aboutsummaryrefslogtreecommitdiffstats
path: root/ui/gtk
diff options
context:
space:
mode:
Diffstat (limited to 'ui/gtk')
-rw-r--r--ui/gtk/.editorconfig217
-rw-r--r--ui/gtk/CMakeLists.txt349
-rw-r--r--ui/gtk/CMakeListsCustom.txt.example31
-rw-r--r--ui/gtk/Makefile.am440
-rw-r--r--ui/gtk/Makefile_custom.common12
-rw-r--r--ui/gtk/STATUS.gtk341
-rw-r--r--ui/gtk/about_dlg.c628
-rw-r--r--ui/gtk/about_dlg.h61
-rw-r--r--ui/gtk/addr_resolution_dlg.c344
-rw-r--r--ui/gtk/addr_resolution_dlg.h28
-rw-r--r--ui/gtk/airpcap_dlg.c2697
-rw-r--r--ui/gtk/airpcap_dlg.h63
-rw-r--r--ui/gtk/airpcap_gui_utils.c2377
-rw-r--r--ui/gtk/airpcap_gui_utils.h305
-rw-r--r--ui/gtk/bytes_view.c1499
-rw-r--r--ui/gtk/bytes_view.h51
-rw-r--r--ui/gtk/capture_dlg.c6243
-rw-r--r--ui/gtk/capture_dlg.h109
-rw-r--r--ui/gtk/capture_file_dlg.c2365
-rw-r--r--ui/gtk/capture_file_dlg.h117
-rw-r--r--ui/gtk/capture_if_details_dlg_win32.c2415
-rw-r--r--ui/gtk/capture_if_details_dlg_win32.h43
-rw-r--r--ui/gtk/capture_if_dlg.c978
-rw-r--r--ui/gtk/capture_if_dlg.h77
-rw-r--r--ui/gtk/capture_info_dlg.c389
-rw-r--r--ui/gtk/cfilter_combo_utils.h33
-rw-r--r--ui/gtk/color_dlg.c1124
-rw-r--r--ui/gtk/color_dlg.h53
-rw-r--r--ui/gtk/color_edit_dlg.c663
-rw-r--r--ui/gtk/color_edit_dlg.h49
-rw-r--r--ui/gtk/color_utils.c95
-rw-r--r--ui/gtk/color_utils.h74
-rw-r--r--ui/gtk/compare_stat.c1078
-rw-r--r--ui/gtk/conversation_hastables_dlg.c176
-rw-r--r--ui/gtk/conversation_hastables_dlg.h30
-rw-r--r--ui/gtk/conversations_table.c2608
-rw-r--r--ui/gtk/conversations_table.h76
-rw-r--r--ui/gtk/dcerpc_stat.c689
-rw-r--r--ui/gtk/decode_as_dlg.c1513
-rw-r--r--ui/gtk/decode_as_dlg.h65
-rw-r--r--ui/gtk/dfilter_expr_dlg.c1228
-rw-r--r--ui/gtk/dfilter_expr_dlg.h39
-rw-r--r--ui/gtk/dissector_tables_dlg.c442
-rw-r--r--ui/gtk/dissector_tables_dlg.h23
-rw-r--r--ui/gtk/dlg_utils.c565
-rw-r--r--ui/gtk/dlg_utils.h154
-rw-r--r--ui/gtk/doxygen.cfg.in67
-rw-r--r--ui/gtk/drag_and_drop.c316
-rw-r--r--ui/gtk/drag_and_drop.h38
-rw-r--r--ui/gtk/edit_packet_comment_dlg.c259
-rw-r--r--ui/gtk/edit_packet_comment_dlg.h30
-rw-r--r--ui/gtk/expert_comp_dlg.c1067
-rw-r--r--ui/gtk/expert_comp_dlg.h29
-rw-r--r--ui/gtk/expert_comp_table.c877
-rw-r--r--ui/gtk/expert_comp_table.h91
-rw-r--r--ui/gtk/export_object_dlg.c492
-rw-r--r--ui/gtk/export_object_dlg.h32
-rw-r--r--ui/gtk/export_pdu_dlg.c187
-rw-r--r--ui/gtk/export_pdu_dlg.h43
-rw-r--r--ui/gtk/export_sslkeys.c196
-rw-r--r--ui/gtk/export_sslkeys.h35
-rw-r--r--ui/gtk/extcap_gtk.c960
-rw-r--r--ui/gtk/extcap_gtk.h125
-rw-r--r--ui/gtk/file_dlg.c474
-rw-r--r--ui/gtk/file_dlg.h133
-rw-r--r--ui/gtk/file_import_dlg.c1224
-rw-r--r--ui/gtk/file_import_dlg.h30
-rw-r--r--ui/gtk/fileset_dlg.c414
-rw-r--r--ui/gtk/fileset_dlg.h63
-rw-r--r--ui/gtk/filter_autocomplete.c899
-rw-r--r--ui/gtk/filter_autocomplete.h53
-rw-r--r--ui/gtk/filter_dlg.c1399
-rw-r--r--ui/gtk/filter_dlg.h132
-rw-r--r--ui/gtk/filter_expression_save_dlg.c354
-rw-r--r--ui/gtk/filter_expression_save_dlg.h37
-rw-r--r--ui/gtk/filter_utils.c118
-rw-r--r--ui/gtk/filter_utils.h65
-rw-r--r--ui/gtk/find_dlg.c803
-rw-r--r--ui/gtk/find_dlg.h59
-rw-r--r--ui/gtk/firewall_dlg.c549
-rw-r--r--ui/gtk/firewall_dlg.h30
-rw-r--r--ui/gtk/flow_graph.c431
-rw-r--r--ui/gtk/follow_stream.c1259
-rw-r--r--ui/gtk/follow_stream.h86
-rw-r--r--ui/gtk/font_utils.c378
-rw-r--r--ui/gtk/font_utils.h67
-rw-r--r--ui/gtk/funnel_stat.c655
-rw-r--r--ui/gtk/goto_dlg.c180
-rw-r--r--ui/gtk/goto_dlg.h74
-rw-r--r--ui/gtk/graph_analysis.c1839
-rw-r--r--ui/gtk/graph_analysis.h111
-rw-r--r--ui/gtk/gsm_map_summary.c429
-rw-r--r--ui/gtk/gtk_iface_monitor.c127
-rw-r--r--ui/gtk/gtk_iface_monitor.h36
-rw-r--r--ui/gtk/gtkglobals.h59
-rw-r--r--ui/gtk/gui_stat_menu.h185
-rw-r--r--ui/gtk/gui_stat_util.c128
-rw-r--r--ui/gtk/gui_stat_util.h60
-rw-r--r--ui/gtk/gui_utils.c2097
-rw-r--r--ui/gtk/gui_utils.h682
-rw-r--r--ui/gtk/help_dlg.c114
-rw-r--r--ui/gtk/help_dlg.h56
-rw-r--r--ui/gtk/hostlist_table.c1281
-rw-r--r--ui/gtk/hostlist_table.h108
-rw-r--r--ui/gtk/iax2_analysis.c3678
-rw-r--r--ui/gtk/io_stat.c2197
-rw-r--r--ui/gtk/keys.h125
-rw-r--r--ui/gtk/lbm_stream_dlg.c775
-rw-r--r--ui/gtk/lbm_stream_dlg.h45
-rw-r--r--ui/gtk/mac_lte_stat_dlg.c1434
-rw-r--r--ui/gtk/macros_dlg.c71
-rw-r--r--ui/gtk/macros_dlg.h29
-rw-r--r--ui/gtk/main.gresources.xml65
-rw-r--r--ui/gtk/main_80211_toolbar.c433
-rw-r--r--ui/gtk/main_80211_toolbar.h32
-rw-r--r--ui/gtk/main_airpcap_toolbar.c429
-rw-r--r--ui/gtk/main_airpcap_toolbar.h31
-rw-r--r--ui/gtk/main_filter_toolbar.c461
-rw-r--r--ui/gtk/main_filter_toolbar.h33
-rw-r--r--ui/gtk/main_menubar.c5439
-rw-r--r--ui/gtk/main_menubar_private.h63
-rw-r--r--ui/gtk/main_statusbar.c1138
-rw-r--r--ui/gtk/main_statusbar_private.h40
-rw-r--r--ui/gtk/main_titlebar.c127
-rw-r--r--ui/gtk/main_titlebar.h38
-rw-r--r--ui/gtk/main_toolbar.c486
-rw-r--r--ui/gtk/main_toolbar.h48
-rw-r--r--ui/gtk/main_toolbar_private.h72
-rw-r--r--ui/gtk/main_welcome.c1580
-rw-r--r--ui/gtk/main_welcome.h69
-rw-r--r--ui/gtk/main_welcome_private.h34
-rw-r--r--ui/gtk/manual_addr_resolv.c212
-rw-r--r--ui/gtk/manual_addr_resolv.h29
-rw-r--r--ui/gtk/mcast_stream_dlg.c858
-rw-r--r--ui/gtk/mcast_stream_dlg.h56
-rw-r--r--ui/gtk/memory_dlg.c740
-rw-r--r--ui/gtk/menus.h111
-rw-r--r--ui/gtk/mtp3_summary.c563
-rw-r--r--ui/gtk/old-gtk-compat.h121
-rw-r--r--ui/gtk/packet_history.c193
-rw-r--r--ui/gtk/packet_history.h34
-rw-r--r--ui/gtk/packet_list.c1733
-rw-r--r--ui/gtk/packet_list.h141
-rw-r--r--ui/gtk/packet_list_store.c1287
-rw-r--r--ui/gtk/packet_list_store.h102
-rw-r--r--ui/gtk/packet_panes.c1443
-rw-r--r--ui/gtk/packet_panes.h240
-rw-r--r--ui/gtk/packet_win.c400
-rw-r--r--ui/gtk/packet_win.h50
-rw-r--r--ui/gtk/pixbuf-csource.c10489
-rw-r--r--ui/gtk/pixbuf-csource.h57
-rw-r--r--ui/gtk/pixmap_save.c187
-rw-r--r--ui/gtk/pixmap_save.h36
-rw-r--r--ui/gtk/plugins_dlg.c136
-rw-r--r--ui/gtk/plugins_dlg.h49
-rw-r--r--ui/gtk/prefs_capture.c2210
-rw-r--r--ui/gtk/prefs_capture.h55
-rw-r--r--ui/gtk/prefs_column.c772
-rw-r--r--ui/gtk/prefs_column.h56
-rw-r--r--ui/gtk/prefs_dlg.c1838
-rw-r--r--ui/gtk/prefs_dlg.h184
-rw-r--r--ui/gtk/prefs_filter_expressions.c92
-rw-r--r--ui/gtk/prefs_filter_expressions.h37
-rw-r--r--ui/gtk/prefs_font_color.c557
-rw-r--r--ui/gtk/prefs_font_color.h57
-rw-r--r--ui/gtk/prefs_gui.c583
-rw-r--r--ui/gtk/prefs_gui.h56
-rw-r--r--ui/gtk/prefs_layout.c531
-rw-r--r--ui/gtk/prefs_layout.h55
-rw-r--r--ui/gtk/print_dlg.c1253
-rw-r--r--ui/gtk/profile_dlg.c1003
-rw-r--r--ui/gtk/profile_dlg.h67
-rw-r--r--ui/gtk/progress_dlg.c422
-rw-r--r--ui/gtk/proto_dlg.c913
-rw-r--r--ui/gtk/proto_dlg.h60
-rw-r--r--ui/gtk/proto_hier_stats_dlg.c609
-rw-r--r--ui/gtk/proto_hier_stats_dlg.h37
-rw-r--r--ui/gtk/proto_hier_tree_model.c500
-rw-r--r--ui/gtk/proto_hier_tree_model.h48
-rw-r--r--ui/gtk/proto_tree_model.c486
-rw-r--r--ui/gtk/proto_tree_model.h40
-rw-r--r--ui/gtk/range_utils.c734
-rw-r--r--ui/gtk/range_utils.h63
-rw-r--r--ui/gtk/response_time_delay_table.c399
-rw-r--r--ui/gtk/response_time_delay_table.h43
-rw-r--r--ui/gtk/rlc_lte_graph.c2733
-rw-r--r--ui/gtk/rlc_lte_stat_dlg.c1685
-rw-r--r--ui/gtk/rpc_stat.c532
-rw-r--r--ui/gtk/rtp_analysis.c4026
-rw-r--r--ui/gtk/rtp_player.c2516
-rw-r--r--ui/gtk/rtp_player.h45
-rw-r--r--ui/gtk/rtp_stream_dlg.c1200
-rw-r--r--ui/gtk/rtp_stream_dlg.h54
-rw-r--r--ui/gtk/sctp_assoc_analyse.c1120
-rw-r--r--ui/gtk/sctp_byte_graph_dlg.c1551
-rw-r--r--ui/gtk/sctp_chunk_stat.c341
-rw-r--r--ui/gtk/sctp_chunk_stat_dlg.c822
-rw-r--r--ui/gtk/sctp_error_dlg.c312
-rw-r--r--ui/gtk/sctp_graph_dlg.c1908
-rw-r--r--ui/gtk/sctp_stat_dlg.c713
-rw-r--r--ui/gtk/sctp_stat_gtk.h160
-rw-r--r--ui/gtk/service_response_time_table.c889
-rw-r--r--ui/gtk/service_response_time_table.h104
-rw-r--r--ui/gtk/simple_dialog.c567
-rw-r--r--ui/gtk/simple_dialog.h91
-rw-r--r--ui/gtk/simple_stattable.c303
-rw-r--r--ui/gtk/simple_stattable.h38
-rw-r--r--ui/gtk/stats_tree_stat.c618
-rw-r--r--ui/gtk/stock_icons.c631
-rw-r--r--ui/gtk/stock_icons.h665
-rw-r--r--ui/gtk/summary_dlg.c1008
-rw-r--r--ui/gtk/summary_dlg.h41
-rw-r--r--ui/gtk/supported_protos_dlg.c356
-rw-r--r--ui/gtk/supported_protos_dlg.h43
-rw-r--r--ui/gtk/tap_param_dlg.c430
-rw-r--r--ui/gtk/tap_param_dlg.h89
-rw-r--r--ui/gtk/tcp_graph.c4546
-rw-r--r--ui/gtk/text_page_utils.c162
-rw-r--r--ui/gtk/text_page_utils.h57
-rw-r--r--ui/gtk/time_shift_dlg.c484
-rw-r--r--ui/gtk/time_shift_dlg.h33
-rw-r--r--ui/gtk/uat_gui.c1164
-rw-r--r--ui/gtk/uat_gui.h33
-rw-r--r--ui/gtk/voip_calls_dlg.c977
-rw-r--r--ui/gtk/voip_calls_dlg.h46
-rw-r--r--ui/gtk/webbrowser.c487
-rw-r--r--ui/gtk/webbrowser.h35
-rw-r--r--ui/gtk/wlan_stat_dlg.c2017
228 files changed, 0 insertions, 142409 deletions
diff --git a/ui/gtk/.editorconfig b/ui/gtk/.editorconfig
deleted file mode 100644
index 84e07a6ae5..0000000000
--- a/ui/gtk/.editorconfig
+++ /dev/null
@@ -1,217 +0,0 @@
-#
-# Editor configuration
-#
-# http://editorconfig.org/
-#
-
-[about_dlg.[ch]]
-indent_size = 2
-
-[bytes_view.[ch]]
-indent_style = tab
-indent_size = tab
-
-[capture_dlg.[ch]]
-indent_size = 2
-
-[capture_file_dlg.[ch]]
-indent_size = 2
-
-[capture_if_dlg.[ch]]
-indent_size = 2
-
-[capture_info_dlg.[ch]]
-indent_size = 2
-
-[color_dlg.[ch]]
-indent_size = 2
-
-[color_edit_dlg.[ch]]
-indent_size = 2
-
-[color_utils.[ch]]
-indent_style = tab
-indent_size = tab
-
-[compare_stat.[ch]]
-indent_style = tab
-indent_size = tab
-
-[dcerpc_stat.[ch]]
-indent_style = tab
-indent_size = tab
-
-[edit_packet_comment_dlg.[ch]]
-indent_size = 2
-
-[export_object_dlg.[ch]]
-indent_style = tab
-indent_size = tab
-
-[filter_autocomplete.[ch]]
-indent_size = 2
-
-[filter_expression_save_dlg.[ch]]
-indent_style = tab
-indent_size = tab
-
-[filter_utils.[ch]]
-indent_style = tab
-indent_size = tab
-
-[find_dlg.[ch]]
-indent_size = 2
-
-[flow_graph.[ch]]
-indent_style = tab
-indent_size = tab
-
-[goto_dlg.[ch]]
-indent_size = 2
-
-[graph_analysis.[ch]]
-indent_style = tab
-indent_size = tab
-
-[gsm_map_summary.[ch]]
-indent_size = 2
-
-[gui_stat_util.[ch]]
-indent_style = tab
-indent_size = tab
-
-[iax2_analysis.[ch]]
-indent_style = tab
-indent_size = tab
-
-[macros_dlg.[ch]]
-indent_style = tab
-indent_size = tab
-
-[manual_addr_resolv.[ch]]
-indent_size = 2
-
-[packet_list.[ch]]
-indent_style = tab
-indent_size = tab
-
-[packet_list_store.[ch]]
-indent_style = tab
-indent_size = tab
-
-[packet_win.[ch]]
-indent_style = tab
-indent_size = tab
-
-[pixmap_save.[ch]]
-indent_style = tab
-indent_size = tab
-
-[prefs_capture.[ch]]
-indent_style = tab
-indent_size = tab
-
-[prefs_dlg.[ch]]
-indent_size = 2
-
-[prefs_font_color.[ch]]
-indent_size = 2
-
-[prefs_gui.[ch]]
-indent_style = tab
-indent_size = tab
-
-[print_dlg.[ch]]
-indent_size = 2
-
-[profile_dlg.[ch]]
-indent_size = 2
-
-[proto_dlg.[ch]]
-indent_size = 2
-
-[proto_hier_tree_model.[ch]]
-indent_style = tab
-indent_size = tab
-
-[proto_tree_model.[ch]]
-indent_style = tab
-indent_size = tab
-
-[range_utils.[ch]]
-indent_size = 2
-
-[response_time_delay_table.[ch]]
-indent_style = tab
-indent_size = tab
-
-[rpc_stat.[ch]]
-indent_style = tab
-indent_size = tab
-
-[rtp_analysis.[ch]]
-indent_style = tab
-indent_size = tab
-
-[rtp_player.[ch]]
-indent_style = tab
-indent_size = tab
-
-[sctp_assoc_analyse.[ch]]
-indent_style = tab
-indent_size = tab
-
-[sctp_byte_graph_dlg.[ch]]
-indent_style = tab
-indent_size = tab
-
-[sctp_chunk_stat.[ch]]
-indent_style = tab
-indent_size = tab
-
-[sctp_error_dlg.[ch]]
-indent_style = tab
-indent_size = tab
-
-[sctp_graph_dlg.[ch]]
-indent_style = tab
-indent_size = tab
-
-[sctp_stat_dlg.[ch]]
-indent_style = tab
-indent_size = tab
-
-[service_response_time_table.[ch]]
-indent_style = tab
-indent_size = tab
-
-[simple_dialog.[ch]]
-indent_size = 2
-
-[simple_stattable.[ch]]
-indent_style = tab
-indent_size = tab
-
-[stats_tree_stat.[ch]]
-indent_style = tab
-indent_size = tab
-
-[summary_dlg.[ch]]
-indent_size = 2
-
-[supported_protos_dlg.[ch]]
-indent_size = 2
-
-[time_shift_dlg.[ch]]
-indent_size = 2
-
-[uat_gui.[ch]]
-indent_style = tab
-indent_size = tab
-
-[voip_calls_dlg.[ch]]
-indent_style = tab
-indent_size = tab
-
-[webbrowser.[ch]]
-indent_size = 2
diff --git a/ui/gtk/CMakeLists.txt b/ui/gtk/CMakeLists.txt
deleted file mode 100644
index 173f02780c..0000000000
--- a/ui/gtk/CMakeLists.txt
+++ /dev/null
@@ -1,349 +0,0 @@
-# CMakeLists.txt
-#
-# Wireshark - Network traffic analyzer
-# By Gerald Combs <gerald@wireshark.org>
-# Copyright 1998 Gerald Combs
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-
-ADD_CUSTOM_CMAKE_INCLUDE()
-
-set(WIRESHARK_GTK_SRC
- about_dlg.c
- addr_resolution_dlg.c
- bytes_view.c
- capture_dlg.c
- capture_file_dlg.c
- capture_if_dlg.c
- capture_info_dlg.c
- color_dlg.c
- color_edit_dlg.c
- color_utils.c
- conversation_hastables_dlg.c
- conversations_table.c
- decode_as_dlg.c
- dfilter_expr_dlg.c
- dissector_tables_dlg.c
- dlg_utils.c
- drag_and_drop.c
- edit_packet_comment_dlg.c
- expert_comp_table.c
- export_object_dlg.c
- export_pdu_dlg.c
- export_sslkeys.c
- extcap_gtk.c
- filter_autocomplete.c
- file_dlg.c
- file_import_dlg.c
- fileset_dlg.c
- filter_dlg.c
- filter_expression_save_dlg.c
- filter_utils.c
- find_dlg.c
- firewall_dlg.c
- follow_stream.c
- font_utils.c
- goto_dlg.c
- graph_analysis.c
- gtk_iface_monitor.c
- gui_stat_util.c
- gui_utils.c
- help_dlg.c
- hostlist_table.c
- macros_dlg.c
- main.c
- main_80211_toolbar.c
- main_filter_toolbar.c
- main_menubar.c
- main_statusbar.c
- main_titlebar.c
- main_toolbar.c
- main_welcome.c
- manual_addr_resolv.c
- packet_history.c
- packet_list_store.c
- packet_list.c
- packet_panes.c
- packet_win.c
- pixmap_save.c
- plugins_dlg.c
- prefs_capture.c
- prefs_column.c
- prefs_dlg.c
- prefs_filter_expressions.c
- prefs_gui.c
- prefs_layout.c
- prefs_font_color.c
- print_dlg.c
- profile_dlg.c
- progress_dlg.c
- proto_dlg.c
- proto_hier_stats_dlg.c
- proto_hier_tree_model.c
- proto_tree_model.c
- range_utils.c
- response_time_delay_table.c
- sctp_byte_graph_dlg.c
- sctp_error_dlg.c
- sctp_graph_dlg.c
- service_response_time_table.c
- simple_dialog.c
- simple_stattable.c
- stock_icons.c
- summary_dlg.c
- supported_protos_dlg.c
- tap_param_dlg.c
- text_page_utils.c
- time_shift_dlg.c
- uat_gui.c
- webbrowser.c
- ${WIRESHARK_CUSTOM_GTK_SRC}
-)
-
-if (AIRPCAP_FOUND)
- set(WIRESHARK_GTK_SRC
- ${WIRESHARK_GTK_SRC}
- airpcap_dlg.c
- airpcap_gui_utils.c
- main_airpcap_toolbar.c
- )
-endif()
-
-if(PORTAUDIO_FOUND)
- set(WIRESHARK_GTK_SRC
- ${WIRESHARK_GTK_SRC}
- rtp_player.c
- )
-
- # For Win32, there is no PortAudio lib, we compile the files locally
- if(WIN32)
- add_definitions(
- -DPA_NO_DS
- -DPA_NO_ASIO
- )
- set(PORTAUDIO_SRC
- ${PORTAUDIO_SRC_DIR}/common/pa_allocation.c
- ${PORTAUDIO_SRC_DIR}/common/pa_converters.c
- ${PORTAUDIO_SRC_DIR}/common/pa_cpuload.c
- ${PORTAUDIO_SRC_DIR}/common/pa_dither.c
- ${PORTAUDIO_SRC_DIR}/common/pa_front.c
- ${PORTAUDIO_SRC_DIR}/common/pa_process.c
- ${PORTAUDIO_SRC_DIR}/common/pa_skeleton.c
- ${PORTAUDIO_SRC_DIR}/common/pa_stream.c
- ${PORTAUDIO_SRC_DIR}/common/pa_trace.c
- ${PORTAUDIO_SRC_DIR}/os/win/pa_win_hostapis.c
- ${PORTAUDIO_SRC_DIR}/os/win/pa_win_util.c
- ${PORTAUDIO_SRC_DIR}/os/win/pa_x86_plain_converters.c
- ${PORTAUDIO_SRC_DIR}/os/win/pa_win_waveformat.c
- ${PORTAUDIO_SRC_DIR}/hostapi/wmme/pa_win_wmme.c
- )
- add_library(portaudio OBJECT
- ${PORTAUDIO_SRC}
- )
- set_target_properties(portaudio PROPERTIES
- INCLUDE_DIRECTORIES "${PORTAUDIO_INCLUDE_DIRS}"
- FOLDER "UI")
-
- # Portaudio has some warnings, annoyingly the combination of CMake
- # and MSBuild means that just disabling the warnings on the specific
- # source files doesn't work, so set them to level 4 for the target
- #set_source_files_properties(${PORTAUDIO_SRC_DIR}/common/pa_front.c
- # PROPERTIES
- # COMPILE_FLAGS "/wd4189"
- #)
- #set_source_files_properties(${PORTAUDIO_SRC_DIR}/os/win/pa_x86_plain_converters.c
- # PROPERTIES
- # COMPILE_FLAGS "/wd4305"
- #)
- target_compile_options(portaudio
- PUBLIC "/w44189"
- PUBLIC "/w44305"
- )
-
- # Portaudio has some size_t > long warnings as a result of using strlen()
- # and other warnings on x64.
- if ("${WIRESHARK_TARGET_PLATFORM}" STREQUAL "win64")
- #set_source_files_properties(${PORTAUDIO_SRC_DIR}/hostapi/wmme/pa_win_wmme.c
- # PROPERTIES
- # COMPILE_FLAGS "/wd4267"
- #)
- target_compile_options(portaudio
- PUBLIC "/w44267"
- PUBLIC "/w44311"
- PUBLIC "/w44312"
- )
- endif()
- endif()
-endif()
-
-set(WIRESHARK_TAP_SRC
- ${CMAKE_CURRENT_SOURCE_DIR}/compare_stat.c
- ${CMAKE_CURRENT_SOURCE_DIR}/dcerpc_stat.c
- ${CMAKE_CURRENT_SOURCE_DIR}/expert_comp_dlg.c
- ${CMAKE_CURRENT_SOURCE_DIR}/flow_graph.c
- ${CMAKE_CURRENT_SOURCE_DIR}/funnel_stat.c
- ${CMAKE_CURRENT_SOURCE_DIR}/gsm_map_summary.c
- ${CMAKE_CURRENT_SOURCE_DIR}/iax2_analysis.c
- ${CMAKE_CURRENT_SOURCE_DIR}/io_stat.c
- ${CMAKE_CURRENT_SOURCE_DIR}/lbm_stream_dlg.c
- ${CMAKE_CURRENT_SOURCE_DIR}/mac_lte_stat_dlg.c
- ${CMAKE_CURRENT_SOURCE_DIR}/mcast_stream_dlg.c
- ${CMAKE_CURRENT_SOURCE_DIR}/mtp3_summary.c
- ${CMAKE_CURRENT_SOURCE_DIR}/rlc_lte_graph.c
- ${CMAKE_CURRENT_SOURCE_DIR}/rlc_lte_stat_dlg.c
- ${CMAKE_CURRENT_SOURCE_DIR}/rpc_stat.c
- ${CMAKE_CURRENT_SOURCE_DIR}/rtp_analysis.c
- ${CMAKE_CURRENT_SOURCE_DIR}/rtp_stream_dlg.c
- ${CMAKE_CURRENT_SOURCE_DIR}/sctp_assoc_analyse.c
- ${CMAKE_CURRENT_SOURCE_DIR}/sctp_chunk_stat.c
- ${CMAKE_CURRENT_SOURCE_DIR}/sctp_chunk_stat_dlg.c
- ${CMAKE_CURRENT_SOURCE_DIR}/sctp_stat_dlg.c
- ${CMAKE_CURRENT_SOURCE_DIR}/stats_tree_stat.c
- ${CMAKE_CURRENT_SOURCE_DIR}/tcp_graph.c
- ${CMAKE_CURRENT_SOURCE_DIR}/voip_calls_dlg.c
- ${CMAKE_CURRENT_SOURCE_DIR}/wlan_stat_dlg.c
- ${WIRESHARK_CUSTOM_TAP_SRC}
-)
-
-if (ENABLE_GTK3)
- add_definitions(
- ${GTK3_DEFINITIONS}
- -DGDK_DISABLE_DEPRECATION_WARNINGS
- )
-else()
- add_definitions(
- # We are only allowed to include gtk/gtk.h, no other files. When
- # violating this with gtk3 the compiler will complain anyway.
- -DGTK_DISABLE_SINGLE_INCLUDES
-
- # GTK+ 3 removes many implementation details and struct members from its
- # public headers. Make the compiler catch all uses of direct access to
- # struct fields so that you can go through them one by one and replace
- # them with a call to an accessor function instead.
- -DGSEAL_ENABLE
-
- # To verify that your program does not use any deprecated symbols,
- # you can use defines to remove deprecated symbols from the header files
- # -DGDK_DISABLE_DEPRECATED
- -DGTK_DISABLE_DEPRECATED
- )
-endif()
-
-if(WIN32)
- set(PLATFORM_UI_SRC
- capture_if_details_dlg_win32.c
- )
-endif()
-
-set(GTKUI_FILES
- ${WIRESHARK_GTK_SRC}
- ${WIRESHARK_TAP_SRC}
- ${PLATFORM_UI_SRC}
-)
-
-set_source_files_properties(
- ${GTKUI_FILES}
- PROPERTIES
- COMPILE_FLAGS "${WERROR_COMMON_FLAGS} ${NO_ERROR_DEPRECATED_DECLARATIONS_COMPILE_FLAGS}"
-)
-
-register_tap_files(wireshark-tap-register.c
- ${WIRESHARK_TAP_SRC}
-)
-
-if(WIN32)
- set(PORTAUDIO_OBJ $<TARGET_OBJECTS:portaudio>)
-endif()
-
-find_program(GLIB_COMPILE_RESOURCES_EXECUTABLE
- glib-compile-resources
- HINTS
- "${GLIB2_HINTS}/bin"
-)
-
-pkg_check_modules(GRESOURCE QUIET gio-2.0>=2.32 gdk-pixbuf-2.0>=2.26)
-
-macro(WIRESHARK_GRESOURCES _outputfile _resourcefile)
- add_custom_command(
- OUTPUT ${_outputfile}
- COMMAND ${GLIB_COMPILE_RESOURCES_EXECUTABLE} --sourcedir=${CMAKE_SOURCE_DIR} --target=${_outputfile} --generate --manual-register ${CMAKE_CURRENT_SOURCE_DIR}/${_resourcefile}
- DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${_resourcefile}
- WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
- )
-endmacro(WIRESHARK_GRESOURCES)
-
-WIRESHARK_GRESOURCES(wireshark-gresources.h main.gresources.xml)
-
-WIRESHARK_GRESOURCES(wireshark-gresources.c main.gresources.xml)
-
-include_directories(${CMAKE_CURRENT_BINARY_DIR})
-
-if(GRESOURCE_FOUND AND NOT WIN32)
- set(PIXBUF_SRC
- wireshark-gresources.c
- wireshark-gresources.h
- )
- add_definitions(-DHAVE_GDK_GRESOURCE)
-else()
- set(PIXBUF_SRC
- pixbuf-csource.c
- )
-endif()
-
-add_library(gtkui STATIC
- ${GTKUI_FILES}
- ${PORTAUDIO_OBJ}
- wireshark-tap-register.c
- ${PIXBUF_SRC}
-)
-set_target_properties(gtkui PROPERTIES
- LINK_FLAGS "${WS_LINK_FLAGS}"
- FOLDER "UI"
-)
-
-CHECKAPI(
- NAME
- gtk-base
- SWITCHES
- -g deprecated-gtk
- SOURCES
- ${WIRESHARK_GTK_SRC}
- ${WIRESHARK_TAP_SRC}
- ${PLATFORM_UI_SRC}
-)
-CHECKAPI(
- NAME
- gtk-todo
- SWITCHES
- -M -g deprecated-gtk-todo
- SOURCES
- ${WIRESHARK_GTK_SRC}
- ${WIRESHARK_TAP_SRC}
- ${PLATFORM_UI_SRC}
-)
-
-#
-# Editor modelines - http://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/gtk/CMakeListsCustom.txt.example b/ui/gtk/CMakeListsCustom.txt.example
deleted file mode 100644
index 57ff1b7a02..0000000000
--- a/ui/gtk/CMakeListsCustom.txt.example
+++ /dev/null
@@ -1,31 +0,0 @@
-# CMakeListsCustom.txt
-#
-# Wireshark - Network traffic analyzer
-# By Gerald Combs <gerald@wireshark.org>
-# Copyright 1998 Gerald Combs
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# You can add custom GUI files here by replacing the commented out file foo with your file.
-
-#Add GUI source files here
-set(WIRESHARK_CUSTOM_GTK_SRC
-# foo.c
-)
-
-#Add your tap source files here:
-set(WIRESHARK_CUSTOM_TAP_SRC
-# tap_foo.c
-)
diff --git a/ui/gtk/Makefile.am b/ui/gtk/Makefile.am
deleted file mode 100644
index 23d70fb8b2..0000000000
--- a/ui/gtk/Makefile.am
+++ /dev/null
@@ -1,440 +0,0 @@
-# Makefile.am
-# Automake file for the GTK interface routines for Wireshark
-#
-# Wireshark - Network traffic analyzer
-# By Gerald Combs <gerald@wireshark.org>
-# Copyright 1998 Gerald Combs
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-include $(top_srcdir)/Makefile.am.inc
-include Makefile_custom.common
-
-# Generated C source files that we want in the distribution.
-GENERATED_FILES =
-
-# Generated C source files that we don't want in the distribution.
-NODIST_GENERATED_FILES = \
- wireshark-tap-register.c
-
-# Files that generate compileable files
-GENERATOR_FILES = \
- main.gresources.xml
-
-WIRESHARK_COMMON_GTK_SRC = \
- about_dlg.c \
- addr_resolution_dlg.c \
- bytes_view.c \
- capture_dlg.c \
- capture_file_dlg.c \
- capture_if_dlg.c \
- capture_info_dlg.c \
- color_dlg.c \
- color_edit_dlg.c \
- color_utils.c \
- conversation_hastables_dlg.c \
- conversations_table.c \
- decode_as_dlg.c \
- dfilter_expr_dlg.c \
- dissector_tables_dlg.c \
- dlg_utils.c \
- drag_and_drop.c \
- edit_packet_comment_dlg.c \
- expert_comp_table.c \
- export_object_dlg.c \
- export_sslkeys.c \
- extcap_gtk.c \
- filter_autocomplete.c \
- file_dlg.c \
- file_import_dlg.c \
- fileset_dlg.c \
- filter_dlg.c \
- filter_expression_save_dlg.c \
- filter_utils.c \
- find_dlg.c \
- firewall_dlg.c \
- follow_stream.c \
- font_utils.c \
- goto_dlg.c \
- graph_analysis.c \
- gtk_iface_monitor.c \
- gui_stat_util.c \
- gui_utils.c \
- help_dlg.c \
- hostlist_table.c \
- macros_dlg.c \
- main.c \
- main_80211_toolbar.c \
- main_filter_toolbar.c \
- main_menubar.c \
- manual_addr_resolv.c \
- packet_panes.c \
- main_statusbar.c \
- main_titlebar.c \
- main_toolbar.c \
- main_welcome.c \
- packet_history.c \
- packet_list_store.c \
- packet_list.c \
- packet_win.c \
- pixmap_save.c \
- plugins_dlg.c \
- prefs_capture.c \
- prefs_column.c \
- prefs_dlg.c \
- prefs_filter_expressions.c \
- prefs_gui.c \
- prefs_layout.c \
- prefs_font_color.c \
- print_dlg.c \
- profile_dlg.c \
- progress_dlg.c \
- proto_dlg.c \
- proto_hier_stats_dlg.c \
- proto_hier_tree_model.c \
- proto_tree_model.c \
- range_utils.c \
- response_time_delay_table.c \
- rtp_player.c \
- sctp_byte_graph_dlg.c \
- sctp_error_dlg.c \
- sctp_graph_dlg.c \
- service_response_time_table.c \
- simple_dialog.c \
- simple_stattable.c \
- stock_icons.c \
- summary_dlg.c \
- supported_protos_dlg.c \
- tap_param_dlg.c \
- text_page_utils.c \
- time_shift_dlg.c \
- uat_gui.c \
- webbrowser.c \
- $(WIRESHARK_CUSTOM_GTK_SRC)
-
-WIRESHARK_TAP_SRC = \
- compare_stat.c \
- dcerpc_stat.c \
- expert_comp_dlg.c \
- export_pdu_dlg.c \
- flow_graph.c \
- funnel_stat.c \
- gsm_map_summary.c \
- iax2_analysis.c \
- io_stat.c \
- lbm_stream_dlg.c \
- mac_lte_stat_dlg.c \
- mcast_stream_dlg.c \
- mtp3_summary.c \
- rlc_lte_graph.c \
- rlc_lte_stat_dlg.c \
- rpc_stat.c \
- rtp_analysis.c \
- rtp_stream_dlg.c \
- sctp_assoc_analyse.c \
- sctp_chunk_stat.c \
- sctp_chunk_stat_dlg.c \
- sctp_stat_dlg.c \
- stats_tree_stat.c \
- tcp_graph.c \
- voip_calls_dlg.c \
- wlan_stat_dlg.c \
- $(WIRESHARK_CUSTOM_TAP_SRC)
-
-WIRESHARK_COMMON_GTK_HDRS = \
- about_dlg.h \
- addr_resolution_dlg.h \
- bytes_view.h \
- capture_dlg.h \
- capture_file_dlg.h \
- capture_if_dlg.h \
- cfilter_combo_utils.h \
- color_dlg.h \
- color_edit_dlg.h \
- color_utils.h \
- conversation_hastables_dlg.h \
- conversations_table.h \
- decode_as_dlg.h \
- dfilter_expr_dlg.h \
- dissector_tables_dlg.h \
- dlg_utils.h \
- drag_and_drop.h \
- edit_packet_comment_dlg.h \
- expert_comp_dlg.h \
- expert_comp_table.h \
- export_object_dlg.h \
- export_pdu_dlg.h \
- export_sslkeys.h \
- extcap_gtk.h \
- file_dlg.h \
- file_import_dlg.h \
- fileset_dlg.h \
- filter_autocomplete.h \
- filter_dlg.h \
- filter_expression_save_dlg.h \
- filter_utils.h \
- find_dlg.h \
- firewall_dlg.h \
- follow_stream.h \
- font_utils.h \
- goto_dlg.h \
- graph_analysis.h \
- gtk_iface_monitor.h \
- gtkglobals.h \
- gui_stat_menu.h \
- gui_stat_util.h \
- gui_utils.h \
- help_dlg.h \
- hostlist_table.h \
- keys.h \
- lbm_stream_dlg.h \
- macros_dlg.h \
- main.h \
- main_filter_toolbar.h \
- main_menubar_private.h \
- main_80211_toolbar.h \
- menus.h \
- packet_panes.h \
- main_statusbar_private.h \
- main_titlebar.h \
- main_toolbar.h \
- main_toolbar_private.h \
- main_welcome.h \
- main_welcome_private.h \
- manual_addr_resolv.h \
- mcast_stream_dlg.h \
- old-gtk-compat.h \
- packet_history.h \
- packet_list_store.h \
- packet_list.h \
- packet_win.h \
- pixmap_save.h \
- plugins_dlg.h \
- prefs_capture.h \
- prefs_column.h \
- prefs_dlg.h \
- prefs_filter_expressions.h \
- prefs_gui.h \
- prefs_layout.h \
- prefs_font_color.h \
- profile_dlg.h \
- proto_dlg.h \
- proto_hier_stats_dlg.h \
- proto_hier_tree_model.h \
- proto_tree_model.h \
- range_utils.h \
- response_time_delay_table.h \
- rtp_player.h \
- rtp_stream_dlg.h \
- sctp_stat_gtk.h \
- service_response_time_table.h \
- simple_stattable.h \
- time_shift_dlg.h \
- simple_dialog.h \
- stock_icons.h \
- summary_dlg.h \
- supported_protos_dlg.h \
- tap_param_dlg.h \
- text_page_utils.h \
- uat_gui.h \
- voip_calls_dlg.h \
- webbrowser.h \
- $(WIRESHARK_CUSTOM_HDRS)
-
-if HAVE_GRESOURCE_PIXBUF
-NODIST_GENERATED_FILES += \
- wireshark-gresources.h \
- wireshark-gresources.c
-else
-BUILD_PIXBUF_CSOURCE = \
- pixbuf-csource.h \
- pixbuf-csource.c
-endif
-
-AM_CPPFLAGS = $(INCLUDEDIRS) $(WS_CPPFLAGS) $(GTK_CFLAGS) \
- $(PORTAUDIO_INCLUDES)
-
-DISTCLEANFILES = \
- $(NODIST_GENERATED_FILES)
-
-MAINTAINERCLEANFILES = \
- $(GENERATED_FILES)
-
-EXTRA_DIST = \
- .editorconfig \
- $(GENERATOR_FILES) \
- airpcap_dlg.c \
- airpcap_dlg.h \
- airpcap_gui_utils.c \
- airpcap_gui_utils.h \
- capture_if_details_dlg_win32.c \
- capture_if_details_dlg_win32.h \
- CMakeLists.txt \
- doxygen.cfg.in \
- main_airpcap_toolbar.c \
- main_airpcap_toolbar.h \
- Makefile_custom.common \
- pixbuf-csource.c \
- pixbuf-csource.h
-
-BUILT_SOURCES = \
- $(GENERATED_FILES) \
- $(NODIST_GENERATED_FILES)
-
-noinst_LIBRARIES = libgtkui.a
-
-libgtkui_a_SOURCES = \
- $(WIRESHARK_COMMON_GTK_SRC) \
- $(WIRESHARK_COMMON_GTK_HDRS) \
- $(WIRESHARK_TAP_SRC) \
- $(GENERATED_FILES)
-
-nodist_libgtkui_a_SOURCES = \
- $(NODIST_GENERATED_FILES) \
- $(BUILD_PIXBUF_CSOURCE)
-
-wireshark-tap-register.c: $(WIRESHARK_TAP_SRC) ../make-taps
- $(AM_V_GEN)../make-taps $@ $(filter %.c,$^)
-
-wireshark-gresources.c: main.gresources.xml $(shell glib-compile-resources --sourcedir=$(top_srcdir) --generate-dependencies $(srcdir)/main.gresources.xml)
- @echo Making $@
- @glib-compile-resources --sourcedir=$(top_srcdir) --target=$@ --generate --manual-register $<
-
-wireshark-gresources.h: main.gresources.xml
- @echo Making $@
- @glib-compile-resources --sourcedir=$(top_srcdir) --target=$@ --generate --manual-register $<
-
-imagedir = $(top_srcdir)/image
-
-pixbuf_csource_data = \
- expert_chat_pb_data \
- $(imagedir)/stock_icons/14x14/x-expert-chat.png \
- expert_error_pb_data \
- $(imagedir)/stock_icons/14x14/x-expert-error.png \
- expert_none_pb_data \
- $(imagedir)/stock_icons/14x14/x-expert-none.png \
- expert_note_pb_data \
- $(imagedir)/stock_icons/14x14/x-expert-note.png \
- expert_warn_pb_data \
- $(imagedir)/stock_icons/14x14/x-expert-warn.png \
- expert_ok_pb_data \
- $(imagedir)/expert_ok.png \
- capture_comment_add_pb_data \
- $(imagedir)/capture_comment_add.png \
- capture_comment_update_pb_data \
- $(imagedir)/capture_comment_update.png \
- capture_comment_disabled_pb_data \
- $(imagedir)/capture_comment_disabled.png \
- network_bluetooth_pb_data \
- $(imagedir)/toolbar/network_bluetooth_16.png \
- network_usb_pb_data \
- $(imagedir)/toolbar/network_usb_16.png \
- network_wired_pb_data \
- $(imagedir)/toolbar/network_wired_16.png \
- network_wireless_pb_data \
- $(imagedir)/toolbar/network_wireless_16.png \
- remote_arrow_pb_data \
- $(imagedir)/toolbar/remote_arrow_16.png \
- remote_globe_pb_data \
- $(imagedir)/toolbar/remote_globe_16.png \
- remote_sat_pb_data \
- $(imagedir)/toolbar/remote_sat_16.png \
- pipe_pb_data \
- $(imagedir)/toolbar/pipe_16.png \
- capture_interfaces_16_pb_data \
- $(imagedir)/toolbar/capture_interfaces_16.png \
- capture_interfaces_24_pb_data \
- $(imagedir)/toolbar/capture_interfaces_24.png \
- gnome_emblem_web_16_pb_data \
- $(imagedir)/toolbar/gnome_emblem_web_16.png \
- gnome_emblem_web_24_pb_data \
- $(imagedir)/toolbar/gnome_emblem_web_24.png \
- toolbar_wireshark_file_16_pb_data \
- $(imagedir)/stock_icons/16x16/x-capture-file-save.png \
- toolbar_wireshark_file_24_pb_data \
- $(imagedir)/stock_icons/24x24/x-capture-file-save.png \
- capture_options_alt1_16_pb_data \
- $(imagedir)/stock_icons/16x16/x-capture-options.png \
- capture_options_alt1_24_pb_data \
- $(imagedir)/stock_icons/24x24/x-capture-options.png \
- capture_restart_16_pb_data \
- $(imagedir)/stock_icons/16x16/x-capture-restart.png \
- capture_restart_24_pb_data \
- $(imagedir)/stock_icons/24x24/x-capture-restart.png \
- capture_start_16_pb_data \
- $(imagedir)/stock_icons/16x16/x-capture-start.png \
- capture_start_24_pb_data \
- $(imagedir)/stock_icons/24x24/x-capture-start.png \
- capture_stop_16_pb_data \
- $(imagedir)/stock_icons/16x16/x-capture-stop.png \
- capture_stop_24_pb_data \
- $(imagedir)/stock_icons/24x24/x-capture-stop.png \
- layout_1_pb_data \
- $(imagedir)/layout_1.png \
- layout_2_pb_data \
- $(imagedir)/layout_2.png \
- layout_3_pb_data \
- $(imagedir)/layout_3.png \
- layout_4_pb_data \
- $(imagedir)/layout_4.png \
- layout_5_pb_data \
- $(imagedir)/layout_5.png \
- layout_6_pb_data \
- $(imagedir)/layout_6.png \
- wsicon_16_pb_data \
- $(imagedir)/wsicon16.png \
- wsicon_24_pb_data \
- $(imagedir)/wsicon24.png \
- wsicon_32_pb_data \
- $(imagedir)/wsicon32.png \
- wsicon_48_pb_data \
- $(imagedir)/wsicon48.png \
- wsicon_64_pb_data \
- $(imagedir)/wsicon64.png \
- wsiconcap_16_pb_data \
- $(imagedir)/wsiconcap16.png \
- wsiconcap_24_pb_data \
- $(imagedir)/wsiconcap24.png \
- wsiconcap_32_pb_data \
- $(imagedir)/wsiconcap32.png \
- wsiconcap_48_pb_data \
- $(imagedir)/wsiconcap48.png \
- wsiconcap_64_pb_data \
- $(imagedir)/wsiconcap64.png \
- wssplash_pb_data \
- $(imagedir)/wssplash_dev.png
-
-pixbuf-csource:
- $(PERL) $(top_srcdir)/tools/make-pixbuf-csource.pl $@ $(pixbuf_csource_data)
-
-doxygen:
-if HAVE_DOXYGEN
- $(DOXYGEN) doxygen.cfg
-endif
-
-checkapi: checkapi-base checkapi-todo
-
-checkapi-base:
- $(PERL) $(top_srcdir)/tools/checkAPIs.pl -g deprecated-gtk -build \
- -sourcedir=$(srcdir) \
- $(WIRESHARK_CLEAN_LIBGTKUI_SRC) \
- capture_if_details_dlg_win32.c
-
-checkapi-todo:
- $(PERL) $(top_srcdir)/tools/checkAPIs.pl -M -g deprecated-gtk-todo -build \
- -sourcedir=$(srcdir) \
- $(WIRESHARK_GTK_SRC) \
- $(WIRESHARK_TAP_SRC) \
- capture_if_details_dlg_win32.c
diff --git a/ui/gtk/Makefile_custom.common b/ui/gtk/Makefile_custom.common
deleted file mode 100644
index 8f9c9b389f..0000000000
--- a/ui/gtk/Makefile_custom.common
+++ /dev/null
@@ -1,12 +0,0 @@
-#
-# You can add custom GUI files here
-#
-
-#Add GUI source files here
-WIRESHARK_CUSTOM_GTK_SRC =
-
-#Add your tap source files here:
-WIRESHARK_CUSTOM_TAP_SRC =
-
-#Add headers here:
-WIRESHARK_CUSTOM_HDRS =
diff --git a/ui/gtk/STATUS.gtk3 b/ui/gtk/STATUS.gtk3
deleted file mode 100644
index 8cf160584c..0000000000
--- a/ui/gtk/STATUS.gtk3
+++ /dev/null
@@ -1,41 +0,0 @@
-Status of the GTK+ 3 port :
-===========================
-
-The port is done. We used the methods described in the "Migrating from
-GTK+ 2.x to GTK+ 3" document at:
-http://developer.gnome.org/gtk3/stable/gtk-migrating-2-to-3.html
-
-To build Wireshark with GTK3 instead of GTK2, use:
-
- - cmake: ENABLE_GTK3=ON
- - configure: --with-gtk3
- This will only work if building without gtkvumeter.c (which is used on Windows
- only and only in the WLAN code). It also requires GTK3 to be installed.
- GTK3 for Windows (32 and 64 bit) is now available the same way as GTK2 for
- Windows: Via the svn repo for Wireshark for windows builds.
-
-Except in one place we are building on GTK2 using the compat flags
- -DGTK_DISABLE_SINGLE_INCLUDES
- -DGSEAL_ENABLE
- -DGDK_DISABLE_DEPRECATED
- -DGTK_DISABLE_DEPRECATED
-
-Summary: The only known files that cause some sort of problems (or lost
- functionality) are:
- - gtkvumeter.c (removed, only used for wlan on windows)
- - tcp-graph: the crosshairs are not right
- - audiograph doesn't work
-
-----------------------------------------------------------------------
-
-March 11, 2013:
-
-Various Gtk widgets (GtkTable, GtkColorSelection, ...) deprecated in versions
-of Gtk3 newer than Gtk 3.0.0 have been replaced as appropriate.
-
-Wireshark Gtk3 builds with Gtk 3.6.4 without any "deprecated" warnings.
-
-Fixes to handling of 'expand' in GTK3 have been completed.
-(Essentially: When adding a widget to a [V|H]Box, use gtk_box_pack_start()
- with appropriate args instead of gtk_container_add().
-
diff --git a/ui/gtk/about_dlg.c b/ui/gtk/about_dlg.c
deleted file mode 100644
index 17d0fca8f8..0000000000
--- a/ui/gtk/about_dlg.c
+++ /dev/null
@@ -1,628 +0,0 @@
-/* about_dlg.c
- *
- * Ulf Lamping <ulf.lamping@web.de>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <wsutil/filesystem.h>
-#include <wsutil/copyright_info.h>
-#include <version_info.h>
-#ifdef HAVE_LIBSMI
-#include <epan/oids.h>
-#endif
-#ifdef HAVE_GEOIP
-#include <epan/geoip_db.h>
-#endif
-#ifdef HAVE_LUA
-#include <epan/wslua/init_wslua.h>
-#endif
-#include "extcap.h"
-
-#include "../../log.h"
-#include "epan/register.h"
-
-#include "ui/last_open_dir.h"
-
-#include "ui/gtk/about_dlg.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/file_dlg.h"
-#include "ui/gtk/text_page_utils.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/plugins_dlg.h"
-#include "ui/gtk/stock_icons.h"
-#ifndef HAVE_GDK_GRESOURCE
-#include "ui/gtk/pixbuf-csource.h"
-#endif
-
-#include "webbrowser.h"
-
-/*
- * Update frequence for the splash screen, given in milliseconds.
- */
-int info_update_freq = 100;
-
-static void about_wireshark_destroy_cb(GtkWidget *, gpointer);
-
-
-/*
- * Keep a static pointer to the current "About Wireshark" window, if any, so
- * that if somebody tries to do "About Wireshark" while there's already an
- * "About Wireshark" window up, we just pop up the existing one, rather than
- * creating a new one.
- */
-static GtkWidget *about_wireshark_w;
-
-
-static void
-about_wireshark(GtkWidget *parent _U_, GtkWidget *main_vb)
-{
- GtkWidget *msg_label, *icon;
- gchar *message;
- const char *title = "Network Protocol Analyzer";
-
- /*icon = xpm_to_widget_from_parent(parent, wssplash_xpm);*/
-#ifdef HAVE_GDK_GRESOURCE
- icon = pixbuf_to_widget("/org/wireshark/image/wssplash_dev.png");
-#else
- icon = pixbuf_to_widget(wssplash_pb_data);
-#endif
-
- gtk_box_pack_start(GTK_BOX(main_vb), icon, TRUE, TRUE, 0);
-
-
- msg_label = gtk_label_new(title);
- message = g_strdup_printf("<span size=\"x-large\" weight=\"bold\">%s</span>", title);
- gtk_label_set_markup(GTK_LABEL(msg_label), message);
- g_free(message);
- gtk_box_pack_start(GTK_BOX(main_vb), msg_label, TRUE, TRUE, 0);
-}
-
-static void
-splash_update_label(GtkWidget *win, const char *message)
-{
- GtkWidget *main_lb;
-
- if (win == NULL) return;
-
- main_lb = (GtkWidget *)g_object_get_data(G_OBJECT(win), "splash_label");
- gtk_label_set_text(GTK_LABEL(main_lb), message);
-
- /* Process all pending GUI events before continuing, so that
- the splash screen window gets updated. */
- while (gtk_events_pending()) gtk_main_iteration();
-}
-
-GtkWidget*
-splash_new(const char *message)
-{
- GtkWidget *win;
- GtkWidget *main_lb;
-
- GtkWidget *main_box;
- GtkWidget *percentage_box;
- GtkWidget *prog_bar;
- GtkWidget *percentage_lb;
-
- win = splash_window_new();
-
- /* When calling about_wireshark(), we must realize the top-level
- widget for the window, otherwise GTK will throw a warning
- because we don't have a colormap associated with that window and
- can't handle the pixmap. */
- gtk_widget_realize(win);
-
- main_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_box), 24);
- gtk_container_add(GTK_CONTAINER(win), main_box);
-
-
- about_wireshark(win, main_box);
-
- main_lb = gtk_label_new(message);
- gtk_box_pack_start(GTK_BOX(main_box), main_lb, TRUE, TRUE, 0);
- g_object_set_data(G_OBJECT(win), "splash_label", main_lb);
-
- main_lb = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(main_box), main_lb, TRUE, TRUE, 0);
- g_object_set_data(G_OBJECT(win), "protocol_label", main_lb);
-
- percentage_box = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1, FALSE);
- gtk_box_pack_start(GTK_BOX(main_box), percentage_box, TRUE, TRUE, 3);
-
- prog_bar = gtk_progress_bar_new();
- gtk_box_pack_start(GTK_BOX(percentage_box), prog_bar, TRUE, TRUE, 3);
- g_object_set_data(G_OBJECT(win), "progress_bar", prog_bar);
-
- percentage_lb = gtk_label_new(" 0%");
- gtk_misc_set_alignment(GTK_MISC(percentage_lb), 0.0f, 0.0f);
- gtk_box_pack_start(GTK_BOX(percentage_box), percentage_lb, FALSE, TRUE, 3);
- g_object_set_data(G_OBJECT(win), "percentage_label", percentage_lb);
-
- gtk_widget_show_all(win);
-
- splash_update_label(win, message);
-
- return win;
-}
-
-void
-splash_update(register_action_e action, const char *message, gpointer client_data)
-{
- GtkWidget *win;
- GtkWidget *main_lb;
- GtkWidget *prog_bar;
- GtkWidget *percentage_lb;
- gfloat percentage;
- gulong ul_percentage;
- gchar tmp[100];
- const char *action_msg;
-
- static gulong ul_sofar = 0;
- static gulong ul_count = 0;
-
- static register_action_e last_action = RA_NONE;
-
- static GTimeVal cur_tv;
- static GTimeVal next_tv = {0, 0};
-
- win = (GtkWidget *)client_data;
-
- if (win == NULL) return;
-
- g_get_current_time(&cur_tv);
- if (last_action == action && cur_tv.tv_sec <= next_tv.tv_sec && cur_tv.tv_usec <= next_tv.tv_usec && ul_sofar < ul_count - 1) {
- /* Only update every splash_register_freq milliseconds */
- ul_sofar++;
- return;
- }
- memcpy(&next_tv, &cur_tv, sizeof(next_tv));
- next_tv.tv_usec += info_update_freq * 1000;
- if (next_tv.tv_usec >= 1000000) {
- next_tv.tv_sec++;
- next_tv.tv_usec -= 1000000;
- }
-
- if(last_action != action) {
- /* the action has changed */
- switch(action) {
- case RA_DISSECTORS:
- action_msg = "Initializing dissectors ...";
- break;
- case RA_LISTENERS:
- action_msg = "Initializing tap listeners ...";
- break;
- case RA_EXTCAP:
- action_msg = "Initializing extcap ...";
- break;
- case RA_REGISTER:
- action_msg = "Registering dissector ...";
- break;
- case RA_PLUGIN_REGISTER:
- action_msg = "Registering plugins ...";
- break;
- case RA_HANDOFF:
- action_msg = "Handing off dissector ...";
- break;
- case RA_PLUGIN_HANDOFF:
- action_msg = "Handing off plugins ...";
- break;
- case RA_LUA_PLUGINS:
- action_msg = "Loading Lua plugins ...";
- break;
- case RA_PREFERENCES:
- action_msg = "Loading module preferences ...";
- break;
- case RA_INTERFACES:
- action_msg = "Finding local interfaces ...";
- break;
- default:
- action_msg = "(Unknown action)";
- break;
- }
- splash_update_label(win, action_msg);
- last_action = action;
- }
-
- if(ul_count == 0) { /* get the count of dissectors */
- ul_count = register_count() + 6; /* additional 6 for:
- dissectors, listeners,
- registering plugins, handingoff plugins,
- preferences, and interfaces */
-#ifdef HAVE_LUA
- ul_count += wslua_count_plugins (); /* get count of lua plugins */
-#endif
- ul_count += extcap_count() + 1; /* Count of extcap binaries + registration message */
- }
-
- main_lb = (GtkWidget *)g_object_get_data(G_OBJECT(win), "protocol_label");
- /* make_dissector_reg.py changed -
- so we need to strip off the leading elements to get back to the protocol */
- if(message) {
- if(!strncmp(message, "proto_register_", 15))
- message += 15;
- else if(!strncmp(message, "proto_reg_handoff_", 18))
- message += 18;
- }
- gtk_label_set_text(GTK_LABEL(main_lb), message ? message : "");
-
- ul_sofar++;
-
- g_assert (ul_sofar <= ul_count);
-
- percentage = (gfloat)ul_sofar/(gfloat)ul_count;
- ul_percentage = (gulong)(percentage * 100);
-
- /* update progress bar */
- prog_bar = (GtkWidget *)g_object_get_data(G_OBJECT(win), "progress_bar");
- gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(prog_bar), percentage);
-
- percentage_lb = (GtkWidget *)g_object_get_data(G_OBJECT(win), "percentage_label");
- g_snprintf(tmp, sizeof(tmp), "%lu%%", ul_percentage);
- gtk_label_set_text((GtkLabel*)percentage_lb, tmp);
-
- /* Process all pending GUI events before continuing, so that
- the splash screen window gets updated. */
- while (gtk_events_pending()) gtk_main_iteration();
-
-}
-
-gboolean
-splash_destroy(GtkWidget *win)
-{
- if (win == NULL)
- return FALSE;
-
- gtk_widget_destroy(win);
- return FALSE;
-}
-
-static GtkWidget *
-about_wireshark_page_new(void)
-{
- GtkWidget *main_box, *msg_label /*, *icon*/;
- gchar *message;
- GString *comp_info_str, *runtime_info_str;
-
- main_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_box), 12);
-
- g_object_set(gtk_widget_get_settings(main_box),
- "gtk-label-select-on-focus", FALSE, NULL);
-
- about_wireshark(top_level, main_box);
-
- comp_info_str = get_compiled_version_info(get_wireshark_gtk_compiled_info,
- get_gui_compiled_info);
- runtime_info_str = get_runtime_version_info(get_wireshark_runtime_info);
-
- /* Construct the message string */
- message = g_strdup_printf(
- "Version %s\n"
- "\n"
- "%s"
- "\n"
- "%s"
- "\n"
- "%s"
- "\n"
- "Wireshark is Open Source Software released under the GNU General Public License.\n"
- "\n"
- "Check the man page and http://www.wireshark.org for more information.",
- get_ws_vcs_version_info(), get_copyright_info(), comp_info_str->str,
- runtime_info_str->str);
-
- msg_label = gtk_label_new(message);
- g_free(message);
- gtk_label_set_justify(GTK_LABEL(msg_label), GTK_JUSTIFY_FILL);
- gtk_label_set_selectable(GTK_LABEL(msg_label), TRUE);
- gtk_box_pack_start(GTK_BOX (main_box), msg_label, TRUE, TRUE, 0);
-
-
- return main_box;
-}
-
-static GtkWidget *
-about_authors_page_new(void)
-{
- GtkWidget *page;
- char *absolute_path;
-
- absolute_path = get_datafile_path("AUTHORS-SHORT");
- page = text_page_new(absolute_path);
-
- return page;
-}
-
-static gboolean about_folders_callback(GtkWidget *widget, GdkEventButton *event, gint id _U_)
-{
- GtkTreeSelection *tree_selection;
- GtkTreeModel *model;
- GtkTreeIter iter;
- gchar *path;
-
- tree_selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
-
- if(gtk_tree_selection_count_selected_rows(tree_selection) == 0)
- return FALSE;
-
- if(event->type != GDK_2BUTTON_PRESS)
- /* not a double click */
- return FALSE;
-
- if(gtk_tree_selection_get_selected (tree_selection, &model, &iter)) {
- gtk_tree_model_get(model, &iter, 1, &path, -1);
- filemanager_open_directory(path);
- g_free(path);
- }
-
- return TRUE;
-}
-
-static void
-about_folders_row(GtkWidget *table, const char *label, const char *dir, const char *tip)
-{
- simple_list_append(table, 0, label, 1, dir, 2, tip, -1);
-}
-
-static GtkWidget *
-about_folders_page_new(void)
-{
- GtkWidget *table;
- const char *constpath;
- char *path;
- static const gchar *titles[] = { "Name", "Folder", "Typical Files"};
- GtkWidget *scrolledwindow;
- gint i;
- gchar **resultArray;
-#if 0
- const gchar *const *dirs;
-#endif
-
- scrolledwindow = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow),
- GTK_SHADOW_IN);
-
- /* Container for our data */
- table = simple_list_new(3, titles);
-
- /* connect a callback so we can spot a double-click */
- g_signal_connect(table, "button_press_event",
- G_CALLBACK(about_folders_callback), NULL);
-
- simple_list_url_col(table, 1);
-
- /* "file open" */
- about_folders_row(table, "\"File\" dialogs", get_last_open_dir(),
- "capture files");
-
- /* temp */
- about_folders_row(table, "Temp", g_get_tmp_dir(),
- "untitled capture files");
-
- /* pers conf */
- path = get_persconffile_path("", FALSE);
- about_folders_row(table, "Personal configuration", path,
- "\"dfilters\", \"preferences\", \"ethers\", ...");
- g_free(path);
-
- /* global conf */
- constpath = get_datafile_dir();
- if (constpath != NULL) {
- about_folders_row(table, "Global configuration", constpath,
- "\"dfilters\", \"preferences\", \"manuf\", ...");
- }
-#if 0
- dirs = g_get_system_data_dirs ();
- for (i = 0; dirs[i]; i++){
- g_warning("glibs data path %u %s",i+1,dirs[i]);
- }
-#endif
- /* system */
- constpath = get_systemfile_dir();
- about_folders_row(table, "System", constpath,
- "\"ethers\", \"ipxnets\"");
-
- /* program */
- constpath = get_progfile_dir();
- about_folders_row(table, "Program", constpath,
- "program files");
-
-#ifdef HAVE_PLUGINS
- /* pers plugins */
- about_folders_row(table, "Personal Plugins", get_plugins_pers_dir_with_version(),
- "binary plugins");
-
- /* global plugins */
- about_folders_row(table, "Global Plugins", get_plugins_dir_with_version(),
- "binary plugins");
-#endif
-
-#ifdef HAVE_LUA
- /* pers plugins */
- about_folders_row(table, "Personal Lua Plugins", get_plugins_pers_dir(),
- "lua scripts");
-
- /* global plugins */
- about_folders_row(table, "Global Lua Plugins", get_plugins_dir(),
- "lua scripts");
-#endif
-
- /* extcap */
- constpath = get_extcap_dir();
-
- resultArray = g_strsplit(constpath, G_SEARCHPATH_SEPARATOR_S, 10);
-
- for(i = 0; resultArray[i]; i++)
- about_folders_row(table, "Extcap path", g_strstrip(resultArray[i]),
- "Extcap Plugins search path");
- g_strfreev(resultArray);
-
-#ifdef HAVE_GEOIP
- /* GeoIP */
- path = geoip_db_get_paths();
-
- resultArray = g_strsplit(path, G_SEARCHPATH_SEPARATOR_S, 10);
-
- for(i = 0; resultArray[i]; i++)
- about_folders_row(table, "GeoIP path", g_strstrip(resultArray[i]),
- "GeoIP database search path");
- g_strfreev(resultArray);
- g_free(path);
-#endif
-
-#ifdef HAVE_LIBSMI
- /* SMI MIBs/PIBs */
- path = oid_get_default_mib_path();
-
- resultArray = g_strsplit(path, G_SEARCHPATH_SEPARATOR_S, 20);
-
- for(i = 0; resultArray[i]; i++)
- about_folders_row(table, "MIB/PIB path", g_strstrip(resultArray[i]),
- "SMI MIB/PIB search path");
- g_strfreev(resultArray);
- g_free(path);
-#endif
-
- gtk_container_add(GTK_CONTAINER(scrolledwindow), table);
-
- return scrolledwindow;
-}
-
-static GtkWidget *
-about_license_page_new(void)
-{
- GtkWidget *page;
- char *absolute_path;
-
-#if defined(_WIN32)
- absolute_path = get_datafile_path("COPYING.txt");
-#else
- absolute_path = get_datafile_path("COPYING");
-#endif
- page = text_page_new(absolute_path);
-
- return page;
-}
-
-void
-about_wireshark_cb( GtkWidget *w _U_, gpointer data _U_ )
-{
- GtkWidget *main_box, *main_nb, *bbox, *ok_btn;
- GtkWidget *page_lb, *about_page, *folders_page;
-
-#if defined(HAVE_PLUGINS) || defined(HAVE_LUA)
- GtkWidget *plugins_page;
-#endif
-
- GtkWidget *authors_page, *license_page;
-
- if (about_wireshark_w != NULL) {
- /* There's already an "About Wireshark" dialog box; reactivate it. */
- reactivate_window(about_wireshark_w);
- return;
- }
-
- /*
- * XXX - use GtkDialog? The GNOME 2.x GnomeAbout widget does.
- * Should we use GtkDialog for simple_dialog() as well? Or
- * is the GTK+ 2.x GtkDialog appropriate but the 1.2[.x] one
- * not? (The GNOME 1.x GnomeAbout widget uses GnomeDialog.)
- */
- about_wireshark_w = dlg_window_new("About Wireshark");
- /* set the initial position (must be done, before show is called!) */
- /* default position is not appropriate for the about dialog */
- gtk_window_set_position(GTK_WINDOW(about_wireshark_w), GTK_WIN_POS_CENTER_ON_PARENT);
- gtk_window_set_default_size(GTK_WINDOW(about_wireshark_w), 600, 400);
- gtk_container_set_border_width(GTK_CONTAINER(about_wireshark_w), 6);
-
- main_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 12, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_box), 6);
- gtk_container_add(GTK_CONTAINER(about_wireshark_w), main_box);
-
- main_nb = gtk_notebook_new();
- gtk_box_pack_start(GTK_BOX(main_box), main_nb, TRUE, TRUE, 0);
-
- about_page = about_wireshark_page_new();
- page_lb = gtk_label_new("Wireshark");
- gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), about_page, page_lb);
-
- authors_page = about_authors_page_new();
- page_lb = gtk_label_new("Authors");
- gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), authors_page, page_lb);
-
- folders_page = about_folders_page_new();
- page_lb = gtk_label_new("Folders");
- gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), folders_page, page_lb);
-
-#if defined(HAVE_PLUGINS) || defined(HAVE_LUA)
- plugins_page = about_plugins_page_new();
- page_lb = gtk_label_new("Plugins");
- gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), plugins_page, page_lb);
-#endif
-
- license_page = about_license_page_new();
- page_lb = gtk_label_new("License");
- /* set a minmum width to avoid a lot of line breaks at the wrong places */
- gtk_widget_set_size_request(license_page, 600, -1);
- gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), license_page, page_lb);
-
- /* Button row */
- bbox = dlg_button_row_new(GTK_STOCK_OK, NULL);
- gtk_box_pack_start(GTK_BOX(main_box), bbox, FALSE, FALSE, 0);
-
- ok_btn = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- gtk_widget_grab_focus(ok_btn);
- gtk_widget_grab_default(ok_btn);
- window_set_cancel_button(about_wireshark_w, ok_btn, window_cancel_button_cb);
-
- g_signal_connect(about_wireshark_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(about_wireshark_w, "destroy", G_CALLBACK(about_wireshark_destroy_cb), NULL);
-
- gtk_widget_show_all(about_wireshark_w);
- window_present(about_wireshark_w);
-}
-
-static void
-about_wireshark_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
-{
- /* Note that we no longer have an "About Wireshark" dialog box. */
- about_wireshark_w = NULL;
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local Variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/about_dlg.h b/ui/gtk/about_dlg.h
deleted file mode 100644
index 271c5ed12e..0000000000
--- a/ui/gtk/about_dlg.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* about_dlg.h
- * Declarations of routines for the "About" dialog
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __ABOUT_DLG_H__
-#define __ABOUT_DLG_H__
-
-/** @file
- * "About" dialog box.
- * @ingroup dialog_group
- */
-
-/** Create a splash screen showed when Wireshark is started.
- *
- * @param message the new message to be displayed
- * @return the newly created window handle
- */
-extern GtkWidget *splash_new(const char *message);
-
-/** Update the splash screen message when loading dissectors and handoffs
- *
- * @param action the initialisation action being performed
- * @param message additional information
- * @param call_data the window handle from splash_new()
- */
-extern void splash_update(register_action_e action, const char *message, void *call_data);
-
-/** Destroy the splash screen.
- *
- * @param win the window handle from splash_new()
- * @return always FALSE, so this function can be used as a callback for gtk_timeout_add()
- */
-extern gboolean splash_destroy(GtkWidget *win);
-
-/** User requested the "About" dialog box by menu or toolbar.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-extern void about_wireshark_cb( GtkWidget *widget, gpointer data);
-
-
-#endif /* __ABOUT_DLG_H__ */
diff --git a/ui/gtk/addr_resolution_dlg.c b/ui/gtk/addr_resolution_dlg.c
deleted file mode 100644
index 77580470cb..0000000000
--- a/ui/gtk/addr_resolution_dlg.c
+++ /dev/null
@@ -1,344 +0,0 @@
-/* addr_resolution_dlg.c
- * Show current address resolution as a hosts file
- *
- * Copyright 2012 Anders Broman <anders.broman@ericsson.com>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/addr_resolv.h>
-#include <epan/wmem/wmem.h>
-
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/font_utils.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/addr_resolution_dlg.h"
-
-#include "globals.h"
-
-static GtkWidget *addr_resolution_dlg_w = NULL;
-
-
-#define ADDRESS_STR_MAX 1024
-
-static void
-eth_hash_to_texbuff(gpointer key, gpointer value, gpointer user_data)
-{
- gchar string_buff[ADDRESS_STR_MAX];
- GtkTextBuffer *buffer = (GtkTextBuffer*)user_data;
- guint8 *eth_addr = (guint8*)key;
- hashether_t* tp = (hashether_t*)value;
-
- g_snprintf(string_buff, ADDRESS_STR_MAX, "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X Status: %u %s %s\n",
- eth_addr[0], eth_addr[1], eth_addr[2],
- eth_addr[3], eth_addr[4], eth_addr[5],
- get_hash_ether_status(tp),
- get_hash_ether_hexaddr(tp),
- get_hash_ether_resolved_name(tp));
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
-}
-static void
-manuf_hash_to_texbuff(gpointer key, gpointer value, gpointer user_data)
-{
- gchar string_buff[ADDRESS_STR_MAX];
- GtkTextBuffer *buffer = (GtkTextBuffer*)user_data;
- hashmanuf_t *manuf = (hashmanuf_t*)value;
- int eth_as_gint = *(int*)key;
-
- g_snprintf(string_buff, ADDRESS_STR_MAX, "%.2X:%.2X:%.2X %s\n",eth_as_gint>>16, (eth_as_gint>>8)&0xff, eth_as_gint&0xff, get_hash_manuf_resolved_name(manuf));
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
-}
-
-static void
-wka_hash_to_texbuff(gpointer key, gpointer value, gpointer user_data)
-{
- gchar string_buff[ADDRESS_STR_MAX];
- GtkTextBuffer *buffer = (GtkTextBuffer*)user_data;
- gchar *name = (gchar *)value;
- guint8 *eth_addr = (guint8*)key;
-
- g_snprintf(string_buff, ADDRESS_STR_MAX, "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X %s\n",
- eth_addr[0], eth_addr[1], eth_addr[2],
- eth_addr[3], eth_addr[4], eth_addr[5],
- name);
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
-}
-
-static void
-serv_port_hash_to_texbuff(gpointer key, gpointer value, gpointer user_data)
-{
- gchar string_buff[ADDRESS_STR_MAX];
- GtkTextBuffer *buffer = (GtkTextBuffer*)user_data;
- serv_port_t *serv_port_table = (serv_port_t *)value;
- int port = *(int*)key;
-
- g_snprintf(string_buff, ADDRESS_STR_MAX, "Port %u \n"" TCP %s\n"" UDP %s\n"" SCTP %s\n"" DCCP %s\n",
- port,
- serv_port_table->tcp_name,
- serv_port_table->udp_name,
- serv_port_table->sctp_name,
- serv_port_table->dccp_name);
-
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
-}
-
-static void
-ipv4_hash_table_to_texbuff(gpointer key, gpointer value, gpointer user_data)
-{
- gchar string_buff[ADDRESS_STR_MAX];
- GtkTextBuffer *buffer = (GtkTextBuffer*)user_data;
- hashipv4_t *ipv4_hash_table_entry = (hashipv4_t *)value;
- int addr = GPOINTER_TO_UINT(key);
-
- g_snprintf(string_buff, ADDRESS_STR_MAX, "Key:0x%x IP: %s, Name: %s\n",
- addr,
- ipv4_hash_table_entry->ip,
- ipv4_hash_table_entry->name);
-
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
-}
-
-static void
-ipv4_hash_table_resolved_to_texbuff(gpointer key _U_, gpointer value, gpointer user_data)
-{
- gchar string_buff[ADDRESS_STR_MAX];
- GtkTextBuffer *buffer = (GtkTextBuffer*)user_data;
- hashipv4_t *ipv4_hash_table_entry = (hashipv4_t *)value;
-
- if((ipv4_hash_table_entry->flags & NAME_RESOLVED)){
- g_snprintf(string_buff, ADDRESS_STR_MAX, "%s\t%s\n",
- ipv4_hash_table_entry->ip,
- ipv4_hash_table_entry->name);
-
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
- }
-
-}
-
-
-
-static void
-ipv6_hash_table_to_texbuff(gpointer key _U_, gpointer value, gpointer user_data)
-{
- gchar string_buff[ADDRESS_STR_MAX];
- GtkTextBuffer *buffer = (GtkTextBuffer*)user_data;
- hashipv6_t *ipv6_hash_table_entry = (hashipv6_t *)value;
-
- g_snprintf(string_buff, ADDRESS_STR_MAX, "IP: %s, Name: %s\n",
- ipv6_hash_table_entry->ip6,
- ipv6_hash_table_entry->name);
-
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
-}
-
-static void
-ipv6_hash_table_resolved_to_texbuff(gpointer key _U_, gpointer value, gpointer user_data)
-{
- gchar string_buff[ADDRESS_STR_MAX];
- GtkTextBuffer *buffer = (GtkTextBuffer*)user_data;
- hashipv6_t *ipv6_hash_table_entry = (hashipv6_t *)value;
-
- if((ipv6_hash_table_entry->flags & NAME_RESOLVED)){
- g_snprintf(string_buff, ADDRESS_STR_MAX, "%s\t%s\n",
- ipv6_hash_table_entry->ip6,
- ipv6_hash_table_entry->name);
-
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
- }
-
-}
-
-static void
-addres_resolution_to_texbuff(GtkTextBuffer *buffer)
-{
- gchar string_buff[ADDRESS_STR_MAX];
- wmem_map_t *manuf_hashtable;
- wmem_map_t *wka_hashtable;
- wmem_map_t *eth_hashtable;
- wmem_map_t *serv_port_hashtable;
- wmem_map_t *ipv4_hash_table;
- wmem_map_t *ipv6_hash_table;
-
- g_snprintf(string_buff, ADDRESS_STR_MAX, "# Hosts information in Wireshark \n#\n");
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
- g_snprintf(string_buff, ADDRESS_STR_MAX, "# Host data gathered from %s\n\n", cfile.filename);
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- /* Dump the v4 addresses first, then v6 */
- ipv4_hash_table = get_ipv4_hash_table();
- if(ipv4_hash_table){
- wmem_map_foreach( ipv4_hash_table, ipv4_hash_table_resolved_to_texbuff, buffer);
- }
-
- ipv6_hash_table = get_ipv6_hash_table();
- if(ipv6_hash_table){
- wmem_map_foreach( ipv6_hash_table, ipv6_hash_table_resolved_to_texbuff, buffer);
- }
-
- g_snprintf(string_buff, ADDRESS_STR_MAX, "\n\n# Address resolution IPv4 Hash table \n#\n");
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- if(ipv4_hash_table){
- g_snprintf(string_buff, ADDRESS_STR_MAX, "# With %i entries\n#\n", wmem_map_size(ipv4_hash_table));
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
- wmem_map_foreach( ipv4_hash_table, ipv4_hash_table_to_texbuff, buffer);
- }
-
- g_snprintf(string_buff, ADDRESS_STR_MAX, "\n\n# Address resolution IPv6 Hash table \n#\n");
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- if(ipv6_hash_table){
- g_snprintf(string_buff, ADDRESS_STR_MAX, "# With %i entries\n#\n", wmem_map_size(ipv6_hash_table));
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
- wmem_map_foreach( ipv6_hash_table, ipv6_hash_table_to_texbuff, buffer);
- }
-
-
- g_snprintf(string_buff, ADDRESS_STR_MAX, "\n\n# Port names information in Wireshark \n#\n");
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- serv_port_hashtable = get_serv_port_hashtable();
- if(serv_port_hashtable){
- g_snprintf(string_buff, ADDRESS_STR_MAX, "# With %i entries\n#\n", wmem_map_size(serv_port_hashtable));
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
- wmem_map_foreach( serv_port_hashtable, serv_port_hash_to_texbuff, buffer);
- }
-
- g_snprintf(string_buff, ADDRESS_STR_MAX, "\n\n# Eth names information in Wireshark \n#\n");
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- eth_hashtable = get_eth_hashtable();
- if(eth_hashtable){
- g_snprintf(string_buff, ADDRESS_STR_MAX, "# With %i entries\n#\n", wmem_map_size(eth_hashtable));
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
- wmem_map_foreach( eth_hashtable, eth_hash_to_texbuff, buffer);
- }
-
- g_snprintf(string_buff, ADDRESS_STR_MAX, "\n\n# Manuf information in Wireshark \n#\n");
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- manuf_hashtable = get_manuf_hashtable();
- if(manuf_hashtable){
- g_snprintf(string_buff, ADDRESS_STR_MAX, "# With %i entries\n#\n", wmem_map_size(manuf_hashtable));
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
- wmem_map_foreach( manuf_hashtable, manuf_hash_to_texbuff, buffer);
- }
-
- g_snprintf(string_buff, ADDRESS_STR_MAX, "\n\n# wka information in Wireshark \n#\n");
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- wka_hashtable = get_wka_hashtable();
- if(wka_hashtable){
- g_snprintf(string_buff, ADDRESS_STR_MAX, "# With %i entries\n#\n", wmem_map_size(wka_hashtable));
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
- wmem_map_foreach( wka_hashtable, wka_hash_to_texbuff, buffer);
- }
-
-
-}
-
-void
-addr_resolution_dlg (GtkAction *action _U_, gpointer data _U_)
-{
-
- GtkWidget *vbox;
- GtkWidget *view;
- GtkWidget *scroll;
- GtkWidget *bbox;
- GtkWidget *ok_bt, *cancel_bt, *help_bt;
- GtkTextBuffer *buffer;
-
- addr_resolution_dlg_w = dlg_window_new ("Address Resolution");
- gtk_widget_set_size_request (addr_resolution_dlg_w, 750, 350);
- gtk_window_set_resizable (GTK_WINDOW (addr_resolution_dlg_w), TRUE);
- gtk_container_set_border_width (GTK_CONTAINER (addr_resolution_dlg_w), DLG_OUTER_MARGIN);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
- gtk_container_add (GTK_CONTAINER (addr_resolution_dlg_w), vbox);
- gtk_widget_show (vbox);
-
- view = gtk_text_view_new ();
- gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view), GTK_WRAP_WORD);
- buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
-#if GTK_CHECK_VERSION(3, 0, 0)
- gtk_widget_override_font(view, user_font_get_regular());
-#else
- gtk_widget_modify_font(view, user_font_get_regular());
-#endif
- gtk_widget_show (view);
-
- scroll = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll),
- GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- gtk_container_add(GTK_CONTAINER(scroll), view);
- gtk_widget_show(scroll);
- gtk_box_pack_start(GTK_BOX (vbox), scroll, TRUE, TRUE, 0);
-
- /* Get the address list */
- addres_resolution_to_texbuff(buffer);
-
- /* Button row. */
- bbox = dlg_button_row_new (GTK_STOCK_OK, GTK_STOCK_CANCEL, GTK_STOCK_HELP, NULL);
- gtk_box_pack_end (GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
-
- ok_bt = (GtkWidget *)g_object_get_data (G_OBJECT(bbox), GTK_STOCK_OK);
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(window_cancel_button_cb), addr_resolution_dlg_w); /* act as cxl */
- gtk_widget_set_sensitive (ok_bt, TRUE);
-
- cancel_bt = (GtkWidget *)g_object_get_data (G_OBJECT(bbox), GTK_STOCK_CANCEL);
- window_set_cancel_button (addr_resolution_dlg_w, cancel_bt, window_cancel_button_cb);
-
- help_bt = (GtkWidget *)g_object_get_data (G_OBJECT(bbox), GTK_STOCK_HELP);
-#if 0
- g_signal_connect (help_bt, "clicked",/* G_CALLBACK(topic_cb)*/NULL, /*(gpointer)HELP_MANUAL_ADDR_RESOLVE_DIALOG*/NULL);
-#endif
- gtk_widget_set_sensitive (help_bt, FALSE);
-
- gtk_widget_grab_default (ok_bt);
- /*g_signal_connect (addr_resolution_dlg_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);*/
-
-
- gtk_widget_show (addr_resolution_dlg_w);
-}
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/addr_resolution_dlg.h b/ui/gtk/addr_resolution_dlg.h
deleted file mode 100644
index 8442b27f24..0000000000
--- a/ui/gtk/addr_resolution_dlg.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* addr_resolution_dlg.h
- * Show current addres resolution as a hosts file
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __ADDR_RESOLUTION_DLG_H__
-#define __ADDR_RESOLUTION_DLG_H__
-
-void addr_resolution_dlg (GtkAction *action, gpointer data);
-
-#endif /* __ADDR_RESOLUTION_DLG_H__ */
diff --git a/ui/gtk/airpcap_dlg.c b/ui/gtk/airpcap_dlg.c
deleted file mode 100644
index 1dc52436f2..0000000000
--- a/ui/gtk/airpcap_dlg.c
+++ /dev/null
@@ -1,2697 +0,0 @@
-/* airpcap_dlg.c
- *
- * Giorgio Tino <giorgio.tino@cacetech.com>
- * Copyright (c) CACE Technologies, LLC 2006
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 2000 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#ifdef HAVE_AIRPCAP
-
-#include <gtk/gtk.h>
-
-#include <string.h>
-
-#include <wsutil/filesystem.h>
-
-#include <epan/prefs.h>
-#include <epan/crypt/wep-wpadefs.h>
-
-#include <wsutil/wspcap.h>
-
-#include "ui/simple_dialog.h"
-
-#include "ui/gtk/main.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dfilter_expr_dlg.h"
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/keys.h"
-#include "ui/gtk/old-gtk-compat.h"
-#include "ui/gtk/packet_win.h"
-
-#include <caputils/airpcap.h>
-#include <caputils/airpcap_loader.h>
-#include "airpcap_gui_utils.h"
-#include "airpcap_dlg.h"
-
-/*
- * Callback for the select row event in the key list widget
- */
-static void
-on_key_list_select_row(GtkTreeSelection *selection, gpointer data)
-{
- GtkWidget *add_new_key_bt, *edit_key_bt, *remove_key_bt;
- GtkWidget *move_key_up_bt, *move_key_down_bt;
- GtkTreeIter iter;
- GtkTreeModel *model;
- GtkTreePath *path, *path_up, *path_down;
-
- add_new_key_bt = (GtkWidget *)g_object_get_data(G_OBJECT(data), AIRPCAP_KEY_MGMT_NEW_KEY);
- edit_key_bt = (GtkWidget *)g_object_get_data(G_OBJECT(data), AIRPCAP_KEY_MGMT_EDIT_KEY);
- remove_key_bt = (GtkWidget *)g_object_get_data(G_OBJECT(data), AIRPCAP_KEY_MGMT_DELETE_KEY);
- move_key_up_bt = (GtkWidget *)g_object_get_data(G_OBJECT(data), AIRPCAP_KEY_MGMT_UP_KEY);
- move_key_down_bt = (GtkWidget *)g_object_get_data(G_OBJECT(data), AIRPCAP_KEY_MGMT_DOWN_KEY);
-
- if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
- path = gtk_tree_model_get_path(model, &iter);
- path_up = gtk_tree_path_copy(path);
- path_down = gtk_tree_path_copy(path);
- gtk_tree_path_next(path_down);
-
- if (gtk_tree_model_iter_n_children(model, NULL) >= MAX_ENCRYPTION_KEYS) {
- gtk_widget_set_sensitive(add_new_key_bt, FALSE);
- } else {
- gtk_widget_set_sensitive(add_new_key_bt, TRUE);
- }
-
- gtk_widget_set_sensitive(edit_key_bt, TRUE);
- gtk_widget_set_sensitive(remove_key_bt, TRUE);
-
- /* ...and we have to use two different methods to figure out first/last because? */
- if (gtk_tree_path_prev(path_up)) {
- gtk_widget_set_sensitive(move_key_up_bt, TRUE);
- } else {
- gtk_widget_set_sensitive(move_key_up_bt, FALSE);
- }
-
- if (gtk_tree_model_get_iter(model, &iter, path_down)) {
- gtk_widget_set_sensitive(move_key_down_bt, TRUE);
- } else {
- gtk_widget_set_sensitive(move_key_down_bt, FALSE);
- }
-
- gtk_tree_path_free(path);
- gtk_tree_path_free(path_up);
- gtk_tree_path_free(path_down);
- } else {
- gtk_widget_set_sensitive(add_new_key_bt, FALSE);
- gtk_widget_set_sensitive(edit_key_bt, FALSE);
- gtk_widget_set_sensitive(remove_key_bt, FALSE);
- gtk_widget_set_sensitive(move_key_up_bt, FALSE);
- gtk_widget_set_sensitive(move_key_down_bt, FALSE);
- }
-}
-/*
- * Callback for the select row event in the key list widget
- */
-static void
-on_key_list_reorder(GtkTreeModel *model _U_, GtkTreePath *path _U_, GtkTreeIter *iter _U_, gpointer no _U_, gpointer data) {
- GtkTreeSelection *selection;
-
- selection = (GtkTreeSelection *)g_object_get_data(G_OBJECT(data), AIRPCAP_ADVANCED_EDIT_KEY_SELECTION_KEY);
- on_key_list_select_row(selection, data);
-}
-
-/*
- * Callback for the crc checkbox
- */
-static void
-on_fcs_ck_toggled(GtkWidget *w _U_, gpointer user_data _U_)
-
-{
- if (airpcap_if_selected != NULL)
- {
- if (airpcap_if_selected->IsFcsPresent)
- {
- airpcap_if_selected->IsFcsPresent = FALSE;
- airpcap_if_selected->saved = FALSE;
- }
- else
- {
- airpcap_if_selected->IsFcsPresent = TRUE;
- airpcap_if_selected->saved = FALSE;
- }
- }
-}
-
-/*
- * Callback for the wrong crc combo
- */
-static void
-on_edit_type_cb_changed(GtkWidget *w, gpointer data)
-{
- GtkWidget *edit_key_w;
- GtkWidget *edit_ssid_te;
- GtkWidget *type_cb;
- GtkWidget *key_lb;
- GtkWidget *ssid_lb;
-
- gchar* type_text = NULL;
-
- edit_key_w = GTK_WIDGET(data);
- type_cb = w;
-
- edit_ssid_te = (GtkWidget *)g_object_get_data(G_OBJECT(edit_key_w),AIRPCAP_ADVANCED_EDIT_KEY_SSID_KEY);
- key_lb = (GtkWidget *)g_object_get_data(G_OBJECT(edit_key_w),AIRPCAP_ADVANCED_EDIT_KEY_KEY_LABEL_KEY);
- ssid_lb = (GtkWidget *)g_object_get_data(G_OBJECT(edit_key_w),AIRPCAP_ADVANCED_EDIT_KEY_SSID_LABEL_KEY);
-
- type_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(type_cb));
-
- if (g_ascii_strcasecmp(type_text, ""))
- {
- /*
- * If it is a WEP key, no SSID is required! Gray out the entry text so
- * it doesn't create confusion ...
- */
- if (g_ascii_strcasecmp(type_text,AIRPCAP_WEP_KEY_STRING) == 0)
- {
- gtk_widget_set_sensitive(edit_ssid_te,FALSE);
- /*
- * Maybe the user has already entered some text into the SSID field
- * and then switched to WEP...
- */
- gtk_entry_set_text(GTK_ENTRY(edit_ssid_te),"");
- gtk_label_set_text(GTK_LABEL(key_lb),"Key");
- gtk_label_set_text(GTK_LABEL(ssid_lb),"");
- }
- else if (g_ascii_strcasecmp(type_text,AIRPCAP_WPA_BIN_KEY_STRING) == 0)
- {
- gtk_widget_set_sensitive(edit_ssid_te,FALSE);
- /*
- * Maybe the user has already entered some text into the SSID field
- * and then switched to WPA...
- */
- gtk_entry_set_text(GTK_ENTRY(edit_ssid_te),"");
- gtk_label_set_text(GTK_LABEL(key_lb),"Key");
- gtk_label_set_text(GTK_LABEL(ssid_lb),"");
- }
- else if (g_ascii_strcasecmp(type_text,AIRPCAP_WPA_PWD_KEY_STRING) == 0)
- {
- gtk_widget_set_sensitive(edit_ssid_te,TRUE);
- /*
- * Maybe the user has already entered some text into the SSID field
- * and then switched to WPA...
- */
- gtk_entry_set_text(GTK_ENTRY(edit_ssid_te),"");
- gtk_label_set_text(GTK_LABEL(key_lb),"Passphrase");
- gtk_label_set_text(GTK_LABEL(ssid_lb),"SSID");
- }
- }
- gtk_widget_show(edit_ssid_te);
-
- g_free(type_text);
-}
-
-/*
- * Callback for the wrong crc combo
- */
-static void
-on_add_type_cb_changed(GtkWidget *w, gpointer data)
-{
- GtkWidget *add_key_w;
- GtkWidget *add_ssid_te;
- GtkWidget *type_cb;
- GtkWidget *key_lb;
- GtkWidget *ssid_lb;
-
- gchar* type_text = NULL;
-
- add_key_w = GTK_WIDGET(data);
- type_cb = w;
-
- add_ssid_te = (GtkWidget *)g_object_get_data(G_OBJECT(add_key_w),AIRPCAP_ADVANCED_ADD_KEY_SSID_KEY);
- key_lb = (GtkWidget *)g_object_get_data(G_OBJECT(add_key_w),AIRPCAP_ADVANCED_ADD_KEY_KEY_LABEL_KEY);
- ssid_lb = (GtkWidget *)g_object_get_data(G_OBJECT(add_key_w),AIRPCAP_ADVANCED_ADD_KEY_SSID_LABEL_KEY);
-
- type_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(type_cb));
-
- if (g_ascii_strcasecmp(type_text, ""))
- {
- /*
- * If it is a WEP key, no SSID is required! Gray out rhe entry text so
- * it doesn't create confusion ...
- */
- if (g_ascii_strcasecmp(type_text,AIRPCAP_WEP_KEY_STRING) == 0)
- {
- gtk_widget_set_sensitive(add_ssid_te,FALSE);
- /*
- * Maybe the user has already entered some text into the SSID field
- * and then switched to WEP...
- */
- gtk_entry_set_text(GTK_ENTRY(add_ssid_te),"");
- gtk_label_set_text(GTK_LABEL(key_lb),"Key");
- gtk_label_set_text(GTK_LABEL(ssid_lb),"");
- }
- else if (g_ascii_strcasecmp(type_text,AIRPCAP_WPA_BIN_KEY_STRING) == 0)
- {
- gtk_widget_set_sensitive(add_ssid_te,FALSE);
- /*
- * Maybe the user has already entered some text into the SSID field
- * and then switched to WPA...
- */
- gtk_entry_set_text(GTK_ENTRY(add_ssid_te),"");
- gtk_label_set_text(GTK_LABEL(key_lb),"Key");
- gtk_label_set_text(GTK_LABEL(ssid_lb),"");
- }
- else if (g_ascii_strcasecmp(type_text,AIRPCAP_WPA_PWD_KEY_STRING) == 0)
- {
- gtk_widget_set_sensitive(add_ssid_te,TRUE);
- /*
- * Maybe the user has already entered some text into the SSID field
- * and then switched to WPA...
- */
- gtk_entry_set_text(GTK_ENTRY(add_ssid_te),"");
- gtk_label_set_text(GTK_LABEL(key_lb),"Passphrase");
- gtk_label_set_text(GTK_LABEL(ssid_lb),"SSID");
- }
- }
- gtk_widget_show(add_ssid_te);
-
- g_free(type_text);
-}
-
-/*
- * Callback for the wrong crc combo
- */
-static void
-on_fcs_filter_cb_changed(GtkWidget *fcs_filter_cb, gpointer data _U_)
-{
- gchar *fcs_filter_str;
-
- if (fcs_filter_cb != NULL)
- {
- fcs_filter_str = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(fcs_filter_cb));
- if (fcs_filter_str && (g_ascii_strcasecmp("", fcs_filter_str)))
- {
- airpcap_if_selected->CrcValidationOn = airpcap_get_validation_type(fcs_filter_str);
- airpcap_if_selected->saved = FALSE;
- }
- g_free(fcs_filter_str);
- }
-}
-
-
-/*
- * Changed callback for the capture type combobox
- */
-static void
-on_capture_type_cb_changed(GtkWidget *cb, gpointer user_data _U_)
-{
- gchar *s;
-
- if (cb == NULL) {
- return;
- }
-
- s = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(cb));
-
- if ((g_ascii_strcasecmp("",s)))
- {
- airpcap_if_selected->linkType = airpcap_get_link_type(s);
- airpcap_if_selected->saved = FALSE;
- }
- g_free(s);
-}
-
-/*
- * Thread function used to blink the led
- */
-static gboolean
-update_blink(gpointer data)
-{
- airpcap_if_info_t* sel;
- PAirpcapHandle ad;
- gchar ebuf[AIRPCAP_ERRBUF_SIZE];
-
- sel = (airpcap_if_info_t*)data;
-
- ad = airpcap_if_open(sel->name, ebuf);
- if (ad)
- {
- if (sel->led)
- {
- airpcap_if_turn_led_off(ad, 0);
- sel->led = FALSE;
- }
- else
- {
- airpcap_if_turn_led_on(ad, 0);
- sel->led = TRUE;
- }
- airpcap_if_close(ad);
- }
- return TRUE;
-}
-
-/*
- * Blink button callback
- */
-static void
-on_blink_bt_clicked( GtkWidget *blink_bt, gpointer data _U_)
-{
- PAirpcapHandle ad = NULL;
- gchar ebuf[AIRPCAP_ERRBUF_SIZE];
-
- if (airpcap_if_selected != NULL) {
- if (!(airpcap_if_selected->blinking))
- {
- gtk_button_set_label(GTK_BUTTON(blink_bt),"Stop Blinking");
- airpcap_if_selected->tag = g_timeout_add(500,update_blink,airpcap_if_selected);
- airpcap_if_selected->blinking = TRUE;
- }
- else
- {
- gtk_button_set_label(GTK_BUTTON(blink_bt)," Blink Led ");
- g_source_remove(airpcap_if_selected->tag);
- airpcap_if_selected->blinking = FALSE;
- /* Switch on the led! */
- ad = airpcap_if_open(airpcap_if_selected->name, ebuf);
- if (ad)
- {
- g_source_remove(airpcap_if_selected->tag);
- airpcap_if_turn_led_on(ad, 0);
- airpcap_if_selected->blinking = FALSE;
- airpcap_if_selected->led = TRUE;
- airpcap_if_close(ad);
- }
- }
- }
-}
-
-/*
- * Callback for the 'Any' adapter What's This button.
- */
-static void
-on_what_s_this_bt_clicked( GtkWidget *blink_bt _U_, gpointer data _U_)
-{
- simple_dialog(ESD_TYPE_INFO,ESD_BTN_OK,
- "The Multi-Channel Aggregator is a virtual device "
- "that can be used to capture packets from all the "
- "AirPcap adapters at the same time.\n"
- "The Capture Type, FCS and Encryption settings of "
- "this virtual device can be configured as for any "
- "real adapter.\nThe channel cannot be changed for "
- "this adapter.\n"
- "Refer to the AirPcap manual for more information.");
-}
-
-/* the window was closed, cleanup things */
-static void
-on_key_management_destroy(GtkWidget *w _U_, gpointer data)
-{
- GtkWidget *airpcap_advanced_w,
- *toolbar;
-
- gint *from_widget = NULL;
-
- /* Retrieve the GUI object pointers */
- airpcap_advanced_w = GTK_WIDGET(data);
-
- toolbar = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_TOOLBAR_KEY));
-
- /* ... */
- from_widget = (gint*)g_object_get_data(G_OBJECT(toolbar),AIRPCAP_ADVANCED_FROM_KEY);
- /* gray out the toolbar (if we came here from the toolbar advanced button)*/
- if ( *from_widget == AIRPCAP_ADVANCED_FROM_TOOLBAR)
- gtk_widget_set_sensitive(toolbar,TRUE);
- else
- gtk_widget_set_sensitive(toolbar,FALSE);
-
- g_free(from_widget);
-
- /* reload the configuration!!! Configuration has not been saved but
- the corresponding structure has been modified probably...*/
- if (airpcap_if_selected != NULL)
- {
- if (!airpcap_if_selected->saved)
- {
- airpcap_load_selected_if_configuration(airpcap_if_selected);
- }
- }
-
-}
-
-/* the Advenced wireless Settings window was closed, cleanup things */
-static void
-on_airpcap_advanced_destroy(GtkWidget *w _U_, gpointer data)
-{
- GtkWidget *airpcap_advanced_w,
- *toolbar;
-
- gint *from_widget = NULL;
-
- /* Retrieve the GUI object pointers */
- airpcap_advanced_w = GTK_WIDGET(data);
-
- toolbar = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_TOOLBAR_KEY));
-
- /* ... */
- from_widget = (gint*)g_object_get_data(G_OBJECT(toolbar),AIRPCAP_ADVANCED_FROM_KEY);
- /* gray out the toolbar (if we came here from the toolbar advanced button)*/
- if ( *from_widget == AIRPCAP_ADVANCED_FROM_TOOLBAR)
- gtk_widget_set_sensitive(toolbar,TRUE);
- else
- gtk_widget_set_sensitive(toolbar,FALSE);
-
- g_free(from_widget);
-
- /* reload the configuration!!! Configuration has not been saved but
- the corresponding structure has been modified probably...*/
- if (!airpcap_if_selected->saved)
- {
- airpcap_load_selected_if_configuration(airpcap_if_selected);
- }
-}
-
-/*
- * Callback for the 'Apply' button.
- */
-/*
- * XXX - Pressing 'Apply' has the same effect as pressing 'OK' -- you
- * can't revert back to the old set of keys by pressing 'Cancel'. We
- * either need to fix reversion or get rid of the 'Apply' button.
- */
-static void
-on_key_management_apply_bt_clicked(GtkWidget *button _U_, gpointer data)
-{
- /* advenced window */
- GtkWidget *key_management_w;
-
- /* widgets in the toolbar */
- GtkWidget *toolbar_cb;
- GtkWidget *decryption_mode_cb;
-
- GtkListStore *key_list_store;
-
- module_t *wlan_module = prefs_find_module("wlan");
- gchar *decryption_mode_string;
-
- /* retrieve main window */
- key_management_w = GTK_WIDGET(data);
- decryption_mode_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_DECRYPTION_MODE_KEY));
- key_list_store = GTK_LIST_STORE(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY));
- toolbar_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_TOOLBAR_DECRYPTION_KEY));
-
-#define CANT_SAVE_ERR_STR "Cannot save configuration. Another application " \
- "might be using AirPcap, or you might not have sufficient privileges."
- /* Set the Decryption Mode */
-
- decryption_mode_string = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(decryption_mode_cb));
- if (g_ascii_strcasecmp(decryption_mode_string, AIRPCAP_DECRYPTION_TYPE_STRING_WIRESHARK) == 0)
- {
- set_wireshark_decryption(TRUE);
- if (!set_airpcap_decryption(FALSE)) g_warning(CANT_SAVE_ERR_STR);
- }
- else if (g_ascii_strcasecmp(decryption_mode_string, AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP) == 0)
- {
- set_wireshark_decryption(FALSE);
- if (!set_airpcap_decryption(TRUE)) g_warning(CANT_SAVE_ERR_STR);
- }
- else if (g_ascii_strcasecmp(decryption_mode_string, AIRPCAP_DECRYPTION_TYPE_STRING_NONE) == 0)
- {
- set_wireshark_decryption(FALSE);
- if (!set_airpcap_decryption(FALSE)) g_warning(CANT_SAVE_ERR_STR);
- }
- g_free(decryption_mode_string);
-
- /* Save the configuration */
- airpcap_read_and_save_decryption_keys_from_list_store(key_list_store,airpcap_if_selected,g_airpcap_if_list); /* This will save the keys for every adapter */
-
- /* The update will make redissect al the packets... no need to do it here again */
- update_decryption_mode(toolbar_cb);
-
- /* Redissect all the packets, and re-evaluate the display filter. */
- prefs_apply(wlan_module);
-}
-
-/*
- * Callback used to add a WEP key in the add new key box;
- */
-static void
-on_add_key_ok_bt_clicked(GtkWidget *widget _U_, gpointer data)
-{
- GtkWidget *type_cb,
- *key_en,
- *ssid_en;
-
- GtkListStore *key_list_store;
-
- GString *new_type_string,
- *new_key_string,
- *new_ssid_string;
-
- gchar *type_entered = NULL;
- gchar *key_entered = NULL;
- gchar *ssid_entered = NULL;
-
- unsigned int i;
-
- key_list_store = (GtkListStore *)g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_ADD_KEY_LIST_KEY);
- type_cb = (GtkWidget *)g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_ADD_KEY_TYPE_KEY);
- key_en = (GtkWidget *)g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_ADD_KEY_KEY_KEY);
- ssid_en = (GtkWidget *)g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_ADD_KEY_SSID_KEY);
-
- type_entered = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(type_cb));
- key_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(key_en)));
- ssid_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(ssid_en)));
-
- /* Check if key is correct */
- new_type_string = g_string_new(type_entered);
- new_key_string = g_string_new(key_entered);
- new_ssid_string = g_string_new(ssid_entered);
-
- g_free(type_entered);
- g_free(key_entered );
- g_free(ssid_entered);
-
- g_strstrip(new_key_string->str);
- g_strstrip(new_ssid_string->str);
-
- /* Check which type of key the user has entered */
- if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WEP_KEY_STRING) == 0) /* WEP key */
- {
-
- if ( ((new_key_string->len) > WEP_KEY_MAX_CHAR_SIZE) || ((new_key_string->len) < WEP_KEY_MIN_CHAR_SIZE))
- {
- simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WEP key size out of range.\nValid key size range is %d-%d characters (%d-%d bits).",WEP_KEY_MIN_CHAR_SIZE,WEP_KEY_MAX_CHAR_SIZE,WEP_KEY_MIN_BIT_SIZE,WEP_KEY_MAX_BIT_SIZE);
-
- g_string_free(new_type_string,TRUE);
- g_string_free(new_key_string, TRUE);
- g_string_free(new_ssid_string,TRUE);
-
- return;
- }
-
- if ((new_key_string->len % 2) != 0)
- {
- simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WEP key.\nThe number of characters must be even.");
-
- g_string_free(new_type_string,TRUE);
- g_string_free(new_key_string, TRUE);
- g_string_free(new_ssid_string,TRUE);
-
- return;
- }
-
- for (i = 0; i < new_key_string->len; i++)
- {
- if (!g_ascii_isxdigit(new_key_string->str[i]))
- {
- simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WEP key.\nA WEP key must be a hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
-
- g_string_free(new_type_string,TRUE);
- g_string_free(new_key_string, TRUE);
- g_string_free(new_ssid_string,TRUE);
-
- return;
- }
- }
-
- /* If so... add key */
- airpcap_add_key_to_list(key_list_store, new_type_string->str, new_key_string->str, new_ssid_string->str);
-
- if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
- }
- else if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WPA_PWD_KEY_STRING) == 0) /* WPA Key */
- {
- /* XXX - Perform some WPA related input fields check */
- /* If everything is ok, modify the entry in the list */
-
- if ( ((new_key_string->len) > WPA_KEY_MAX_CHAR_SIZE) || ((new_key_string->len) < WPA_KEY_MIN_CHAR_SIZE))
- {
- simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WPA key size out of range.\nValid key size range is %d-%d ASCII characters (%d-%d bits).",WPA_KEY_MIN_CHAR_SIZE,WPA_KEY_MAX_CHAR_SIZE,WPA_KEY_MIN_BIT_SIZE,WPA_KEY_MAX_BIT_SIZE);
-
- g_string_free(new_type_string,TRUE);
- g_string_free(new_key_string, TRUE);
- g_string_free(new_ssid_string,TRUE);
-
- return;
- }
-
- /*
- * XXX - Maybe we need some check on the characters? I'm not sure if only standard ASCII are ok...
- */
- if ((new_ssid_string->len) > WPA_SSID_MAX_CHAR_SIZE)
- {
- simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"SSID key size out of range.\nValid SSID size range is %d-%d ASCII characters (%d-%d bits).",WPA_SSID_MIN_CHAR_SIZE,WPA_SSID_MAX_CHAR_SIZE,WPA_SSID_MIN_BIT_SIZE,WPA_SSID_MAX_BIT_SIZE);
-
- g_string_free(new_type_string,TRUE);
- g_string_free(new_key_string, TRUE);
- g_string_free(new_ssid_string,TRUE);
-
- return;
- }
-
- /* If so... add key */
- airpcap_add_key_to_list(key_list_store, new_type_string->str, new_key_string->str, new_ssid_string->str);
-
- if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
- }
- else if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WPA_BIN_KEY_STRING) == 0) /* WPA_BIN Key */
- {
- /* XXX - Perform some WPA_BIN related input fields check */
- /* If everything is ok, modify the entry int he list */
-
- if ( ((new_key_string->len) != WPA_PSK_KEY_CHAR_SIZE))
- {
- simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WPA PSK/PMK key size is wrong.\nValid key size is %d characters (%d bits).",WPA_PSK_KEY_CHAR_SIZE,WPA_PSK_KEY_BIT_SIZE);
-
- g_string_free(new_type_string,TRUE);
- g_string_free(new_key_string, TRUE);
- g_string_free(new_ssid_string,TRUE);
-
- return;
- }
-
- for (i = 0; i < new_key_string->len; i++)
- {
- if (!g_ascii_isxdigit(new_key_string->str[i]))
- {
- simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WPA PSK/PMK key.\nKey must be an hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
-
- g_string_free(new_type_string,TRUE);
- g_string_free(new_key_string, TRUE);
- g_string_free(new_ssid_string,TRUE);
-
- return;
- }
- }
-
- /* If so... add key */
- airpcap_add_key_to_list(key_list_store, new_type_string->str, new_key_string->str, new_ssid_string->str);
-
- if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
- }
- else /* Should never happen!!! */
- {
- simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Unknown error in the key \"Type\" field.");
- }
-
- g_string_free(new_type_string,TRUE);
- g_string_free(new_key_string, TRUE);
- g_string_free(new_ssid_string,TRUE);
-
- window_destroy(GTK_WIDGET(data));
- return;
-}
-
-/*
- * Callback used to edit a WEP key in the edit key box;
- */
-static void
-on_edit_key_ok_bt_clicked(GtkWidget *widget _U_, gpointer data)
-{
- GtkWidget *type_cb,
- *key_en,
- *ssid_en;
-
- GtkListStore *key_list_store;
- GtkTreeSelection *selection;
- GtkTreeIter iter;
-
- GString *new_type_string,
- *new_key_string,
- *new_ssid_string;
-
- gchar *type_entered = NULL;
- gchar *key_entered = NULL;
- gchar *ssid_entered = NULL;
-
- unsigned int i;
-
- key_list_store = (GtkListStore *)g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_EDIT_KEY_LIST_KEY);
- selection = (GtkTreeSelection *)g_object_get_data(G_OBJECT(data), AIRPCAP_ADVANCED_EDIT_KEY_SELECTION_KEY);
- type_cb = (GtkWidget *)g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_EDIT_KEY_TYPE_KEY);
- key_en = (GtkWidget *)g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_EDIT_KEY_KEY_KEY);
- ssid_en = (GtkWidget *)g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_EDIT_KEY_SSID_KEY);
-
- if (!gtk_tree_selection_get_selected(selection, NULL, &iter))
- return;
-
- type_entered = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(type_cb));
- key_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(key_en)));
- ssid_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(ssid_en)));
-
- g_strstrip(key_entered);
- g_strstrip(ssid_entered);
-
- /* Check if key is correct */
- new_type_string = g_string_new(type_entered);
- new_key_string = g_string_new(key_entered);
- new_ssid_string = g_string_new(ssid_entered);
-
- g_free(type_entered);
- g_free(key_entered );
- g_free(ssid_entered);
-
- /* Check which type of key the user has entered */
- if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WEP_KEY_STRING) == 0) /* WEP key */
- {
-
- if ( ((new_key_string->len) > WEP_KEY_MAX_CHAR_SIZE) || ((new_key_string->len) < WEP_KEY_MIN_CHAR_SIZE))
- {
- simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WEP key size out of range.\nValid key size range is %d-%d characters (%d-%d bits).",WEP_KEY_MIN_CHAR_SIZE,WEP_KEY_MAX_CHAR_SIZE,WEP_KEY_MIN_BIT_SIZE,WEP_KEY_MAX_BIT_SIZE);
-
- g_string_free(new_type_string,TRUE);
- g_string_free(new_key_string, TRUE);
- g_string_free(new_ssid_string,TRUE);
-
- return;
- }
-
- if ((new_key_string->len % 2) != 0)
- {
- simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WEP key.\nThe number of characters must be even.");
-
- g_string_free(new_type_string,TRUE);
- g_string_free(new_key_string, TRUE);
- g_string_free(new_ssid_string,TRUE);
-
- return;
- }
-
- for (i = 0; i < new_key_string->len; i++)
- {
- if (!g_ascii_isxdigit(new_key_string->str[i]))
- {
- simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WEP key.\nA WEP key must be an hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
-
- g_string_free(new_type_string,TRUE);
- g_string_free(new_key_string, TRUE);
- g_string_free(new_ssid_string,TRUE);
-
- return;
- }
- }
-
- /* If so... Modify key */
- gtk_list_store_set(key_list_store, &iter,
- KL_COL_TYPE, new_type_string->str,
- KL_COL_KEY, new_key_string->str,
- KL_COL_SSID, new_ssid_string->str,
- -1);
-
- if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
- }
- else if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WPA_PWD_KEY_STRING) == 0) /* WPA Key */
- {
- /* XXX - Perform some WPA related input fields check */
- /* If everything is ok, modify the entry in the list */
-
- if ( ((new_key_string->len) > WPA_KEY_MAX_CHAR_SIZE) || ((new_key_string->len) < WPA_KEY_MIN_CHAR_SIZE))
- {
- simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WPA key size out of range.\nValid key size range is %d-%d ASCII characters (%d-%d bits).",WPA_KEY_MIN_CHAR_SIZE,WPA_KEY_MAX_CHAR_SIZE,WPA_KEY_MIN_BIT_SIZE,WPA_KEY_MAX_BIT_SIZE);
-
- g_string_free(new_type_string,TRUE);
- g_string_free(new_key_string, TRUE);
- g_string_free(new_ssid_string,TRUE);
-
- return;
- }
-
- /*
- * XXX - Maybe we need some check on the characters? I'm not sure if only standard ASCII are ok...
- */
- if ((new_ssid_string->len) > WPA_SSID_MAX_CHAR_SIZE)
- {
- simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"SSID key size out of range.\nValid SSID size range is %d-%d ASCII characters (%d-%d bits).",WPA_SSID_MIN_CHAR_SIZE,WPA_SSID_MAX_CHAR_SIZE,WPA_SSID_MIN_BIT_SIZE,WPA_SSID_MAX_BIT_SIZE);
-
- g_string_free(new_type_string,TRUE);
- g_string_free(new_key_string, TRUE);
- g_string_free(new_ssid_string,TRUE);
-
- return;
- }
-
- /* If so... Modify key */
- gtk_list_store_set(key_list_store, &iter,
- KL_COL_TYPE, new_type_string->str,
- KL_COL_KEY, new_key_string->str,
- KL_COL_SSID, new_ssid_string->str,
- -1);
-
- if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
- }
- else if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WPA_BIN_KEY_STRING) == 0) /* WPA_BIN Key */
- {
- /* XXX - Perform some WPA_BIN related input fields check */
- /* If everything is ok, modify the entry in the list */
-
- if ( ((new_key_string->len) != WPA_PSK_KEY_CHAR_SIZE))
- {
- simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WPA PSK/PMK key size is wrong.\nValid key size is %d characters (%d bits).",WPA_PSK_KEY_CHAR_SIZE,WPA_PSK_KEY_BIT_SIZE);
-
- g_string_free(new_type_string,TRUE);
- g_string_free(new_key_string, TRUE);
- g_string_free(new_ssid_string,TRUE);
-
- return;
- }
-
- for (i = 0; i < new_key_string->len; i++)
- {
- if (!g_ascii_isxdigit(new_key_string->str[i]))
- {
- simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WPA PSK/PMK key.\nKey must be an hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
-
- g_string_free(new_type_string,TRUE);
- g_string_free(new_key_string, TRUE);
- g_string_free(new_ssid_string,TRUE);
-
- return;
- }
- }
-
- /* If so... Modify key */
- gtk_list_store_set(key_list_store, &iter,
- KL_COL_TYPE, new_type_string->str,
- KL_COL_KEY, new_key_string->str,
- KL_COL_SSID, new_ssid_string->str,
- -1);
-
- if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
- }
- else /* Should never happen!!! */
- {
- simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Unknown error in the key \"Type\" field.");
- }
-
- g_string_free(new_type_string,TRUE);
- g_string_free(new_key_string, TRUE);
- g_string_free(new_ssid_string,TRUE);
-
- window_destroy(GTK_WIDGET(data));
- return;
-}
-
-/*
- * Add key window destroy callback
- */
-static void
-on_add_key_w_destroy(GtkWidget *button _U_, gpointer data)
-{
- GtkWidget *airpcap_advanced_w;
-
- airpcap_advanced_w = GTK_WIDGET(data);
-
- gtk_widget_set_sensitive(GTK_WIDGET(airpcap_advanced_w),TRUE);
-
- return;
-}
-
-/*
- * Callback for the 'Add Key' button.
- */
-static void
-on_add_new_key_bt_clicked(GtkWidget *button _U_, gpointer data)
-{
- GtkWidget *add_key_window;
- GtkWidget *add_frame;
- GtkWidget *main_v_box;
- GtkWidget *add_grid;
- GtkWidget *add_frame_al;
- GtkWidget *add_type_cb;
- GtkWidget *add_key_te;
- GtkWidget *add_ssid_te;
- GtkWidget *add_type_lb;
- GtkWidget *add_key_lb;
- GtkWidget *add_ssid_lb;
- GtkWidget *low_h_button_box;
- GtkWidget *ok_bt;
- GtkWidget *cancel_bt;
- GtkWidget *add_frame_lb;
-
- GtkWidget *airpcap_advanced_w;
-
- GtkListStore *key_list_store;
-
- airpcap_advanced_w = GTK_WIDGET(data);
-
- key_list_store = (GtkListStore *)g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
-
- if (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(key_list_store), NULL) >= MAX_ENCRYPTION_KEYS)
- {
- simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Maximum number (%d) of decryption keys reached. You cannot add another key.\n",MAX_ENCRYPTION_KEYS);
- return;
- }
-
- /* Gray out the Advanced Wireless Setting window */
- gtk_widget_set_sensitive(airpcap_advanced_w,FALSE);
-
- /* Pop-up a new window */
- add_key_window = dlg_window_new ("Add Decryption Key");
- gtk_window_set_modal(GTK_WINDOW(add_key_window), TRUE);
- gtk_window_set_transient_for(GTK_WINDOW(add_key_window), GTK_WINDOW(airpcap_advanced_w));
- gtk_widget_set_name (add_key_window, "add_key_window");
- gtk_container_set_border_width (GTK_CONTAINER (add_key_window), 5);
- gtk_window_set_resizable (GTK_WINDOW (add_key_window), FALSE);
-
- main_v_box = ws_gtk_box_new (GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_widget_set_name (main_v_box, "main_v_box");
- gtk_widget_show (main_v_box);
- gtk_container_add (GTK_CONTAINER (add_key_window), main_v_box);
-
- add_frame = gtk_frame_new (NULL);
- gtk_widget_set_name (add_frame, "add_frame");
- gtk_widget_show (add_frame);
- gtk_box_pack_start (GTK_BOX (main_v_box), add_frame, TRUE, TRUE, 0);
-
- add_frame_al = gtk_alignment_new (0.5f, 0.5f, 1, 1);
- gtk_widget_set_name (add_frame_al, "add_frame_al");
- gtk_widget_show (add_frame_al);
- gtk_container_add (GTK_CONTAINER (add_frame), add_frame_al);
- gtk_alignment_set_padding (GTK_ALIGNMENT (add_frame_al), 0, 0, 12, 0);
-
- add_grid = ws_gtk_grid_new ();
- gtk_widget_set_name (add_grid, "add_tb");
- gtk_container_set_border_width(GTK_CONTAINER(add_grid),5);
- gtk_widget_show (add_grid);
- gtk_container_add (GTK_CONTAINER (add_frame_al), add_grid);
-
- add_type_lb = gtk_label_new ("Type");
- gtk_widget_set_name (add_type_lb, "add_type_lb");
- gtk_widget_show (add_type_lb);
- ws_gtk_grid_attach_defaults (GTK_GRID (add_grid), add_type_lb, 0, 0, 1, 1);
- gtk_label_set_justify (GTK_LABEL (add_type_lb), GTK_JUSTIFY_CENTER);
-
- add_key_lb = gtk_label_new ("Key");
- gtk_widget_set_name (add_key_lb, "add_key_lb");
- gtk_widget_show (add_key_lb);
- ws_gtk_grid_attach_defaults (GTK_GRID (add_grid), add_key_lb, 1, 0, 1, 1);
- gtk_label_set_justify (GTK_LABEL (add_key_lb), GTK_JUSTIFY_CENTER);
-
- add_ssid_lb = gtk_label_new ("");
- gtk_widget_set_name (add_ssid_lb, "add_ssid_lb");
- /* XXX - Decomment only when WPA and WPA_BIN will be ready */
- gtk_widget_show (add_ssid_lb);
- ws_gtk_grid_attach_defaults (GTK_GRID (add_grid), add_ssid_lb, 2, 0, 1, 1);
- gtk_label_set_justify (GTK_LABEL (add_ssid_lb), GTK_JUSTIFY_CENTER);
-
- add_type_cb = gtk_combo_box_text_new();
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(add_type_cb), AIRPCAP_WEP_KEY_STRING);
-
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(add_type_cb), AIRPCAP_WPA_PWD_KEY_STRING);
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(add_type_cb), AIRPCAP_WPA_BIN_KEY_STRING);
- gtk_combo_box_set_active(GTK_COMBO_BOX(add_type_cb), 0);
- gtk_widget_set_name (add_type_cb, "add_type_cb");
- gtk_widget_show (add_type_cb);
- ws_gtk_grid_attach_defaults (GTK_GRID (add_grid), add_type_cb, 0, 1, 1, 1);
- gtk_widget_set_size_request (add_type_cb, 83, -1);
-
- add_key_te = gtk_entry_new ();
- gtk_widget_set_name (add_key_te, "add_key_te");
-
- gtk_widget_show (add_key_te);
- ws_gtk_grid_attach_defaults (GTK_GRID (add_grid), add_key_te, 1, 1, 1, 1);
- gtk_widget_set_size_request (add_key_te, 178, -1);
-
- add_ssid_te = gtk_entry_new ();
- gtk_widget_set_name (add_ssid_te, "add_ssid_te");
- gtk_widget_set_sensitive(add_ssid_te,FALSE);
- /* XXX - Decomment only when WPA and WPA_BIN will be ready */
- gtk_widget_show (add_ssid_te);
- ws_gtk_grid_attach_defaults (GTK_GRID (add_grid), add_ssid_te, 2, 1, 1, 1);
- low_h_button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
- gtk_widget_set_name (low_h_button_box, "low_h_button_box");
- gtk_container_set_border_width (GTK_CONTAINER (low_h_button_box), 5);
- gtk_widget_show (low_h_button_box);
- gtk_box_pack_end (GTK_BOX (main_v_box), low_h_button_box, FALSE, FALSE, 0);
- gtk_button_box_set_layout (GTK_BUTTON_BOX (low_h_button_box),
- GTK_BUTTONBOX_END);
-
- ok_bt = gtk_button_new_with_mnemonic ("OK");
- gtk_widget_set_name (ok_bt, "ok_bt");
- gtk_widget_show (ok_bt);
- gtk_container_add (GTK_CONTAINER (low_h_button_box), ok_bt);
- gtk_widget_set_can_default (ok_bt, TRUE);
-
- cancel_bt = gtk_button_new_with_mnemonic ("Cancel");
- gtk_widget_set_name (cancel_bt, "cancel_bt");
- gtk_widget_show (cancel_bt);
- gtk_container_add (GTK_CONTAINER (low_h_button_box), cancel_bt);
- gtk_widget_set_can_default (cancel_bt, TRUE);
-
- add_frame_lb = gtk_label_new ("<b>Modify Selected Key</b>");
- gtk_widget_set_name (add_frame_lb, "add_frame_lb");
- gtk_widget_show (add_frame_lb);
- gtk_frame_set_label_widget (GTK_FRAME (add_frame), add_frame_lb);
- gtk_label_set_use_markup (GTK_LABEL (add_frame_lb), TRUE);
-
- /* Add callbacks */
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(on_add_key_ok_bt_clicked), add_key_window );
- g_signal_connect(cancel_bt, "clicked", G_CALLBACK(window_cancel_button_cb), add_key_window );
- g_signal_connect(add_type_cb, "changed", G_CALLBACK(on_add_type_cb_changed), add_key_window);
- g_signal_connect(add_key_window, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(add_key_window, "destroy", G_CALLBACK(on_add_key_w_destroy), data);
-
- /* Add widget data */
- g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_LIST_KEY,key_list_store);
- g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_TYPE_KEY,add_type_cb);
- g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_KEY_KEY,add_key_te);
- g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_SSID_KEY,add_ssid_te);
- g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_KEY_LABEL_KEY,add_key_lb);
- g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_SSID_LABEL_KEY,add_ssid_lb);
-
- gtk_widget_show(add_key_window);
-}
-
-/*
- * Edit key window destroy callback
- */
-static void
-on_edit_key_w_destroy(GtkWidget *button _U_, gpointer data)
-{
- GtkWidget *airpcap_advanced_w;
-
- airpcap_advanced_w = GTK_WIDGET(data);
-
- gtk_widget_set_sensitive(GTK_WIDGET(airpcap_advanced_w),TRUE);
-
- return;
-}
-
-/*
- * Callback for the 'Remove Key' button.
- */
-static void
-on_remove_key_bt_clicked(GtkWidget *button _U_, gpointer data)
-{
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkTreeSelection *selection;
-
- /* retrieve needed stuff */
- selection = (GtkTreeSelection *)g_object_get_data(G_OBJECT(data), AIRPCAP_ADVANCED_EDIT_KEY_SELECTION_KEY);
-
- if (!gtk_tree_selection_get_selected(selection, &model, &iter))
- return;
-
- /* Remove selected key */
- gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
- gtk_tree_selection_select_iter(selection, &iter);
- /* XXX - select the last item if needed? */
-
- /* Need to save config... */
- if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
-}
-
-/*
- * Callback for the 'Edit Key' button.
- */
-static void
-on_edit_key_bt_clicked(GtkWidget *button _U_, gpointer data)
-{
- GtkWidget *edit_key_window;
- GtkWidget *edit_frame;
- GtkWidget *main_v_box;
- GtkWidget *edit_grid;
- GtkWidget *edit_frame_al;
- GtkWidget *edit_type_cb;
- GtkWidget *edit_key_te;
- GtkWidget *edit_ssid_te;
- GtkWidget *edit_type_lb;
- GtkWidget *edit_key_lb;
- GtkWidget *edit_ssid_lb;
- GtkWidget *low_h_button_box;
- GtkWidget *ok_bt;
- GtkWidget *cancel_bt;
- GtkWidget *edit_frame_lb;
-
- GtkWidget *airpcap_advanced_w;
-
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkTreeSelection *selection;
-
- /* Key List Store */
- GtkListStore *key_list_store;
-
- gchar *row_type,
- *row_key,
- *row_ssid = NULL;
-
- airpcap_advanced_w = GTK_WIDGET(data);
-
- /* Retrieve the selected item... if no row is selected, this is null... */
- selection = (GtkTreeSelection *)g_object_get_data(G_OBJECT(data), AIRPCAP_ADVANCED_EDIT_KEY_SELECTION_KEY);
- key_list_store = (GtkListStore *)g_object_get_data (G_OBJECT(data), AIRPCAP_ADVANCED_KEYLIST_KEY);
-
-
- if (!gtk_tree_selection_get_selected(selection, &model, &iter))
- return;
-
- gtk_tree_model_get(model, &iter,
- KL_COL_TYPE, &row_type,
- KL_COL_KEY, &row_key,
- KL_COL_SSID, &row_ssid,
- -1);
-
- /* Gray out the Advanced Wireless Setting window */
- gtk_widget_set_sensitive(airpcap_advanced_w,FALSE);
-
- /* Pop-up a new window */
- edit_key_window = dlg_window_new("Edit Decryption Key");
- gtk_window_set_modal(GTK_WINDOW(edit_key_window), TRUE);
- gtk_window_set_transient_for(GTK_WINDOW(edit_key_window), GTK_WINDOW(airpcap_advanced_w));
- gtk_widget_set_name (edit_key_window, "edit_key_window");
- gtk_container_set_border_width (GTK_CONTAINER (edit_key_window), 5);
- gtk_window_set_resizable (GTK_WINDOW (edit_key_window), FALSE);
-
- main_v_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_widget_set_name (main_v_box, "main_v_box");
- gtk_widget_show (main_v_box);
- gtk_container_add (GTK_CONTAINER (edit_key_window), main_v_box);
-
- edit_frame = gtk_frame_new (NULL);
- gtk_widget_set_name (edit_frame, "edit_frame");
- gtk_widget_show (edit_frame);
- gtk_box_pack_start (GTK_BOX (main_v_box), edit_frame, TRUE, TRUE, 0);
-
- edit_frame_al = gtk_alignment_new (0.5f, 0.5f, 1, 1);
- gtk_widget_set_name (edit_frame_al, "edit_frame_al");
- gtk_widget_show (edit_frame_al);
- gtk_container_add (GTK_CONTAINER (edit_frame), edit_frame_al);
- gtk_alignment_set_padding (GTK_ALIGNMENT (edit_frame_al), 0, 0, 12, 0);
-
- edit_grid = ws_gtk_grid_new();
-
- gtk_widget_set_name (edit_grid, "edit_tb");
- gtk_container_set_border_width(GTK_CONTAINER(edit_grid),5);
- gtk_widget_show (edit_grid);
- gtk_container_add (GTK_CONTAINER (edit_frame_al), edit_grid);
-
- edit_type_lb = gtk_label_new ("Type");
- gtk_widget_set_name (edit_type_lb, "edit_type_lb");
- gtk_widget_show (edit_type_lb);
- ws_gtk_grid_attach_defaults (GTK_GRID (edit_grid), edit_type_lb, 0, 0, 1, 1);
- gtk_label_set_justify (GTK_LABEL (edit_type_lb), GTK_JUSTIFY_CENTER);
-
- edit_key_lb = gtk_label_new ("Key");
- gtk_widget_set_name (edit_key_lb, "edit_key_lb");
- gtk_widget_show (edit_key_lb);
- ws_gtk_grid_attach_defaults (GTK_GRID (edit_grid), edit_key_lb, 1, 0, 1, 1);
- gtk_label_set_justify (GTK_LABEL (edit_key_lb), GTK_JUSTIFY_CENTER);
-
- edit_ssid_lb = gtk_label_new ("");
- gtk_widget_set_name (edit_ssid_lb, "edit_ssid_lb");
- /* XXX - Decomment only when WPA and WPA_BIN will be ready */
- gtk_widget_show (edit_ssid_lb);
- ws_gtk_grid_attach_defaults (GTK_GRID (edit_grid), edit_ssid_lb, 2, 0, 1, 1);
- gtk_label_set_justify (GTK_LABEL (edit_ssid_lb), GTK_JUSTIFY_CENTER);
-
- edit_type_cb = gtk_combo_box_text_new();
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(edit_type_cb), AIRPCAP_WEP_KEY_STRING);
-
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(edit_type_cb), AIRPCAP_WPA_PWD_KEY_STRING);
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(edit_type_cb), AIRPCAP_WPA_BIN_KEY_STRING);
- /* Set current type */
- gtk_combo_box_set_active(GTK_COMBO_BOX(edit_type_cb), 0);
- if (g_ascii_strcasecmp(row_type, AIRPCAP_WPA_PWD_KEY_STRING) == 0) {
- gtk_combo_box_set_active(GTK_COMBO_BOX(edit_type_cb), 1);
- } else if (g_ascii_strcasecmp(row_type, AIRPCAP_WPA_BIN_KEY_STRING) == 0) {
- gtk_combo_box_set_active(GTK_COMBO_BOX(edit_type_cb), 2);
- }
- gtk_widget_set_name (edit_type_cb, "edit_type_cb");
- gtk_widget_show (edit_type_cb);
- ws_gtk_grid_attach_defaults (GTK_GRID (edit_grid), edit_type_cb, 0, 1, 1, 1);
- gtk_widget_set_size_request (edit_type_cb, 83, -1);
-
- edit_key_te = gtk_entry_new ();
- gtk_widget_set_name (edit_key_te, "edit_key_te");
- /* Set current key */
- gtk_entry_set_text(GTK_ENTRY(edit_key_te),row_key);
- gtk_widget_show (edit_key_te);
- ws_gtk_grid_attach_defaults (GTK_GRID (edit_grid), edit_key_te, 1, 1, 1, 1);
- gtk_widget_set_size_request (edit_key_te, 178, -1);
-
- edit_ssid_te = gtk_entry_new ();
- gtk_widget_set_name (edit_ssid_te, "edit_ssid_te");
-
- /* Set current ssid (if key type is not WEP!)*/
- if (g_ascii_strcasecmp(row_type,AIRPCAP_WEP_KEY_STRING) == 0)
- {
- gtk_widget_set_sensitive(edit_ssid_te,FALSE);
- }
- else
- {
- gtk_widget_set_sensitive(edit_ssid_te,TRUE);
- gtk_entry_set_text(GTK_ENTRY(edit_ssid_te),row_ssid?row_ssid:"");
- }
-
- /* XXX - Decomment only when WPA and WPA@ will be ready */
- gtk_widget_show (edit_ssid_te);
- ws_gtk_grid_attach_defaults (GTK_GRID (edit_grid), edit_ssid_te, 2, 1, 1, 1);
-
- low_h_button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
- gtk_widget_set_name (low_h_button_box, "low_h_button_box");
- gtk_container_set_border_width (GTK_CONTAINER (low_h_button_box), 5);
- gtk_widget_show (low_h_button_box);
- gtk_box_pack_end (GTK_BOX (main_v_box), low_h_button_box, FALSE, FALSE, 0);
- gtk_button_box_set_layout (GTK_BUTTON_BOX (low_h_button_box),
- GTK_BUTTONBOX_END);
-
- ok_bt = gtk_button_new_with_mnemonic ("OK");
- gtk_widget_set_name (ok_bt, "ok_bt");
- gtk_widget_show (ok_bt);
- gtk_container_add (GTK_CONTAINER (low_h_button_box), ok_bt);
- gtk_widget_set_can_default (ok_bt, TRUE);
-
- cancel_bt = gtk_button_new_with_mnemonic ("Cancel");
- gtk_widget_set_name (cancel_bt, "cancel_bt");
- gtk_widget_show (cancel_bt);
- gtk_container_add (GTK_CONTAINER (low_h_button_box), cancel_bt);
- gtk_widget_set_can_default (cancel_bt, TRUE);
-
- edit_frame_lb = gtk_label_new ("<b>Modify Selected Key</b>");
- gtk_widget_set_name (edit_frame_lb, "edit_frame_lb");
- gtk_widget_show (edit_frame_lb);
- gtk_frame_set_label_widget (GTK_FRAME (edit_frame), edit_frame_lb);
- gtk_label_set_use_markup (GTK_LABEL (edit_frame_lb), TRUE);
-
- /* Add callbacks */
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(on_edit_key_ok_bt_clicked), edit_key_window );
- g_signal_connect(cancel_bt, "clicked", G_CALLBACK(window_cancel_button_cb), edit_key_window );
- g_signal_connect(edit_type_cb, "changed", G_CALLBACK(on_edit_type_cb_changed), edit_key_window);
- g_signal_connect(edit_key_window, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(edit_key_window, "destroy", G_CALLBACK(on_edit_key_w_destroy), data);
-
- /* Add widget data */
- g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_LIST_KEY,key_list_store);
- g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_SELECTION_KEY,selection);
- g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_TYPE_KEY,edit_type_cb);
- g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_KEY_KEY,edit_key_te);
- g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_SSID_KEY,edit_ssid_te);
- g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_KEY_LABEL_KEY,edit_key_lb);
- g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_SSID_LABEL_KEY,edit_ssid_lb);
-
-
- g_free(row_type);
- g_free(row_key);
- g_free(row_ssid);
- gtk_widget_show(edit_key_window);
-}
-
-/*
- * Callback for the 'Move Key Up' button.
- */
-static void
-on_move_key_up_bt_clicked(GtkWidget *button _U_, gpointer key_list)
-{
- tree_view_list_store_move_selection(GTK_TREE_VIEW(key_list), TRUE);
-}
-
-/*
- * Callback for the 'Move Key Down' button.
- */
-static void
-on_move_key_down_bt_clicked(GtkWidget *button _U_, gpointer list_view)
-{
- tree_view_list_store_move_selection(GTK_TREE_VIEW(list_view), FALSE);
-}
-
-/* Turns the decryption on or off */
-void
-on_decryption_mode_cb_changed(GtkWidget *cb, gpointer data _U_)
-{
- gint cur_active;
-
- if (cb == NULL) {
- return;
- }
-
- cur_active = gtk_combo_box_get_active(GTK_COMBO_BOX(cb));
-
- if (cur_active < 0) {
- return;
- }
-
- switch(cur_active) {
- /* XXX - Don't use magic numbers here */
- case 1: /* Wireshark */
- set_wireshark_decryption(TRUE);
- if (!set_airpcap_decryption(FALSE)) g_warning(CANT_SAVE_ERR_STR);
- break;
- case 2: /* Driver */
- set_wireshark_decryption(FALSE);
- if (!set_airpcap_decryption(TRUE)) g_warning(CANT_SAVE_ERR_STR);
- break;
- default:
- set_wireshark_decryption(FALSE);
- if (!set_airpcap_decryption(FALSE)) g_warning(CANT_SAVE_ERR_STR);
- break;
- }
-
- /* Redissect all the packets, and re-evaluate the display filter. */
- redissect_packets();
- redissect_all_packet_windows();
-}
-
-/*
- * Selects the current decryption mode string in the decryption mode combo box
- */
-void
-update_decryption_mode(GtkWidget *cb)
-{
- if (cb == NULL) {
- return;
- }
-
- /* Wireshark decryption is on */
- if (wireshark_decryption_on())
- {
- gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 1);
- }
- /* AirPcap decryption is on */
- else if (airpcap_decryption_on())
- {
- gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 2);
- }
- /* No decryption enabled */
- else
- {
- gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 0);
- }
-
- return;
-}
-
-/*
- * Creates the list of available decryption modes, depending on the adapters found
- */
-void
-update_decryption_mode_list(GtkWidget *cb)
-{
- gchar *current_text;
-
- if (cb == NULL)
- return;
-
- current_text = NULL;
-
- /*
- * XXX - Retrieve the current 'decryption mode'. It would be better just block the
- * signal handler, but it doesn't work... one of these days I'll try to figure out why...
- */
- current_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(cb));
-
- while (gtk_tree_model_iter_n_children(gtk_combo_box_get_model(GTK_COMBO_BOX(cb)), NULL) > 0) {
- gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(cb), 0);
- }
-
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(cb), AIRPCAP_DECRYPTION_TYPE_STRING_NONE);
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(cb), AIRPCAP_DECRYPTION_TYPE_STRING_WIRESHARK);
-
- if (g_airpcap_if_list != NULL && g_list_length(g_airpcap_if_list) > 0)
- {
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(cb), AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP);
- }
- else
- {
- /* The last decryption mode was 'Driver', but no more AirPcap adapter are found */
- if (current_text == NULL || g_ascii_strcasecmp(current_text, AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP) == 0)
- {
- g_free(current_text);
- current_text = g_strdup(AIRPCAP_DECRYPTION_TYPE_STRING_NONE);
- }
- }
-
- if (g_ascii_strcasecmp(current_text, AIRPCAP_DECRYPTION_TYPE_STRING_WIRESHARK) == 0) {
- gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 1);
- } else if (g_ascii_strcasecmp(current_text, AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP) == 0) {
- gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 2);
- } else { /* None / Invalid */
- gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 0);
- }
-
- g_free(current_text);
-}
-
-
-/*
- * Callback for the Wireless Advanced Settings 'Apply' button.
- */
-static void
-on_advanced_apply_bt_clicked(GtkWidget *button _U_, gpointer data)
-{
- /* advenced window */
- GtkWidget *airpcap_advanced_w;
- GtkWidget *channel_cb, *channel_offset_cb;
-
- /* widgets in the toolbar */
- GtkWidget *toolbar,
- *toolbar_if_lb,
- *toolbar_channel_cb,
- *toolbar_channel_offset_cb,
- *toolbar_fcs_filter_cb;
-
- /* retrieve main window */
- airpcap_advanced_w = GTK_WIDGET(data);
-
- /* Set the channel and offset */
- channel_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_CHANNEL_KEY));
- channel_offset_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_CHANNEL_OFFSET_KEY));
- airpcap_channel_offset_changed_cb(channel_offset_cb, NULL);
- airpcap_channel_changed_set_cb(channel_cb, channel_offset_cb);
-
-
- toolbar = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_TOOLBAR_KEY));
-
- /* retrieve toolbar info */
- toolbar_if_lb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_INTERFACE_KEY));
- toolbar_channel_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_CHANNEL_KEY));
- toolbar_channel_offset_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_CHANNEL_OFFSET_KEY));
- toolbar_fcs_filter_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_FCS_FILTER_KEY));
-
- /* Save the configuration (for all ) */
- airpcap_save_selected_if_configuration(airpcap_if_selected);
-
- /* Update toolbar (only if airpcap_if_selected is airpcap_if_active)*/
- if ( g_ascii_strcasecmp(airpcap_if_selected->description,airpcap_if_active->description) == 0)
- {
- gtk_label_set_text(GTK_LABEL(toolbar_if_lb), g_strdup_printf("%s %s\t","Current Wireless Interface: #",airpcap_get_if_string_number(airpcap_if_selected)));
- airpcap_update_channel_combo(GTK_WIDGET(toolbar_channel_cb),airpcap_if_selected);
- airpcap_update_channel_offset_combo(airpcap_if_selected, airpcap_if_selected->channelInfo.Frequency, toolbar_channel_offset_cb, TRUE);
- airpcap_validation_type_combo_set_by_type(toolbar_fcs_filter_cb,airpcap_if_selected->CrcValidationOn);
- }
-}
-
-/*
- * Callback for the OK button 'clicked' in the Advanced Wireless Settings window.
- */
-static void
-on_advanced_ok_bt_clicked(GtkWidget *button _U_, gpointer data)
-{
- PAirpcapHandle ad = NULL;
- gchar ebuf[AIRPCAP_ERRBUF_SIZE];
-
- /* Retrieve object data */
- GtkWidget *airpcap_advanced_w = GTK_WIDGET(data);
-
- if (airpcap_if_selected == NULL) { /* There's not much we can do. */
- gtk_widget_destroy(airpcap_advanced_w);
- return;
- }
-
- on_advanced_apply_bt_clicked(button, data);
-
- /* Stop blinking our LED */
- ad = airpcap_if_open(airpcap_if_selected->name, ebuf);
- if (ad)
- {
- g_source_remove(airpcap_if_selected->tag);
- airpcap_if_turn_led_on(ad, 0);
- airpcap_if_selected->blinking = FALSE;
- airpcap_if_selected->led = TRUE;
- airpcap_if_close(ad);
- }
-
- /* Remove GLIB timeout */
- g_source_remove(airpcap_if_selected->tag);
-
- gtk_widget_destroy(airpcap_advanced_w);
-}
-
-/*
- * Callback for the CANCEL button 'clicked' in the Advanced Wireless Settings window.
- */
-static void
-on_advanced_cancel_bt_clicked(GtkWidget *button _U_, gpointer data)
-{
- PAirpcapHandle ad = NULL;
- gchar ebuf[AIRPCAP_ERRBUF_SIZE];
-
- /* Retrieve object data */
- GtkWidget *airpcap_advanced_w;
-
- /* Retrieve the GUI object pointers */
- airpcap_advanced_w = GTK_WIDGET(data);
-
- /* Stop blinking ALL leds (go through the g_airpcap_if_list) */
- if (airpcap_if_selected != NULL)
- {
- ad = airpcap_if_open(airpcap_if_selected->name, ebuf);
- if (ad)
- {
- g_source_remove(airpcap_if_selected->tag);
- airpcap_if_turn_led_on(ad, 0);
- airpcap_if_selected->blinking = FALSE;
- airpcap_if_selected->led = TRUE;
- airpcap_if_close(ad);
- }
-
- /* reload the configuration!!! Configuration has not been saved but
- the corresponding structure has been modified probably...*/
- if (!airpcap_if_selected->saved)
- {
- airpcap_load_selected_if_configuration(airpcap_if_selected);
- }
- }
-
- gtk_widget_destroy(airpcap_advanced_w);
-}
-
-
-/* Called to create the airpcap settings' window */
-void
-display_airpcap_advanced_cb(GtkWidget *w _U_, gpointer data)
-{
- GtkWidget *airpcap_advanced_w;
- GtkWidget *main_box;
- GtkWidget *settings_sub_box;
- GtkWidget *interface_fr;
- GtkWidget *interface_al;
- GtkWidget *interface_sub_h_box;
- GtkWidget *interface_name_lb;
- GtkWidget *blink_bt;
- GtkWidget *interface_frame_lb;
- GtkWidget *basic_parameters_fr;
- GtkWidget *basic_parameters_al;
- GtkWidget *basic_parameters_grid;
- GtkWidget *channel_lb;
- GtkWidget *channel_offset_lb;
- GtkWidget *capture_type_lb;
- GtkWidget *channel_cb;
- GtkWidget *channel_offset_cb;
- GtkWidget *capture_type_cb;
- GtkWidget *fcs_ck;
- GtkWidget *basic_parameters_fcs_h_box;
- GtkWidget *basic_parameters_fcs_filter_lb;
- GtkWidget *fcs_filter_cb;
- GtkWidget *basic_parameters_frame_lb;
- GtkWidget *low_buttons_h_box;
- GtkWidget *left_h_button_box;
- GtkWidget *right_h_button_box;
- GtkWidget *ok_bt;
- GtkWidget *apply_bt;
- GtkWidget *cancel_bt;
-
- /* widgets in the toolbar */
- GtkWidget *toolbar;
-
- /* user data - RETRIEVE pointers of toolbar widgets */
- toolbar = GTK_WIDGET(data);
-
- /* gray out the toolbar */
- gtk_widget_set_sensitive(toolbar,FALSE);
-
- /* main window */
- /* global */
-
- /* the selected is the active, for now */
- airpcap_if_selected = airpcap_if_active;
-
- /* Create the new window */
- airpcap_advanced_w = dlg_window_new("Advanced Wireless Settings"); /* transient_for top_level */
- gtk_window_set_modal(GTK_WINDOW(airpcap_advanced_w), TRUE);
- gtk_window_set_transient_for(GTK_WINDOW(airpcap_advanced_w), GTK_WINDOW(gtk_widget_get_toplevel(w)));
- gtk_window_set_destroy_with_parent (GTK_WINDOW(airpcap_advanced_w), TRUE);
-
- gtk_container_set_border_width (GTK_CONTAINER (airpcap_advanced_w), 5);
- gtk_window_set_position (GTK_WINDOW (airpcap_advanced_w),
- GTK_WIN_POS_CENTER);
-
- gtk_window_set_resizable (GTK_WINDOW (airpcap_advanced_w), FALSE);
- gtk_window_set_type_hint (GTK_WINDOW (airpcap_advanced_w), GDK_WINDOW_TYPE_HINT_DIALOG);
-
- main_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_widget_set_name (main_box, "main_box");
- gtk_widget_show (main_box);
- gtk_container_add (GTK_CONTAINER (airpcap_advanced_w), main_box);
-
- settings_sub_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_widget_set_name (settings_sub_box, "settings_sub_box");
- gtk_widget_show (settings_sub_box);
- gtk_box_pack_start (GTK_BOX (main_box), settings_sub_box, FALSE, TRUE, 0);
-
- interface_fr = gtk_frame_new (NULL);
- gtk_widget_set_name (interface_fr, "interface_fr");
- gtk_widget_show (interface_fr);
- gtk_box_pack_start (GTK_BOX (settings_sub_box), interface_fr, FALSE, FALSE,
- 0);
- gtk_container_set_border_width (GTK_CONTAINER (interface_fr), 10);
-
- interface_al = gtk_alignment_new (0.5f, 0.5f, 1, 1);
- gtk_widget_set_name (interface_al, "interface_al");
- gtk_widget_show (interface_al);
- gtk_container_add (GTK_CONTAINER (interface_fr), interface_al);
- gtk_alignment_set_padding (GTK_ALIGNMENT (interface_al), 5, 5, 0, 0);
-
- interface_sub_h_box = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_widget_set_name (interface_sub_h_box, "interface_sub_h_box");
- gtk_widget_show (interface_sub_h_box);
- gtk_container_add (GTK_CONTAINER (interface_al), interface_sub_h_box);
- gtk_container_set_border_width (GTK_CONTAINER (interface_sub_h_box), 5);
-
- /* Fill the interface_box */
- if (airpcap_if_active != NULL)
- {
- interface_name_lb = gtk_label_new(airpcap_if_active->description);
- }
- else
- {
- interface_name_lb = gtk_label_new("Couldn't find an airpcap interface.");
- gtk_widget_set_sensitive(main_box,FALSE);
- }
-
- gtk_widget_set_name (interface_name_lb, "interface_name_lb");
- gtk_widget_show (interface_name_lb);
- gtk_box_pack_start (GTK_BOX (interface_sub_h_box), interface_name_lb, TRUE,
- FALSE, 0);
-
- /* If it is NOT the 'Any' Interface */
- if (!airpcap_if_is_any(airpcap_if_selected))
- {
- blink_bt = gtk_button_new_with_mnemonic ("Blink Led");
- }
- else /* It is the any interface, so it doesn't make sense to have 'Blink' button... */
- {
- blink_bt = gtk_button_new_with_mnemonic ("What's This?");
- }
- gtk_widget_set_name (blink_bt, "blink_bt");
- gtk_widget_show (blink_bt);
- gtk_box_pack_end (GTK_BOX (interface_sub_h_box), blink_bt, FALSE, FALSE, 0);
-
- interface_frame_lb = gtk_label_new ("<b>Interface</b>");
- gtk_widget_set_name (interface_frame_lb, "interface_frame_lb");
- gtk_widget_show (interface_frame_lb);
- gtk_frame_set_label_widget (GTK_FRAME (interface_fr), interface_frame_lb);
- gtk_label_set_use_markup (GTK_LABEL (interface_frame_lb), TRUE);
-
- basic_parameters_fr = gtk_frame_new (NULL);
- gtk_widget_set_name (basic_parameters_fr, "basic_parameters_fr");
- gtk_widget_show (basic_parameters_fr);
- gtk_box_pack_start (GTK_BOX (settings_sub_box), basic_parameters_fr, TRUE,FALSE, 0);
- gtk_container_set_border_width (GTK_CONTAINER (basic_parameters_fr), 10);
-
- basic_parameters_al = gtk_alignment_new (0.5f, 0.5f, 1, 1);
- gtk_widget_set_name (basic_parameters_al, "basic_parameters_al");
- gtk_widget_show (basic_parameters_al);
- gtk_container_add (GTK_CONTAINER (basic_parameters_fr),basic_parameters_al);
- gtk_alignment_set_padding (GTK_ALIGNMENT (basic_parameters_al), 10, 10, 0, 0);
-
- basic_parameters_grid = ws_gtk_grid_new ();
- gtk_widget_set_name (basic_parameters_grid, "basic_parameters_grid");
- gtk_widget_show (basic_parameters_grid);
- gtk_container_add (GTK_CONTAINER (basic_parameters_al),
- basic_parameters_grid);
- gtk_container_set_border_width (GTK_CONTAINER (basic_parameters_grid), 5);
- ws_gtk_grid_set_column_spacing(GTK_GRID(basic_parameters_grid), 20);
-
- channel_lb = gtk_label_new ("Channel:");
- gtk_widget_set_name (channel_lb, "channel_lb");
- gtk_widget_show (channel_lb);
- ws_gtk_grid_attach_extended (GTK_GRID (basic_parameters_grid), channel_lb, 0, 0, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (channel_lb), 0, 0.5f);
-
- capture_type_lb = gtk_label_new ("Capture Type:");
- gtk_widget_set_name (capture_type_lb, "capture_type_lb");
- gtk_widget_show (capture_type_lb);
- ws_gtk_grid_attach_extended (GTK_GRID (basic_parameters_grid), capture_type_lb, 0, 2, 1,
- 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0),
- 0, 0);
- gtk_misc_set_alignment (GTK_MISC (capture_type_lb), 0, 0.5f);
-
- /* Start: Channel offset label */
- channel_offset_lb = gtk_label_new ("Channel Offset:");
- gtk_widget_set_name (channel_offset_lb, "channel_offset_lb");
- gtk_widget_show (channel_offset_lb);
- ws_gtk_grid_attach_extended (GTK_GRID (basic_parameters_grid), channel_offset_lb, 0, 1, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (channel_offset_lb), 0, 0.5f);
- /* End: Channel offset label */
-
- /* Start: Channel offset combo box */
- channel_offset_cb = gtk_combo_box_text_new();
- gtk_widget_set_name (channel_offset_cb, "channel_offset_cb");
-
- airpcap_update_channel_offset_combo(airpcap_if_selected, airpcap_if_selected->channelInfo.Frequency, channel_offset_cb, FALSE);
-
- gtk_widget_show(channel_offset_cb);
-
- ws_gtk_grid_attach_extended (GTK_GRID (basic_parameters_grid), channel_offset_cb, 1, 1, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- /* End: Channel offset combo box */
-
- channel_cb = gtk_combo_box_text_new();
- gtk_widget_set_name (channel_cb, "channel_cb");
- gtk_widget_show (channel_cb);
- ws_gtk_grid_attach_extended (GTK_GRID (basic_parameters_grid), channel_cb, 1, 0, 1, 1,
- (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-
- /* Select the current channel */
- airpcap_update_channel_combo(GTK_WIDGET(channel_cb), airpcap_if_selected);
-
- capture_type_cb = gtk_combo_box_text_new();
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(capture_type_cb), AIRPCAP_LINK_TYPE_NAME_802_11_ONLY);
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(capture_type_cb), AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO);
- if (airpcap_get_dll_state() == AIRPCAP_DLL_OK) {
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(capture_type_cb), AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_PPI);
- }
-
- gtk_widget_set_name (capture_type_cb, "capture_type_cb");
- gtk_widget_show (capture_type_cb);
- ws_gtk_grid_attach_extended (GTK_GRID (basic_parameters_grid), capture_type_cb, 1, 2, 1,
- 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-
- /* Current interface value */
- if (airpcap_if_selected != NULL)
- {
- if (airpcap_if_selected->linkType == AIRPCAP_LT_802_11_PLUS_RADIO){
- gtk_combo_box_set_active(GTK_COMBO_BOX(capture_type_cb), AIRPCAP_LINK_TYPE_NUM_802_11_PLUS_RADIO);
- }else if (airpcap_if_selected->linkType == AIRPCAP_LT_802_11_PLUS_PPI){
- gtk_combo_box_set_active(GTK_COMBO_BOX(capture_type_cb), AIRPCAP_LINK_TYPE_NUM_802_11_PLUS_PPI);
- } else {
- gtk_combo_box_set_active(GTK_COMBO_BOX(capture_type_cb), AIRPCAP_LINK_TYPE_NUM_802_11_ONLY);
- }
- }
-
- fcs_ck = gtk_check_button_new_with_label ("Include 802.11 FCS in Frames");
-
- gtk_widget_set_name (fcs_ck, "fcs_ck");
-
- /* Fcs Presence check box */
- if (airpcap_if_selected != NULL)
- {
- if (airpcap_if_selected->IsFcsPresent)
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(fcs_ck),TRUE);
- else
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(fcs_ck),FALSE);
- }
-
- gtk_widget_show (fcs_ck);
- ws_gtk_grid_attach_extended (GTK_GRID (basic_parameters_grid), fcs_ck, 3, 0, 2, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-
- basic_parameters_fcs_h_box = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1, FALSE);
- gtk_widget_set_name (basic_parameters_fcs_h_box,
- "basic_parameters_fcs_h_box");
- gtk_widget_show (basic_parameters_fcs_h_box);
- ws_gtk_grid_attach_extended (GTK_GRID (basic_parameters_grid),
- basic_parameters_fcs_h_box, 3, 2, 2, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (GTK_FILL), 3, 0);
-
- basic_parameters_fcs_filter_lb = gtk_label_new ("FCS Filter:");
- gtk_widget_set_name (basic_parameters_fcs_filter_lb,
- "basic_parameters_fcs_filter_lb");
- gtk_widget_show (basic_parameters_fcs_filter_lb);
- gtk_box_pack_start (GTK_BOX (basic_parameters_fcs_h_box),
- basic_parameters_fcs_filter_lb, FALSE, FALSE, 0);
-
- fcs_filter_cb = gtk_combo_box_text_new();
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(fcs_filter_cb), airpcap_get_validation_name(AIRPCAP_VT_ACCEPT_EVERYTHING));
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(fcs_filter_cb), airpcap_get_validation_name(AIRPCAP_VT_ACCEPT_CORRECT_FRAMES));
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(fcs_filter_cb), airpcap_get_validation_name(AIRPCAP_VT_ACCEPT_CORRUPT_FRAMES));
- gtk_combo_box_set_active(GTK_COMBO_BOX(fcs_filter_cb), 0);
- gtk_widget_set_name (fcs_filter_cb, "fcs_filter_cb");
- gtk_widget_show (fcs_filter_cb);
- gtk_box_pack_start (GTK_BOX (basic_parameters_fcs_h_box), fcs_filter_cb,
- FALSE, FALSE, 0);
- gtk_widget_set_size_request (fcs_filter_cb, 112, -1);
-
- if (airpcap_if_selected != NULL)
- {
- airpcap_validation_type_combo_set_by_type(fcs_filter_cb, airpcap_if_selected->CrcValidationOn);
- }
-
- basic_parameters_frame_lb = gtk_label_new ("<b>Basic Parameters</b>");
- gtk_widget_set_name (basic_parameters_frame_lb,
- "basic_parameters_frame_lb");
- gtk_widget_show (basic_parameters_frame_lb);
-
- gtk_frame_set_label_widget (GTK_FRAME (basic_parameters_fr),basic_parameters_frame_lb);
- gtk_label_set_use_markup (GTK_LABEL (basic_parameters_frame_lb), TRUE);
-
- low_buttons_h_box = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_widget_set_name (low_buttons_h_box, "low_buttons_h_box");
- gtk_widget_show (low_buttons_h_box);
- gtk_box_pack_end (GTK_BOX (main_box), low_buttons_h_box, FALSE, FALSE, 0);
-
- left_h_button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
- gtk_widget_set_name (left_h_button_box, "left_h_button_box");
- gtk_widget_show (left_h_button_box);
- gtk_box_pack_start (GTK_BOX (low_buttons_h_box), left_h_button_box, FALSE,
- FALSE, 0);
-
- /* dlg_button_row_new() returns an (h)box */
- right_h_button_box = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_APPLY, GTK_STOCK_CANCEL, NULL);
- gtk_widget_show (right_h_button_box);
- gtk_box_pack_end (GTK_BOX (low_buttons_h_box), right_h_button_box, FALSE,
- FALSE, 0);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_OK);
- apply_bt = (GtkWidget *)g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_APPLY);
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_CANCEL);
-
- /* Connect the callbacks */
- g_signal_connect (airpcap_advanced_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect (airpcap_advanced_w, "destroy", G_CALLBACK(on_airpcap_advanced_destroy), airpcap_advanced_w);
-
- if (!airpcap_if_is_any(airpcap_if_selected))
- {
- g_signal_connect (blink_bt, "clicked", G_CALLBACK(on_blink_bt_clicked), NULL);
- }
- else
- {
- g_signal_connect (blink_bt, "clicked", G_CALLBACK(on_what_s_this_bt_clicked), NULL);
- }
-
- g_signal_connect (channel_cb, "changed", G_CALLBACK(airpcap_channel_changed_noset_cb), channel_offset_cb);
- /* We don't attach the channel offset combo because we don't want it changing anything yet. */
- g_signal_connect (capture_type_cb, "changed", G_CALLBACK(on_capture_type_cb_changed), NULL);
- g_signal_connect (fcs_ck, "toggled", G_CALLBACK(on_fcs_ck_toggled), NULL);
- g_signal_connect (fcs_filter_cb, "changed", G_CALLBACK(on_fcs_filter_cb_changed), NULL);
- g_signal_connect (apply_bt, "clicked", G_CALLBACK(on_advanced_apply_bt_clicked), airpcap_advanced_w);
- g_signal_connect (ok_bt,"clicked", G_CALLBACK(on_advanced_ok_bt_clicked), airpcap_advanced_w);
- g_signal_connect (cancel_bt,"clicked", G_CALLBACK(on_advanced_cancel_bt_clicked), airpcap_advanced_w);
-
- /* Different because the window will be closed ... */
- /*window_set_cancel_button(airpcap_advanced_w, ok_bt, window_cancel_button_cb);
- window_set_cancel_button(airpcap_advanced_w, cancel_bt, window_cancel_button_cb);*/
-
-
- /* Store pointers to all widgets, for use by lookup_widget(). */
- g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_BLINK_KEY, blink_bt);
- g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_CHANNEL_KEY,channel_cb);
- g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_CHANNEL_OFFSET_KEY, channel_offset_cb);
- g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_LINK_TYPE_KEY,capture_type_cb);
- g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_FCS_CHECK_KEY, fcs_ck);
- g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_FCS_FILTER_KEY, fcs_filter_cb);
- g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_OK_KEY, ok_bt);
- g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_CANCEL_KEY, cancel_bt);
-
- /*
- * I will need the toolbar and the main widget in some callback,
- * so I will add the toolbar pointer to the airpcap_advanced_w
- */
- g_object_set_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_TOOLBAR_KEY,toolbar);
-
- /* At the end, so that it appears completely all together ... */
- gtk_widget_show (airpcap_advanced_w);
-}
-
-/*
- * Callback for the OK button 'clicked' in the Decryption Key Management window.
- */
-static void
-on_key_management_ok_bt_clicked(GtkWidget *button, gpointer data)
-{
- /* advanced window */
- GtkWidget *key_management_w;
-
- /* retrieve main window */
- key_management_w = GTK_WIDGET(data);
-
- /* Apply the current decryption preferences */
- on_key_management_apply_bt_clicked(button, data);
-
- gtk_widget_destroy(key_management_w);
-}
-
-/*
- * Callback for the CANCEL button 'clicked' in the Decryption Key Management window.
- */
-static void
-on_key_management_cancel_bt_clicked(GtkWidget *button _U_, gpointer data)
-{
- /* Retrieve object data */
- GtkWidget *key_management_w;
-
- /* Retrieve the GUI object pointers */
- key_management_w = GTK_WIDGET(data);
-
- gtk_widget_destroy(key_management_w);
-}
-
-/* Called to create the key management window */
-void
-display_airpcap_key_management_cb(GtkWidget *w _U_, gpointer data)
-{
- GtkWidget *key_management_w;
- GtkWidget *main_box;
- GtkWidget *keys_fr;
- GtkWidget *keys_al;
- GtkWidget *keys_h_sub_box;
- GtkWidget *decryption_mode_grid;
- GtkWidget *decryption_mode_lb;
- GtkWidget *decryption_mode_cb;
- GtkWidget *keys_v_sub_box;
- GtkWidget *keys_scrolled_w;
- GtkListStore *key_list_store;
- GtkWidget *key_list;
- GtkWidget *key_v_button_box;
- GtkWidget *add_new_key_bt;
- GtkWidget *remove_key_bt;
- GtkWidget *edit_key_bt;
- GtkWidget *move_key_up_bt;
- GtkWidget *move_key_down_bt;
- GtkWidget *keys_frame_lb;
- GtkWidget *low_buttons_h_box;
- GtkWidget *left_h_button_box;
- GtkWidget *right_h_button_box;
- GtkWidget *ok_bt;
- GtkWidget *apply_bt;
- GtkWidget *cancel_bt;
-
- /* widgets in the toolbar */
- GtkWidget *toolbar,
- *toolbar_decryption_ck;
-
- /* key list */
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
- GtkTreeSelection *selection;
- GtkTreeIter iter;
-
- /* user data - RETRIEVE pointers of toolbar widgets */
- toolbar = GTK_WIDGET(data);
- toolbar_decryption_ck = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_DECRYPTION_KEY));
-
- /* gray out the toolbar */
- gtk_widget_set_sensitive(toolbar,FALSE);
-
- /* main window */
- /* global */
-
- /* the selected is the active, for now */
- airpcap_if_selected = airpcap_if_active;
-
- /* Create the new window */
- key_management_w = dlg_window_new("Decryption Key Management"); /* transient_for top_level */
- gtk_window_set_destroy_with_parent(GTK_WINDOW(key_management_w), TRUE);
- gtk_window_set_modal(GTK_WINDOW(key_management_w), TRUE);
-
- gtk_container_set_border_width (GTK_CONTAINER (key_management_w), 5);
- gtk_window_set_position (GTK_WINDOW (key_management_w),
- GTK_WIN_POS_CENTER);
-
- gtk_window_set_resizable (GTK_WINDOW (key_management_w), FALSE);
- gtk_window_set_type_hint (GTK_WINDOW (key_management_w), GDK_WINDOW_TYPE_HINT_DIALOG);
-
- main_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_widget_set_name (main_box, "main_box");
- gtk_widget_show (main_box);
- gtk_container_add (GTK_CONTAINER (key_management_w), main_box);
-
- keys_fr = gtk_frame_new (NULL);
- gtk_widget_set_name (keys_fr, "keys_fr");
- gtk_widget_show (keys_fr);
- gtk_box_pack_start (GTK_BOX (main_box), keys_fr, FALSE, FALSE, 0);
- gtk_container_set_border_width (GTK_CONTAINER (keys_fr), 10);
-
- keys_al = gtk_alignment_new (0.5f, 0.5f, 1, 1);
- gtk_widget_set_name (keys_al, "keys_al");
- gtk_widget_show (keys_al);
- gtk_container_add (GTK_CONTAINER (keys_fr), keys_al);
- gtk_container_set_border_width (GTK_CONTAINER (keys_al), 5);
-
- gtk_alignment_set_padding (GTK_ALIGNMENT (keys_al), 0, 0, 12, 0);
-
- keys_h_sub_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_widget_set_name (keys_h_sub_box, "keys_h_sub_box");
- gtk_widget_show (keys_h_sub_box);
- gtk_container_add (GTK_CONTAINER (keys_al), keys_h_sub_box);
-
- decryption_mode_grid = ws_gtk_grid_new ();
- gtk_widget_set_name (decryption_mode_grid, "decryption_mode_grid");
- gtk_widget_show (decryption_mode_grid);
- gtk_box_pack_start (GTK_BOX (keys_h_sub_box), decryption_mode_grid, FALSE,
- FALSE, 0);
- ws_gtk_grid_set_row_spacing(GTK_GRID(decryption_mode_grid), 6);
-
- decryption_mode_lb = gtk_label_new ("Select Decryption Mode");
- gtk_widget_set_name (decryption_mode_lb, "decryption_mode_lb");
- gtk_widget_show (decryption_mode_lb);
- ws_gtk_grid_attach_extended (GTK_GRID (decryption_mode_grid), decryption_mode_lb, 1,
- 0, 1, 1, (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (decryption_mode_lb), 0, 0.5f);
-
- decryption_mode_cb = gtk_combo_box_text_new();
- update_decryption_mode_list(decryption_mode_cb);
- gtk_widget_set_name (decryption_mode_cb, "decryption_mode_cb");
- gtk_widget_show (decryption_mode_cb);
- ws_gtk_grid_attach_extended (GTK_GRID (decryption_mode_grid), decryption_mode_cb, 0,
- 0, 1, 1, (GtkAttachOptions) (0), (GtkAttachOptions) (0),
- 0, 0);
- gtk_widget_set_size_request (decryption_mode_cb, 83, -1);
-
- /* Set correct decryption mode!!!! */
- update_decryption_mode(decryption_mode_cb);
-
- keys_v_sub_box = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_widget_set_name (keys_v_sub_box, "keys_v_sub_box");
- gtk_widget_show (keys_v_sub_box);
- gtk_box_pack_start (GTK_BOX (keys_h_sub_box), keys_v_sub_box, TRUE, TRUE, 0);
-
- keys_scrolled_w = gtk_scrolled_window_new (NULL, NULL);
- gtk_widget_set_name (keys_scrolled_w, "keys_scrolled_w");
- gtk_widget_show (keys_scrolled_w);
- gtk_box_pack_start (GTK_BOX (keys_v_sub_box), keys_scrolled_w, TRUE, TRUE,
- 0);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (keys_scrolled_w), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
-
-
-
- /* Create the store */
- key_list_store = gtk_list_store_new(KL_NUM_COLS,
- G_TYPE_STRING, /* Type */
- G_TYPE_STRING /* Key */
- , G_TYPE_STRING /* SSID */
- );
-
- /* Create a view */
- key_list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(key_list_store));
-
- /* Speed up the list display */
- gtk_tree_view_set_fixed_height_mode(GTK_TREE_VIEW(key_list), TRUE);
-
- /* Setup the sortable columns */
- gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(key_list), FALSE);
-
- /* The view now holds a reference. We can get rid of our own reference */
- g_object_unref(G_OBJECT(key_list_store));
-
- /*
- * Create the first column packet, associating the "text" attribute of the
- * cell_renderer to the first column of the model
- */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Type", renderer,
- "text", KL_COL_TYPE, NULL);
- gtk_tree_view_column_set_sort_column_id(column, KL_COL_TYPE);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 60);
- gtk_tree_view_column_set_fixed_width(column, 100);
- /* Add the column to the view. */
- gtk_tree_view_append_column(GTK_TREE_VIEW(key_list), column);
-
- /* Key */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Key", renderer,
- "text", KL_COL_KEY, NULL);
- gtk_tree_view_column_set_sort_column_id(column, KL_COL_KEY);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 120);
- gtk_tree_view_column_set_fixed_width(column, 200);
- gtk_tree_view_append_column(GTK_TREE_VIEW(key_list), column);
-
- /* SSID */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("SSID", renderer,
- "text", KL_COL_SSID,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, KL_COL_SSID);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 80);
- gtk_tree_view_column_set_fixed_width(column, 150);
- gtk_tree_view_append_column(GTK_TREE_VIEW(key_list), column);
-
- /* Now enable the sorting of each column */
- gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(key_list), TRUE);
- gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(key_list), TRUE);
-
- /* Setup the selection handler */
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(key_list));
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
-
- gtk_widget_show (key_list);
-
- gtk_container_add (GTK_CONTAINER (keys_scrolled_w), key_list);
-
- key_v_button_box = gtk_button_box_new (GTK_ORIENTATION_VERTICAL);
- gtk_widget_set_name (key_v_button_box, "key_v_button_box");
- gtk_widget_show (key_v_button_box);
- gtk_box_pack_start (GTK_BOX (keys_v_sub_box), key_v_button_box, FALSE, TRUE,
- 0);
-
- add_new_key_bt = ws_gtk_button_new_from_stock(GTK_STOCK_NEW);
- gtk_widget_set_name (add_new_key_bt, "add_new_key_bt");
- gtk_widget_show (add_new_key_bt);
- gtk_container_add (GTK_CONTAINER (key_v_button_box), add_new_key_bt);
- gtk_widget_set_can_default (add_new_key_bt, TRUE);
-
- edit_key_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_EDIT);
- gtk_widget_set_name (edit_key_bt, "edit_key_bt");
- gtk_widget_show (edit_key_bt);
- gtk_container_add (GTK_CONTAINER (key_v_button_box), edit_key_bt);
- gtk_widget_set_can_default (edit_key_bt, TRUE);
-
- remove_key_bt = ws_gtk_button_new_from_stock(GTK_STOCK_DELETE);
- gtk_widget_set_name (remove_key_bt, "remove_key_bt");
- gtk_widget_show (remove_key_bt);
- gtk_container_add (GTK_CONTAINER (key_v_button_box), remove_key_bt);
- gtk_widget_set_can_default (remove_key_bt, TRUE);
-
- move_key_up_bt = ws_gtk_button_new_from_stock(GTK_STOCK_GO_UP);
- gtk_widget_set_name (move_key_up_bt, "move_key_up_bt");
- gtk_widget_show (move_key_up_bt);
- gtk_container_add (GTK_CONTAINER (key_v_button_box), move_key_up_bt);
- gtk_widget_set_can_default (move_key_up_bt, TRUE);
-
- move_key_down_bt = ws_gtk_button_new_from_stock(GTK_STOCK_GO_DOWN);
- gtk_widget_set_name (move_key_down_bt, "move_key_down_bt");
- gtk_widget_show (move_key_down_bt);
- gtk_container_add (GTK_CONTAINER (key_v_button_box), move_key_down_bt);
- gtk_widget_set_can_default (move_key_down_bt, TRUE);
-
- keys_frame_lb = gtk_label_new ("<b>Decryption Keys</b>");
- gtk_widget_set_name (keys_frame_lb, "keys_frame_lb");
- gtk_widget_show (keys_frame_lb);
-
- gtk_frame_set_label_widget (GTK_FRAME (keys_fr), keys_frame_lb);
- gtk_label_set_use_markup (GTK_LABEL (keys_frame_lb), TRUE);
-
- low_buttons_h_box = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_widget_set_name (low_buttons_h_box, "low_buttons_h_box");
- gtk_widget_show (low_buttons_h_box);
- gtk_box_pack_end (GTK_BOX (main_box), low_buttons_h_box, FALSE, FALSE, 0);
-
- left_h_button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
- gtk_widget_set_name (left_h_button_box, "left_h_button_box");
- gtk_widget_show (left_h_button_box);
- gtk_box_pack_start (GTK_BOX (low_buttons_h_box), left_h_button_box, FALSE,
- FALSE, 0);
-
- /* dlg_button_row_new() returns an (h)box */
- right_h_button_box = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_APPLY, GTK_STOCK_CANCEL, NULL);
- gtk_widget_set_name (right_h_button_box, "right_h_button_box");
- gtk_widget_show (right_h_button_box);
- gtk_box_pack_end (GTK_BOX (low_buttons_h_box), right_h_button_box, FALSE,
- FALSE, 0);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_OK);
- apply_bt = (GtkWidget *)g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_APPLY);
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_CANCEL);
-
- /* Connect the callbacks */
- g_signal_connect (key_management_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect (key_management_w, "destroy", G_CALLBACK(on_key_management_destroy), key_management_w);
- g_signal_connect (add_new_key_bt, "clicked", G_CALLBACK(on_add_new_key_bt_clicked), key_management_w);
- g_signal_connect (remove_key_bt, "clicked", G_CALLBACK(on_remove_key_bt_clicked), key_management_w);
- g_signal_connect (edit_key_bt, "clicked", G_CALLBACK(on_edit_key_bt_clicked), key_management_w);
- g_signal_connect (move_key_up_bt, "clicked", G_CALLBACK(on_move_key_up_bt_clicked), key_list);
- g_signal_connect (move_key_down_bt, "clicked", G_CALLBACK(on_move_key_down_bt_clicked), key_list);
- g_signal_connect (apply_bt, "clicked", G_CALLBACK(on_key_management_apply_bt_clicked), key_management_w);
- g_signal_connect (ok_bt, "clicked", G_CALLBACK(on_key_management_ok_bt_clicked), key_management_w);
- g_signal_connect (cancel_bt, "clicked", G_CALLBACK(on_key_management_cancel_bt_clicked), key_management_w);
- g_signal_connect (selection, "changed", G_CALLBACK(on_key_list_select_row), key_management_w);
- g_signal_connect (key_list_store, "rows_reordered", G_CALLBACK(on_key_list_reorder), key_management_w);
-
- /* Different because the window will be closed ... */
- /*window_set_cancel_button(key_management_w, ok_bt, window_cancel_button_cb);
- window_set_cancel_button(key_management_w, cancel_bt, window_cancel_button_cb);*/
-
- g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_EDIT_KEY_SELECTION_KEY,selection);
-
- /* Store pointers to all widgets, for use by lookup_widget(). */
- g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_DECRYPTION_MODE_KEY, decryption_mode_cb);
- g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_KEYLIST_KEY, key_list_store);
- g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_OK_KEY, ok_bt);
- g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_CANCEL_KEY, cancel_bt);
-
- /* Enable / disable buttons */
- g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_KEY_MGMT_NEW_KEY, add_new_key_bt);
- g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_KEY_MGMT_EDIT_KEY, edit_key_bt);
- g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_KEY_MGMT_DELETE_KEY, remove_key_bt);
- g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_KEY_MGMT_UP_KEY, move_key_up_bt);
- g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_KEY_MGMT_DOWN_KEY, move_key_down_bt);
-
- /*
- * I will need the toolbar and the main widget in some callback,
- * so I will add the toolbar pointer to the key_management_w
- */
- g_object_set_data(G_OBJECT(key_management_w),AIRPCAP_TOOLBAR_KEY,toolbar);
- g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_TOOLBAR_DECRYPTION_KEY, toolbar_decryption_ck);
-
- /* FIRST OF ALL, CHECK THE KEY COLLECTIONS */
- /*
- * This will read the decryption keys from the preferences file, and will store
- * them into the registry...
- */
- if (!airpcap_check_decryption_keys(g_airpcap_if_list))
- {
- /* Ask the user what to do ...*/
- airpcap_keys_check_w(key_management_w,NULL);
- }
- else /* Keys from lists are equals, or Wireshark has got no keys */
- {
- airpcap_load_decryption_keys(g_airpcap_if_list);
- airpcap_fill_key_list(key_list_store);
- /* At the end, so that it appears completely all together ... */
- gtk_widget_show (key_management_w);
- }
-
- if(gtk_tree_model_get_iter_first(GTK_TREE_MODEL(key_list_store), &iter))
- {
- gtk_tree_selection_select_iter(selection, &iter);
- }
-}
-
-
-static void
-on_keys_check_cancel_bt_clicked (GtkWidget *button _U_, gpointer user_data)
-{
- GtkWidget *key_management_w;
- GtkWidget *keys_check_w;
- GtkListStore *key_list_store;
-
- keys_check_w = GTK_WIDGET(user_data);
-
- key_management_w = (GtkWidget *)g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
-
- /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
- and is not NULL if it was called when the Key Management widget has been clicked */
- if (key_management_w != NULL)
- {
- /* ... */
- key_list_store = (GtkListStore *)g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
- airpcap_fill_key_list(key_list_store);
- gtk_widget_show (key_management_w);
- }
-
- gtk_widget_destroy(keys_check_w);
-}
-
-static void
-on_merge_bt_clicked (GtkWidget* button _U_, gpointer user_data)
-{
- GtkWidget *key_management_w;
- GtkWidget *keys_check_w;
- GtkListStore *key_list_store;
-
- guint n_adapters = 0;
- guint i = 0;
-
- GList* wireshark_keys=NULL;
- GList* driver_keys=NULL;
- GList* current_adapter_keys=NULL;
- GList* merged_list = NULL;
- GList* merged_list_tmp = NULL;
-
- airpcap_if_info_t* curr_adapter;
-
- keys_check_w = GTK_WIDGET(user_data);
-
- key_management_w = (GtkWidget *)g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
-
- n_adapters = g_list_length(g_airpcap_if_list);
-
- /* Retrieve Wireshark keys */
- wireshark_keys = get_wireshark_keys();
-
- merged_list = merge_key_list(wireshark_keys,NULL);
-
- /* Retrieve AirPcap driver's keys */
- driver_keys = get_airpcap_driver_keys();
-
- merged_list = merge_key_list(merged_list,driver_keys);
-
- /* NOW wireshark_keys and driver_keys ARE no more needed... at the end, we will have to free them! */
- for (i = 0; i<n_adapters; i++)
- {
- curr_adapter = (airpcap_if_info_t*)g_list_nth_data(g_airpcap_if_list,i);
- current_adapter_keys = get_airpcap_device_keys(curr_adapter);
-
- merged_list_tmp = merged_list;
- merged_list = merge_key_list(merged_list_tmp,current_adapter_keys);
- free_key_list(merged_list_tmp);
-
- }
-
- /* Set up this new list as default for Wireshark and Adapters... */
- airpcap_save_decryption_keys(merged_list,g_airpcap_if_list);
-
- free_key_list(wireshark_keys);
- free_key_list(driver_keys);
-
- gtk_widget_destroy(keys_check_w);
-
- /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
- and is not NULL if it was called when the Key Management widget has been clicked */
- if (key_management_w != NULL)
- {
- /* ... */
- key_list_store = (GtkListStore *)g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
- airpcap_fill_key_list(key_list_store);
- gtk_widget_show (key_management_w);
- }
-}
-
-static void
-on_keep_bt_clicked (GtkWidget *button _U_, gpointer user_data)
-{
- GtkWidget *key_management_w;
- GtkWidget *keys_check_w;
- GtkListStore *key_list_store=NULL;
-
- GList* wireshark_keys=NULL;
-
- GList* merged_keys=NULL;
-
- keys_check_w = GTK_WIDGET(user_data);
-
- key_management_w = (GtkWidget *)g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
-
- /* Retrieve Wireshark keys */
- wireshark_keys = get_wireshark_keys();
-
- merged_keys = merge_key_list(wireshark_keys,NULL);
-
- /* Set up this new list as default for Wireshark and Adapters... */
- airpcap_save_decryption_keys(merged_keys,g_airpcap_if_list);
-
- /* Free the memory */
- free_key_list(wireshark_keys);
-
- /* Close the window */
- gtk_widget_destroy(keys_check_w);
-
- /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
- and is not NULL if it was called when the Key Management widget has been clicked */
- if (key_management_w != NULL)
- {
- /* ... */
- key_list_store = (GtkListStore *)g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
- airpcap_fill_key_list(key_list_store);
- gtk_widget_show (key_management_w);
- }
-}
-
-static void
-on_import_bt_clicked (GtkWidget* button _U_, gpointer user_data)
-{
- GtkWidget *key_management_w;
- GtkWidget *keys_check_w;
- GtkListStore *key_list_store;
-
- guint n_adapters = 0;
- guint i = 0;
-
- GList* wireshark_keys=NULL;
- GList* driver_keys=NULL;
- GList* current_adapter_keys=NULL;
- GList* merged_list = NULL;
- GList* merged_list_tmp = NULL;
-
- airpcap_if_info_t* curr_adapter;
-
- keys_check_w = GTK_WIDGET(user_data);
-
- key_management_w = (GtkWidget *)g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
-
- n_adapters = g_list_length(g_airpcap_if_list);
-
- wireshark_keys = get_wireshark_keys();
-
- /* Retrieve AirPcap driver's keys */
- driver_keys = get_airpcap_driver_keys();
-
- merged_list = merge_key_list(merged_list,driver_keys);
-
- /* NOW wireshark_keys IS no more needed... at the end, we will have to free it! */
- for (i = 0; i<n_adapters; i++)
- {
- curr_adapter = (airpcap_if_info_t*)g_list_nth_data(g_airpcap_if_list,i);
- current_adapter_keys = get_airpcap_device_keys(curr_adapter);
-
- merged_list_tmp = merged_list;
- merged_list = merge_key_list(merged_list_tmp,current_adapter_keys);
- free_key_list(merged_list_tmp);
-
- }
-
- /* Set up this new list as default for Wireshark and Adapters... */
- airpcap_save_decryption_keys(merged_list,g_airpcap_if_list);
-
- free_key_list(wireshark_keys);
- free_key_list(driver_keys);
-
- gtk_widget_destroy(keys_check_w);
-
- /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
- and is not NULL if it was called when the Key Management widget has been clicked */
- if (key_management_w != NULL)
- {
- /* ... */
- key_list_store = (GtkListStore *)g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
- airpcap_fill_key_list(key_list_store);
- gtk_widget_show (key_management_w);
- }
-}
-
-static void
-on_ignore_bt_clicked (GtkWidget* button _U_, gpointer user_data)
-{
- GtkWidget *key_management_w;
- GtkWidget *keys_check_w;
- GtkListStore *key_list_store;
-
- keys_check_w = GTK_WIDGET(user_data);
-
- key_management_w = (GtkWidget *)g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
-
- /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
- and is not NULL if it was called when the Key Management widget has been clicked */
- if (key_management_w != NULL)
- {
- /* ... */
- key_list_store = (GtkListStore *)g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
- airpcap_fill_key_list(key_list_store);
- gtk_widget_show (key_management_w);
- }
-
- gtk_widget_destroy(keys_check_w);
-}
-
-static void
-on_keys_check_ok_bt_clicked (GtkWidget *button _U_, gpointer user_data)
-{
- GtkWidget *keys_check_w;
-
- GtkWidget *merge_rb,
- *keep_rb,
- *import_rb,
- *ignore_rb;
-
- keys_check_w = GTK_WIDGET(user_data);
-
- merge_rb = (GtkWidget *)g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_MERGE_KEY);
- keep_rb = (GtkWidget *)g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_KEEP_KEY);
- import_rb = (GtkWidget *)g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_IMPORT_KEY);
- ignore_rb = (GtkWidget *)g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_IGNORE_KEY);
-
- /* Find out which radio button is selected and call the correct function */
- if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(merge_rb)))
- on_merge_bt_clicked (merge_rb,keys_check_w);
- else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(keep_rb)))
- on_keep_bt_clicked (keep_rb,keys_check_w);
- else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(import_rb)))
- on_import_bt_clicked (import_rb,keys_check_w);
- else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ignore_rb)))
- on_ignore_bt_clicked (ignore_rb,keys_check_w);
- else on_keys_check_cancel_bt_clicked(NULL,keys_check_w);
-}
-
-static void
-on_keys_check_w_destroy (GtkWidget *w _U_, gpointer user_data)
-{
- gtk_widget_set_sensitive(top_level,TRUE);
- gtk_widget_set_sensitive(GTK_WIDGET(user_data),TRUE);
-}
-
-/*
- * Dialog box that appears whenever keys are not consistent between Wireshark and AirPcap
- */
-void
-airpcap_keys_check_w(GtkWidget *w, gpointer data _U_)
-{
- GtkWidget *keys_check_w;
- GtkWidget *main_v_box;
- GtkWidget *warning_lb;
- GtkWidget *radio_grid;
- GtkWidget *keep_rb;
- GSList *radio_bt_group = NULL;
- GtkWidget *merge_rb;
- GtkWidget *import_rb;
- GtkWidget *ignore_rb;
- GtkWidget *keep_lb;
- GtkWidget *merge_lb;
- GtkWidget *import_lb;
- GtkWidget *ignore_lb;
- GtkWidget *low_h_button_box;
- GtkWidget *ok_bt;
- GtkWidget *cancel_bt;
-
- keys_check_w = window_new (GTK_WINDOW_TOPLEVEL, "Decryption Key Warning");
- gtk_widget_set_name (keys_check_w, "keys_check_w");
- gtk_window_set_resizable (GTK_WINDOW (keys_check_w), FALSE);
-
- main_v_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_widget_set_name (main_v_box, "main_v_box");
- gtk_widget_show (main_v_box);
- gtk_container_add (GTK_CONTAINER (keys_check_w), main_v_box);
-
- warning_lb = gtk_label_new("<b>WARNING</b> Decryption keys specified in Wireshark's preferences file differ from those specified for the AirPcap adapter(s). You can choose to:");
- gtk_label_set_use_markup (GTK_LABEL (warning_lb), TRUE);
- gtk_widget_set_name (warning_lb, "warning_lb");
- gtk_widget_show (warning_lb);
- gtk_box_pack_start (GTK_BOX (main_v_box), warning_lb, FALSE, FALSE, 0);
- gtk_label_set_justify (GTK_LABEL (warning_lb), GTK_JUSTIFY_CENTER);
- gtk_label_set_line_wrap (GTK_LABEL (warning_lb), TRUE);
-
- radio_grid = ws_gtk_grid_new();
- gtk_widget_set_name (radio_grid, "radio_grid");
- gtk_widget_show (radio_grid);
- gtk_box_pack_start (GTK_BOX (main_v_box), radio_grid, TRUE, FALSE, 0);
- gtk_container_set_border_width (GTK_CONTAINER (radio_grid), 5);
- ws_gtk_grid_set_column_spacing (GTK_GRID (radio_grid), 8);
-
- keep_rb = gtk_radio_button_new_with_mnemonic (NULL, "Keep");
- gtk_widget_set_name (keep_rb, "keep_rb");
- gtk_widget_show (keep_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (radio_grid), keep_rb, 0, 0, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_radio_button_set_group (GTK_RADIO_BUTTON (keep_rb), radio_bt_group);
- radio_bt_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (keep_rb));
-
- merge_rb = gtk_radio_button_new_with_mnemonic (NULL, "Merge");
- gtk_widget_set_name (merge_rb, "merge_rb");
- gtk_widget_show (merge_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (radio_grid), merge_rb, 0, 1, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_radio_button_set_group (GTK_RADIO_BUTTON (merge_rb), radio_bt_group);
- radio_bt_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (merge_rb));
-
- import_rb = gtk_radio_button_new_with_mnemonic (NULL, "Import");
- gtk_widget_set_name (import_rb, "import_rb");
- gtk_widget_show (import_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (radio_grid), import_rb, 0, 2, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_radio_button_set_group (GTK_RADIO_BUTTON (import_rb), radio_bt_group);
- radio_bt_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (import_rb));
-
- ignore_rb = gtk_radio_button_new_with_mnemonic (NULL, "Ignore");
- gtk_widget_set_name (ignore_rb, "ignore_rb");
- gtk_widget_show (ignore_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (radio_grid), ignore_rb, 0, 3, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_radio_button_set_group (GTK_RADIO_BUTTON (ignore_rb), radio_bt_group);
- radio_bt_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (ignore_rb));
-
- keep_lb =
- gtk_label_new
- ("Use Wireshark keys, thus overwriting AirPcap adapter(s) ones.");
- gtk_widget_set_name (keep_lb, "keep_lb");
- gtk_widget_show (keep_lb);
- ws_gtk_grid_attach_extended (GTK_GRID (radio_grid), keep_lb, 1, 0, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (keep_lb), 0, 0.5f);
-
- merge_lb = gtk_label_new ("Merge Wireshark and AirPcap adapter(s) keys.");
- gtk_widget_set_name (merge_lb, "merge_lb");
- gtk_widget_show (merge_lb);
- ws_gtk_grid_attach_extended (GTK_GRID (radio_grid), merge_lb, 1, 1, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (merge_lb), 0, 0.5f);
-
- import_lb =
- gtk_label_new
- ("Use AirPcap adapter(s) keys, thus overwriting Wireshark ones.");
- gtk_widget_set_name (import_lb, "import_lb");
- gtk_widget_show (import_lb);
- ws_gtk_grid_attach_extended (GTK_GRID (radio_grid), import_lb, 1, 2, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (import_lb), 0, 0.5f);
-
- ignore_lb =
- gtk_label_new
- ("Keep using different set of keys. Remember that in this case, this dialog box will appear whenever you will attempt to modify/add/remove decryption keys.");
- gtk_widget_set_name (ignore_lb, "ignore_lb");
- gtk_widget_show (ignore_lb);
- ws_gtk_grid_attach_extended (GTK_GRID (radio_grid), ignore_lb, 1, 3, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_label_set_line_wrap (GTK_LABEL (ignore_lb), TRUE);
- gtk_misc_set_alignment (GTK_MISC (ignore_lb), 0, 0.5f);
-
- low_h_button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
- gtk_widget_set_name (low_h_button_box, "low_h_button_box");
- gtk_widget_show (low_h_button_box);
- gtk_box_pack_start (GTK_BOX (main_v_box), low_h_button_box, FALSE, FALSE,
- 0);
- gtk_button_box_set_layout (GTK_BUTTON_BOX (low_h_button_box),
- GTK_BUTTONBOX_SPREAD);
-
- ok_bt = gtk_button_new_with_mnemonic ("OK");
- gtk_widget_set_name (ok_bt, "ok_bt");
- gtk_widget_show (ok_bt);
- gtk_container_add (GTK_CONTAINER (low_h_button_box), ok_bt);
- gtk_widget_set_can_default (ok_bt, TRUE);
-
- cancel_bt = gtk_button_new_with_mnemonic ("Cancel");
- gtk_widget_set_name (cancel_bt, "cancel_bt");
- gtk_widget_show (cancel_bt);
- gtk_container_add (GTK_CONTAINER (low_h_button_box), cancel_bt);
- gtk_widget_set_can_default (cancel_bt, TRUE);
-
- /* Store pointers to all widgets, for use by lookup_widget(). */
- g_signal_connect (ok_bt, "clicked", G_CALLBACK(on_keys_check_ok_bt_clicked), keys_check_w);
- g_signal_connect (cancel_bt, "clicked", G_CALLBACK(on_keys_check_cancel_bt_clicked), keys_check_w);
- g_signal_connect (keys_check_w, "destroy", G_CALLBACK(on_keys_check_w_destroy), keys_check_w);
-
- /* Store pointers to all widgets, for use by lookup_widget(). */
- g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY,w);
- g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_MERGE_KEY,merge_rb);
- g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_KEEP_KEY,keep_rb);
- g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_IMPORT_KEY,import_rb);
- g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_IGNORE_KEY,ignore_rb);
- g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_GROUP_KEY,radio_bt_group);
-
- gtk_widget_set_sensitive(top_level,FALSE);
- gtk_widget_show(keys_check_w);
-}
-
-
-#endif /* HAVE_AIRPCAP */
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/airpcap_dlg.h b/ui/gtk/airpcap_dlg.h
deleted file mode 100644
index d90cccaa98..0000000000
--- a/ui/gtk/airpcap_dlg.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* airpcap_dlg.h
- * Declarations of routines for the "Airpcap" dialog
- *
- * Giorgio Tino <giorgio.tino@cacetech.com>
- * Copyright (c) CACE Technologies, LLC 2006
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __AIRPCAP_DLG_H__
-#define __AIRPCAP_DLG_H__
-
-#define AIRPCAP_ADVANCED_FROM_TOOLBAR 0
-#define AIRPCAP_ADVANCED_FROM_OPTIONS 1
-
-/*
- * Creates the list of available decryption modes, depending on the adapters found
- */
-void update_decryption_mode_list(GtkWidget *w);
-
-/*
- * Selects the current decryption mode in the given combo box
- */
-void update_decryption_mode(GtkWidget *w);
-
-/*
- * Turns the decryption on or off
- */
-void on_decryption_mode_cb_changed(GtkWidget *w, gpointer data _U_);
-
-/** Create a "Airpcap" dialog box caused by a button click.
- *
- * @param widget parent widget
- * @param construct_args_ptr parameters to construct the dialog (construct_args_t)
- */
-void display_airpcap_advanced_cb(GtkWidget *widget, gpointer construct_args_ptr);
-
-/* Called to create the key management window */
-void display_airpcap_key_management_cb(GtkWidget *w, gpointer data);
-
-/**/
-/*
- * Dialog box that appears whenever keys are not consistent between wieshark and airpcap
- */
-void airpcap_keys_check_w(GtkWidget *w, gpointer data);
-
-#endif
diff --git a/ui/gtk/airpcap_gui_utils.c b/ui/gtk/airpcap_gui_utils.c
deleted file mode 100644
index 5d67ecab92..0000000000
--- a/ui/gtk/airpcap_gui_utils.c
+++ /dev/null
@@ -1,2377 +0,0 @@
-/* airpcap_gui_utils.c
- *
- * Giorgio Tino <giorgio.tino@cacetech.com>
- * Copyright (c) CACE Technologies, LLC 2006
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 2000 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <gtk/gtk.h>
-#include <glib.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <wsutil/filesystem.h>
-#include <wsutil/frequency-utils.h>
-
-#include <epan/prefs.h>
-#include <epan/prefs-int.h>
-#include <epan/uat-int.h>
-#include <epan/strutil.h>
-#include <epan/crypt/dot11decrypt_ws.h>
-#include <epan/crypt/wep-wpadefs.h>
-
-#include <epan/packet.h>
-#include <epan/dissectors/packet-ieee80211.h>
-
-#include "ui/capture_ui_utils.h"
-#include "ui/simple_dialog.h"
-
-#include "ui/gtk/main.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dfilter_expr_dlg.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/keys.h"
-#include "ui/gtk/old-gtk-compat.h"
-
-#include <caputils/airpcap.h>
-#include <caputils/airpcap_loader.h>
-#include "airpcap_gui_utils.h"
-
-
-/* Controls the releay of settings back to the adapter. */
-gboolean change_airpcap_settings = FALSE;
-
-/* WLAN preferences pointer */
-module_t *wlan_prefs = NULL;
-
-/*
- * Set up the airpcap toolbar for the new capture interface
- */
-void
-airpcap_set_toolbar_start_capture(airpcap_if_info_t* if_info)
-{
- GtkWidget *airpcap_toolbar_label;
- GtkWidget *toolbar_channel_cb;
- GtkWidget *airpcap_toolbar_channel_lb;
- GtkWidget *airpcap_toolbar_channel_offset;
- GtkWidget *airpcap_toolbar_channel_offset_lb;
- GtkWidget *airpcap_toolbar_button;
- GtkWidget *airpcap_toolbar_fcs;
- GtkWidget *airpcap_toolbar_fcs_lb;
- GtkWidget *airpcap_toolbar_decryption;
- GtkWidget *airpcap_toolbar_decryption_lb;
- GtkWidget *airpcap_toolbar_keys_button;
-
- gchar *if_label_text;
-
- airpcap_toolbar_label = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_INTERFACE_KEY);
- toolbar_channel_cb = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_CHANNEL_KEY);
- airpcap_toolbar_channel_lb = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_CHANNEL_LABEL_KEY);
- airpcap_toolbar_channel_offset = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_CHANNEL_OFFSET_KEY);
- airpcap_toolbar_channel_offset_lb = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_CHANNEL_OFFSET_LABEL_KEY);
- airpcap_toolbar_fcs = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_FCS_FILTER_KEY);
- airpcap_toolbar_fcs_lb = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_FCS_FILTER_LABEL_KEY);
- airpcap_toolbar_button = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_ADVANCED_KEY);
- airpcap_toolbar_decryption = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_DECRYPTION_KEY);
- airpcap_toolbar_decryption_lb = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_DECRYPTION_LABEL_KEY);
- airpcap_toolbar_keys_button = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_KEY_MANAGEMENT_KEY);
-
- /* The current interface is an airpcap interface */
- if (if_info != NULL)
- {
- gtk_widget_set_sensitive(wireless_tb,TRUE);
- gtk_widget_set_sensitive(airpcap_toolbar_label,TRUE);
- gtk_widget_set_sensitive(toolbar_channel_cb,TRUE);
- gtk_widget_set_sensitive(airpcap_toolbar_channel_lb,TRUE);
- gtk_widget_set_sensitive(airpcap_toolbar_channel_offset,TRUE);
- gtk_widget_set_sensitive(airpcap_toolbar_channel_offset_lb,TRUE);
- gtk_widget_set_sensitive(airpcap_toolbar_fcs,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_fcs_lb,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_button,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_button,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_decryption,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_decryption_lb,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_keys_button,FALSE);
-
- /*decryption check box*/
- g_signal_handlers_block_by_func (airpcap_toolbar_decryption,airpcap_toolbar_encryption_cb, wireless_tb);
- if (if_info->DecryptionOn == AIRPCAP_DECRYPTION_ON)
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(airpcap_toolbar_decryption),TRUE);
- else
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(airpcap_toolbar_decryption),FALSE);
- g_signal_handlers_unblock_by_func (airpcap_toolbar_decryption,airpcap_toolbar_encryption_cb, wireless_tb);
-
- if_label_text = g_strdup_printf("Current Wireless Interface: #%s", airpcap_get_if_string_number(if_info));
- gtk_label_set_text(GTK_LABEL(airpcap_toolbar_label),if_label_text);
- g_free(if_label_text);
-
- change_airpcap_settings = FALSE;
- if (if_info->pSupportedChannels != NULL && if_info->numSupportedChannels > 0) {
- guint i = 0;
-
- for (; i<if_info->numSupportedChannels; i++) {
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(toolbar_channel_cb), ieee80211_mhz_to_str(if_info->pSupportedChannels[i].Frequency));
- }
- }
-
- airpcap_update_channel_combo(GTK_WIDGET(toolbar_channel_cb),if_info);
- airpcap_update_channel_offset_combo(if_info, if_info->channelInfo.Frequency, airpcap_toolbar_channel_offset, TRUE);
- change_airpcap_settings = TRUE;
- }
- else /* Current interface is NOT an AirPcap one... */
- {
- gtk_widget_set_sensitive(wireless_tb,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_label,FALSE);
- gtk_widget_set_sensitive(toolbar_channel_cb,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_channel_lb,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_channel_offset,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_channel_offset_lb,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_fcs,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_fcs_lb,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_button,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_button,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_decryption,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_decryption_lb,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_keys_button,FALSE);
- }
-}
-
-/*
- * Set up the airpcap toolbar for the new capture interface
- */
-void
-airpcap_set_toolbar_stop_capture(airpcap_if_info_t* if_info)
-{
- GtkWidget *airpcap_toolbar_crc_filter_combo;
- GtkWidget *airpcap_toolbar_label;
- GtkWidget *toolbar_channel_cb;
- GtkWidget *airpcap_toolbar_channel_lb;
- GtkWidget *airpcap_toolbar_channel_offset;
- GtkWidget *airpcap_toolbar_channel_offset_lb;
- GtkWidget *airpcap_toolbar_button;
- GtkWidget *airpcap_toolbar_fcs;
- GtkWidget *airpcap_toolbar_fcs_lb;
- GtkWidget *airpcap_toolbar_decryption;
- GtkWidget *airpcap_toolbar_decryption_lb;
- GtkWidget *airpcap_toolbar_keys_button;
-
- gchar *if_label_text;
-
- airpcap_toolbar_crc_filter_combo = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_FCS_FILTER_KEY);
- airpcap_toolbar_label = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_INTERFACE_KEY);
- toolbar_channel_cb = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_CHANNEL_KEY);
- airpcap_toolbar_channel_lb = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_CHANNEL_LABEL_KEY);
- airpcap_toolbar_channel_offset = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_CHANNEL_OFFSET_KEY);
- airpcap_toolbar_channel_offset_lb = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_CHANNEL_OFFSET_LABEL_KEY);
- airpcap_toolbar_fcs = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_FCS_FILTER_KEY);
- airpcap_toolbar_fcs_lb = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_FCS_FILTER_LABEL_KEY);
- airpcap_toolbar_button = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_ADVANCED_KEY);
- airpcap_toolbar_decryption = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_DECRYPTION_KEY);
- airpcap_toolbar_decryption_lb = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_DECRYPTION_LABEL_KEY);
- airpcap_toolbar_keys_button = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_KEY_MANAGEMENT_KEY);
-
- /* The current interface is an airpcap interface */
- if (if_info != NULL)
- {
- gtk_widget_set_sensitive(wireless_tb,TRUE);
- gtk_widget_set_sensitive(airpcap_toolbar_label,TRUE);
- gtk_widget_set_sensitive(toolbar_channel_cb,TRUE);
- gtk_widget_set_sensitive(airpcap_toolbar_channel_lb,TRUE);
- gtk_widget_set_sensitive(airpcap_toolbar_channel_offset,TRUE);
- gtk_widget_set_sensitive(airpcap_toolbar_channel_offset_lb,TRUE);
- gtk_widget_set_sensitive(airpcap_toolbar_fcs,TRUE);
- gtk_widget_set_sensitive(airpcap_toolbar_fcs_lb,TRUE);
- gtk_widget_set_sensitive(airpcap_toolbar_button,TRUE);
- gtk_widget_set_sensitive(airpcap_toolbar_crc_filter_combo,TRUE);
- gtk_widget_set_sensitive(airpcap_toolbar_decryption,TRUE);
- gtk_widget_set_sensitive(airpcap_toolbar_decryption_lb,TRUE);
- gtk_widget_set_sensitive(airpcap_toolbar_keys_button,TRUE);
- airpcap_validation_type_combo_set_by_type(airpcap_toolbar_crc_filter_combo, if_info->CrcValidationOn);
-
- /*decription check box*/
- g_signal_handlers_block_by_func (airpcap_toolbar_decryption,airpcap_toolbar_encryption_cb, wireless_tb);
- if (if_info->DecryptionOn == AIRPCAP_DECRYPTION_ON)
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(airpcap_toolbar_decryption),TRUE);
- else
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(airpcap_toolbar_decryption),FALSE);
- g_signal_handlers_unblock_by_func (airpcap_toolbar_decryption,airpcap_toolbar_encryption_cb, wireless_tb);
-
- if_label_text = g_strdup_printf("Current Wireless Interface: #%s", airpcap_get_if_string_number(if_info));
- gtk_label_set_text(GTK_LABEL(airpcap_toolbar_label),if_label_text);
- g_free(if_label_text);
-
- change_airpcap_settings = FALSE;
- if (if_info->pSupportedChannels != NULL && if_info->numSupportedChannels > 0) {
- guint i = 0;
-
- for (; i<if_info->numSupportedChannels; i++) {
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(toolbar_channel_cb), ieee80211_mhz_to_str(if_info->pSupportedChannels[i].Frequency));
- }
- }
-
- airpcap_update_channel_combo(GTK_WIDGET(toolbar_channel_cb),if_info);
- airpcap_update_channel_offset_combo(if_info, if_info->channelInfo.Frequency, airpcap_toolbar_channel_offset, TRUE);
- change_airpcap_settings = TRUE;
- }
- else
- {
- gtk_widget_set_sensitive(wireless_tb,TRUE);
- gtk_widget_set_sensitive(airpcap_toolbar_label,FALSE);
- gtk_widget_set_sensitive(toolbar_channel_cb,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_channel_lb,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_channel_offset,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_channel_offset_lb,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_fcs,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_fcs_lb,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_button,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_crc_filter_combo,FALSE);
- gtk_widget_set_sensitive(airpcap_toolbar_decryption,TRUE);
- gtk_widget_set_sensitive(airpcap_toolbar_decryption_lb,TRUE);
- gtk_widget_set_sensitive(airpcap_toolbar_keys_button,TRUE);
- change_airpcap_settings = FALSE;
- }
-}
-
-#if 0
-/* Returs TRUE if the WEP key is valid, false otherwise */
-gboolean
-wep_key_is_valid(char* key)
-{
- size_t strsize, i;
-
- if (key == NULL)
- return FALSE;
-
- strsize = strlen(key);
-
- if ( (strsize > WEP_KEY_MAX_CHAR_SIZE) || (strsize < 2))
- {
- return FALSE;
- }
- if ((strsize % 2) != 0)
- {
- return FALSE;
- }
- for(i = 0; i < strsize; i++)
- {
- if (!g_ascii_isxdigit(key[i]))
- {
- return FALSE;
- }
- }
-
- return TRUE;
-}
-#endif
-
-/*
- * Callback used by the load_wlan_keys() routine in order to read a WEP decryption key
- */
-static guint
-get_wep_key(pref_t *pref, gpointer ud)
-{
- gchar *key_string = NULL;
- guint8 key_type = DOT11DECRYPT_KEY_TYPE_WEP;
- keys_cb_data_t* user_data;
- uat_t *uat;
- guint i;
- char* err = NULL;
- uat_wep_key_record_t* wep_keys;
- decryption_key_t* new_key;
-
- /* Retrieve user data info */
- user_data = (keys_cb_data_t*)ud;
-
- if (g_ascii_strcasecmp(prefs_get_name(pref), "wep_key_table") == 0 && prefs_get_type(pref) == PREF_UAT)
- {
- uat = prefs_get_uat_value(pref);
- /* This is just a sanity check. UAT should be loaded */
- if (!uat->loaded)
- {
- if (!uat_load(uat, &err))
- {
- /* XXX - report the error */
- g_free(err);
- return 1;
- }
- }
-
- for (i = 0, wep_keys = (uat_wep_key_record_t*)*uat->user_ptr; i < *uat->nrows_p; i++, wep_keys++)
- {
- /* strip out key type if present */
- if (g_ascii_strncasecmp(wep_keys->string, STRING_KEY_TYPE_WEP ":", 4) == 0) {
- key_type = DOT11DECRYPT_KEY_TYPE_WEP;
- key_string = (gchar*)wep_keys->string+4;
- }
- else if (g_ascii_strncasecmp(wep_keys->string, STRING_KEY_TYPE_WPA_PWD ":", 8) == 0) {
- key_string = (gchar*)wep_keys->string+8;
- key_type = DOT11DECRYPT_KEY_TYPE_WPA_PWD;
- }
- else if (g_ascii_strncasecmp(wep_keys->string, STRING_KEY_TYPE_WPA_PSK ":", 8) == 0) {
- key_string = (gchar*)wep_keys->string+8;
- key_type = DOT11DECRYPT_KEY_TYPE_WPA_PSK;
- }
- else {
- key_type = wep_keys->key;
- key_string = (gchar*)wep_keys->string;
- }
-
- /* Here we have the string describing the key... */
- new_key = parse_key_string(key_string, key_type);
-
- if (new_key != NULL)
- {
- /* Key is added only if not null ... */
- user_data->list = g_list_append(user_data->list,new_key);
- user_data->number_of_keys++;
- user_data->current_index++;
- }
- }
- }
- return 0;
-}
-
-/* Callback used by the save_wlan_keys() routine in order to write a decryption key */
-static guint
-set_wep_key(pref_t *pref, gpointer ud _U_)
-{
- keys_cb_data_t* user_data;
- uat_t *uat;
- gint i;
- char* err = NULL;
- uat_wep_key_record_t uat_key;
-
- decryption_key_t* new_key;
-
- /* Retrieve user data info */
- user_data = (keys_cb_data_t*)ud;
-
- if (g_ascii_strcasecmp(prefs_get_name(pref), "wep_key_table") == 0 && prefs_get_type(pref) == PREF_UAT)
- {
- uat = prefs_get_uat_value(pref);
- if (!uat->loaded)
- {
- /* UAT will only be loaded if previous keys exist, so it may need
- to be loaded now */
- if (!uat_load(uat, &err))
- {
- /* XXX - report the error */
- g_free(err);
- return 1;
- }
- uat->loaded = 1;
- }
- /* Free the old records */
- uat_clear(uat);
-
- for (i = 0; i < user_data->number_of_keys; i++)
- {
- new_key = (decryption_key_t*)g_list_nth_data(user_data->list,i);
-
- uat_key.string = get_key_string(new_key);
- uat_key.key = new_key->type;
- uat_add_record(uat, &uat_key, TRUE);
- }
-
- if (!uat_save(uat, &err))
- {
- /* XXX - report the error */
- g_free(err);
- return 1;
- }
- }
-
- return 0;
-}
-
-/*
- * This function will tell the airpcap driver the key list to use
- * This will be stored into the registry...
- */
-static gboolean
-write_wlan_driver_wep_keys_to_registry(GList* key_list)
-{
- guint i,j,k,n,y;
- GString *new_key;
- gchar s[3];
- PAirpcapKeysCollection KeysCollection;
- guint KeysCollectionSize;
- guint8 KeyByte;
- guint keys_in_list = 0;
- decryption_key_t* key_item = NULL;
- airpcap_if_info_t* fake_info_if = NULL;
-
- /* Create the fake_info_if from the first adapter of the list */
- fake_info_if = airpcap_driver_fake_if_info_new();
-
- if (fake_info_if == NULL)
- return FALSE;
-
- /*
- * XXX - When WPA will be supported, change this to: keys_in_list = g_list_length(key_list);
- * but right now we will have to count only the WEP keys (or we will have a malloc-mess :-) )
- */
- n = g_list_length(key_list);
- for(k = 0; k < n; k++ )
- if (((decryption_key_t*)g_list_nth_data(key_list,k))->type == DOT11DECRYPT_KEY_TYPE_WEP)
- keys_in_list++;
-
- /*
- * Calculate the size of the keys collection
- */
- KeysCollectionSize = (guint)AirpcapKeysCollectionSize(keys_in_list);
-
- /*
- * Allocate the collection
- */
- KeysCollection = (PAirpcapKeysCollection)g_malloc(KeysCollectionSize);
- if (!KeysCollection)
- {
- return FALSE;
- }
-
- /*
- * Populate the key collection
- */
- KeysCollection->nKeys = keys_in_list;
-
- /*
- * XXX - If we have, let's say, six keys, the first three are WEP, then two are WPA, and the
- * last is WEP, we have to scroll the whole list (n) but increment the array counter only
- * when a WEP key is found (y) .. When WPA will be supported by the driver, I'll have to change
- * this
- */
- y = 0; /* Current position in the key list */
-
- for(i = 0; i < n; i++)
- {
- /* Retrieve the Item corresponding to the i-th key */
- key_item = (decryption_key_t*)g_list_nth_data(key_list,i);
-
- /*
- * XXX - The DOT11DECRYPT_KEY_TYPE_WEP is the only supported right now!
- * We will have to modify the AirpcapKey structure in order to
- * support the other two types! What happens now, is that simply the
- * not supported keys will just be discarded (they will be saved in Wireshark though)
- */
- if (key_item->type == DOT11DECRYPT_KEY_TYPE_WEP)
- {
- KeysCollection->Keys[y].KeyType = DOT11DECRYPT_KEY_TYPE_WEP;
-
- new_key = g_string_new(key_item->key->str);
-
- KeysCollection->Keys[y].KeyLen = (guint) new_key->len / 2;
- memset(&KeysCollection->Keys[y].KeyData, 0, sizeof(KeysCollection->Keys[y].KeyData));
-
- for(j = 0 ; j < new_key->len; j += 2)
- {
- s[0] = new_key->str[j];
- s[1] = new_key->str[j+1];
- s[2] = '\0';
- KeyByte = (guint8)strtol(s, NULL, 16);
- KeysCollection->Keys[y].KeyData[j / 2] = KeyByte;
- }
- /* XXX - Change when WPA will be supported!!! */
- y++;
- g_string_free(new_key,TRUE);
- }
- else if (key_item->type == DOT11DECRYPT_KEY_TYPE_WPA_PWD)
- {
- /* XXX - The driver cannot deal with this kind of key yet... */
- }
- else if (key_item->type == DOT11DECRYPT_KEY_TYPE_WPA_PMK)
- {
- /* XXX - The driver cannot deal with this kind of key yet... */
- }
- }
-
- /*
- * Free the old adapter key collection!
- */
- g_free(fake_info_if->keysCollection);
-
- /*
- * Set this collection ad the new one
- */
- fake_info_if->keysCollection = KeysCollection;
- fake_info_if->keysCollectionSize = KeysCollectionSize;
-
- /*
- * Configuration must be saved
- */
- fake_info_if->saved = FALSE;
-
- /*
- * Write down the changes to the registry
- */
- airpcap_save_driver_if_configuration(fake_info_if);
-
- airpcap_if_info_free(fake_info_if);
-
- return TRUE;
-}
-
-/*
- * Function used to read the Decryption Keys from the preferences and store them
- * properly into the airpcap adapter.
- */
-static gboolean
-load_wlan_driver_wep_keys(void)
-{
- keys_cb_data_t* user_data;
-
- /* Retrieve the wlan preferences */
- wlan_prefs = prefs_find_module("wlan");
-
- /* Allocate a structure used to keep infos between the callbacks */
- user_data = (keys_cb_data_t*)g_malloc(sizeof(keys_cb_data_t));
-
- /* Fill the structure */
- user_data->list = NULL;
- user_data->current_index = 0;
- user_data->number_of_keys= 0; /* Still unknown */
-
- /* Run the callback on each 802.11 preference */
- prefs_pref_foreach(wlan_prefs, get_wep_key, (gpointer)user_data);
-
- /* Now the key list should be filled */
-
- /*
- * Signal that we've changed things, and run the 802.11 dissector's
- * callback
- */
- wlan_prefs->prefs_changed_flags |= PREF_EFFECT_DISSECTION;
-
- prefs_apply(wlan_prefs);
-
- write_wlan_driver_wep_keys_to_registry(user_data->list);
-
- /* FREE MEMORY */
- /* free the WEP key string */
- g_list_foreach(user_data->list, (GFunc)free_key_string, NULL);
-
- /* free the (empty) list */
- g_list_free(user_data->list);
-
- /* free the user_data structure */
- g_free(user_data);
-
- /* airpcap_if_info_free(fake_info_if); */
-
- return TRUE;
-}
-
-/*
- * This function will tell the airpcap driver the key list to use
- * This will be stored into the registry...
- */
-static gboolean
-write_wlan_wep_keys_to_registry(airpcap_if_info_t* info_if, GList* key_list)
-{
- guint i,j;
- GString *new_key;
- gchar s[3];
- PAirpcapKeysCollection KeysCollection;
- guint KeysCollectionSize;
- guint8 KeyByte;
- guint keys_in_list = 0;
- decryption_key_t* key_item = NULL;
-
- keys_in_list = g_list_length(key_list);
-
- /*
- * Calculate the size of the keys collection
- */
- KeysCollectionSize = (guint)AirpcapKeysCollectionSize(keys_in_list);
-
- /*
- * Allocate the collection
- */
- KeysCollection = (PAirpcapKeysCollection)g_malloc(KeysCollectionSize);
- if (!KeysCollection)
- {
- return FALSE;
- }
-
- /*
- * Populate the key collection
- */
- KeysCollection->nKeys = keys_in_list;
-
- for(i = 0; i < keys_in_list; i++)
- {
- KeysCollection->Keys[i].KeyType = DOT11DECRYPT_KEY_TYPE_WEP;
-
- /* Retrieve the Item corresponding to the i-th key */
- key_item = (decryption_key_t*)g_list_nth_data(key_list,i);
- new_key = g_string_new(key_item->key->str);
-
- KeysCollection->Keys[i].KeyLen = (guint) new_key->len / 2;
- memset(&KeysCollection->Keys[i].KeyData, 0, sizeof(KeysCollection->Keys[i].KeyData));
-
- for(j = 0 ; j < new_key->len; j += 2)
- {
- s[0] = new_key->str[j];
- s[1] = new_key->str[j+1];
- s[2] = '\0';
- KeyByte = (guint8)strtol(s, NULL, 16);
- KeysCollection->Keys[i].KeyData[j / 2] = KeyByte;
- }
-
- g_string_free(new_key,TRUE);
-
- }
- /*
- * Free the old adapter key collection!
- */
- g_free(info_if->keysCollection);
-
- /*
- * Set this collection ad the new one
- */
- info_if->keysCollection = KeysCollection;
- info_if->keysCollectionSize = KeysCollectionSize;
-
- /*
- * Configuration must be saved
- */
- info_if->saved = FALSE;
-
- /*
- * Write down the changes to the registry
- */
- airpcap_save_selected_if_configuration(info_if);
-
- return TRUE;
-}
-
-/*
- * Returns the ASCII string of a key given the key bytes
- */
-static gchar*
-airpcap_get_key_string(AirpcapKey key)
-{
- unsigned int j = 0;
- gchar *dst,*src;
-
- dst = NULL;
- src = NULL;
-
- if (key.KeyType == DOT11DECRYPT_KEY_TYPE_WEP)
- {
- if (key.KeyLen != 0)
- {
- /* Allocate the string used to store the ASCII representation of the WEP key */
- dst = (gchar*)g_malloc(sizeof(gchar)*WEP_KEY_MAX_CHAR_SIZE + 1);
- /* Make sure that the first char is '\0' in order to make g_strlcat() work */
- dst[0]='\0';
-
- for(j = 0; j < key.KeyLen; j++)
- {
- src = g_strdup_printf("%.2x", key.KeyData[j]);
- /*
- * XXX - use g_strconcat() or GStrings instead ???
- */
- g_strlcat(dst, src, WEP_KEY_MAX_CHAR_SIZE+1);
- }
- g_free(src);
- }
- }
- else if (key.KeyType == DOT11DECRYPT_KEY_TYPE_WPA_PWD)
- {
- /* XXX - Add code here */
- }
- else if (key.KeyType == DOT11DECRYPT_KEY_TYPE_WPA_PMK)
- {
- /* XXX - Add code here */
- }
- else
- {
- /* XXX - Add code here */
- }
-
- return dst;
-}
-
-/*
- * Function used to save to the preference file the Decryption Keys.
- */
-static int
-save_wlan_driver_wep_keys(void)
-{
- GList* key_list = NULL;
- char* tmp_key = NULL;
- guint keys_in_list,i;
- keys_cb_data_t* user_data;
- airpcap_if_info_t* fake_info_if = NULL;
-
- /* Create the fake_info_if from the first adapter of the list */
- fake_info_if = airpcap_driver_fake_if_info_new();
-
- if (fake_info_if == NULL)
- return 0;
-
- /* Retrieve the wlan preferences */
- wlan_prefs = prefs_find_module("wlan");
-
- /* Allocate a structure used to keep infos between the callbacks */
- user_data = (keys_cb_data_t*)g_malloc(sizeof(keys_cb_data_t));
-
- /* Number of keys in key list */
- if (fake_info_if->keysCollectionSize != 0)
- keys_in_list = AirpcapKeysCollectionSizeToKeyCount(fake_info_if->keysCollectionSize);
- else
- keys_in_list = 0;
-
- for(i=0; i<keys_in_list; i++)
- {
- /* Only if it is a WEP key... */
- if (fake_info_if->keysCollection->Keys[i].KeyType == DOT11DECRYPT_KEY_TYPE_WEP)
- {
- tmp_key = airpcap_get_key_string(fake_info_if->keysCollection->Keys[i]);
- key_list = g_list_append(key_list,g_strdup(tmp_key));
- g_free(tmp_key);
- }
- }
-
- /* Now we know the exact number of WEP keys in the list, so store it ... */
- keys_in_list = g_list_length(key_list);
-
- /* Fill the structure */
- user_data->list = key_list;
- user_data->current_index = 0;
- user_data->number_of_keys= keys_in_list;
-
- /* Retrieve the wlan preferences */
- wlan_prefs = prefs_find_module("wlan");
-
- /* Run the callback on each 802.11 preference */
- prefs_pref_foreach(wlan_prefs, set_wep_key, (gpointer)user_data);
-
- /* Signal that we've changed things, and run the 802.11 dissector's
- * callback */
- wlan_prefs->prefs_changed_flags |= PREF_EFFECT_DISSECTION;
-
- /* Apply changes for the specified preference */
- prefs_apply(wlan_prefs);
-
- /* FREE MEMORY */
- /* free the WEP key string */
- for(i=0;i<g_list_length(user_data->list);i++)
- {
- g_free(g_list_nth(user_data->list,i)->data);
- }
-
- /* free the (empty) list */
- g_list_free(user_data->list);
-
- /* free the user_data structure */
- g_free(user_data);
-
- airpcap_if_info_free(fake_info_if);
-
- return keys_in_list;
-}
-
-/*
- * Function used to save to the preference file the Decryption Keys.
- */
-static int
-save_wlan_wireshark_wep_keys(GList* key_ls)
-{
- GList* key_list = NULL;
- guint keys_in_list,i;
- keys_cb_data_t* user_data;
- decryption_key_t* tmp_dk;
-
- /* Retrieve the wlan preferences */
- wlan_prefs = prefs_find_module("wlan");
-
- /* Allocate a structure used to keep infos between the callbacks */
- user_data = (keys_cb_data_t*)g_malloc(sizeof(keys_cb_data_t));
-
- keys_in_list = g_list_length(key_ls);
-
- key_list = key_ls;
-
- /* Fill the structure */
- user_data->list = key_list;
- user_data->current_index = 0;
- user_data->number_of_keys= keys_in_list;
-
- /* Retrieve the wlan preferences */
- wlan_prefs = prefs_find_module("wlan");
-
- /* Run the callback on each 802.11 preference */
- prefs_pref_foreach(wlan_prefs, set_wep_key, (gpointer)user_data);
-
- /* Signal that we've changed things, and run the 802.11 dissector's
- * callback */
- wlan_prefs->prefs_changed_flags |= PREF_EFFECT_DISSECTION;
-
- /* Apply changes for the specified preference */
- prefs_apply(wlan_prefs);
-
- /* FREE MEMORY */
- /* free the WEP key string */
- for(i=0;i<g_list_length(user_data->list);i++)
- {
- tmp_dk = (decryption_key_t*)g_list_nth(user_data->list,i)->data;
- g_string_free(tmp_dk->key,TRUE);
- if (tmp_dk->ssid != NULL) g_byte_array_free(tmp_dk->ssid,TRUE);
- }
-
- /* free the (empty) list */
- g_list_free(user_data->list);
-
- /* free the user_data structure */
- g_free(user_data);
-
- return keys_in_list;
-}
-
-/*
- * Returns the default airpcap interface of a list, NULL if list is empty
- */
-airpcap_if_info_t*
-airpcap_get_default_if(GList* airpcap_if_list_p)
-{
- airpcap_if_info_t* if_info = NULL;
-
- if ((prefs.capture_device != NULL) && (*prefs.capture_device != '\0'))
- {
- if_info = get_airpcap_if_from_name(airpcap_if_list_p,
- get_if_name(prefs.capture_device));
- }
- return if_info;
-}
-
-/*
- * DECRYPTION KEYS FUNCTIONS
- */
-#if 0
-/*
- * This function is used for DEBUG POURPOSES ONLY!!!
- */
-void
-print_key_list(GList* key_list)
-{
- gint n,i;
- decryption_key_t* tmp;
- gchar* ssid;
-
- if (key_list == NULL)
- {
- g_print("\n\n******* KEY LIST NULL *******\n\n");
- return;
- }
-
- n = g_list_length(key_list);
-
- g_print("\n\n********* KEY LIST **********\n\n");
-
- g_print("NUMBER OF KEYS IN LIST : %d\n\n",n);
-
- for(i =0; i < n; i++)
- {
- g_print("[%d] :\n",i+1);
- tmp = (decryption_key_t*)(g_list_nth_data(key_list,i));
- g_print("KEY : %s\n",tmp->key->str);
-
- g_print("BITS: %d\n",tmp->bits);
-
- if (tmp->type == DOT11DECRYPT_KEY_TYPE_WEP)
- g_print("TYPE: %s\n",AIRPCAP_WEP_KEY_STRING);
- else if (tmp->type == DOT11DECRYPT_KEY_TYPE_WPA_PWD)
- g_print("TYPE: %s\n",AIRPCAP_WPA_PWD_KEY_STRING);
- else if (tmp->type == DOT11DECRYPT_KEY_TYPE_WPA_PMK)
- g_print("TYPE: %s\n",AIRPCAP_WPA_BIN_KEY_STRING);
- else
- g_print("TYPE: %s\n","???");
-
- ssid = format_text(NULL, (guchar *)tmp->ssid->data, tmp->ssid->len);
- g_print("SSID: %s\n",(tmp->ssid != NULL) ? ssid : "---");
- g_print("\n");
- wmem_free(NULL, ssid);
- }
-
- g_print("\n*****************************\n\n");
-}
-#endif
-
-/*
- * Retrieves a GList of decryption_key_t structures containing infos about the
- * keys for the given adapter... returns NULL if no keys are found.
- */
-GList *
-get_airpcap_device_keys(airpcap_if_info_t* info_if)
-{
- /* tmp vars */
- char* tmp_key = NULL;
- guint i,keys_in_list = 0;
-
- /* real vars*/
- decryption_key_t *new_key = NULL;
- GList *key_list = NULL;
-
- /* Number of keys in key list */
- if (info_if->keysCollectionSize != 0)
- keys_in_list = AirpcapKeysCollectionSizeToKeyCount(info_if->keysCollectionSize);
- else
- keys_in_list = 0;
-
- for(i=0; i<keys_in_list; i++)
- {
- /* Different things to do depending on the key type */
- if (info_if->keysCollection->Keys[i].KeyType == DOT11DECRYPT_KEY_TYPE_WEP)
- {
- /* allocate memory for the new key item */
- new_key = (decryption_key_t*)g_malloc(sizeof(decryption_key_t));
-
- /* fill the fields */
- /* KEY */
- tmp_key = airpcap_get_key_string(info_if->keysCollection->Keys[i]);
- new_key->key = g_string_new(tmp_key);
- g_free(tmp_key);
-
- /* BITS */
- new_key->bits = (guint) new_key->key->len *4; /* every char is 4 bits in WEP keys (it is an hexadecimal number) */
-
- /* SSID not used in WEP keys */
- new_key->ssid = NULL;
-
- /* TYPE (WEP in this case) */
- new_key->type = info_if->keysCollection->Keys[i].KeyType;
-
- /* Append the new element in the list */
- key_list = g_list_append(key_list,(gpointer)new_key);
- }
- else if (info_if->keysCollection->Keys[i].KeyType == DOT11DECRYPT_KEY_TYPE_WPA_PWD)
- {
- /* XXX - Not supported yet */
- }
- else if (info_if->keysCollection->Keys[i].KeyType == DOT11DECRYPT_KEY_TYPE_WPA_PMK)
- {
- /* XXX - Not supported yet */
- }
- }
-
- return key_list;
-}
-
-/*
- * Retrieves a GList of decryption_key_t structures containing infos about the
- * keys for the global AirPcap driver... returns NULL if no keys are found.
- */
-GList *
-get_airpcap_driver_keys(void)
-{
- /* tmp vars */
- char *tmp_key = NULL;
- guint i,keys_in_list = 0;
-
- /* real vars*/
- decryption_key_t *new_key = NULL;
- GList *key_list = NULL;
-
- /*
- * To read the drivers general settings we need to create and use one airpcap adapter...
- * The only way to do that is to instantiate a fake adapter, and then close it and delete it.
- */
- airpcap_if_info_t* fake_info_if = NULL;
-
- /* Create the fake_info_if from the first adapter of the list */
- fake_info_if = airpcap_driver_fake_if_info_new();
-
- if (fake_info_if == NULL)
- return NULL;
-
- /* Number of keys in key list */
- if (fake_info_if->keysCollectionSize != 0)
- keys_in_list = AirpcapKeysCollectionSizeToKeyCount(fake_info_if->keysCollectionSize);
- else
- keys_in_list = 0;
-
- for(i=0; i<keys_in_list; i++)
- {
- /* Different things to do depending on the key type */
- if (fake_info_if->keysCollection->Keys[i].KeyType == DOT11DECRYPT_KEY_TYPE_WEP)
- {
- /* allocate memory for the new key item */
- new_key = (decryption_key_t*)g_malloc(sizeof(decryption_key_t));
-
- /* fill the fields */
- /* KEY */
- tmp_key = airpcap_get_key_string(fake_info_if->keysCollection->Keys[i]);
- new_key->key = g_string_new(tmp_key);
- g_free(tmp_key);
-
- /* BITS */
- new_key->bits = (guint) new_key->key->len *4; /* every char is 4 bits in WEP keys (it is an hexadecimal number) */
-
- /* SSID not used in WEP keys */
- new_key->ssid = NULL;
-
- /* TYPE (WEP in this case) */
- new_key->type = fake_info_if->keysCollection->Keys[i].KeyType;
-
- /* Append the new element in the list */
- key_list = g_list_append(key_list,(gpointer)new_key);
- }
- else if (fake_info_if->keysCollection->Keys[i].KeyType == DOT11DECRYPT_KEY_TYPE_WPA_PWD)
- {
- /* XXX - Not supported yet */
- }
- else if (fake_info_if->keysCollection->Keys[i].KeyType == DOT11DECRYPT_KEY_TYPE_WPA_PMK)
- {
- /* XXX - Not supported yet */
- }
- }
-
- airpcap_if_info_free(fake_info_if);
-
- return key_list;
-}
-
-/*
- * Returns the list of the decryption keys specified for wireshark, NULL if
- * no key is found
- */
-GList *
-get_wireshark_keys(void)
-{
- keys_cb_data_t *wep_user_data = NULL;
-
- GList *final_list = NULL;
- GList *wep_final_list = NULL;
-
- /* Retrieve the wlan preferences */
- wlan_prefs = prefs_find_module("wlan");
-
- /* Allocate a structure used to keep infos between the callbacks */
- wep_user_data = (keys_cb_data_t*)g_malloc(sizeof(keys_cb_data_t));
-
- /* Fill the structure */
- wep_user_data->list = NULL;
- wep_user_data->current_index = 0;
- wep_user_data->number_of_keys= 0; /* Still unknown */
-
- /* Run the callback on each 802.11 preference */
- /* XXX - Right now, only WEP keys will be loaded */
- prefs_pref_foreach(wlan_prefs, get_wep_key, (gpointer)wep_user_data);
-
- /* Copy the list field in the user data structure pointer into the final_list */
- wep_final_list = wep_user_data->list;
-
- /* XXX - Merge the three lists!!!!! */
- final_list = wep_final_list;
-
- /* free the wep_user_data structure */
- g_free(wep_user_data);
-
- return final_list;
-}
-
-
-static guint
-test_if_on(pref_t *pref, gpointer ud)
-{
- gboolean *is_on;
-
- /* Retrieve user data info */
- is_on = (gboolean*)ud;
-
- if (g_ascii_strncasecmp(prefs_get_name(pref), "enable_decryption", 17) == 0 && prefs_get_gui_type(pref) == PREF_BOOL)
- {
- *is_on = prefs_get_bool_value(pref, pref_current);
-
- return 1;
- }
- return 0;
-}
-
-/*
- * Merges two lists of keys and return a newly created GList. If a key is
- * found multiple times, it will just appear once!
- * list1 and list 2 pointer will have to be freed manually if needed!!!
- * If the total number of keys exceeeds the maximum number allowed,
- * exceeding keys will be discarded...
- */
-GList *
-merge_key_list(GList* list1, GList* list2)
-{
- guint n1=0,n2=0;
- guint i;
- decryption_key_t *dk1=NULL,
- *dk2=NULL,
- *new_dk=NULL;
-
- GList* merged_list = NULL;
-
- if ( (list1 == NULL) && (list2 == NULL) )
- return NULL;
-
- if (list1 == NULL)
- {
- n2 = g_list_length(list2);
-
- for(i=0;i<n2;i++)
- {
- new_dk = (decryption_key_t*)g_malloc(sizeof(decryption_key_t));
- dk2 = (decryption_key_t *)g_list_nth_data(list2,i);
-
- new_dk->bits = dk2->bits;
- new_dk->type = dk2->type;
- new_dk->key = g_string_new(dk2->key->str);
- new_dk->ssid = byte_array_dup(dk2->ssid);
-
- /* Check the total length of the merged list */
- if (g_list_length(merged_list) < MAX_ENCRYPTION_KEYS)
- merged_list = g_list_append(merged_list,(gpointer)new_dk);
- }
- }
- else if (list2 == NULL)
- {
- n1 = g_list_length(list1);
-
- for(i=0;i<n1;i++)
- {
- new_dk = (decryption_key_t*)g_malloc(sizeof(decryption_key_t));
- dk1 = (decryption_key_t*)g_list_nth_data(list1,i);
-
- new_dk->bits = dk1->bits;
- new_dk->type = dk1->type;
- new_dk->key = g_string_new(dk1->key->str);
- new_dk->ssid = byte_array_dup(dk1->ssid);
-
- /* Check the total length of the merged list */
- if (g_list_length(merged_list) < MAX_ENCRYPTION_KEYS)
- merged_list = g_list_append(merged_list,(gpointer)new_dk);
- }
- }
- else
- {
- n1 = g_list_length(list1);
- n2 = g_list_length(list2);
-
- /* Copy the whole list1 into merged_list */
- for(i=0;i<n1;i++)
- {
- new_dk = (decryption_key_t*)g_malloc(sizeof(decryption_key_t));
- dk1 = (decryption_key_t *)g_list_nth_data(list1,i);
-
- new_dk->bits = dk1->bits;
- new_dk->type = dk1->type;
- new_dk->key = g_string_new(dk1->key->str);
- new_dk->ssid = byte_array_dup(dk1->ssid);
-
- /* Check the total length of the merged list */
- if (g_list_length(merged_list) < MAX_ENCRYPTION_KEYS)
- merged_list = g_list_append(merged_list,(gpointer)new_dk);
- }
-
- /* Look for keys that are present in list2 but aren't in list1 yet...
- * Add them to merged_list
- */
- for(i=0;i<n2;i++)
- {
- dk2 = (decryption_key_t *)g_list_nth_data(list2,i);
-
- if (!key_is_in_list(dk2,merged_list))
- {
- new_dk = (decryption_key_t*)g_malloc(sizeof(decryption_key_t));
-
- new_dk->bits = dk2->bits;
- new_dk->type = dk2->type;
- new_dk->key = g_string_new(dk2->key->str);
- new_dk->ssid = byte_array_dup(dk2->ssid);
-
- /* Check the total length of the merged list */
- if (g_list_length(merged_list) < MAX_ENCRYPTION_KEYS)
- merged_list = g_list_append(merged_list,(gpointer)new_dk);
- }
- }
- }
-
- return merged_list;
-}
-
-/*
- * Use this function to free a key list.
- */
-void
-free_key_list(GList *list)
-{
- guint i,n;
- decryption_key_t *curr_key;
-
- if (list == NULL)
- return;
-
- n = g_list_length(list);
-
- for(i = 0; i < n; i++)
- {
- curr_key = (decryption_key_t*)g_list_nth_data(list,i);
-
- /* Free all the strings */
- if (curr_key->key != NULL)
- g_string_free(curr_key->key, TRUE);
-
- if (curr_key->ssid != NULL)
- g_byte_array_free(curr_key->ssid, TRUE);
-
- /* free the decryption_key_t structure*/
- g_free(curr_key);
- curr_key = NULL;
- }
-
- /* Free the list */
- g_list_free(list);
-
- return;
-}
-
-
-/*
- * If the given key is contained in the list, returns TRUE.
- * Returns FALSE otherwise.
- */
-gboolean
-key_is_in_list(decryption_key_t *dk,GList *list)
-{
- guint i,n;
- decryption_key_t *curr_key = NULL;
- gboolean found = FALSE;
-
- if ( (list == NULL) || (dk == NULL) )
- return FALSE;
-
- n = g_list_length(list);
-
- if (n < 1)
- return FALSE;
-
- for(i = 0; i < n; i++)
- {
- curr_key = (decryption_key_t*)g_list_nth_data(list,i);
- if (keys_are_equals(dk,curr_key))
- found = TRUE;
- }
-
- return found;
-}
-
-/*
- * Returns TRUE if keys are equals, FALSE otherwise
- */
-gboolean
-keys_are_equals(decryption_key_t *k1,decryption_key_t *k2)
-{
-
- if ((k1==NULL) || (k2==NULL))
- return FALSE;
-
- /* XXX - Remove this check when we will have the WPA/WPA2 decryption in the Driver! */
- /** if ( (k1->type == DOT11DECRYPT_KEY_TYPE_WPA_PWD) || (k2->type == DOT11DECRYPT_KEY_TYPE_WPA_PWD) || (k1->type == DOT11DECRYPT_KEY_TYPE_WPA_PMK) || (k2->type == DOT11DECRYPT_KEY_TYPE_WPA_PMK) ) **/
- /** return TRUE; **/
-
- if (g_string_equal(k1->key,k2->key) &&
- (k1->bits == k2->bits) && /* If the previous is TRUE, this must be TRUE as well */
- (k1->type == k2->type))
- {
- /* Check the ssid... if the key type is WEP, the two fields should be NULL */
- if ((k1->ssid == NULL) && (k2->ssid == NULL))
- return TRUE;
-
- /* If they are not null, they must share the same ssid */
- return byte_array_equal(k1->ssid,k2->ssid);
- }
-
- /* Some field is not equal ... */
- return FALSE;
-}
-
-/*
- * Tests if two collection of keys are equal or not, to be considered equals, they have to
- * contain the same keys in the SAME ORDER! (If both lists are NULL, which means empty will
- * return TRUE)
- */
-gboolean
-key_lists_are_equal(GList* list1, GList* list2)
-{
- guint n1 = 0,n2=0;
- /* XXX - Remove */
- guint wep_n1 = 0,wep_n2=0;
- GList *wep_list1 = NULL;
- GList *wep_list2 = NULL;
- /* XXX - END*/
- guint i/*,j*/;
- decryption_key_t *dk1=NULL,*dk2=NULL;
-
- n1 = g_list_length(list1);
- n2 = g_list_length(list2);
-
- /*
- * XXX - START : Retrieve the aublists of WEP keys!!! This is needed only 'till Driver WPA decryption
- * is implemented.
- */
- for(i=0;i<n1;i++)
- {
- dk1=(decryption_key_t*)g_list_nth_data(list1,i);
- if (dk1->type == DOT11DECRYPT_KEY_TYPE_WEP)
- {
- wep_list1 = g_list_append(wep_list1,(gpointer)dk1);
- wep_n1++;
- }
- }
- for(i=0;i<n2;i++)
- {
- dk2=(decryption_key_t*)g_list_nth_data(list2,i);
- if (dk2->type == DOT11DECRYPT_KEY_TYPE_WEP)
- {
- wep_list2 = g_list_append(wep_list2,(gpointer)dk2);
- wep_n2++;
- }
- }
-
- /*
- * XXX - END : Remove from START to END when the WPA/WPA2 decryption will be implemented in
- * the Driver
- */
-
- /*
- * Commented, because in the new AirPcap version all the keys will be saved
- * into the driver, and all the keys for every specific adapter will be
- * removed. This means that this check will always fail... and the user will
- * always be asked what to do... and it doesn't make much sense.
- */
- /* if (n1 != n2) return FALSE; */
- if (wep_n1 != wep_n2) return FALSE;
-
- n2 = wep_n2;
-
- /*for(i=0;i<n1;i++)
- {
- dk1=(decryption_key_t*)g_list_nth_data(list1,i);
- dk2=(decryption_key_t*)g_list_nth_data(list2,i);
-
- if (!g_string_equal(dk1->key,dk2->key)) return FALSE;
- }*/
- for(i=0;i<n2;i++)
- {
- dk2=(decryption_key_t*)g_list_nth_data(wep_list2,i);
- if (!key_is_in_list(dk2,wep_list1)) return FALSE;
- }
-
- return TRUE;
-}
-
-
-/*
- * Returns TRUE if the Wireshark decryption is active, false otherwise
- * XXX - Should we just add a routine to packet-ieee80211.c to grab this directly?
- */
-gboolean
-wireshark_decryption_on(void)
-{
- gboolean is_on;
-
- /* Retrieve the wlan preferences */
- wlan_prefs = prefs_find_module("wlan");
-
- /* Run the callback on each 802.11 preference */
- prefs_pref_foreach(wlan_prefs, test_if_on, (gpointer)&is_on);
-
- return is_on;
-}
-
-/*
- * Returns TRUE if the AirPcap decryption for the current adapter is active, false otherwise
- */
-gboolean
-airpcap_decryption_on(void)
-{
- gboolean is_on = FALSE;
-
- airpcap_if_info_t* fake_if_info = NULL;
-
- fake_if_info = airpcap_driver_fake_if_info_new();
-
- if (fake_if_info != NULL)
- {
- if (fake_if_info->DecryptionOn == AIRPCAP_DECRYPTION_ON)
- is_on = TRUE;
- else if (fake_if_info->DecryptionOn == AIRPCAP_DECRYPTION_OFF)
- is_on = FALSE;
- }
-
- airpcap_if_info_free(fake_if_info);
-
- return is_on;
-}
-
-static guint
-set_on_off(pref_t *pref, gpointer ud)
-{
- gboolean *is_on;
-
- /* Retrieve user data info */
- is_on = (gboolean*)ud;
-
- if (g_ascii_strncasecmp(prefs_get_name(pref), "enable_decryption", 17) == 0 && prefs_get_type(pref) == PREF_BOOL)
- {
- prefs_set_bool_value(pref, *is_on, pref_current);
- return 1;
- }
- return 0;
-}
-
-/*
- * Enables decryption for Wireshark if on_off is TRUE, disables it otherwise.
- */
-void
-set_wireshark_decryption(gboolean on_off)
-{
- gboolean is_on;
-
- is_on = on_off;
-
- /* Retrieve the wlan preferences */
- wlan_prefs = prefs_find_module("wlan");
-
- /* Run the callback on each 802.11 preference */
- prefs_pref_foreach(wlan_prefs, set_on_off, (gpointer)&is_on);
-
- /*
- * Signal that we've changed things, and run the 802.11 dissector's
- * callback
- */
- wlan_prefs->prefs_changed_flags |= PREF_EFFECT_DISSECTION;
-
- prefs_apply(wlan_prefs);
-}
-
-/*
- * Enables decryption for all the adapters if on_off is TRUE, disables it otherwise.
- */
-gboolean
-set_airpcap_decryption(gboolean on_off)
-{
- /* We need to directly access the .dll functions here... */
- gchar ebuf[AIRPCAP_ERRBUF_SIZE];
- PAirpcapHandle ad,ad_driver;
-
- gboolean success = TRUE;
-
- gint n = 0;
- gint i = 0;
- airpcap_if_info_t* curr_if = NULL;
- airpcap_if_info_t* fake_if_info = NULL;
-
- fake_if_info = airpcap_driver_fake_if_info_new();
-
- if (fake_if_info == NULL)
- /* We apparently don't have any adapters installed.
- * This isn't a failure, so return TRUE
- */
- return TRUE;
-
- /* Set the driver decryption */
- ad_driver = airpcap_if_open(fake_if_info->name, ebuf);
- if (ad_driver)
- {
- if (on_off)
- airpcap_if_set_driver_decryption_state(ad_driver,AIRPCAP_DECRYPTION_ON);
- else
- airpcap_if_set_driver_decryption_state(ad_driver,AIRPCAP_DECRYPTION_OFF);
-
- airpcap_if_close(ad_driver);
- }
-
- airpcap_if_info_free(fake_if_info);
-
- n = g_list_length(g_airpcap_if_list);
-
- /* Set to FALSE the decryption for all the adapters */
- /* Apply this change to all the adapters !!! */
- for(i = 0; i < n; i++)
- {
- curr_if = (airpcap_if_info_t*)g_list_nth_data(g_airpcap_if_list,i);
-
- if (curr_if != NULL)
- {
- ad = airpcap_if_open(curr_if->name, ebuf);
- if (ad)
- {
- curr_if->DecryptionOn = AIRPCAP_DECRYPTION_OFF;
- airpcap_if_set_decryption_state(ad,curr_if->DecryptionOn);
- /* Save configuration for the curr_if */
- if (!airpcap_if_store_cur_config_as_adapter_default(ad))
- {
- success = FALSE;
- }
- airpcap_if_close(ad);
- }
- }
- }
-
- return success;
-}
-
-
-
-/*
- * Add a key (string) to the given list
- */
-void
-airpcap_add_key_to_list(GtkListStore *key_list_store, gchar* type, gchar* key, gchar* ssid)
-{
- GtkTreeIter iter;
-
- gtk_list_store_insert_with_values(key_list_store , &iter, G_MAXINT,
- KL_COL_TYPE, type,
- KL_COL_KEY, key,
- KL_COL_SSID, ssid,
- -1);
-}
-
-/*
- * Fill the list with the keys. BEWARE! At this point, Wireshark and Drivers
- * keys should be EQUALS! But is better to load keys from Wireshark, because
- * the driver is not always present, and maybe that cannot support some keys
- * (i.e. the WPA problem)
- */
-void
-airpcap_fill_key_list(GtkListStore *key_list_store)
-{
- gchar* s = NULL;
- unsigned int i,n;
- airpcap_if_info_t* fake_if_info;
- GList* wireshark_key_list = NULL;
- decryption_key_t* curr_key = NULL;
- GtkTreeIter iter;
-
- fake_if_info = airpcap_driver_fake_if_info_new();
-
- /* We can retrieve the driver's key list (i.e. we have the right .dll)*/
- wireshark_key_list = get_wireshark_keys();
- n = g_list_length(wireshark_key_list);
-
- for(i = 0; i < n; i++)
- {
- curr_key = (decryption_key_t*)g_list_nth_data(wireshark_key_list,i);
-
- if (curr_key->type == DOT11DECRYPT_KEY_TYPE_WEP)
- {
- gtk_list_store_insert_with_values(key_list_store , &iter, G_MAXINT,
- KL_COL_TYPE, AIRPCAP_WEP_KEY_STRING,
- KL_COL_KEY, curr_key->key->str,
- KL_COL_SSID, "",
- -1);
- }
- else if (curr_key->type == DOT11DECRYPT_KEY_TYPE_WPA_PWD)
- {
- if (curr_key->ssid != NULL)
- {
- s = format_uri(NULL, curr_key->ssid, ":");
- gtk_list_store_insert_with_values(key_list_store , &iter, G_MAXINT,
- KL_COL_TYPE, AIRPCAP_WPA_PWD_KEY_STRING,
- KL_COL_KEY, curr_key->key->str,
- KL_COL_SSID, s,
- -1);
- wmem_free(NULL, s);
- }
- else
- {
- gtk_list_store_insert_with_values(key_list_store , &iter, G_MAXINT,
- KL_COL_TYPE, AIRPCAP_WPA_PWD_KEY_STRING,
- KL_COL_KEY, curr_key->key->str,
- KL_COL_SSID, "",
- -1);
- }
- }
- else if (curr_key->type == DOT11DECRYPT_KEY_TYPE_WPA_PMK)
- {
- gtk_list_store_insert_with_values(key_list_store , &iter, G_MAXINT,
- KL_COL_TYPE, AIRPCAP_WPA_BIN_KEY_STRING,
- KL_COL_KEY, curr_key->key->str,
- KL_COL_SSID, "",
- -1);
-
- }
- }
-
- airpcap_if_info_free(fake_if_info);
- return;
-}
-
-/*
- * Function used to retrieve the AirpcapValidationType given the string name.
- */
-AirpcapValidationType
-airpcap_get_validation_type(const gchar* name)
-{
- if (!(g_ascii_strcasecmp(AIRPCAP_VALIDATION_TYPE_NAME_ALL,name)))
- {
- return AIRPCAP_VT_ACCEPT_EVERYTHING;
- }
- else if (!(g_ascii_strcasecmp(AIRPCAP_VALIDATION_TYPE_NAME_CORRECT,name)))
- {
- return AIRPCAP_VT_ACCEPT_CORRECT_FRAMES;
- }
- else if (!(g_ascii_strcasecmp(AIRPCAP_VALIDATION_TYPE_NAME_CORRUPT,name)))
- {
- return AIRPCAP_VT_ACCEPT_CORRUPT_FRAMES;
- }
- return AIRPCAP_VT_UNKNOWN;
-}
-
-/*
- * Function used to retrieve the string name given an AirpcapValidationType,
- * or NULL in case of error
- */
-const gchar*
-airpcap_get_validation_name(AirpcapValidationType vt)
-{
- if (vt == AIRPCAP_VT_ACCEPT_EVERYTHING)
- {
- return AIRPCAP_VALIDATION_TYPE_NAME_ALL;
- }
- else if (vt == AIRPCAP_VT_ACCEPT_CORRECT_FRAMES)
- {
- return AIRPCAP_VALIDATION_TYPE_NAME_CORRECT;
- }
- else if (vt == AIRPCAP_VT_ACCEPT_CORRUPT_FRAMES)
- {
- return AIRPCAP_VALIDATION_TYPE_NAME_CORRUPT;
- }
- else if (vt == AIRPCAP_VT_UNKNOWN)
- {
- return AIRPCAP_VALIDATION_TYPE_NAME_UNKNOWN;
- }
- return NULL;
-}
-
-/*
- * Return an appropriate combo box entry number for the given an AirpcapValidationType,
- * defaulting to 0
- */
-gint
-airpcap_get_validation_combo_entry(AirpcapValidationType vt)
-{
- switch (vt) {
- case AIRPCAP_VT_ACCEPT_CORRECT_FRAMES:
- return 1;
- break;
- case AIRPCAP_VT_ACCEPT_CORRUPT_FRAMES:
- return 2;
- break;
- default:
- return 0;
- break;
- }
-}
-
-/*
- * Returns the AirpcapLinkType corresponding to the given string name.
- */
-AirpcapLinkType
-airpcap_get_link_type(const gchar* name)
-{
- if (!(g_ascii_strcasecmp(AIRPCAP_LINK_TYPE_NAME_802_11_ONLY,name))) {
- return AIRPCAP_LT_802_11;
- }else if (!(g_ascii_strcasecmp(AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO,name))) {
- return AIRPCAP_LT_802_11_PLUS_RADIO;
- }else if (!(g_ascii_strcasecmp(AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_PPI,name))) {
- return AIRPCAP_LT_802_11_PLUS_PPI;
- }else{
- return AIRPCAP_LT_UNKNOWN;
- }
-}
-
-/*
- * Returns the string name corresponding to the given AirpcapLinkType, or
- * NULL in case of error.
- */
-const gchar*
-airpcap_get_link_name(AirpcapLinkType lt)
-{
- if (lt == AIRPCAP_LT_802_11) {
- return AIRPCAP_LINK_TYPE_NAME_802_11_ONLY;
- }else if (lt == AIRPCAP_LT_802_11_PLUS_RADIO) {
- return AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO;
- }else if (lt == AIRPCAP_LT_802_11_PLUS_PPI) {
- return AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_PPI;
- }else if (lt == AIRPCAP_LT_UNKNOWN) {
- return AIRPCAP_LINK_TYPE_NAME_UNKNOWN;
- }
- return NULL;
-}
-
-/*
- * Sets the entry of the validation combo using the AirpcapValidationType.
- */
-void
-airpcap_validation_type_combo_set_by_type(GtkWidget* c, AirpcapValidationType type)
-{
- gtk_combo_box_set_active(GTK_COMBO_BOX(c), airpcap_get_validation_combo_entry(type));
-}
-
-/*
- * Returns the string corresponding to the given guint (1-14, for channel only)
- */
-gchar*
-airpcap_get_channel_name(guint n)
-{
- return g_strdup_printf("%d",n);
-}
-
-
-/*
- * Set the combo box entry string given a channel frequency
- */
-void
-airpcap_channel_combo_set_by_frequency(GtkWidget* cb, guint chan_freq)
-{
- guint i;
-
- for (i = 0; i < airpcap_if_selected->numSupportedChannels; i++) {
- if (airpcap_if_selected->pSupportedChannels[i].Frequency == chan_freq) {
- gtk_combo_box_set_active(GTK_COMBO_BOX(cb), i);
- break;
- }
- }
-}
-
-/*
- * Change channel of Airpcap Adapter
- */
-static gboolean
-airpcap_update_frequency_and_offset(airpcap_if_info_t* if_info)
-{
- gchar ebuf[AIRPCAP_ERRBUF_SIZE];
- PAirpcapHandle ad;
- gboolean return_value = FALSE;
-
- if (if_info != NULL) {
- ad = airpcap_if_open(if_info->name, ebuf);
-
- if (ad != NULL) {
- return_value = airpcap_if_set_device_channel_ex(ad,if_info->channelInfo);
- airpcap_if_close(ad);
- }
- }
-
- return return_value;
-}
-
-/*
- * Changed callback for the channel combobox - common routine
- */
-static void
-airpcap_channel_changed_common(GtkWidget *channel_cb, gpointer channel_offset_cb, gboolean set)
-{
- gint cur_chan_idx;
-
- if (channel_cb && channel_offset_cb && change_airpcap_settings && airpcap_if_active) {
- cur_chan_idx = gtk_combo_box_get_active(GTK_COMBO_BOX(channel_cb));
- if (cur_chan_idx >= 0 && cur_chan_idx < (gint) airpcap_if_active->numSupportedChannels) {
- if (set) {
- airpcap_if_active->channelInfo.Frequency = airpcap_if_active->pSupportedChannels[cur_chan_idx].Frequency;
- }
- airpcap_update_channel_offset_combo(airpcap_if_active,
- airpcap_if_active->channelInfo.Frequency,
- GTK_WIDGET(channel_offset_cb), set);
- }
- }
-}
-
-/*
- * Changed callback for the channel combobox - set channel and offset
- */
-void
-airpcap_channel_changed_set_cb(GtkWidget *channel_cb, gpointer channel_offset_cb)
-{
- airpcap_channel_changed_common(channel_cb, channel_offset_cb, TRUE);
-}
-
-/*
- * Changed callback for the channel combobox - don't set channel and offset
- */
-void
-airpcap_channel_changed_noset_cb(GtkWidget *channel_cb, gpointer channel_offset_cb)
-{
- airpcap_channel_changed_common(channel_cb, channel_offset_cb, FALSE);
-}
-
-static int
-airpcap_get_selected_channel_offset(GtkWidget *channel_offset_cb) {
- int offset;
- gchar *off_str;
- int retval = 0;
-
-
- if (channel_offset_cb == NULL || !gtk_widget_get_sensitive(channel_offset_cb)) {
- return 0;
- }
-
- off_str = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(channel_offset_cb));
- if (off_str && (g_ascii_strcasecmp("", off_str)))
- {
- if (airpcap_if_selected != NULL)
- {
- if (sscanf(off_str, "%d", &offset) == 1) {
- if (offset >= -1 && offset <= 1) {
- retval = offset;
- }
- }
- }
- }
- g_free(off_str);
- return retval;
-}
-
-/*
- * Changed callback for the channel offset combobox
- */
-void
-airpcap_channel_offset_changed_cb(GtkWidget *channel_offset_cb, gpointer data _U_)
-{
- airpcap_if_selected->channelInfo.ExtChannel = airpcap_get_selected_channel_offset(channel_offset_cb);
- airpcap_if_selected->saved = FALSE;
- change_airpcap_settings = TRUE;
- if (!airpcap_update_frequency_and_offset(airpcap_if_selected)) {
- simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,
- "Unable to set extension channel %d",
- airpcap_if_selected->channelInfo.ExtChannel);
- }
-}
-
-
-/*
- * Update the channel offset of the given combobox according to the given frequency.
- */
-void
-airpcap_update_channel_offset_combo(airpcap_if_info_t* if_info, guint chan_freq, GtkWidget *channel_offset_cb, gboolean set)
-{
- gint current_offset;
- gint new_offset;
- guint i;
- gint active_idx = 0;
- gint idx_count = -1;
-
- if (!if_info || airpcap_if_is_any(if_info) || if_info->pSupportedChannels == NULL || if_info->numSupportedChannels < 1) {
- gtk_widget_set_sensitive(GTK_WIDGET(channel_offset_cb),FALSE);
- gtk_combo_box_set_active(GTK_COMBO_BOX(channel_offset_cb), -1);
- return;
- }
-
- new_offset = current_offset = if_info->channelInfo.ExtChannel;
-
- /* Clear out the list */
- while (gtk_tree_model_iter_n_children(gtk_combo_box_get_model(GTK_COMBO_BOX(channel_offset_cb)), NULL) > 0) {
- gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(channel_offset_cb), 0);
- }
-
- gtk_widget_set_sensitive(GTK_WIDGET(channel_offset_cb), TRUE);
-
- for (i = 0; i < if_info->numSupportedChannels; i++) {
- if (if_info->pSupportedChannels[i].Frequency == chan_freq) {
-
- /* If we can't be low or high, nudge the offset to 0 */
- if (current_offset == -1 && !(if_info->pSupportedChannels[i].Flags & FLAG_CAN_BE_LOW)) {
- new_offset = 0;
- } else if (current_offset == 1 && !(if_info->pSupportedChannels[i].Flags & FLAG_CAN_BE_HIGH)) {
- new_offset = 0;
- }
-
- if ((if_info->pSupportedChannels[i].Flags & FLAG_CAN_BE_LOW)) {
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(channel_offset_cb), "-1");
- idx_count++;
- if (new_offset == -1) {
- active_idx = idx_count;
- }
- }
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(channel_offset_cb), "0");
- idx_count++;
- if (new_offset == 0) {
- active_idx = idx_count;
- }
- if ((if_info->pSupportedChannels[i].Flags & FLAG_CAN_BE_HIGH)) {
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(channel_offset_cb), "+1");
- idx_count++;
- if (new_offset == 1) {
- active_idx = idx_count;
- }
- }
- break;
- }
- }
-
- gtk_combo_box_set_active(GTK_COMBO_BOX(channel_offset_cb), active_idx);
-
-
- if (set) {
- change_airpcap_settings = TRUE;
-
- if_info->channelInfo.ExtChannel = new_offset;
- if (!airpcap_update_frequency_and_offset(if_info)) {
- simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Adapter failed to be set with the following settings: Frequency - %d Extension Channel - %d", if_info->channelInfo.Frequency, if_info->channelInfo.ExtChannel);
- }
- }
-
- if (idx_count < 1) {
- gtk_widget_set_sensitive(channel_offset_cb, FALSE);
- }
-}
-
-/*
- * Returns '1' if this is the "Any" adapter, '0' otherwise
- */
-int
-airpcap_if_is_any(airpcap_if_info_t* if_info)
-{
- if (g_ascii_strcasecmp(if_info->name,AIRPCAP_DEVICE_ANY_EXTRACT_STRING)==0)
- return 1;
- else
- return 0;
-}
-
-/*
- * Update channel combo box. If the airpcap interface is "Any", the combo box will be disabled.
- */
-void
-airpcap_update_channel_combo(GtkWidget* channel_cb, airpcap_if_info_t* if_info)
-{
- if (!if_info || airpcap_if_is_any(if_info) || !airpcap_if_selected)
- {
- gtk_combo_box_set_active(GTK_COMBO_BOX(channel_cb), -1);
- change_airpcap_settings = FALSE;
- gtk_widget_set_sensitive(GTK_WIDGET(channel_cb),FALSE);
- }
- else
- {
- while (gtk_tree_model_iter_n_children(gtk_combo_box_get_model(GTK_COMBO_BOX(channel_cb)), NULL) > 0) {
- gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(channel_cb), 0);
- }
-
- if (if_info->pSupportedChannels != NULL && if_info->numSupportedChannels > 0) {
- guint i;
- for (i = 0; i<(if_info->numSupportedChannels); i++) {
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(channel_cb), ieee80211_mhz_to_str(airpcap_if_selected->pSupportedChannels[i].Frequency));
- }
- }
-
- airpcap_channel_combo_set_by_frequency(channel_cb, if_info->channelInfo.Frequency);
- change_airpcap_settings = TRUE;
- gtk_widget_set_sensitive(GTK_WIDGET(channel_cb), TRUE);
- }
-}
-
-/*
- * Takes the keys from the GtkList widget, and add them to the interface list
- */
-static void
-airpcap_add_keys_to_driver_from_list(GtkListStore *key_list_store, airpcap_if_info_t *fake_if_info)
-{
- GtkTreePath *path;
- GtkTreeIter iter;
- GtkTreeModel *model = GTK_TREE_MODEL(key_list_store);
-
- /* airpcap stuff */
- guint i, j;
- gchar s[3];
- PAirpcapKeysCollection KeysCollection;
- guint KeysCollectionSize;
- guint8 KeyByte;
-
- guint keys_in_list = 0;
-
- gchar *row_type, *row_key; /* SSID not needed for AirPcap */
- size_t key_len;
-
- if (fake_if_info == NULL)
- return;
-
- keys_in_list = gtk_tree_model_iter_n_children(model, NULL);
-
- /*
- * Calculate the size of the keys collection
- */
- KeysCollectionSize = (guint)AirpcapKeysCollectionSize(keys_in_list);
-
- /*
- * Allocate the collection
- */
- KeysCollection = (PAirpcapKeysCollection)g_malloc(KeysCollectionSize);
-
- /*
- * Populate the key collection
- */
- KeysCollection->nKeys = keys_in_list;
-
- for(i = 0; i < keys_in_list; i++)
- {
- path = gtk_tree_path_new_from_indices(i, -1);
- gtk_tree_model_get_iter(model, &iter, path);
- gtk_tree_path_free(path);
- gtk_tree_model_get(model, &iter,
- KL_COL_TYPE, &row_type,
- KL_COL_KEY, &row_key,
- -1);
-
- if (g_ascii_strcasecmp(row_type,AIRPCAP_WEP_KEY_STRING) == 0)
- KeysCollection->Keys[i].KeyType = DOT11DECRYPT_KEY_TYPE_WEP;
- else if (g_ascii_strcasecmp(row_type,AIRPCAP_WPA_PWD_KEY_STRING) == 0)
- KeysCollection->Keys[i].KeyType = DOT11DECRYPT_KEY_TYPE_WPA_PWD;
- else if (g_ascii_strcasecmp(row_type,AIRPCAP_WPA_BIN_KEY_STRING) == 0)
- KeysCollection->Keys[i].KeyType = DOT11DECRYPT_KEY_TYPE_WPA_PMK;
-
- /* Retrieve the Item corresponding to the i-th key */
- key_len = strlen(row_key);
-
- KeysCollection->Keys[i].KeyLen = (guint) key_len / 2;
- memset(&KeysCollection->Keys[i].KeyData, 0, sizeof(KeysCollection->Keys[i].KeyData));
-
- /* Key must be saved in a different way, depending on its type... */
- if (KeysCollection->Keys[i].KeyType == DOT11DECRYPT_KEY_TYPE_WEP)
- {
- for(j = 0 ; j < key_len; j += 2)
- {
- s[0] = row_key[j];
- s[1] = row_key[j+1];
- s[2] = '\0';
- KeyByte = (guint8)strtol(s, NULL, 16);
- KeysCollection->Keys[i].KeyData[j / 2] = KeyByte;
- }
- }
- g_free(row_type);
- g_free(row_key);
- }
-
- /*
- * Free the old adapter key collection!
- */
- g_free(fake_if_info->keysCollection);
-
- /*
- * Set this collection ad the new one
- */
- fake_if_info->keysCollection = KeysCollection;
- fake_if_info->keysCollectionSize = KeysCollectionSize;
- return;
-}
-
-/*
- * This function will take the current keys (widget list), specified for the
- * current adapter, and save them as default for ALL the others.
- */
-void
-airpcap_read_and_save_decryption_keys_from_list_store(GtkListStore* key_list_store, airpcap_if_info_t* info_if, GList* if_list)
-{
- GtkTreeIter iter;
- GtkTreeModel *model = GTK_TREE_MODEL(key_list_store);
- gboolean items_left;
- gint if_n = 0;
- gint i = 0;
- airpcap_if_info_t* curr_if = NULL;
- airpcap_if_info_t* fake_info_if = NULL;
- GList* key_list = NULL;
-
- char* tmp_type = NULL;
- char* tmp_key = NULL;
- char* tmp_ssid = NULL;
-
- decryption_key_t* tmp_dk=NULL;
-
- /*
- * Save the keys for Wireshark...
- */
-
- /* Create a list of keys from the list store */
- for (items_left = gtk_tree_model_get_iter_first (model, &iter);
- items_left;
- items_left = gtk_tree_model_iter_next (model, &iter)) {
-
- gtk_tree_model_get(model, &iter,
- KL_COL_TYPE, &tmp_type,
- KL_COL_KEY, &tmp_key,
- KL_COL_SSID, &tmp_ssid,
- -1);
-
- if (g_ascii_strcasecmp(tmp_type, AIRPCAP_WEP_KEY_STRING) == 0)
- {
- tmp_dk = (decryption_key_t*)g_malloc(sizeof(decryption_key_t));
- tmp_dk->key = g_string_new(tmp_key);
- tmp_dk->ssid = NULL;
- tmp_dk->type = DOT11DECRYPT_KEY_TYPE_WEP;
- tmp_dk->bits = (guint) tmp_dk->key->len * 4;
- key_list = g_list_append(key_list,tmp_dk);
- }
- else if (g_ascii_strcasecmp(tmp_type, AIRPCAP_WPA_PWD_KEY_STRING) == 0)
- {
- tmp_dk = (decryption_key_t*)g_malloc(sizeof(decryption_key_t));
- tmp_dk->key = g_string_new(tmp_key);
- tmp_dk->ssid = g_byte_array_new();
- uri_str_to_bytes(tmp_ssid?tmp_ssid:"", tmp_dk->ssid);
- tmp_dk->type = DOT11DECRYPT_KEY_TYPE_WPA_PWD;
- tmp_dk->bits = 256;
- key_list = g_list_append(key_list,tmp_dk);
- }
- else if (g_ascii_strcasecmp(tmp_type, AIRPCAP_WPA_BIN_KEY_STRING) == 0)
- {
- tmp_dk = (decryption_key_t*)g_malloc(sizeof(decryption_key_t));
- tmp_dk->key = g_string_new(tmp_key);
- tmp_dk->ssid = NULL; /* No SSID in this case */
- tmp_dk->type = DOT11DECRYPT_KEY_TYPE_WPA_PMK;
- tmp_dk->bits = 256;
- key_list = g_list_append(key_list,tmp_dk);
- }
- g_free(tmp_type);
- g_free(tmp_ssid);
- }
-
- save_wlan_wireshark_wep_keys(key_list);
- /* The key_list has been freed!!! */
-
- /*
- * Save the key list for driver.
- */
- if ( (if_list == NULL) || (info_if == NULL) ) return;
-
- fake_info_if = airpcap_driver_fake_if_info_new();
-
- airpcap_add_keys_to_driver_from_list(key_list_store,fake_info_if);
- airpcap_save_driver_if_configuration(fake_info_if);
- airpcap_if_info_free(fake_info_if);
-
- if_n = g_list_length(if_list);
-
- /* For all the adapters in the list, empty the key list */
- for(i = 0; i < if_n; i++)
- {
- curr_if = (airpcap_if_info_t*)g_list_nth_data(if_list,i);
-
- if (curr_if != NULL)
- {
- /* XXX - Set an empty collection */
- airpcap_if_clear_decryption_settings(curr_if);
-
- /* Save to registry */
- airpcap_save_selected_if_configuration(curr_if);
- }
- }
-}
-
-/*
- * This function will load from the preferences file ALL the
- * keys (WEP, WPA and WPA_BIN) and will set them as default for
- * each adapter. To do this, it will save the keys in the registry...
- * A check will be performed, to make sure that keys found in
- * registry and keys found in Wireshark preferences are the same. If not,
- * the user will be asked to choose if use all keys (merge them),
- * or use Wireshark preferences ones. In the last case, registry keys will
- * be overwritten for all the connected AirPcap adapters.
- * In the first case, adapters will use their own keys, but those
- * keys will not be accessible via Wireshark...
- */
-gboolean
-airpcap_check_decryption_keys(GList* if_list)
-{
- gint if_n = 0;
- gint i = 0;
- gint n_adapters_keys = 0;
- gint n_driver_keys = 0;
- airpcap_if_info_t* curr_if = NULL;
-
- GList* wireshark_key_list;
- GList* driver_key_list;
- GList* curr_adapter_key_list;
-
- gboolean equals = TRUE;
- gboolean adapters_keys_equals=TRUE;
-
- /*
- * If no AirPcap interface is found, return TRUE, so Wireshark
- * will use HIS OWN keys.
- */
- if (if_list == NULL)
- return TRUE;
-
- if_n = g_list_length(if_list);
-
- /* Get Wireshark preferences keys */
- wireshark_key_list = get_wireshark_keys();
-
- /* Retrieve AirPcap driver's keys */
- driver_key_list = get_airpcap_driver_keys();
- n_driver_keys = g_list_length(driver_key_list);
-
- equals &= key_lists_are_equal(wireshark_key_list,driver_key_list);
-
- for(i = 0; i < if_n; i++)
- {
- curr_if = (airpcap_if_info_t*)g_list_nth_data(if_list,i);
- curr_adapter_key_list = get_airpcap_device_keys(curr_if);
- n_adapters_keys += g_list_length(curr_adapter_key_list);
- adapters_keys_equals &= key_lists_are_equal(wireshark_key_list,curr_adapter_key_list);
- }
-
- if (n_adapters_keys != 0) /* If for some reason at least one specific key has been found */
- equals &= adapters_keys_equals; /* */
-
- if (n_driver_keys == 0) /* No keys set in any of the AirPcap adapters... */
- return TRUE; /* Use Wireshark keys and set them ad default for airpcap devices */
-
- return equals;
-}
-
-/*
- * This function will load from the preferences file ALL the
- * keys (WEP, WPA_PWD and WPA_BIN) and will set them as default for
- * each adapter. To do this, it will save the keys in the registry...
- * A check will be performed, to make sure that keys found in
- * registry and keys found in Wireshark preferences are the same. If not,
- * the user will be asked to choose if use all keys (merge them),
- * or use Wireshark preferences ones. In the last case, registry keys will
- * be overwritten for all the connected AirPcap adapters.
- * In the first case, adapters will use their own keys, but those
- * keys will not be accessible via Wireshark...
- */
-void
-airpcap_load_decryption_keys(GList* if_list)
-{
- gint if_n = 0;
- gint i = 0;
-
- if (if_list == NULL) return;
-
- if_n = g_list_length(if_list);
-
- for(i = 0; i < if_n; i++)
- {
- load_wlan_driver_wep_keys();
- }
-}
-
-/*
- * This function will set the gibven GList of decryption_key_t structures
- * as the defoult for both Wireshark and the AirPcap adapters...
- */
-void
-airpcap_save_decryption_keys(GList* key_list, GList* adapters_list)
-{
- gint if_n = 0;
- gint i = 0;
- airpcap_if_info_t* curr_if = NULL;
- GList* empty_key_list = NULL;
-
- if ( (key_list == NULL) || (adapters_list == NULL)) return;
-
- if_n = g_list_length(adapters_list);
-
- /* Set the driver's global list of keys. */
- write_wlan_driver_wep_keys_to_registry(key_list);
-
- /* Empty the key list for each interface */
- for(i = 0; i < if_n; i++)
- {
- curr_if = (airpcap_if_info_t*)g_list_nth_data(adapters_list,i);
- write_wlan_wep_keys_to_registry(curr_if,empty_key_list);
- }
-
- /*
- * This will set the keys of the current adapter as Wireshark default...
- * Now all the adapters have the same keys, so curr_if is ok as any other...
- */
- save_wlan_wireshark_wep_keys(key_list);
-}
-
-/*
- * This function is used to enable/disable the toolbar widgets
- * depending on the type of interface selected... Not the whole
- * toolbar must be grayed/enabled ... Only some widgets...
- */
-void
-airpcap_enable_toolbar_widgets(GtkWidget* w, gboolean en)
-{
- GtkWidget *toolbar_tb,
- *if_description_lb,
- *toolbar_channel_cb,
- *channel_lb,
- *channel_offset_cb,
- *channel_offset_lb,
- *fcs_cb,
- *fcs_lb,
- *advanced_bt;
-
- if (w == NULL)
- return;
-
- toolbar_tb = w;
-
- if_description_lb = (GtkWidget *)g_object_get_data(G_OBJECT(toolbar_tb),AIRPCAP_TOOLBAR_INTERFACE_KEY);
- channel_lb = (GtkWidget *)g_object_get_data(G_OBJECT(toolbar_tb),AIRPCAP_TOOLBAR_CHANNEL_LABEL_KEY);
- toolbar_channel_cb = (GtkWidget *)g_object_get_data(G_OBJECT(toolbar_tb),AIRPCAP_TOOLBAR_CHANNEL_KEY);
- channel_offset_cb = (GtkWidget *)g_object_get_data(G_OBJECT(toolbar_tb),AIRPCAP_TOOLBAR_CHANNEL_OFFSET_KEY);
- channel_offset_lb = (GtkWidget *)g_object_get_data(G_OBJECT(toolbar_tb),AIRPCAP_TOOLBAR_CHANNEL_OFFSET_LABEL_KEY);
- fcs_lb = (GtkWidget *)g_object_get_data(G_OBJECT(toolbar_tb),AIRPCAP_TOOLBAR_FCS_FILTER_LABEL_KEY);
- fcs_cb = (GtkWidget *)g_object_get_data(G_OBJECT(toolbar_tb),AIRPCAP_TOOLBAR_FCS_FILTER_KEY);
- advanced_bt = (GtkWidget *)g_object_get_data(G_OBJECT(toolbar_tb),AIRPCAP_TOOLBAR_ADVANCED_KEY);
-
-
- if (if_description_lb != NULL)
- gtk_widget_set_sensitive(if_description_lb,en);
- if (channel_lb != NULL)
- gtk_widget_set_sensitive(channel_lb,en);
- if (toolbar_channel_cb != NULL)
- gtk_widget_set_sensitive(toolbar_channel_cb,en);
- if (channel_offset_cb != NULL)
- gtk_widget_set_sensitive(channel_offset_cb,en);
- if (channel_offset_lb != NULL)
- gtk_widget_set_sensitive(channel_offset_lb,en);
- if (fcs_lb != NULL)
- gtk_widget_set_sensitive(fcs_lb,en);
- if (fcs_cb != NULL)
- gtk_widget_set_sensitive(fcs_cb,en);
- if (advanced_bt != NULL)
- gtk_widget_set_sensitive(advanced_bt,en);
-
- return;
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/airpcap_gui_utils.h b/ui/gtk/airpcap_gui_utils.h
deleted file mode 100644
index d5cd0a0632..0000000000
--- a/ui/gtk/airpcap_gui_utils.h
+++ /dev/null
@@ -1,305 +0,0 @@
-/* airpcap_utils.h
- * Declarations of utility routines for the "Airpcap" dialog widgets
- *
- * Giorgio Tino <giorgio.tino@cacetech.com>
- * Copyright (c) CACE Technologies, LLC 2006
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __AIRPCAP_GUI_UTILS_H__
-#define __AIRPCAP_GUI_UTILS_H__
-
-#define AIRPCAP_VALIDATION_TYPE_NAME_ALL "All Frames"
-#define AIRPCAP_VALIDATION_TYPE_NAME_CORRECT "Valid Frames"
-#define AIRPCAP_VALIDATION_TYPE_NAME_CORRUPT "Invalid Frames"
-#define AIRPCAP_VALIDATION_TYPE_NAME_UNKNOWN "Unknown"
-
-#define AIRPCAP_LINK_TYPE_NAME_802_11_ONLY "802.11 Only"
-#define AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO "802.11 + Radio"
-#define AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_PPI "802.11 + PPI"
-#define AIRPCAP_LINK_TYPE_NAME_UNKNOWN "Unknown"
-
-#define AIRPCAP_LINK_TYPE_NUM_802_11_ONLY 0
-#define AIRPCAP_LINK_TYPE_NUM_802_11_PLUS_RADIO 1
-#define AIRPCAP_LINK_TYPE_NUM_802_11_PLUS_PPI 2
-
-#define AIRPCAP_DECRYPTION_TYPE_STRING_WIRESHARK "Wireshark"
-#define AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP "Driver"
-#define AIRPCAP_DECRYPTION_TYPE_STRING_NONE "None"
-
-/* Key list columns */
-enum {
- KL_COL_TYPE,
- KL_COL_KEY,
- KL_COL_SSID,
- KL_NUM_COLS
-};
-
-/* Controls the releay of settings back to the adapter. */
-extern gboolean change_airpcap_settings;
-
-/*
- * set up the airpcap toolbar for the new capture interface
- */
-void
-airpcap_set_toolbar_start_capture(airpcap_if_info_t* if_info);
-
-/*
- * Set up the airpcap toolbar for the new capture interface
- */
-void
-airpcap_set_toolbar_stop_capture(airpcap_if_info_t* if_info);
-
-/*
- * Add a key (string) to the given list
- */
-void
-airpcap_add_key_to_list(GtkListStore *key_list_store, gchar* type, gchar* key, gchar* ssid);
-
-/*
- * Fill the list with the keys
- */
-void
-airpcap_fill_key_list(GtkListStore *key_list_store);
-
-/*
- * Function used to retrieve the AirpcapValidationType given the string name.
- */
-AirpcapValidationType
-airpcap_get_validation_type(const gchar* name);
-
-/*
- * Function used to retrieve the string name given an AirpcapValidationType.
- */
-const gchar*
-airpcap_get_validation_name(AirpcapValidationType vt);
-
-/*
- * Return an appropriate combo box entry number for the given an AirpcapValidationType.
- */
-gint
-airpcap_get_validation_combo_entry(AirpcapValidationType vt);
-
-/*
- * Returns the AirpcapLinkType corresponding to the given string name.
- */
-AirpcapLinkType
-airpcap_get_link_type(const gchar* name);
-
-/*
- * Returns the string name corresponding to the given AirpcapLinkType.
- */
-const gchar*
-airpcap_get_link_name(AirpcapLinkType lt);
-
-/*
- * Sets the entry of the validation combo using the AirpcapValidationType.
- */
-void
-airpcap_validation_type_combo_set_by_type(GtkWidget* c,AirpcapValidationType type);
-
-/*
- * Update channel offset combo box to 'offset'.
- */
-void
-airpcap_update_channel_offset_combo(airpcap_if_info_t* if_info, guint32 ch_freq, GtkWidget *channel_offset_cb, gboolean set);
-
-
-/*
- * Retrieve the guint corresponding to the given string (channel only, handle with care!)
- */
-gchar*
-airpcap_get_channel_name(guint n);
-
-/*
- * Set the combo box entry string given an guint channel number
- */
-void
-airpcap_channel_combo_set_by_frequency(GtkWidget* w,guint channel);
-
-/** Respond to the user changing the channel combo box.
- * Update the active interface channel and update the offset
- * combo box.
- * Requires AirPcap globals.
- *
- * @param channel_cb The channel GtkComboBox
- * @param channel_offset_cb The channel offset GtkComboBox
- */
-void
-airpcap_channel_changed_set_cb(GtkWidget *channel_cb, gpointer channel_offset_cb);
-
-/** Respond to the user changing the channel combo box.
- * Update the offset combo box but not the channel.
- * Requires AirPcap globals.
- *
- * @param channel_cb The channel GtkComboBox
- * @param channel_offset_cb The channel offset GtkComboBox
- */
-void
-airpcap_channel_changed_noset_cb(GtkWidget *channel_cb, gpointer channel_offset_cb);
-
-/** Respond to the user changing the channel offset combo box.
- * Update the active interface channel offset.
- * Requires AirPcap globals.
- *
- * @param channel_offset_cb The channel offset GtkComboBox
- * @param data Unused
- */
-void
-airpcap_channel_offset_changed_cb(GtkWidget *channel_offset_cb, gpointer data);
-
-/*
- * Returns '1' if this is the "Any" adapter, '0' otherwise
- */
-int
-airpcap_if_is_any(airpcap_if_info_t* if_info);
-
-/*
- * Update channel combo box. If the airpcap interface is "Any", the combo box will be disabled.
- */
-void
-airpcap_update_channel_combo(GtkWidget* channel_cb, airpcap_if_info_t* if_info);
-
-/*
- * This function will take the current keys (widget list), specified for the
- * current adapter, and save them as default for ALL the others.
- */
-void
-airpcap_read_and_save_decryption_keys_from_list_store(GtkListStore* key_list_store, airpcap_if_info_t* info_if, GList* if_list);
-
-/*
- * This function will load from the preferences file ALL the
- * keys (WEP, WPA and WPA_BIN) and will set them as default for
- * each adapter. To do this, it will save the keys in the registry...
- */
-void
-airpcap_load_decryption_keys(GList* if_list);
-
-/*
- * This function will load from the preferences file ALL the
- * keys (WEP, WPA and WPA_BIN) and will set them as default for
- * each adapter. To do this, it will save the keys in the registry...
- */
-gboolean
-airpcap_check_decryption_keys(GList* if_list);
-
-/*
- * This function will set the gibven GList of decryption_key_t structures
- * as the defoult for both Wireshark and the AirPcap adapters...
- */
-void
-airpcap_save_decryption_keys(GList* key_list, GList* adapters_list);
-
-/*
- * This function is used to enable/disable the toolbar widgets
- * depending on the type of interface selected...
- */
-void
-airpcap_enable_toolbar_widgets(GtkWidget* w, gboolean en);
-
-/*
- * Returns the default airpcap interface of a list, NULL if list is empty
- */
-airpcap_if_info_t*
-airpcap_get_default_if(GList* airpcap_if_list);
-
-/*
- * DECRYPTION KEYS FUNCTIONS
- */
-
-/*
- * Retrieves a GList of decryption_key_t structures containing infos about the
- * keys for the given adapter... returns NULL if no keys are found.
- */
-GList*
-get_airpcap_device_keys(airpcap_if_info_t* if_info);
-
-/*
- * Retrieves a GList of decryption_key_t structures containing infos about the
- * keys for the global AirPcap driver... returns NULL if no keys are found.
- */
-GList*
-get_airpcap_driver_keys(void);
-
-/*
- * Returns the list of the decryption keys specified for wireshark, NULL if
- * no key is found
- */
-GList*
-get_wireshark_keys(void);
-
-/*
- * Tests if two collection of keys are equal or not, to be considered equals, they have to
- * contain the same keys in the SAME ORDER! (If both lists are NULL, which means empty will
- * return TRUE)
- */
-gboolean
-key_lists_are_equal(GList* list1, GList* list2);
-
-/*
- * Merges two lists of keys. If a key is found multiple times, it will just appear once!
- */
-GList*
-merge_key_list(GList* list1, GList* list2);
-
-/*
- * If the given key is contained in the list, returns TRUE.
- * Returns FALSE otherwise.
- */
-gboolean
-key_is_in_list(decryption_key_t *dk,GList *list);
-
-/*
- * Returns TRUE if keys are equals, FALSE otherwise
- */
-gboolean
-keys_are_equals(decryption_key_t *k1,decryption_key_t *k2);
-
-/*
- * Use this function to free a key list.
- */
-void
-free_key_list(GList *list);
-
-/*
- * Returns TRUE if the Wireshark decryption is active, FALSE otherwise
- */
-gboolean
-wireshark_decryption_on(void);
-
-/*
- * Returns TRUE if the AirPcap decryption for the current adapter is active, FALSE otherwise
- */
-gboolean
-airpcap_decryption_on(void);
-
-/*
- * Enables decryption for Wireshark if on_off is TRUE, disables it otherwise.
- */
-void
-set_wireshark_decryption(gboolean on_off);
-
-/*
- * Enables decryption for all the adapters if on_off is TRUE, disables it otherwise.
- */
-gboolean
-set_airpcap_decryption(gboolean on_off);
-
-#endif
diff --git a/ui/gtk/bytes_view.c b/ui/gtk/bytes_view.c
deleted file mode 100644
index 86fff12865..0000000000
--- a/ui/gtk/bytes_view.c
+++ /dev/null
@@ -1,1499 +0,0 @@
-/* bytes_view.c
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
- */
-
-/* Code based on:
- * xtext, the text widget used by X-Chat. Peter Zelezny <zed@xchat.org>.
- * GtkTextView. Copyright (C) 2000 Red Hat, Inc.
- * GtkHex. Jaka Mocnik <jaka@gnu.org>.
- * pango-layout.c: High-level layout driver. Copyright (C) 2000, 2001, 2006 Red Hat Software
- */
-
-#include "config.h"
-
-#include <gtk/gtk.h>
-#include "ui/gtk/old-gtk-compat.h"
-
-#include <string.h>
-#include <stddef.h>
-
-#include <epan/wmem/wmem.h>
-#include <epan/charsets.h>
-#include <epan/packet.h>
-
-#include "ui/recent.h"
-
-#define MARGIN 2
-#define REFRESH_TIMEOUT 10
-
-static GtkWidgetClass *parent_class = NULL;
-
-struct _BytesView
-{
- GtkWidget widget;
-
- PangoContext *context;
-
- PangoFontDescription *font;
- int font_ascent;
- int font_descent;
- int fontsize;
-
- GtkAdjustment *vadj;
- GtkAdjustment *hadj;
-#if GTK_CHECK_VERSION(3, 0, 0)
- guint hscroll_policy : 1;
- guint vscroll_policy : 1;
-#endif
- gint adj_tag;
- int max_width;
-
- gboolean bold_highlight;
- int state;
-
-/* data */
- packet_char_enc encoding; /* ASCII or EBCDIC */
- bytes_view_type format; /* bytes in hex or bytes as bits */
- guint8 *pd; /* packet data */
- int len; /* length of packet data in bytes */
-/* data-highlight (field, appendix, protocol) */
- int start[3];
- int end[3];
-
- int per_line; /* number of bytes shown per line */
- int use_digits; /* number of hex digits of byte offset */
-};
-
-#include "bytes_view.h"
-
-typedef struct _BytesViewClass
-{
- GtkWidgetClass parent_class;
-
- void (*set_scroll_adjustments)(BytesView *, GtkAdjustment *, GtkAdjustment *);
-
-} BytesViewClass;
-
-static void bytes_view_set_scroll_adjustments(BytesView *, GtkAdjustment *, GtkAdjustment *);
-static void bytes_view_adjustment_set(BytesView *);
-
-static void
-bytes_view_init(BytesView *bv)
-{
- bv->context = NULL;
-
- bv->encoding = PACKET_CHAR_ENC_CHAR_ASCII;
- bv->format = BYTES_HEX;
-
- bv->per_line = 16;
- bv->use_digits = 4;
-
- bv->max_width = 0;
-}
-
-static void
-bytes_view_destroy(BytesView *bv)
-{
- if (bv->pd) {
- g_free(bv->pd);
- bv->pd = NULL;
- }
- if (bv->adj_tag) {
- g_source_remove(bv->adj_tag);
- bv->adj_tag = 0;
- }
- if (bv->vadj) {
- g_object_unref(G_OBJECT(bv->vadj));
- bv->vadj = NULL;
- }
- if (bv->hadj) {
- g_object_unref(G_OBJECT(bv->hadj));
- bv->hadj = NULL;
- }
- if (bv->font) {
- pango_font_description_free(bv->font);
- bv->font = NULL;
- }
- if (bv->context) {
- g_object_unref(bv->context);
- bv->context = NULL;
- }
-}
-
-#if GTK_CHECK_VERSION(3, 0, 0)
-static void
-bytes_view_destroy_widget(GtkWidget *widget)
-{
- bytes_view_destroy(BYTES_VIEW(widget));
-
- GTK_WIDGET_CLASS(parent_class)->destroy(widget);
-}
-
-#else
-
-static void
-bytes_view_destroy_object(GtkObject *object)
-{
- bytes_view_destroy(BYTES_VIEW(object));
-
- if (GTK_OBJECT_CLASS(parent_class)->destroy)
- (*GTK_OBJECT_CLASS(parent_class)->destroy)(object);
-}
-
-#endif
-
-static void
-bytes_view_ensure_layout(BytesView *bv)
-{
- if (bv->context == NULL) {
- bv->context = gtk_widget_get_pango_context(GTK_WIDGET(bv));
- g_object_ref(bv->context);
-
- {
- PangoLanguage *lang;
- PangoFontMetrics *metrics;
-
- /* vte and xchat does it this way */
- lang = pango_context_get_language(bv->context);
- metrics = pango_context_get_metrics(bv->context, bv->font, lang);
- bv->font_ascent = pango_font_metrics_get_ascent(metrics) / PANGO_SCALE;
- bv->font_descent = pango_font_metrics_get_descent(metrics) / PANGO_SCALE;
- pango_font_metrics_unref(metrics);
-
- bv->fontsize = bv->font_ascent + bv->font_descent;
- }
- g_assert(bv->context);
- bytes_view_adjustment_set(bv);
- }
-}
-
-static void
-bytes_view_realize(GtkWidget *widget)
-{
- BytesView *bv;
- GdkWindowAttr attributes;
- GtkAllocation allocation;
- GdkWindow *win;
-
-#if GTK_CHECK_VERSION(3, 0, 0)
- GtkStyleContext *context;
-#endif
-
- _gtk_widget_set_realized_true(widget);
- bv = BYTES_VIEW(widget);
-
- gtk_widget_get_allocation(widget, &allocation);
-
- attributes.window_type = GDK_WINDOW_CHILD;
- attributes.x = allocation.x;
- attributes.y = allocation.y;
- attributes.width = allocation.width;
- attributes.height = allocation.height;
- attributes.wclass = GDK_INPUT_OUTPUT;
- attributes.visual = gtk_widget_get_visual(widget);
- attributes.event_mask = gtk_widget_get_events(widget) | GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK;
-
-#if !GTK_CHECK_VERSION(3, 0, 0)
- attributes.colormap = gtk_widget_get_colormap(widget);
-
- win = gdk_window_new(gtk_widget_get_parent_window(widget), &attributes, GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP);
-#else
- win = gdk_window_new(gtk_widget_get_parent_window(widget), &attributes, GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL);
-#endif
-
- gtk_widget_set_window(widget, win);
-
-#if GTK_CHECK_VERSION(3, 8, 0)
- gtk_widget_register_window(widget, win);
-#else
- gdk_window_set_user_data(win, widget);
-#endif
-
-#if !GTK_CHECK_VERSION(3, 0, 0) /* XXX, check */
- gdk_window_set_back_pixmap(win, NULL, FALSE);
-#endif
-
-#if GTK_CHECK_VERSION(3, 0, 0)
- context = gtk_widget_get_style_context(widget);
- gtk_style_context_add_class(context, GTK_STYLE_CLASS_VIEW);
- /* gtk_style_context_add_class(context, GTK_STYLE_CLASS_ENTRY); */
-
-#elif GTK_CHECK_VERSION(2, 20, 0)
- gtk_widget_style_attach(widget);
-#else
- widget->style = gtk_style_attach(widget->style, win);
-#endif
- bytes_view_ensure_layout(bv);
-}
-
-static void
-bytes_view_unrealize(GtkWidget *widget)
-{
- BytesView *bv = BYTES_VIEW(widget);
-
- if (bv->context) {
- g_object_unref(bv->context);
- bv->context = NULL;
- }
- /* if there are still events in the queue, this'll avoid segfault */
-#if !GTK_CHECK_VERSION(3, 8, 0)
- gdk_window_set_user_data(gtk_widget_get_window(widget), NULL);
-#endif
-
- if (parent_class->unrealize)
- (*GTK_WIDGET_CLASS(parent_class)->unrealize)(widget);
-}
-
-static GtkAdjustment *
-bytes_view_ensure_vadj(BytesView *bv)
-{
- if (bv->vadj == NULL) {
- bytes_view_set_scroll_adjustments(bv, bv->hadj, bv->vadj);
- g_assert(bv->vadj != NULL);
- }
- return bv->vadj;
-}
-
-static GtkAdjustment *
-bytes_view_ensure_hadj(BytesView *bv)
-{
- if (bv->hadj == NULL) {
- bytes_view_set_scroll_adjustments(bv, bv->hadj, bv->vadj);
- g_assert(bv->hadj != NULL);
- }
- return bv->hadj;
-}
-
-static gboolean
-bytes_view_scroll(GtkWidget *widget, GdkEventScroll *event)
-{
- BytesView *bv = BYTES_VIEW(widget);
-
- gdouble new_value;
-
- if (event->direction == GDK_SCROLL_UP) { /* mouse wheel pageUp */
- bytes_view_ensure_vadj(bv);
-
- new_value = gtk_adjustment_get_value(bv->vadj) - (gtk_adjustment_get_page_increment(bv->vadj) / 10);
- if (new_value < gtk_adjustment_get_lower(bv->vadj))
- new_value = gtk_adjustment_get_lower(bv->vadj);
- gtk_adjustment_set_value(bv->vadj, new_value);
-
- } else if (event->direction == GDK_SCROLL_DOWN) { /* mouse wheel pageDn */
- bytes_view_ensure_vadj(bv);
-
- new_value = gtk_adjustment_get_value(bv->vadj) + (gtk_adjustment_get_page_increment(bv->vadj) / 10);
- if (new_value > (gtk_adjustment_get_upper(bv->vadj) - gtk_adjustment_get_page_size(bv->vadj)))
- new_value = gtk_adjustment_get_upper(bv->vadj) - gtk_adjustment_get_page_size(bv->vadj);
- gtk_adjustment_set_value(bv->vadj, new_value);
- }
- return FALSE;
-}
-
-static void
-bytes_view_allocate(GtkWidget *widget, GtkAllocation *allocation)
-{
- gtk_widget_set_allocation(widget, allocation);
-
- if (gtk_widget_get_realized(widget)) {
- BytesView *bv = BYTES_VIEW(widget);
-
- gdk_window_move_resize(gtk_widget_get_window(widget), allocation->x, allocation->y, allocation->width, allocation->height);
- bytes_view_adjustment_set(bv);
- }
-}
-
-#if GTK_CHECK_VERSION(3, 0, 0)
-static void
-bytes_view_get_preferred_width(GtkWidget *widget _U_, gint *minimum, gint *natural)
-{
- *minimum = *natural = 200;
-}
-
-static void
-bytes_view_get_preferred_height(GtkWidget *widget _U_, gint *minimum, gint *natural)
-{
- *minimum = *natural = 90;
-}
-
-#else
-
-static void
-bytes_view_size_request(GtkWidget *widget _U_, GtkRequisition *requisition)
-{
- requisition->width = 200;
- requisition->height = 90;
-}
-#endif
-
-static GSList *
-_pango_runs_build(BytesView *bv, const char *str, int len)
-{
- GSList *runs = NULL;
-
- PangoAttrList *attrs;
- PangoAttrIterator *iter;
-
- GList *run_list;
- GList *tmp_list;
-
- attrs = pango_attr_list_new();
- pango_attr_list_insert_before(attrs, pango_attr_font_desc_new(bv->font));
-
- iter = pango_attr_list_get_iterator(attrs);
-
- run_list = pango_itemize(bv->context, str, 0, len, attrs, iter);
-
- for (tmp_list = run_list; tmp_list; tmp_list = tmp_list->next) {
- PangoLayoutRun *run = g_slice_new(PangoLayoutRun);
- PangoItem *run_item = (PangoItem *)tmp_list->data;
-
- run->item = run_item;
-
- /* XXX pango_layout_get_item_properties(run_item, &state->properties); */
-
- run->glyphs = pango_glyph_string_new();
- pango_shape(str + run_item->offset, run_item->length, &run_item->analysis, run->glyphs);
-
- runs = g_slist_prepend(runs, run);
- }
-
- g_list_free(run_list);
-
- pango_attr_iterator_destroy(iter);
- pango_attr_list_unref(attrs);
-
- return g_slist_reverse(runs);
-}
-
-static int
-_pango_glyph_string_to_pixels(PangoGlyphString *glyphs, PangoFont *font _U_)
-{
-#if PANGO_VERSION_MAJOR == 1 && PANGO_VERSION_MINOR >= 14
- return pango_glyph_string_get_width(glyphs) / PANGO_SCALE;
-#else
- PangoRectangle logical_rect;
-
- pango_glyph_string_extents(glyphs, font, NULL, &logical_rect);
- /* pango_extents_to_pixels(&logical_rect, NULL); */
-
- return (logical_rect.width / PANGO_SCALE);
-#endif
-}
-
-static int
-xtext_draw_layout_line(cairo_t *cr, gint x, gint y, GSList *runs)
-{
- while (runs) {
- PangoLayoutRun *run = (PangoLayoutRun *)runs->data;
-
- cairo_move_to(cr, x, y);
- pango_cairo_show_glyph_string(cr, run->item->analysis.font, run->glyphs);
-
- x += _pango_glyph_string_to_pixels(run->glyphs, run->item->analysis.font);
- runs = runs->next;
- }
- return x;
-}
-
-static int
-_pango_runs_width(GSList *runs)
-{
- int width = 0;
-
- while (runs) {
- PangoLayoutRun *run = (PangoLayoutRun *)runs->data;
-
- width += _pango_glyph_string_to_pixels(run->glyphs, run->item->analysis.font);
- runs = runs->next;
- }
- return width;
-}
-
-static void
-_pango_runs_free(GSList *runs)
-{
- GSList *list = runs;
-
- while (list) {
- PangoLayoutRun *run = (PangoLayoutRun *)list->data;
-
- pango_item_free(run->item);
- pango_glyph_string_free(run->glyphs);
- g_slice_free(PangoLayoutRun, run);
-
- list = list->next;
- }
- g_slist_free(runs);
-}
-
-typedef int bytes_view_line_cb(BytesView *, void *data, int x, int arg1, const char *str, int len);
-
-static int
-bytes_view_flush_render(BytesView *bv, void *data, int x, int y, const char *str, int len)
-{
- cairo_t *cr = (cairo_t *)data;
- GSList *line_runs;
- int str_width;
-
-#if GTK_CHECK_VERSION(3, 0, 0)
- GtkStyleContext *context;
- GdkRGBA bg_color, fg_color;
-#endif
-
- if (len < 1)
- return 0;
-
- line_runs = _pango_runs_build(bv, str, len);
-
- /* XXX, cliping */
-
-#if GTK_CHECK_VERSION(3, 0, 0)
- context = gtk_widget_get_style_context(GTK_WIDGET(bv));
-#endif
-
- if (bv->state == GTK_STATE_SELECTED || bv->state == GTK_STATE_INSENSITIVE) {
- str_width = _pango_runs_width(line_runs);
-
- /* background */
-#if GTK_CHECK_VERSION(3, 0, 0)
- gtk_style_context_get_background_color(context, (GtkStateFlags)( (bv->state == GTK_STATE_SELECTED ? GTK_STATE_FLAG_FOCUSED : 0) | GTK_STATE_FLAG_SELECTED), &bg_color);
- gdk_cairo_set_source_rgba(cr, &bg_color);
-#else
- gdk_cairo_set_source_color(cr, &gtk_widget_get_style(GTK_WIDGET(bv))->base[bv->state]);
-#endif
- cairo_rectangle(cr, x, y - bv->font_ascent, str_width, bv->fontsize);
- cairo_fill(cr);
- }
-
- /* text */
-#if GTK_CHECK_VERSION(3, 0, 0)
- gtk_style_context_get_color(context, (GtkStateFlags)(GTK_STATE_FLAG_FOCUSED | (bv->state == GTK_STATE_SELECTED ? GTK_STATE_FLAG_SELECTED : GTK_STATE_FLAG_NORMAL)), &fg_color);
- gdk_cairo_set_source_rgba(cr, &fg_color);
-#else
- gdk_cairo_set_source_color(cr, &gtk_widget_get_style(GTK_WIDGET(bv))->text[bv->state]);
-#endif
- str_width = xtext_draw_layout_line(cr, x, y, line_runs)-x;
-
- _pango_runs_free(line_runs);
-
- return str_width;
-}
-
-static int
-_pango_runs_find_index(GSList *runs, int x_pos, const char *str)
-{
- int start_pos = 0;
-
- while (runs) {
- PangoLayoutRun *run = (PangoLayoutRun *)runs->data;
- int width;
-
- width = _pango_glyph_string_to_pixels(run->glyphs, run->item->analysis.font);
-
- if (x_pos >= start_pos && x_pos < start_pos + width) {
- gboolean char_trailing;
- int pos;
-
- pango_glyph_string_x_to_index(run->glyphs,
- (char *) str + run->item->offset, run->item->length,
- &run->item->analysis,
- (x_pos - start_pos) * PANGO_SCALE,
- &pos, &char_trailing);
-
- return run->item->offset + pos;
- }
-
- start_pos += width;
- runs = runs->next;
- }
- return -1;
-}
-
-static int
-bytes_view_flush_pos(BytesView *bv, void *data, int x, int search_x, const char *str, int len)
-{
- int *pos_x = (int *)data;
- GSList *line_runs;
- int line_width;
-
- if (len < 1)
- return 0;
-
- line_runs = _pango_runs_build(bv, str, len);
-
- line_width = _pango_runs_width(line_runs);
-
- if (x <= search_x && x + line_width > search_x) {
- int off_x = search_x - x;
- int pos_run;
-
- if ((pos_run = _pango_runs_find_index(line_runs, off_x, str)) != -1)
- *pos_x = (-*pos_x) + pos_run;
-
- return -1; /* terminate */
- } else
- *pos_x -= len;
-
- _pango_runs_free(line_runs);
-
- return line_width;
-}
-
-static void
-bytes_view_render_state(BytesView *bv, int state)
-{
- g_assert(state == GTK_STATE_NORMAL || state == GTK_STATE_SELECTED || state == GTK_STATE_INSENSITIVE);
-
- if (bv->bold_highlight) {
- pango_font_description_set_weight(bv->font,
- (state == GTK_STATE_SELECTED) ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL);
- bv->state = GTK_STATE_NORMAL;
- } else
- bv->state = state;
-}
-
-#define BYTE_VIEW_SEP 8 /* insert a space every BYTE_VIEW_SEP bytes */
-
-static void
-_bytes_view_line_common(BytesView *bv, void *data, const int org_off, int xx, int arg1, bytes_view_line_cb flush)
-{
- static const guchar hexchars[16] = {
- '0', '1', '2', '3', '4', '5', '6', '7',
- '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
-
- const guint8 *pd = bv->pd;
- const int len = bv->len;
-
- int state;
-
- char str[128];
- int cur = 0;
-
- int off;
- guchar c;
- int byten;
- int j;
-
- int scroll_x;
- int dx;
-
- g_assert(org_off >= 0);
-
- scroll_x = (int) gtk_adjustment_get_value(bytes_view_ensure_hadj(bv));
-
- state = GTK_STATE_NORMAL;
- bytes_view_render_state(bv, GTK_STATE_NORMAL);
-
- /* Print the line number */
- j = bv->use_digits;
- do {
- j--;
- c = (org_off >> (j*4)) & 0xF;
- str[cur++] = hexchars[c];
- } while (j != 0);
- str[cur++] = ' ';
- str[cur++] = ' ';
-
- /* Print the hex bit */
- for (byten = 0, off = org_off; byten < bv->per_line; byten++) {
- gboolean byte_highlighted =
- (off >= bv->start[0] && off < bv->end[0]) ||
- (off >= bv->start[1] && off < bv->end[1]);
- gboolean proto_byte_highlighted =
- (off >= bv->start[2] && off < bv->end[2]);
-
- int state_cur = (off < len && byte_highlighted) ?
- GTK_STATE_SELECTED :
- (off < len && proto_byte_highlighted) ?
- GTK_STATE_INSENSITIVE :
- GTK_STATE_NORMAL;
-
- if (state_cur != state) {
- /* ok, we want to put space, we prefer to put it in STATE_NORMAL or STATE_INSENSITIVE */
- int space_now = (state_cur != GTK_STATE_NORMAL && state_cur != GTK_STATE_INSENSITIVE)
- || state == GTK_STATE_NORMAL;
-
- if (space_now && byten) {
- str[cur++] = ' ';
- /* insert a space every BYTE_VIEW_SEP bytes */
- if ((off % BYTE_VIEW_SEP) == 0)
- str[cur++] = ' ';
- }
-
- if ((dx = flush(bv, data, xx - scroll_x, arg1, str, cur)) < 0)
- return;
- xx += dx;
- cur = 0;
- bytes_view_render_state(bv, state_cur);
- state = state_cur;
-
- if (!space_now && byten) {
- str[cur++] = ' ';
- /* insert a space every BYTE_VIEW_SEP bytes */
- if ((off % BYTE_VIEW_SEP) == 0)
- str[cur++] = ' ';
- }
-
- } else if (byten) {
- str[cur++] = ' ';
- /* insert a space every BYTE_VIEW_SEP bytes */
- if ((off % BYTE_VIEW_SEP) == 0)
- str[cur++] = ' ';
- }
-
- if (off < len) {
- switch (bv->format) {
- case BYTES_HEX:
- str[cur++] = hexchars[(pd[off] & 0xf0) >> 4];
- str[cur++] = hexchars[pd[off] & 0x0f];
- break;
- case BYTES_BITS:
- /* XXX, bitmask */
- for (j = 7; j >= 0; j--)
- str[cur++] = (pd[off] & (1 << j)) ? '1' : '0';
- break;
- }
- } else {
- switch (bv->format) {
- case BYTES_HEX:
- str[cur++] = ' ';
- str[cur++] = ' ';
- break;
- case BYTES_BITS:
- for (j = 7; j >= 0; j--)
- str[cur++] = ' ';
- break;
- }
- }
- off++;
- }
-
- if (state != GTK_STATE_NORMAL) {
- if ((dx = flush(bv, data, xx - scroll_x, arg1, str, cur)) < 0)
- return;
- xx += dx;
- cur = 0;
- bytes_view_render_state(bv, GTK_STATE_NORMAL);
- state = GTK_STATE_NORMAL;
- }
-
- /* Print some space at the end of the line */
- str[cur++] = ' '; str[cur++] = ' '; str[cur++] = ' ';
-
- /* Print the ASCII bit */
- for (byten = 0, off = org_off; byten < bv->per_line; byten++) {
- gboolean byte_highlighted =
- (off >= bv->start[0] && off < bv->end[0]) ||
- (off >= bv->start[1] && off < bv->end[1]);
- gboolean proto_byte_highlighted =
- (off >= bv->start[2] && off < bv->end[2]);
-
- int state_cur = (off < len && byte_highlighted) ?
- GTK_STATE_SELECTED :
- (off < len && proto_byte_highlighted) ?
- GTK_STATE_INSENSITIVE :
- GTK_STATE_NORMAL;
-
- if (state_cur != state) {
- int space_now = (state_cur != GTK_STATE_NORMAL && state_cur != GTK_STATE_INSENSITIVE)
- || state == GTK_STATE_NORMAL;
-
- if (space_now && byten) {
- /* insert a space every BYTE_VIEW_SEP bytes */
- if ((off % BYTE_VIEW_SEP) == 0)
- str[cur++] = ' ';
- }
-
- if ((dx = flush(bv, data, xx - scroll_x, arg1, str, cur)) < 0)
- return;
- xx += dx;
- cur = 0;
- bytes_view_render_state(bv, state_cur);
- state = state_cur;
-
- if (!space_now && byten) {
- /* insert a space every BYTE_VIEW_SEP bytes */
- if ((off % BYTE_VIEW_SEP) == 0)
- str[cur++] = ' ';
- }
-
- } else if (byten) {
- /* insert a space every BYTE_VIEW_SEP bytes */
- if ((off % BYTE_VIEW_SEP) == 0)
- str[cur++] = ' ';
- }
-
- if (off < len) {
- c = (bv->encoding == PACKET_CHAR_ENC_CHAR_EBCDIC) ?
- EBCDIC_to_ASCII1(pd[off]) :
- pd[off];
-
- str[cur++] = g_ascii_isprint(c) ? c : '.';
- } else
- str[cur++] = ' ';
-
- off++;
- }
-
- if (cur) {
- if ((dx = flush(bv, data, xx - scroll_x, arg1, str, cur)) < 0)
- return;
- xx += dx;
- /* cur = 0; */
- }
-
- if (state != GTK_STATE_NORMAL) {
- bytes_view_render_state(bv, GTK_STATE_NORMAL);
- /* state = GTK_STATE_NORMAL; */
- }
-
- if (bv->max_width < xx)
- bv->max_width = xx;
-}
-
-static void
-_bytes_view_render_line(BytesView *bv, cairo_t *cr, const int org_off, int yy)
-{
- _bytes_view_line_common(bv, cr, org_off, MARGIN, yy, bytes_view_flush_render);
-}
-
-static int
-_bytes_view_find_pos(BytesView *bv, const int org_off, int search_x)
-{
- int pos_x = 0;
-
- _bytes_view_line_common(bv, &pos_x, org_off, MARGIN, search_x, bytes_view_flush_pos);
-
- return pos_x;
-}
-
-static void
-bytes_view_render(BytesView *bv, cairo_t *cr, GdkRectangle *area)
-{
- const int old_max_width = bv->max_width;
-
- int width, height;
- int y;
- int off;
-
- guint line, lines_max;
- guint lines_max_full;
-
-#if GTK_CHECK_VERSION(3, 0, 0)
- GtkStyleContext *context;
- GdkRGBA bg_color;
-#endif
-
- if (!gtk_widget_get_realized(GTK_WIDGET(bv)))
- return;
-
- bytes_view_ensure_layout(bv);
-
-#if GTK_CHECK_VERSION(3, 0, 0)
- width = gtk_widget_get_allocated_width(GTK_WIDGET(bv));
- height = gtk_widget_get_allocated_height(GTK_WIDGET(bv));
-#elif GTK_CHECK_VERSION(2,24,0)
- width = gdk_window_get_width(gtk_widget_get_window(GTK_WIDGET(bv)));
- height = gdk_window_get_height(gtk_widget_get_window(GTK_WIDGET(bv)));
-#else
- ws_gdk_drawable_get_size(gtk_widget_get_window(GTK_WIDGET(bv)), &width, &height);
-#endif
-
- if (width < 32 + MARGIN || height < bv->fontsize)
- return;
-
- if (area) {
- line = area->y / bv->fontsize;
- lines_max = 1 + (area->y + area->height) / bv->fontsize;
- } else {
- line = 0;
- lines_max = (guint) -1;
- }
- /* g_print("from %d to %d\n", line, lines_max); */
-
- y = (bv->fontsize * line);
-
- /* clear */
-#if GTK_CHECK_VERSION(3, 0, 0)
- context = gtk_widget_get_style_context(GTK_WIDGET(bv));
- gtk_style_context_get_background_color(context, (GtkStateFlags)(GTK_STATE_FLAG_FOCUSED | GTK_STATE_FLAG_NORMAL), &bg_color);
- gdk_cairo_set_source_rgba(cr, &bg_color);
-#else
- gdk_cairo_set_source_color(cr, &gtk_widget_get_style(GTK_WIDGET(bv))->base[GTK_STATE_NORMAL]);
-#endif
- if (area)
- cairo_rectangle(cr, area->x, area->y, area->x + area->width, area->y + area->height);
- else
- cairo_rectangle(cr, 0, 0, width, height);
- cairo_fill(cr);
-
- if (bv->pd) {
- guint real_line = line + (guint) gtk_adjustment_get_value(bytes_view_ensure_vadj(bv));
-
- lines_max_full = (height / bv->fontsize) + 1;
- if (lines_max_full < lines_max)
- lines_max = lines_max_full;
-
- off = real_line * bv->per_line;
-
- while (off < bv->len) {
- _bytes_view_render_line(bv, cr, off, y + bv->font_ascent);
- line++;
- if (line >= lines_max)
- break;
-
- off += bv->per_line;
- y += bv->fontsize;
- }
- }
-
- if (old_max_width != bv->max_width)
- bytes_view_adjustment_set(bv);
-}
-
-static void
-bytes_view_render_full(BytesView *bv)
-{
- cairo_t *cr;
-
- if (bv->adj_tag) {
- g_source_remove(bv->adj_tag);
- bv->adj_tag = 0;
- }
-
- cr = gdk_cairo_create(gtk_widget_get_window(GTK_WIDGET(bv)));
- bytes_view_render(bv, cr, NULL);
- cairo_destroy(cr);
-}
-
-#if GTK_CHECK_VERSION(3, 0, 0)
-static gboolean
-bytes_view_draw(GtkWidget *widget, cairo_t *cr)
-{
- GdkRectangle area;
-
- gdk_cairo_get_clip_rectangle(cr, &area);
-
- bytes_view_render(BYTES_VIEW(widget), cr, &area);
- return FALSE;
-}
-
-#else
-
-static gboolean
-bytes_view_expose(GtkWidget *widget, GdkEventExpose *event)
-{
- BytesView *bv = BYTES_VIEW(widget);
- cairo_t *cr;
-
- cr = gdk_cairo_create(gtk_widget_get_window(GTK_WIDGET(bv)));
-
- gdk_cairo_region(cr, event->region);
- cairo_clip(cr);
-
- bytes_view_render(bv, cr, &event->area);
-
- cairo_destroy(cr);
- return FALSE;
-}
-
-#endif
-
-#if !GTK_CHECK_VERSION(2, 14, 0)
-static void
-_gtk_adjustment_configure(GtkAdjustment *adj,
- gdouble value,
- gdouble lower,
- gdouble upper,
- gdouble step_increment,
- gdouble page_increment,
- gdouble page_size)
-{
- adj->value = value;
- adj->lower = lower;
- adj->upper = upper;
- adj->step_increment = step_increment;
- adj->page_increment = page_increment;
- adj->page_size = page_size;
-
- gtk_adjustment_changed(adj);
-}
-
-#elif GTK_CHECK_VERSION(3, 0, 0)
-
-#define _gtk_adjustment_configure(adj, val, low, up, step, page, size) \
- gtk_adjustment_configure(adj, val, low, MAX((up), (size)), step, page, size)
-
-#else
-
-#define _gtk_adjustment_configure(adj, val, low, up, step, page, size) \
- gtk_adjustment_configure(adj, val, low, up, step, page, size)
-
-#endif
-
-
-static void
-bytes_view_adjustment_set(BytesView *bv)
-{
- GtkAllocation allocation;
- double lower, upper, page_size, step_increment, page_increment, value;
-
- if (bv->vadj == NULL || bv->hadj == NULL)
- return;
-
- if (bv->context == NULL) {
- bytes_view_ensure_layout(bv);
- /* bytes_view_ensure_layout will call bytes_view_adjustment_set() again */
- return;
- }
-
- gtk_widget_get_allocation(GTK_WIDGET(bv), &allocation);
-
- if (bv->vadj) {
- lower = 0;
- upper = (int) (bv->len / bv->per_line);
- if ((bv->len % bv->per_line))
- upper++;
-
- page_size = (allocation.height - bv->font_descent) / bv->fontsize;
- page_increment = page_size;
- step_increment = 1;
-
- value = gtk_adjustment_get_value(bv->vadj);
-
- if (value > upper - page_size)
- value = upper - page_size;
-
- if (value < 0)
- value = 0;
-
- _gtk_adjustment_configure(bv->vadj, value, lower, upper, step_increment, page_increment, page_size);
- }
-
- if (bv->hadj) {
- lower = 0;
- upper = bv->max_width;
-
- page_size = allocation.width;
- page_increment = page_size;
- step_increment = page_size / 10.0;
-
- value = gtk_adjustment_get_value(bv->hadj);
-
- if (value > upper - page_size)
- value = upper - page_size;
-
- if (value < 0)
- value = 0;
-
- _gtk_adjustment_configure(bv->hadj, value, lower, upper, step_increment, page_increment, page_size);
- }
-}
-
-static gint
-bytes_view_adjustment_timeout(BytesView *bv)
-{
- bv->adj_tag = 0;
- bytes_view_render_full(bv);
- return 0;
-}
-
-static void
-bytes_view_adjustment_changed(GtkAdjustment *adj, BytesView *bv)
-{
- /* delay rendering when scrolling (10ms) */
- if (adj && ((adj == bv->vadj) || (adj == bv->hadj))) {
- if (!bv->adj_tag)
- bv->adj_tag = g_timeout_add(REFRESH_TIMEOUT, (GSourceFunc) bytes_view_adjustment_timeout, bv);
- }
-}
-
-static void
-bytes_view_set_scroll_adjustments(BytesView *bv, GtkAdjustment *hadj, GtkAdjustment *vadj)
-{
- gboolean need_adjust = FALSE;
-
- g_return_if_fail(!hadj || GTK_IS_ADJUSTMENT(hadj));
- g_return_if_fail(!vadj || GTK_IS_ADJUSTMENT(vadj));
-
- if (!vadj)
- vadj = GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 0.0, 0.0, 0.0, 0.0));
-
- if (!hadj)
- hadj = GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 0.0, 0.0, 0.0, 0.0));
-
- if (bv->vadj && (bv->vadj != vadj)) {
- g_signal_handlers_disconnect_by_func(bv->vadj, bytes_view_adjustment_changed, bv);
- g_object_unref(bv->vadj);
- }
- if (bv->vadj != vadj) {
- bv->vadj = vadj;
- g_object_ref_sink(bv->vadj);
-
- g_signal_connect(bv->vadj, "value-changed", G_CALLBACK(bytes_view_adjustment_changed), bv);
- need_adjust = TRUE;
-#if GTK_CHECK_VERSION(3, 0, 0)
- g_object_notify(G_OBJECT(bv), "vadjustment");
-#endif
- }
-
- if (bv->hadj && (bv->hadj != hadj)) {
- g_signal_handlers_disconnect_by_func(bv->hadj, bytes_view_adjustment_changed, bv);
- g_object_unref(bv->hadj);
- }
- if (bv->hadj != hadj) {
- bv->hadj = hadj;
- g_object_ref_sink(bv->hadj);
-
- g_signal_connect(bv->hadj, "value-changed", G_CALLBACK(bytes_view_adjustment_changed), bv);
- need_adjust = TRUE;
-#if GTK_CHECK_VERSION(3, 0, 0)
- g_object_notify(G_OBJECT(bv), "hadjustment");
-#endif
- }
-
- if (need_adjust)
- bytes_view_adjustment_set(bv);
-}
-
-#if GTK_CHECK_VERSION(3, 0, 0)
-enum {
- PROP_0,
- PROP_HADJUSTMENT,
- PROP_VADJUSTMENT,
- PROP_HSCROLL_POLICY,
- PROP_VSCROLL_POLICY
-};
-
-static void
-bytes_view_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-{
- BytesView *bv = BYTES_VIEW(object);
-
- switch (prop_id) {
- case PROP_HADJUSTMENT:
- bytes_view_set_scroll_adjustments(bv, (GtkAdjustment *)g_value_get_object(value), bv->vadj);
- break;
-
- case PROP_VADJUSTMENT:
- bytes_view_set_scroll_adjustments(bv, bv->hadj, (GtkAdjustment *)g_value_get_object(value));
- break;
-
- case PROP_HSCROLL_POLICY:
- bv->hscroll_policy = g_value_get_enum(value);
- gtk_widget_queue_resize(GTK_WIDGET(bv));
- break;
-
- case PROP_VSCROLL_POLICY:
- bv->vscroll_policy = g_value_get_enum(value);
- gtk_widget_queue_resize(GTK_WIDGET(bv));
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
- break;
- }
-}
-
-static void
-bytes_view_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-{
- BytesView *bv = BYTES_VIEW(object);
-
- switch (prop_id) {
- case PROP_HADJUSTMENT:
- g_value_set_object(value, bv->hadj);
- break;
-
- case PROP_VADJUSTMENT:
- g_value_set_object(value, bv->vadj);
- break;
-
- case PROP_HSCROLL_POLICY:
- g_value_set_enum(value, bv->hscroll_policy);
- break;
-
- case PROP_VSCROLL_POLICY:
- g_value_set_enum(value, bv->vscroll_policy);
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
- break;
- }
-}
-
-#else
-
-/* bv_VOID__OBJECT_OBJECT() generated by:
- * $ echo 'VOID:OBJECT,OBJECT' | glib-genmarshal --prefix=bv --body
- * (glib-genmarshal version 2.32.4)
- * I *really hope* it's portable over platforms and can be put generated.
- */
-
-static void
-bv_VOID__OBJECT_OBJECT(GClosure *closure, GValue *return_value _U_, guint n_params, const GValue *param_values, gpointer hint _U_, gpointer marshal_data)
-{
- typedef void (*GMarshalFunc_VOID__OBJECT_OBJECT)(gpointer, gpointer, gpointer, gpointer);
-
- register GMarshalFunc_VOID__OBJECT_OBJECT callback;
- register GCClosure *cc = (GCClosure*) closure;
- register gpointer data1, data2;
-
- g_return_if_fail(n_params == 3);
-
- if (G_CCLOSURE_SWAP_DATA(closure)) {
- data1 = closure->data;
- data2 = g_value_peek_pointer(param_values + 0);
- } else {
- data1 = g_value_peek_pointer(param_values + 0);
- data2 = closure->data;
- }
- callback = (GMarshalFunc_VOID__OBJECT_OBJECT) (marshal_data ? marshal_data : cc->callback);
-
- callback(data1, g_value_get_object(param_values + 1), g_value_get_object(param_values + 2), data2);
-}
-
-#endif
-
-static void
-bytes_view_class_init(BytesViewClass *klass)
-{
-#if !GTK_CHECK_VERSION(3, 0, 0)
- GtkObjectClass *object_class;
-#endif
- GtkWidgetClass *widget_class;
-
- parent_class = (GtkWidgetClass *) g_type_class_peek_parent(klass);
-
-#if !GTK_CHECK_VERSION(3, 0, 0)
- object_class = (GtkObjectClass *) klass;
-#endif
- widget_class = (GtkWidgetClass *) klass;
-
-#if GTK_CHECK_VERSION(3, 0, 0)
- widget_class->destroy = bytes_view_destroy_widget;
-#else
- object_class->destroy = bytes_view_destroy_object;
-#endif
- widget_class->realize = bytes_view_realize;
- widget_class->unrealize = bytes_view_unrealize;
-#if GTK_CHECK_VERSION(3, 0, 0)
- widget_class->get_preferred_width = bytes_view_get_preferred_width;
- widget_class->get_preferred_height = bytes_view_get_preferred_height;
-#else
- widget_class->size_request = bytes_view_size_request;
-#endif
- widget_class->size_allocate = bytes_view_allocate;
-
-#if GTK_CHECK_VERSION(3, 0, 0)
- widget_class->draw = bytes_view_draw;
-#else
- widget_class->expose_event = bytes_view_expose;
-#endif
-
- widget_class->scroll_event = bytes_view_scroll;
-
-#if GTK_CHECK_VERSION(3, 0, 0)
- {
- GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
-
- gobject_class->set_property = bytes_view_set_property;
- gobject_class->get_property = bytes_view_get_property;
-
- /* XXX, move some code from widget->destroy to gobject->finalize? */
- /* gobject_class->finalize = bytes_view_finalize; */
-
- g_object_class_override_property(gobject_class, PROP_HADJUSTMENT, "hadjustment");
- g_object_class_override_property(gobject_class, PROP_VADJUSTMENT, "vadjustment");
- g_object_class_override_property(gobject_class, PROP_HSCROLL_POLICY, "hscroll-policy");
- g_object_class_override_property(gobject_class, PROP_VSCROLL_POLICY, "vscroll-policy");
- }
-#else
- klass->set_scroll_adjustments = bytes_view_set_scroll_adjustments;
-
- widget_class->set_scroll_adjustments_signal =
- g_signal_new(g_intern_static_string("set-scroll-adjustments"),
- G_OBJECT_CLASS_TYPE(object_class),
- (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
- offsetof(BytesViewClass, set_scroll_adjustments),
- NULL, NULL,
- bv_VOID__OBJECT_OBJECT,
- G_TYPE_NONE, 2,
- GTK_TYPE_ADJUSTMENT,
- GTK_TYPE_ADJUSTMENT);
-#endif
-}
-
-GType
-bytes_view_get_type(void)
-{
- static GType bytes_view_gtype = 0;
-
- if (!bytes_view_gtype) {
- static const GTypeInfo bytes_view_info = {
- sizeof (BytesViewClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) bytes_view_class_init,
- NULL, /* class finalize */
- NULL, /* class_data */
- sizeof(BytesView),
- 0, /* n_preallocs */
- (GInstanceInitFunc) bytes_view_init,
- NULL /* value_table */
- };
-
-#if GTK_CHECK_VERSION(3, 0, 0)
- static const GInterfaceInfo scrollable_info = {
- NULL,
- NULL,
- NULL
- };
-#endif
-
- bytes_view_gtype = g_type_register_static(GTK_TYPE_WIDGET,
- "BytesView",
- &bytes_view_info,
- (GTypeFlags)0);
-
-#if GTK_CHECK_VERSION(3, 0, 0)
- g_type_add_interface_static(bytes_view_gtype,
- GTK_TYPE_SCROLLABLE,
- &scrollable_info);
-#endif
- }
- return bytes_view_gtype;
-}
-
-int
-bytes_view_byte_from_xy(BytesView *bv, int x, int y)
-{
- /* hex_pos_byte array generated with hex_view_get_byte(0, 0, 0...70) */
- static const int hex_pos_byte[70] = {
- -1, -1,
- 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3,
- 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7,
- -1,
- 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11,
- 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15,
- -1, -1,
- 0, 1, 2, 3, 4, 5, 6, 7,
- -1,
- 8, 9, 10, 11, 12, 13, 14, 15
- };
-
- /* bits_pos_byte array generated with bit_view_get_byte(0, 0, 0...84) */
- static const int bits_pos_byte[84] = {
- -1, -1,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- -1, -1,
- 0, 1, 2, 3, 4, 5, 6, 7
- };
-
- int char_x, off_x = 1;
- int char_y, off_y;
-
- if (x < MARGIN)
- return -1;
-
- bytes_view_ensure_layout(bv);
-
- char_y = (int) gtk_adjustment_get_value(bytes_view_ensure_vadj(bv)) + (y / bv->fontsize);
- off_y = char_y * bv->per_line;
-
- char_x = _bytes_view_find_pos(bv, off_y, x);
- if (/* char_x < 0 || */ char_x < bv->use_digits)
- return -1;
- char_x -= bv->use_digits;
-
- switch (bv->format) {
- case BYTES_BITS:
- g_return_val_if_fail(char_x >= 0 && char_x < (int) G_N_ELEMENTS(bits_pos_byte), -1);
- off_x = bits_pos_byte[char_x];
- break;
-
- case BYTES_HEX:
- g_return_val_if_fail(char_x >= 0 && char_x < (int) G_N_ELEMENTS(hex_pos_byte), -1);
- off_x = hex_pos_byte[char_x];
- break;
- }
-
- if (off_x == -1)
- return -1;
-
- return off_y + off_x;
-}
-
-void
-bytes_view_scroll_to_byte(BytesView *bv, int byte)
-{
- int line;
-
- g_return_if_fail(byte >= 0 && byte < bv->len);
-
- line = byte / bv->per_line;
-
- bytes_view_ensure_vadj(bv);
-
- if (line > gtk_adjustment_get_upper(bv->vadj) - gtk_adjustment_get_page_size(bv->vadj)) {
- line = (int)(gtk_adjustment_get_upper(bv->vadj) - gtk_adjustment_get_page_size(bv->vadj));
-
- if (line < 0)
- line = 0;
- }
-
- /* after bytes_view_scroll_to_byte() we always do bytes_view_refresh() so we can block it */
- g_signal_handlers_block_by_func(bv->vadj, bytes_view_adjustment_changed, bv);
- gtk_adjustment_set_value(bv->vadj, line);
- g_signal_handlers_unblock_by_func(bv->vadj, bytes_view_adjustment_changed, bv);
-
- /* XXX, scroll hadj? */
-}
-
-void
-bytes_view_set_font(BytesView *bv, PangoFontDescription *font)
-{
- if (bv->font)
- pango_font_description_free(bv->font);
-
-#if GTK_CHECK_VERSION(3, 0, 0)
- gtk_widget_override_font(GTK_WIDGET(bv), font);
-#else
- gtk_widget_modify_font(GTK_WIDGET(bv), font);
-#endif
- bv->font = pango_font_description_copy(font);
- bv->max_width = 0;
-
- if (bv->context) {
- g_object_unref(bv->context);
- bv->context = NULL;
- bytes_view_ensure_layout(bv);
- }
-}
-
-void
-bytes_view_set_data(BytesView *bv, const guint8 *data, int len)
-{
- g_free(bv->pd);
- bv->pd = (guint8 *)g_memdup(data, len);
- bv->len = len;
-
- /*
- * How many of the leading digits of the offset will we supply?
- * We always supply at least 4 digits, but if the maximum offset
- * won't fit in 4 digits, we use as many digits as will be needed.
- */
- if (((len - 1) & 0xF0000000) != 0)
- bv->use_digits = 8; /* need all 8 digits */
- else if (((len - 1) & 0x0F000000) != 0)
- bv->use_digits = 7; /* need 7 digits */
- else if (((len - 1) & 0x00F00000) != 0)
- bv->use_digits = 6; /* need 6 digits */
- else if (((len - 1) & 0x000F0000) != 0)
- bv->use_digits = 5; /* need 5 digits */
- else
- bv->use_digits = 4; /* we'll supply 4 digits */
-
- bytes_view_ensure_vadj(bv);
-
- bytes_view_adjustment_set(bv);
-}
-
-void
-bytes_view_set_encoding(BytesView *bv, packet_char_enc enc)
-{
- bv->encoding = enc;
-}
-
-void
-bytes_view_set_format(BytesView *bv, int format)
-{
- g_assert(format == BYTES_HEX || format == BYTES_BITS);
-
- bv->format = (bytes_view_type)format;
-
- switch (format) {
- case BYTES_BITS:
- bv->per_line = 8;
- break;
-
- case BYTES_HEX:
- bv->per_line = 16;
- break;
- }
-}
-
-void
-bytes_view_set_highlight_style(BytesView *bv, gboolean inverse)
-{
- bv->bold_highlight = !inverse;
-}
-
-void
-bytes_view_set_highlight(BytesView *bv, int start, int end, guint64 mask _U_, int maskle _U_)
-{
- bv->start[0] = start;
- bv->end[0] = end;
-}
-
-void
-bytes_view_set_highlight_extra(BytesView *bv, int id, int start, int end)
-{
- bv->start[id] = start;
- bv->end[id] = end;
-}
-
-void
-bytes_view_refresh(BytesView *bv)
-{
- /* bytes_view_render_full(bv); */
- gtk_widget_queue_draw(GTK_WIDGET(bv));
-}
-
-GtkWidget *
-bytes_view_new(void)
-{
- GtkWidget *widget;
-
- widget = (GtkWidget *) g_object_new(BYTES_VIEW_TYPE, NULL);
-
- g_assert(widget != NULL);
-
- return widget;
-}
-
-/*
- * Editor modelines - http://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/gtk/bytes_view.h b/ui/gtk/bytes_view.h
deleted file mode 100644
index bce61096bd..0000000000
--- a/ui/gtk/bytes_view.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/* bytes_view.h
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
- */
-
-#ifndef __BYTES_VIEW_H__
-#define __BYTES_VIEW_H__
-
-#define BYTES_VIEW_TYPE (bytes_view_get_type())
-#define BYTES_VIEW(object) (G_TYPE_CHECK_INSTANCE_CAST((object), BYTES_VIEW_TYPE, BytesView))
-
-#define BYTE_VIEW_HIGHLIGHT_APPENDIX 1
-#define BYTE_VIEW_HIGHLIGHT_PROTOCOL 2
-
-typedef struct _BytesView BytesView;
-
-GType bytes_view_get_type(void);
-
-GtkWidget *bytes_view_new(void);
-void bytes_view_set_font(BytesView *bv, PangoFontDescription *font);
-
-void bytes_view_set_data(BytesView *bv, const guint8 *data, int len);
-void bytes_view_set_encoding(BytesView *bv, packet_char_enc enc);
-void bytes_view_set_format(BytesView *bv, int format);
-void bytes_view_set_highlight_style(BytesView *bv, gboolean bold);
-
-void bytes_view_set_highlight(BytesView *bv, int start, int end, guint64 mask, int maskle);
-void bytes_view_set_highlight_extra(BytesView *bv, int id, int start, int end);
-
-void bytes_view_refresh(BytesView *bv);
-int bytes_view_byte_from_xy(BytesView *bv, int x, int y);
-void bytes_view_scroll_to_byte(BytesView *bv, int byte);
-
-#endif /* __BYTES_VIEW_H__ */
diff --git a/ui/gtk/capture_dlg.c b/ui/gtk/capture_dlg.c
deleted file mode 100644
index bb68bbf918..0000000000
--- a/ui/gtk/capture_dlg.c
+++ /dev/null
@@ -1,6243 +0,0 @@
-/* capture_dlg.c
- * Routines for the "Capture Options" dialog and dialog windows popped
- * up from it
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#ifdef HAVE_LIBPCAP
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/packet.h>
-#include <epan/addr_resolv.h>
-#include <epan/prefs.h>
-#include <wsutil/filesystem.h>
-#include <wsutil/strtoi.h>
-
-#include <wiretap/wtap.h>
-
-#include "ui/capture.h"
-#include "caputils/capture_ifinfo.h"
-#include "caputils/capture-pcap-util.h"
-#include "../../ringbuffer.h"
-
-#include "ui/capture_ui_utils.h"
-#include "ui/capture_globals.h"
-#include "ui/iface_lists.h"
-#include "ui/preference_utils.h"
-#include "ui/recent.h"
-#include "ui/recent_utils.h"
-#include "ui/util.h"
-
-#include "ui/gtk/main.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/capture_dlg.h"
-#include "ui/gtk/filter_dlg.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/file_dlg.h"
-#include "ui/gtk/capture_file_dlg.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/cfilter_combo_utils.h"
-#include "ui/gtk/capture_if_dlg.h"
-#include "ui/gtk/main_welcome.h"
-#include "ui/gtk/menus.h"
-#include "ui/gtk/prefs_dlg.h"
-#include "ui/gtk/main_80211_toolbar.h"
-#include "ui/gtk/stock_icons.h"
-#ifndef HAVE_GDK_GRESOURCE
-#include "ui/gtk/pixbuf-csource.h"
-#endif
-#include "simple_dialog.h"
-
-#include "ui/gtk/keys.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-#ifdef HAVE_AIRPCAP
-#include <caputils/airpcap.h>
-#include <caputils/airpcap_loader.h>
-#include "airpcap_gui_utils.h"
-#include "airpcap_dlg.h"
-#endif
-
-#include "extcap.h"
-#include "ui/gtk/extcap_gtk.h"
-
-#include "globals.h"
-
-/*
- * Symbolic names for column indices.
- */
-enum
-{
- CAPTURE = 0,
- IFACE_HIDDEN_NAME,
- INTERFACE,
- LINK,
- PMODE,
- SNAPLEN,
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- BUFFER,
-#endif
-#ifdef HAVE_PCAP_CREATE
- MONITOR,
-#endif
- FILTER,
- NUM_COLUMNS
-};
-
-enum
-{
- COMPILE_ERROR = 0,
- SIGN,
- INAME
-};
-
-#ifdef _WIN32
- #define LOCAL_OFFSET 1
-#else
- #define LOCAL_OFFSET 0
-#endif
-
-/* Capture callback data keys */
-#define E_CAP_IFACE_KEY "cap_iface"
-#define E_CAP_IFACE_IP_KEY "cap_iface_ip"
-#define E_CAP_SNAP_CB_KEY "cap_snap_cb"
-#define E_CAP_LT_CBX_KEY "cap_lt_cbx"
-#define E_CAP_LT_CBX_LABEL_KEY "cap_lt_cbx_label"
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
-#define E_CAP_BUFFER_SIZE_SB_KEY "cap_buffer_size_sb"
-#endif
-#define E_CAP_SNAP_SB_KEY "cap_snap_sb"
-#define E_CAP_PROMISC_KEY "cap_promisc"
-#define E_CAP_PROMISC_KEY_ALL "cap_promisc_all"
-#define E_CAP_KEY_ALL "cap_all"
-#ifdef HAVE_PCAP_CREATE
-#define E_CAP_MONITOR_KEY "cap_monitor"
-#endif
-#define E_CAP_PCAP_NG_KEY "cap_pcap_ng"
-#define E_CAP_FILT_KEY "cap_filter_te"
-#define E_OPT_EDIT_DIALOG_PTR_KEY "cap_edit_opt_dialog"
-#define E_OPT_EDIT_CALLER_PTR_KEY "cap_edit_opt_caller"
-#define E_CAP_FILE_TE_KEY "cap_file_te"
-#define E_CAP_MULTI_FILES_ON_CB_KEY "cap_multi_files_on_cb"
-#define E_CAP_RING_FILESIZE_CB_KEY "cap_ring_filesize_cb"
-#define E_CAP_RING_FILESIZE_SB_KEY "cap_ring_filesize_sb"
-#define E_CAP_RING_FILESIZE_CBX_KEY "cap_ring_filesize_cbx"
-#define E_CAP_FILE_INTERVAL_CB_KEY "cap_file_interval_cb"
-#define E_CAP_FILE_INTERVAL_SB_KEY "cap_file_interval_sb"
-#define E_CAP_FILE_INTERVAL_CBX_KEY "cap_file_interval_cbx"
-#define E_CAP_RING_NBF_CB_KEY "cap_ring_nbf_cb"
-#define E_CAP_RING_NBF_SB_KEY "cap_ring_nbf_sb"
-#define E_CAP_RING_NBF_LB_KEY "cap_ring_nbf_lb"
-#define E_CAP_STOP_FILES_CB_KEY "cap_stop_files_cb"
-#define E_CAP_STOP_FILES_SB_KEY "cap_stop_files_sb"
-#define E_CAP_STOP_FILES_LB_KEY "cap_stop_files_lb"
-#define E_CAP_SYNC_KEY "cap_sync"
-#define E_CAP_AUTO_SCROLL_KEY "cap_auto_scroll"
-#define E_CAP_HIDE_INFO_KEY "cap_hide_info"
-#define E_CAP_STOP_PACKETS_CB_KEY "cap_stop_packets_cb"
-#define E_CAP_STOP_PACKETS_SB_KEY "cap_stop_packets_sb"
-#define E_CAP_STOP_PACKETS_LB_KEY "cap_stop_packets_lb"
-#define E_CAP_STOP_FILESIZE_CB_KEY "cap_stop_filesize_cb"
-#define E_CAP_STOP_FILESIZE_SB_KEY "cap_stop_filesize_sb"
-#define E_CAP_STOP_FILESIZE_CBX_KEY "cap_stop_filesize_cbx"
-#define E_CAP_STOP_DURATION_CB_KEY "cap_stop_duration_cb"
-#define E_CAP_STOP_DURATION_SB_KEY "cap_stop_duration_sb"
-#define E_CAP_STOP_DURATION_CBX_KEY "cap_stop_duration_cbx"
-#define E_CAP_M_RESOLVE_KEY "cap_m_resolve"
-#define E_CAP_N_RESOLVE_KEY "cap_n_resolve"
-#define E_CAP_T_RESOLVE_KEY "cap_t_resolve"
-#define E_CAP_E_RESOLVE_KEY "cap_e_resolve"
-#define E_CAP_EXTCAP_KEY "cap_extcap_vbox"
-
-#define E_CAP_IFTYPE_CBX_KEY "cap_iftype_cbx"
-#ifdef HAVE_PCAP_REMOTE
-#define E_CAP_IF_LIST_KEY "cap_if_list"
-#define E_CAP_DATATX_UDP_CB_KEY "cap_datatx_udp_cb"
-#define E_CAP_NOCAP_RPCAP_CB_KEY "cap_nocap_rpcap_cb"
-#define E_CAP_REMOTE_DIALOG_PTR_KEY "cap_remote_dialog"
-#define E_CAP_REMOTE_CALLER_PTR_KEY "cap_remote_caller"
-#define E_REMOTE_HOST_TE_KEY "cap_remote_host"
-#define E_REMOTE_PORT_TE_KEY "cap_remote_port"
-#define E_REMOTE_AUTH_NULL_KEY "cap_remote_auth_null"
-#define E_REMOTE_AUTH_PASSWD_KEY "cap_remote_auth_passwd"
-#define E_REMOTE_USERNAME_LB_KEY "cap_remote_username_lb"
-#define E_REMOTE_USERNAME_TE_KEY "cap_remote_username_te"
-#define E_REMOTE_PASSWD_LB_KEY "cap_remote_passwd_lb"
-#define E_REMOTE_PASSWD_TE_KEY "cap_remote_passwd_te"
-#define E_REMOTE_OK_BT_KEY "cap_remote_ok_bt"
-#define E_REMOTE_DEL_BT_KEY "cap_remote_delete_bt"
-#define E_CAP_CBX_IFTYPE_NOUPDATE_KEY "cap_cbx_iftype_noupdate"
-#define E_OPT_REMOTE_DIALOG_PTR_KEY "cap_remote_opt_dialog"
-#define E_OPT_REMOTE_CALLER_PTR_KEY "cap_remote_opt_caller"
-#endif
-#ifdef HAVE_PCAP_SETSAMPLING
-#define E_CAP_SAMP_NONE_RB_KEY "cap_samp_none_rb"
-#define E_CAP_SAMP_COUNT_RB_KEY "cap_samp_count_rb"
-#define E_CAP_SAMP_COUNT_SB_KEY "cap_samp_count_sb"
-#define E_CAP_SAMP_TIMER_RB_KEY "cap_samp_timer_rb"
-#define E_CAP_SAMP_TIMER_SB_KEY "cap_samp_timer_sb"
-#endif
-#define E_CAP_PIPE_TE_KEY "cap_pipe_te"
-#define E_CAP_PIPE_L_KEY "cap_pipe_list"
-#define E_CAP_PIPE_DEL_KEY "cap_pipe_delete_key"
-#define E_CAP_LOCAL_L_KEY "cap_local_list"
-#define E_CAP_REMOTE_L_KEY "cap_remote_list"
-
-#define E_COMPILE_SW_SCROLLW_KEY "compileScrolledWindowInterfaces"
-#define E_COMPILE_TREE_VIEW_INTERFACES "compileTreeViewInterfaces"
-
-#define DUMMY_SNAPLENGTH 65535
-#define DUMMY_NETMASK 0xFF000000
-
-enum
-{
- COL_NAME = 0,
- COL_ADDRESS,
- COL_LINK
-} ;
-
-/*
- * Keep a static pointer to the current "Capture Options" window, if
- * any, so that if somebody tries to do "Capture:Options" while there's
- * already a "Capture Options" window up, we just pop up the existing
- * one, rather than creating a new one.
- * Also: Capture:Start obtains info from the "Capture Options" window
- * if it exists and if its creation is complete.
- */
-static GtkWidget *cap_open_w = NULL, *opt_edit_w = NULL, *ok_bt, *interface_management_w = NULL;
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
-static GtkWidget *compile_bpf_w = NULL;
-#endif
-static gboolean cap_open_complete; /* valid only if cap_open_w != NULL */
-static const gchar *pipe_name = NULL;
-static const gchar *selected_name;
-static GtkWidget *columns_menu_object;
-static GtkUIManager *ui_manager_columns = NULL;
-static GSList *popup_menu_list = NULL;
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
-static GHashTable *compile_results = NULL;
-static GtkWidget *all_compile_bt;
-#endif
-
-static gint marked_interface;
-static gint marked_row;
-
-#ifdef HAVE_PCAP_REMOTE
-static remote_options global_remote_opts;
-static guint num_selected = 0;
-#endif
-
-static gulong capture_all_handler_id;
-static gulong promisc_all_handler_id;
-
-static void
-capture_prep_file_cb(GtkWidget *file_bt, GtkWidget *file_te);
-
-static void
-capture_prep_pipe_cb(GtkWidget *pipe_bt, GtkWidget *pipe_te);
-
-static void
-select_link_type_cb(GtkWidget *w, gpointer data);
-
-#ifdef HAVE_PCAP_REMOTE
-static void
-populate_existing_remotes(gpointer key, gpointer value, gpointer user_data);
-
-static void
-capture_remote_cb(GtkWidget *w, gboolean focus_username);
-
-static void
-select_if_type_cb(GtkComboBox *iftype_cbx, gpointer data);
-
-static void
-fill_remote_list(void);
-#endif
-
-static void
-capture_prep_adjust_sensitivity(GtkWidget *tb, gpointer parent_w);
-
-static void
-capture_prep_destroy_cb(GtkWidget *win, gpointer user_data);
-
-#ifdef HAVE_PCAP_CREATE
-static void
-capture_prep_monitor_changed_cb(GtkWidget *monitor, gpointer argp);
-#endif
-
-static gboolean
-capture_dlg_prep(gpointer parent_w);
-
-static GtkTreeModel*
-create_and_fill_model(GtkTreeView *view);
-
-static void
-update_options_table(gint indx);
-
-static void
-update_properties_all(void);
-
-static gboolean
-query_tooltip_tree_view_cb (GtkWidget *widget,
- gint x,
- gint y,
- gboolean keyboard_tip,
- GtkTooltip *tooltip,
- gpointer data);
-
-static
-gchar *col_index_to_name(gint indx)
-{
- gchar *col_name;
-
- switch (indx)
- {
- case INTERFACE: col_name = g_strdup("INTERFACE");
- break;
- case LINK: col_name = g_strdup("LINK");
- break;
- case PMODE: col_name = g_strdup("PMODE");
- break;
- case SNAPLEN: col_name = g_strdup("SNAPLEN");
- break;
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- case BUFFER: col_name = g_strdup("BUFFER");
- break;
-#endif
-#ifdef HAVE_PCAP_CREATE
- case MONITOR: col_name = g_strdup("MONITOR");
- break;
-#endif
- case FILTER: col_name = g_strdup("FILTER");
- break;
- default: return NULL;
- }
- return col_name;
-}
-
-static
-gint col_title_to_index(const gchar *name)
-{
- if (strcmp(name, "Capture") == 0) return CAPTURE;
- if (strcmp(name, "Interface") == 0) return INTERFACE;
- if (strcmp(name, "Link-layer header") == 0) return LINK;
- if (strcmp(name, "Prom. Mode") == 0) return PMODE;
- if (strcmp(name, "Snaplen [B]") == 0) return SNAPLEN;
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- if (strcmp(name, "Buffer [MiB]") == 0) return BUFFER;
-#endif
-#ifdef HAVE_PCAP_CREATE
- if (strcmp(name, "Mon. Mode") == 0) return MONITOR;
-#endif
- if (strcmp(name, "Capture Filter") == 0) return FILTER;
- return -1;
-}
-
-static void
-set_capture_column_visible(gchar *col, gboolean visible _U_)
-{
- GList *curr;
- gchar *col_name;
-
- if (visible && !prefs_capture_options_dialog_column_is_visible(col)) {
- prefs.capture_columns = g_list_append(prefs.capture_columns, col);
- } else if (!visible && prefs_capture_options_dialog_column_is_visible(col)) {
- for (curr = g_list_first(prefs.capture_columns); curr; curr = g_list_next(curr)) {
- col_name = (gchar *)curr->data;
- if (col_name && (g_ascii_strcasecmp(col_name, col) == 0)) {
- prefs.capture_columns = g_list_remove(prefs.capture_columns, curr->data);
- break;
- }
- }
- }
-}
-
-static void
-toggle_visible_column_cb (GtkWidget *w _U_, gpointer data)
-{
- GtkTreeView *view;
- GtkTreeViewColumn *col;
- gchar *col_name;
- gint col_id;
-
- col_id = GPOINTER_TO_INT(data);
- view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- col = gtk_tree_view_get_column(GTK_TREE_VIEW(view), col_id);
- col_name = col_index_to_name(col_id);
- gtk_tree_view_column_set_visible(col, prefs_capture_options_dialog_column_is_visible(col_name)?FALSE:TRUE);
- set_capture_column_visible(col_name, prefs_capture_options_dialog_column_is_visible(col_name)?FALSE:TRUE);
-}
-
-
-static void
-set_all_columns_visible (void)
-{
- GtkTreeViewColumn *col;
- int col_id;
- GtkTreeView *view;
- gchar *name;
-
- view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- for (col_id = 2; col_id < NUM_COLUMNS; col_id++) {
- col = gtk_tree_view_get_column(GTK_TREE_VIEW(view), col_id);
- gtk_tree_view_column_set_visible(col, TRUE);
- if ((name = col_index_to_name(col_id)) != NULL) {
- set_capture_column_visible(name, TRUE);
- }
- }
-
- if (!prefs.gui_use_pref_save) {
- prefs_main_write();
- }
-
- update_visible_columns_menu ();
-}
-
-static void
-columns_activate_all_columns_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- set_all_columns_visible ();
-}
-
-void
-update_visible_tree_view_columns(void)
-{
- GtkTreeView *view;
- gint col_id;
- GtkTreeViewColumn *col;
-
- view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- gtk_tree_view_column_set_visible(gtk_tree_view_get_column(GTK_TREE_VIEW(view), INTERFACE), TRUE);
- for (col_id = 3; col_id < NUM_COLUMNS; col_id++) {
- col = gtk_tree_view_get_column(GTK_TREE_VIEW(view), col_id);
- gtk_tree_view_column_set_visible(col, prefs_capture_options_dialog_column_is_visible(col_index_to_name(col_id))?TRUE:FALSE);
- }
-}
-
-
-void
-update_visible_columns_menu (void)
-{
- GtkWidget *menu_columns, *menu_item;
- GtkWidget *sub_menu;
- gchar *title;
- gint col_id;
-
- menu_columns = gtk_ui_manager_get_widget(ui_manager_columns, "/ColumnsPopup/DisplayedColumns");
- /* Debug */
- if (! menu_columns){
- fprintf (stderr, "Warning: couldn't find menu_columns path=/ColumnsPopup/DisplayedColumns");
- }
-
- sub_menu = gtk_menu_new();
- gtk_menu_item_set_submenu (GTK_MENU_ITEM(menu_columns), sub_menu);
-
- for (col_id = 3; col_id < NUM_COLUMNS; col_id++) {
- title = col_index_to_name(col_id);
- menu_item = gtk_check_menu_item_new_with_label(title);
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_item), prefs_capture_options_dialog_column_is_visible(title));
- g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(toggle_visible_column_cb), GINT_TO_POINTER(col_id));
- gtk_menu_shell_append (GTK_MENU_SHELL(sub_menu), menu_item);
- gtk_widget_show (menu_item);
- }
- menu_item = gtk_menu_item_new();
- gtk_menu_shell_append (GTK_MENU_SHELL(sub_menu), menu_item);
- gtk_widget_show (menu_item);
-
- menu_item = gtk_menu_item_new_with_label ("Display All");
- gtk_menu_shell_append (GTK_MENU_SHELL(sub_menu), menu_item);
- g_signal_connect(menu_item, "activate", G_CALLBACK(columns_activate_all_columns_cb), NULL);
- gtk_widget_show (menu_item);
-}
-
-static void
-columns_pref_cb(GtkAction *action _U_, gpointer user_data)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_columns, "/ColumnsPopup/ColumnPreferences");
- prefs_page_cb( widget , user_data, PREFS_PAGE_CAPTURE);
-}
-
-static void
-columns_hide_col_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- GtkTreeView *view;
- GtkTreeViewColumn *col;
- gint num;
- gchar *name;
-
- view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- col = (GtkTreeViewColumn *)g_object_get_data(G_OBJECT(view), E_MCAPTURE_COLUMNS_COLUMN_KEY);
- gtk_tree_view_column_set_visible(col, FALSE);
- num = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(col), E_MCAPTURE_COLUMNS_COL_KEY));
- if ((name = col_index_to_name(num)) != NULL) {
- set_capture_column_visible(name, FALSE);
- if (!prefs.gui_use_pref_save) {
- prefs_main_write();
- }
- update_visible_columns_menu ();
- }
-}
-
-static const char *ui_desc_columns_menu_popup =
-"<ui>\n"
-" <popup name='ColumnsPopup' action='PopupAction'>\n"
-" <menuitem name='ColumnPreferences' action='/Column Preferences'/>\n"
-" <menu name='DisplayedColumns' action='/Displayed Columns'>\n"
-" <menuitem name='Display All' action='/Displayed Columns/Display All'/>\n"
-" </menu>\n"
-" <menuitem name='HideColumn' action='/Hide Column'/>\n"
-" </popup>\n"
-"</ui>\n";
-
-static const GtkActionEntry columns_menu_popup_action_entries[] = {
- { "/Column Preferences", GTK_STOCK_PREFERENCES, "Column Preferences...", NULL, NULL, G_CALLBACK(columns_pref_cb) },
- { "/Displayed Columns", NULL, "Displayed Columns", NULL, NULL, NULL },
- { "/Displayed Columns/Display All", NULL, "Display All", NULL, NULL, G_CALLBACK(columns_activate_all_columns_cb) },
- { "/Hide Column", NULL, "Hide Column", NULL, NULL, G_CALLBACK(columns_hide_col_cb) },
-};
-
-#ifdef HAVE_PCAP_CREATE
-static void
-activate_monitor(GtkTreeViewColumn *tree_column, GtkCellRenderer *renderer,
- GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data);
-#endif
-
-static void
-init_columns_menu(void)
-{
- GtkActionGroup *columns_action_group;
- GError *error = NULL;
-
- columns_menu_object = gtk_menu_new();
- /* columns pop-up menu */
- columns_action_group = gtk_action_group_new ("ColumnsPopUpMenuActionGroup");
-
- gtk_action_group_add_actions (columns_action_group, /* the action group */
- (const GtkActionEntry *)columns_menu_popup_action_entries, /* an array of action descriptions */
- G_N_ELEMENTS(columns_menu_popup_action_entries), /* the number of entries */
- columns_menu_object); /* data to pass to the action callbacks */
-
- ui_manager_columns = gtk_ui_manager_new ();
- gtk_ui_manager_insert_action_group (ui_manager_columns,
- columns_action_group,
- 0); /* the position at which the group will be inserted. */
-
- gtk_ui_manager_add_ui_from_string (ui_manager_columns, ui_desc_columns_menu_popup, -1, &error);
- if (error != NULL)
- {
- fprintf (stderr, "Warning: building Packet List Heading Pop-Up failed: %s\n", error->message);
- g_error_free (error);
- error = NULL;
- }
-
- g_object_set_data(G_OBJECT(columns_menu_object), PM_COLUMNS_KEY,
- gtk_ui_manager_get_widget(ui_manager_columns, "/ColumnsPopup"));
-
- popup_menu_list = g_slist_append((GSList *)popup_menu_list, ui_manager_columns);
-}
-
-/* stop the currently running capture */
-void
-capture_stop_cb(GtkWidget *w _U_, gpointer d _U_)
-{
-#ifdef HAVE_AIRPCAP
- if (airpcap_if_active)
- airpcap_set_toolbar_stop_capture(airpcap_if_active);
-#endif
-
- capture_stop(&global_capture_session);
-}
-
-/* restart (stop - delete old file - start) running capture */
-void
-capture_restart_cb(GtkWidget *w _U_, gpointer d _U_)
-{
-#ifdef HAVE_AIRPCAP
- if (airpcap_if_active)
- airpcap_set_toolbar_start_capture(airpcap_if_active);
-#endif
-
- capture_restart(&global_capture_session);
-}
-
-enum cfc_state_t {
- CFC_PENDING,
- CFC_UNKNOWN,
- CFC_VALID,
- CFC_INVALID
-};
-
-typedef struct capture_filter_check {
- enum cfc_state_t state;
- gchar *filter_text;
- GtkWidget *filter_te;
- int dlt;
-} capture_filter_check_t;
-
-/* Valid states:
- *
- * Idle: filter_text = NULL, state = ?
- * Pending: filter_text != NULL, state = CFC_PENDING
- * Unknown: filter_text != NULL, state = CFC_UNKNOWN
- * Known: filter_text != NULL, state = CFC_VALID || CFC_INVALID
- *
- * We assume that only one text entry is active at a time.
- */
-
-/* We could make this smarter by caching results */
-static capture_filter_check_t cfc_data;
-
-static GMutex *pcap_compile_mtx;
-static GCond *cfc_data_cond;
-static GMutex *cfc_data_mtx;
-
-#if 0
-#define DEBUG_SYNTAX_CHECK(state1, state2) g_warning("CF state %s -> %s : %s", state1, state2, cfc_data.filter_text)
-#else
-#define DEBUG_SYNTAX_CHECK(state1, state2)
-#endif
-
-static void *
-check_capture_filter_syntax(void *data _U_) {
- struct bpf_program fcode;
- int pc_err;
-
- while (1) {
- g_mutex_lock(cfc_data_mtx);
- while (!cfc_data.filter_text || cfc_data.state != CFC_PENDING) {
- /* Do we really need to use a mutex here? We only have one thread... */
- g_cond_wait(cfc_data_cond, cfc_data_mtx);
- }
- cfc_data.state = CFC_UNKNOWN;
- DEBUG_SYNTAX_CHECK("pending", "unknown");
-
- g_mutex_unlock(cfc_data_mtx);
- g_mutex_lock(pcap_compile_mtx);
-
- /* pcap_compile_nopcap will not alter the filter string, so the (char *) cast is "safe" */
- pc_err = pcap_compile_nopcap(DUMMY_SNAPLENGTH /* use a dummy snaplength for syntax-checking */,
- cfc_data.dlt, &fcode, cfc_data.filter_text, 1 /* Do optimize */,
- DUMMY_NETMASK /* use a dummy netmask for syntax-checking */);
-
- g_mutex_unlock(pcap_compile_mtx);
- g_mutex_lock(cfc_data_mtx);
-
- if (cfc_data.state == CFC_UNKNOWN) { /* No more input came in */
- if (pc_err) {
- DEBUG_SYNTAX_CHECK("unknown", "known bad");
- cfc_data.state = CFC_INVALID;
- } else {
- DEBUG_SYNTAX_CHECK("unknown", "known good");
- cfc_data.state = CFC_VALID;
- }
- }
- g_mutex_unlock(cfc_data_mtx);
- }
- return NULL;
-}
-
-static gboolean
-update_capture_filter_te(gpointer data _U_) {
-
- g_mutex_lock(cfc_data_mtx);
-
- if (cfc_data.filter_text && cfc_data.filter_te) {
- if (cfc_data.state == CFC_VALID) {
- colorize_filter_te_as_valid(cfc_data.filter_te);
- } else if (cfc_data.state == CFC_INVALID) {
- colorize_filter_te_as_invalid(cfc_data.filter_te);
- } else {
- colorize_filter_te_as_empty(cfc_data.filter_te);
- }
-
- if (cfc_data.state == CFC_VALID || cfc_data.state == CFC_INVALID) {
- DEBUG_SYNTAX_CHECK("known", "idle");
- /* Reset the current state to idle. */
- if (cfc_data.filter_text != NULL) {
- g_free(cfc_data.filter_text);
- }
- cfc_data.filter_text = NULL;
- cfc_data.state = CFC_PENDING;
- }
- }
- g_mutex_unlock(cfc_data_mtx);
- return TRUE;
-}
-
-/** Initialize background capture filter syntax checking
- */
-void capture_filter_init(void) {
- cfc_data.filter_text = NULL;
- cfc_data.filter_te = NULL;
- cfc_data.state = CFC_PENDING;
-
-#if GLIB_CHECK_VERSION(2,31,0)
- pcap_compile_mtx = g_new(GMutex,1);
- g_mutex_init(pcap_compile_mtx);
- cfc_data_cond = g_new(GCond,1);
- g_cond_init(cfc_data_cond);
- cfc_data_mtx = g_new(GMutex,1);
- g_mutex_init(cfc_data_mtx);
- g_thread_new("Capture filter syntax", check_capture_filter_syntax, NULL);
-#else
- pcap_compile_mtx = g_mutex_new();
- cfc_data_cond = g_cond_new();
- cfc_data_mtx = g_mutex_new();
- g_thread_create(check_capture_filter_syntax, NULL, FALSE, NULL);
-#endif
-
- g_timeout_add(200, update_capture_filter_te, NULL);
-}
-
-static void
-update_filter_string(gchar *name, gchar *text)
-{
- GtkTreeIter iter;
- GtkTreeView *if_cb;
- GtkTreeModel *model;
- gchar *name_str;
-
- if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- model = gtk_tree_view_get_model(if_cb);
- gtk_tree_model_get_iter_first(model, &iter);
- do {
- gtk_tree_model_get(model, &iter, IFACE_HIDDEN_NAME, &name_str, -1);
- if (strcmp(name, name_str) == 0) {
- gtk_list_store_set (GTK_LIST_STORE(model), &iter, FILTER, g_strdup(text), -1);
- break;
- }
- } while (gtk_tree_model_iter_next(model, &iter));
-}
-
-static void
-capture_all_filter_check_syntax_cb(GtkWidget *w _U_, gpointer user_data _U_)
-{
- GtkWidget *filter_cm, *filter_te;
- gchar *filter_text = NULL;
- guint i;
-
- filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY);
-
- if (!filter_cm)
- return;
-
- filter_te = gtk_bin_get_child(GTK_BIN(filter_cm));
-
- if (!filter_te)
- return;
-
- if (global_capture_opts.num_selected > 0) {
- 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.selected) {
- continue;
- }
- if (device.active_dlt == -1) {
- colorize_filter_te_as_empty(filter_te);
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The link type of interface %s was not specified.", device.name);
- continue; /* Programming error: somehow managed to select an "unsupported" entry */
- }
- /* Can't verify extcap capture filters */
- if (device.if_info.extcap != NULL && strlen(device.if_info.extcap) > 0)
- continue;
- filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
- if (strlen(filter_text) == 0) {
- colorize_filter_te_as_empty(filter_te);
- if (strlen(device.cfilter) > 0) {
- g_array_remove_index(global_capture_opts.all_ifaces, i);
- g_free(device.cfilter);
- device.cfilter = g_strdup(filter_text);
- g_array_insert_val(global_capture_opts.all_ifaces, i, device);
- update_filter_string(device.name, filter_text);
- }
- g_free(filter_text);
- continue;
- }
- g_assert(filter_text != NULL);
- g_array_remove_index(global_capture_opts.all_ifaces, i);
- g_free(device.cfilter);
- device.cfilter = g_strdup(filter_text);
- g_array_insert_val(global_capture_opts.all_ifaces, i, device);
- g_mutex_lock(cfc_data_mtx);
- /* Ruthlessly clobber the current state. */
- g_free(cfc_data.filter_text);
- cfc_data.dlt = device.active_dlt;
- cfc_data.filter_text = filter_text;
- cfc_data.filter_te = filter_te;
- cfc_data.state = CFC_PENDING;
- DEBUG_SYNTAX_CHECK("?", "pending");
- g_cond_signal(cfc_data_cond);
- g_mutex_unlock(cfc_data_mtx);
- update_filter_string(device.name, filter_text);
- }
- }
-}
-
-static void
-capture_filter_check_syntax_cb(GtkWidget *w _U_, gpointer user_data _U_)
-{
- GtkWidget *filter_cm, *filter_te, *linktype_combo_box;
- gchar *filter_text;
- gpointer dlt_ptr;
-
- filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(opt_edit_w), E_CFILTER_CM_KEY);
- if (!filter_cm)
- return;
- filter_te = gtk_bin_get_child(GTK_BIN(filter_cm));
- if (!filter_te)
- return;
-
- linktype_combo_box = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY);
-
- if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(linktype_combo_box), &dlt_ptr)) {
- /*
- * There is no guarantee that we will even know the list of link-layer
- * header types; we will not have it if, for example, we have a named
- * pipe rather than an interface, as a named pipe doesn't *have* a
- * link-layer header type until the capture is started and the
- * pcap file header or pcapng interface description block is
- * written, and we can't wait for that. We won't have it if we can't
- * open the interface, either.
- *
- * We also won't have an active pointer, even if we have the list of
- * link-layer header types, if none of the types are supported.
- *
- * Just mark it as empty, as a way of saying "damned if I know whether
- * this filter is valid".
- */
- colorize_filter_te_as_empty(filter_te);
- return;
- }
- if ((cfc_data.dlt = GPOINTER_TO_INT(dlt_ptr)) == -1) {
- g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
- }
-
- filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
-
- if (strlen(filter_text) == 0) {
- colorize_filter_te_as_empty(filter_te);
- g_free(filter_text);
- return;
- }
-
- g_mutex_lock(cfc_data_mtx);
- /* Ruthlessly clobber the current state. */
- if (cfc_data.filter_text != NULL) {
- g_free(cfc_data.filter_text);
- }
- cfc_data.filter_text = filter_text;
- cfc_data.filter_te = filter_te;
- cfc_data.state = CFC_PENDING;
- DEBUG_SYNTAX_CHECK("?", "pending");
- g_cond_signal(cfc_data_cond);
- g_mutex_unlock(cfc_data_mtx);
-}
-
-static void
-capture_filter_destroy_cb(GtkWidget *w _U_, gpointer user_data _U_)
-{
- g_mutex_lock(cfc_data_mtx);
- /* Reset the current state to idle. */
- if (cfc_data.filter_text != NULL) {
- g_free(cfc_data.filter_text);
- }
- cfc_data.filter_text = NULL;
- cfc_data.filter_te = NULL;
- cfc_data.state = CFC_PENDING;
- g_mutex_unlock(cfc_data_mtx);
-}
-
-#define TIME_UNIT_SECOND 0
-#define TIME_UNIT_MINUTE 1
-#define TIME_UNIT_HOUR 2
-#define TIME_UNIT_DAY 3
-#define MAX_TIME_UNITS 4
-static const char *time_unit_name[MAX_TIME_UNITS] = {
- "second(s)",
- "minute(s)",
- "hour(s)",
- "day(s)",
-};
-
-/* create one of the duration options */
-/* (and select the matching unit depending on the given value) */
-static GtkWidget *time_unit_combo_box_new(guint32 value) {
- GtkWidget *unit_combo_box;
- int i;
-
- unit_combo_box = gtk_combo_box_text_new ();
- for (i = 0; i < MAX_TIME_UNITS; i++) {
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (unit_combo_box), time_unit_name[i]);
- }
- /* the selected combo_box item can't be changed, once the combo_box
- is created, so set the matching combo_box item now */
- /* days */
- if (value >= 60 * 60 * 24) {
- gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), TIME_UNIT_DAY);
- } else {
- /* hours */
- if (value >= 60 * 60) {
- gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), TIME_UNIT_HOUR);
- } else {
- /* minutes */
- if (value >= 60) {
- gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), TIME_UNIT_MINUTE);
- } else {
- /* seconds */
- gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), TIME_UNIT_SECOND);
- }
- }
- }
- return unit_combo_box;
-}
-
-/* convert time value from raw to displayed (e.g. 60s -> 1min) */
-static guint32 time_unit_combo_box_convert_value(
-guint32 value)
-{
- /* days */
- if (value >= 60 * 60 * 24) {
- return value / (60 * 60 * 24);
- }
-
- /* hours */
- if (value >= 60 * 60) {
- return value / (60 * 60);
- }
-
- /* minutes */
- if (value >= 60) {
- return value / 60;
- }
-
- /* seconds */
- return value;
-}
-
-/* get raw value from unit and value fields */
-static guint32 time_unit_combo_box_get_value(
-GtkWidget *unit_combo_box,
-guint32 value)
-{
- int unit;
-
- unit = gtk_combo_box_get_active (GTK_COMBO_BOX(unit_combo_box));
-
- switch(unit) {
- case(TIME_UNIT_SECOND):
- return value;
- case(TIME_UNIT_MINUTE):
- return value * 60;
- case(TIME_UNIT_HOUR):
- return value * 60 * 60;
- case(TIME_UNIT_DAY):
- return value * 60 * 60 * 24;
- default:
- g_assert_not_reached();
- return 0;
- }
-}
-
-
-#define SIZE_UNIT_KILOBYTES 0
-#define SIZE_UNIT_MEGABYTES 1
-#define SIZE_UNIT_GIGABYTES 2
-#define MAX_SIZE_UNITS 3
-static const char *size_unit_name[MAX_SIZE_UNITS] = {
- "kilobyte(s)",
- "megabyte(s)",
- "gigabyte(s)"
-};
-
-/* create one of the size options */
-/* (and select the matching unit depending on the given value) */
-static GtkWidget *size_unit_combo_box_new(guint32 value) {
- GtkWidget *unit_combo_box;
- int i;
-
- unit_combo_box=gtk_combo_box_text_new();
- for (i=0; i<MAX_SIZE_UNITS; i++){
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (unit_combo_box), size_unit_name[i]);
- }
- /* the selected combo_box item can't be changed, once the combo_box
- is created, so set the matching combo_box item now */
- /* gigabytes */
- if (value >= 1000 * 1000) {
- gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), SIZE_UNIT_GIGABYTES);
- } else {
- /* megabytes */
- if (value >= 1000) {
- gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), SIZE_UNIT_MEGABYTES);
- } else {
- /* kilobytes */
- gtk_combo_box_set_active(GTK_COMBO_BOX(unit_combo_box), SIZE_UNIT_KILOBYTES);
- }
- }
- return unit_combo_box;
-}
-
-/* convert size value from raw to displayed (e.g. 1000 Bytes -> 1 kB) */
-static guint32 size_unit_combo_box_set_value(
-guint32 value)
-{
- /* gigabytes */
- if (value >= 1000 * 1000) {
- return value / (1000 * 1000);
- }
-
- /* megabytes */
- if (value >= 1000) {
- return value / (1000);
- }
-
- /* kilobytes */
- return value;
-}
-
-/* get raw value from unit and value fields */
-static guint32 size_unit_combo_box_convert_value(
- GtkWidget *unit_combo_box,
-guint32 value)
-{
- int unit;
-
- unit = gtk_combo_box_get_active (GTK_COMBO_BOX(unit_combo_box));
-
- switch(unit) {
- case(SIZE_UNIT_KILOBYTES):
- if (value > (((guint32)G_MAXINT + 1) / 1000)) {
- return 0;
- } else {
- return value;
- }
- case(SIZE_UNIT_MEGABYTES):
- if (value > (((guint32)G_MAXINT + 1) / (1000 * 1000))) {
- return 0;
- } else {
- return value * 1000;
- }
- case(SIZE_UNIT_GIGABYTES):
- if (value > (((guint32)G_MAXINT + 1) / (1000 * 1000 * 1000))) {
- return 0;
- } else {
- return value * 1000 * 1000;
- }
- default:
- g_assert_not_reached();
- return 0;
- }
-}
-
-#ifdef HAVE_AIRPCAP
-/*
- * Sets the toolbar before calling the advanced dialog with for the right interface
- */
-static void
-options_airpcap_advanced_cb(GtkWidget *w, gpointer d)
-{
- int *from_widget;
-
- from_widget = (gint*)g_malloc(sizeof(gint));
- *from_widget = AIRPCAP_ADVANCED_FROM_OPTIONS;
- g_object_set_data(G_OBJECT(wireless_tb),AIRPCAP_ADVANCED_FROM_KEY,from_widget);
-
- airpcap_if_active = airpcap_if_selected;
- airpcap_enable_toolbar_widgets(wireless_tb,FALSE);
- display_airpcap_advanced_cb(w,d);
-}
-#endif
-
-#ifdef HAVE_PCAP_REMOTE
-#if 0
-/* PCAP interface type menu item */
-struct iftype_info {
- capture_source id;
- const char *name;
-};
-
-/* List of available types of PCAP interface */
-static struct iftype_info iftype[] = {
- { CAPTURE_IFLOCAL, "Local" },
- { CAPTURE_IFREMOTE, "Remote..." }
-};
-
-#define REMOTE_HOST_START ((sizeof(iftype) / sizeof(iftype[0])) + 1)
-#else
-#define REMOTE_HOST_START 3
-#endif
-#define REMOTE_HOST_SEPARATOR "---"
-
-static void
-iftype_combo_box_add_remote_separators (GtkWidget *iftype_cbx)
-{
- gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(iftype_cbx), REMOTE_HOST_SEPARATOR);
- gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(iftype_cbx), "Clear list");
-}
-
-#if 0
-static void
-iftype_combo_box_add (GtkWidget *iftype_cbx, interface_t *device)
-{
- GtkTreeModel *model;
- GtkTreeIter iter;
- gboolean create_new = FALSE;
- gchar *string;
- guint pos = REMOTE_HOST_START;
- struct remote_host *rh;
-
- rh = recent_get_remote_host(device->remote_opts.remote_host_opts.remote_host);
- if (!rh) {
- rh = (struct remote_host *)g_malloc0 (sizeof (*rh));
- if (recent_get_remote_host_list_size() == 0) {
- iftype_combo_box_add_remote_separators (iftype_cbx);
- }
- gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(iftype_cbx), pos, device->remote_opts.remote_host_opts.remote_host);
- rh->r_host = g_strdup (device->remote_opts.remote_host_opts.remote_host);
- create_new = TRUE;
- } else {
- model = (GtkTreeModel *)gtk_combo_box_get_model(GTK_COMBO_BOX(iftype_cbx));
- if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) {
- while (gtk_tree_model_iter_next(model, &iter)) {
- gtk_tree_model_get(model, &iter, 0, &string, -1);
- if (string) {
- if (strcmp (device->remote_opts.remote_host_opts.remote_host, string) == 0) {
- /* Found match, show this position in combo box */
- g_free (string);
- break;
- }
- g_free (string);
- }
- pos++;
- }
- }
-
- g_free (rh->remote_port);
- g_free (rh->auth_username);
- g_free (rh->auth_password);
- }
-
- rh->remote_port = g_strdup (device->remote_opts.remote_host_opts.remote_port);
- rh->auth_type = device->remote_opts.remote_host_opts.auth_type;
- rh->auth_username = g_strdup (device->remote_opts.remote_host_opts.auth_username);
- rh->auth_password = g_strdup (device->remote_opts.remote_host_opts.auth_password);
-
- if (create_new) {
- recent_add_remote_host(g_strdup (device->remote_opts.remote_host_opts.remote_host), rh);
- }
-
- g_object_set_data(G_OBJECT(iftype_cbx), E_CAP_CBX_IFTYPE_NOUPDATE_KEY, GINT_TO_POINTER(1));
- gtk_combo_box_set_active(GTK_COMBO_BOX(iftype_cbx), pos);
- g_object_set_data(G_OBJECT(iftype_cbx), E_CAP_CBX_IFTYPE_NOUPDATE_KEY, GINT_TO_POINTER(0));
-}
-#endif
-
-static void
-iftype_combo_box_add_remote_host (gpointer key, gpointer value _U_, gpointer user_data)
-{
- gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(user_data), REMOTE_HOST_START, (const char *)key);
-}
-
-/* Fill the menu of available types of interfaces */
-static GtkWidget *
-iftype_combo_box_new(void)
-{
- GtkWidget *iftype_cbx;
-
- iftype_cbx = gtk_combo_box_text_new_with_entry();
-
- if (recent_get_remote_host_list_size() > 0) {
- /* Add remote hosts */
- recent_remote_host_list_foreach (iftype_combo_box_add_remote_host, iftype_cbx);
- iftype_combo_box_add_remote_separators (iftype_cbx);
- }
-
- g_signal_connect(iftype_cbx, "changed", G_CALLBACK(select_if_type_cb), NULL);
-
- return iftype_cbx;
-}
-
-#if 0
-static gboolean
-iftype_combo_is_separator (GtkTreeModel *model, GtkTreeIter *iter, gpointer data _U_)
-{
- gboolean result = FALSE;
- gchar *string;
-
- gtk_tree_model_get(model, iter, 0, &string, -1);
- if (string) {
- result = !strcmp (string, REMOTE_HOST_SEPARATOR);
- g_free (string);
- }
-
- return result;
-
-}
-#endif
-#endif
-
-#ifdef HAVE_PCAP_REMOTE
-static void
-error_list_remote_interface_cb (gpointer dialog _U_, gint btn _U_, gpointer data)
-{
- capture_remote_cb(GTK_WIDGET(data), FALSE);
-}
-
-static void
-insert_new_rows(GList *rlist)
-{
- GtkTreeIter iter;
- GtkTreeView *if_cb;
- GtkTreeModel *model;
- char *snaplen_string;
- gchar *link_type_name = NULL;
- char *temp = NULL;
-
- GList *if_entry, *lt_entry;
- if_info_t *if_info;
- char *if_string = NULL;
- gchar *descr, *auth_str;
- if_capabilities_t *caps;
- gint linktype_count;
- gboolean monitor_mode, found = FALSE;
- GSList *curr_addr;
- int ips = 0;
- guint i;
- if_addr_t *addr;
- data_link_info_t *data_link_info;
- GString *ip_str;
- link_row *linkr = NULL;
- interface_t device;
- guint num_interfaces;
- remote_options *roptions;
-
- if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- model = gtk_tree_view_get_model(if_cb);
-
- roptions = &global_remote_opts;
- /* Scan through the list and build a list of strings to display. */
- num_interfaces = global_capture_opts.all_ifaces->len;
- for (if_entry = g_list_first(rlist); if_entry != NULL; if_entry = g_list_next(if_entry)) {
- auth_str = NULL;
- if_info = (if_info_t *)if_entry->data;
- add_interface_to_remote_list(if_info);
- for (i = 0; i < num_interfaces; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- if (strcmp(device.name, if_info->name) == 0) {
- found = TRUE;
- break;
- }
- }
- if (found) {
- found = FALSE;
- continue;
- }
- ip_str = g_string_new("");
- ips = 0;
- memset(&device, 0, sizeof(device));
- device.name = g_strdup(if_info->name);
- device.if_info.name = g_strdup("Don't crash on bug 13448");
- /* Is this interface hidden and, if so, should we include it
- anyway? */
- descr = capture_dev_user_descr_find(if_info->name);
- if (descr != NULL) {
- /* Yes, we have a user-supplied description; use it. */
- if_string = g_strdup_printf("%s: %s", descr, if_info->name);
- g_free(descr);
- } else {
- /* No, we don't have a user-supplied description; did we get
- one from the OS or libpcap? */
- if (if_info->vendor_description != NULL) {
- /* Yes - use it. */
- if_string = g_strdup_printf("%s: %s", if_info->vendor_description, if_info->name);
- } else {
- /* No. */
- if_string = g_strdup(if_info->name);
- }
- } /* else descr != NULL */
- if (if_info->loopback) {
- device.display_name = g_strdup_printf("%s (loopback)", if_string);
- } else {
- device.display_name = g_strdup(if_string);
- }
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- if ((device.buffer = capture_dev_user_buffersize_find(if_string)) == -1) {
- device.buffer = global_capture_opts.default_options.buffer_size;
- }
-#endif
- if (!capture_dev_user_pmode_find(if_string, &device.pmode)) {
- device.pmode = global_capture_opts.default_options.promisc_mode;
- }
- if (!capture_dev_user_snaplen_find(if_string, &device.has_snaplen,
- &device.snaplen)) {
- device.has_snaplen = global_capture_opts.default_options.has_snaplen;
- device.snaplen = global_capture_opts.default_options.snaplen;
- }
- device.cfilter = g_strdup(global_capture_opts.default_options.cfilter);
- device.timestamp_type = g_strdup(global_capture_opts.default_options.timestamp_type);
- monitor_mode = prefs_capture_device_monitor_mode(if_string);
- if (roptions->remote_host_opts.auth_type == CAPTURE_AUTH_PWD) {
- auth_str = g_strdup_printf("%s:%s", roptions->remote_host_opts.auth_username,
- roptions->remote_host_opts.auth_password);
- }
- caps = capture_get_if_capabilities(if_string, monitor_mode, auth_str, NULL, main_window_update);
- g_free(auth_str);
- for (; (curr_addr = g_slist_nth(if_info->addrs, ips)) != NULL; ips++) {
- address addr_str;
- char* temp_addr_str = NULL;
- if (ips != 0) {
- g_string_append(ip_str, "\n");
- }
- addr = (if_addr_t *)curr_addr->data;
- switch (addr->ifat_type) {
- case IF_AT_IPv4:
- set_address(&addr_str, AT_IPv4, 4, &addr->addr.ip4_addr);
- temp_addr_str = (char*)address_to_str(NULL, &addr_str);
- g_string_append(ip_str, temp_addr_str);
- break;
- case IF_AT_IPv6:
- set_address(&addr_str, AT_IPv6, 16, addr->addr.ip6_addr);
- temp_addr_str = (char*)address_to_str(NULL, &addr_str);
- g_string_append(ip_str, temp_addr_str);
- break;
- default:
- /* In case we add non-IP addresses */
- break;
- }
-
- wmem_free(NULL, temp_addr_str);
- } /* for curr_addr */
- linktype_count = 0;
- device.links = NULL;
- if (caps != NULL) {
-#ifdef HAVE_PCAP_CREATE
- device.monitor_mode_enabled = monitor_mode;
- device.monitor_mode_supported = caps->can_set_rfmon;
-#endif
- for (lt_entry = caps->data_link_types; lt_entry != NULL; lt_entry = g_list_next(lt_entry)) {
- data_link_info = (data_link_info_t *)lt_entry->data;
- linkr = (link_row *)g_malloc(sizeof(link_row));
- /*
- * For link-layer types libpcap/WinPcap doesn't know about, the
- * name will be "DLT n", and the description will be null.
- * We mark those as unsupported, and don't allow them to be
- * used.
- */
- if (data_link_info->description != NULL) {
- linkr->name = g_strdup(data_link_info->description);
- linkr->dlt = data_link_info->dlt;
- } else {
- linkr->name = g_strdup_printf("%s (not supported)", data_link_info->name);
- linkr->dlt = -1;
- }
- if (linktype_count == 0) {
- device.active_dlt = data_link_info->dlt;
- }
- device.links = g_list_append(device.links, linkr);
- linktype_count++;
- } /* for link_types */
- } else {
-#if defined(HAVE_PCAP_CREATE)
- device.monitor_mode_enabled = FALSE;
- device.monitor_mode_supported = FALSE;
-#endif
- device.active_dlt = -1;
- }
- device.addresses = g_strdup(ip_str->str);
- device.no_addresses = ips;
- device.remote_opts.src_type = roptions->src_type;
- if (device.remote_opts.src_type == CAPTURE_IFREMOTE) {
- device.local = FALSE;
- }
- device.remote_opts.remote_host_opts.remote_host = g_strdup(roptions->remote_host_opts.remote_host);
- device.remote_opts.remote_host_opts.remote_port = g_strdup(roptions->remote_host_opts.remote_port);
- device.remote_opts.remote_host_opts.auth_type = roptions->remote_host_opts.auth_type;
- device.remote_opts.remote_host_opts.auth_username = g_strdup(roptions->remote_host_opts.auth_username);
- device.remote_opts.remote_host_opts.auth_password = g_strdup(roptions->remote_host_opts.auth_password);
- device.remote_opts.remote_host_opts.datatx_udp = roptions->remote_host_opts.datatx_udp;
- device.remote_opts.remote_host_opts.nocap_rpcap = roptions->remote_host_opts.nocap_rpcap;
- device.remote_opts.remote_host_opts.nocap_local = roptions->remote_host_opts.nocap_local;
-#ifdef HAVE_PCAP_SETSAMPLING
- device.remote_opts.sampling_method = roptions->sampling_method;
- device.remote_opts.sampling_param = roptions->sampling_param;
-#endif
- device.selected = TRUE;
- global_capture_opts.num_selected++;
- g_array_append_val(global_capture_opts.all_ifaces, device);
- g_string_free(ip_str, TRUE);
-
- if (caps == NULL) {
- link_type_name = g_strdup("default");
- } else {
- data_link_info = (data_link_info_t *)caps->data_link_types->data;
- if (data_link_info->description != NULL) {
- link_type_name = g_strdup(data_link_info->description);
- } else {
- link_type_name = g_strdup_printf("%s (not supported)", data_link_info->name);
- }
- }
- if (ips == 0) {
- temp = g_strdup_printf("<b>%s</b>", device.display_name);
- } else {
- temp = g_strdup_printf("<b>%s</b>\n<span size='small'>%s</span>", device.display_name, device.addresses);
- }
- snaplen_string = g_strdup_printf("%d", device.snaplen);
-
- gtk_list_store_append (GTK_LIST_STORE(model), &iter);
-#if defined(HAVE_PCAP_CREATE)
- gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, FALSE, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp, LINK, link_type_name, PMODE, (device.pmode?"enabled":"disabled"), SNAPLEN, snaplen_string, BUFFER, device.buffer, MONITOR, "no",FILTER, "",-1);
-#elif defined(CAN_SET_CAPTURE_BUFFER_SIZE)
- gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, FALSE, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp, LINK, link_type_name, PMODE, (device.pmode?"enabled":"disabled"), SNAPLEN, snaplen_string, BUFFER, device.buffer, FILTER, "",-1);
- #else
- gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, FALSE, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp, LINK, link_type_name, PMODE, (device.pmode?"enabled":"disabled"), SNAPLEN, snaplen_string, -1);
-#endif
- add_interface_to_list(global_capture_opts.all_ifaces->len-1);
- } /*for*/
- gtk_tree_view_set_model(GTK_TREE_VIEW(if_cb), model);
-}
-#endif
-
-#ifdef HAVE_PCAP_REMOTE
-static void
-populate_existing_remotes(gpointer key, gpointer value, gpointer user_data _U_)
-{
- const gchar *host = (const gchar *)key;
- struct remote_host *remote_host = (struct remote_host *)value;
- GList *if_list;
- int err;
- gchar *err_str;
-
- g_free(global_remote_opts.remote_host_opts.remote_host);
- g_free(global_remote_opts.remote_host_opts.remote_port);
- g_free(global_remote_opts.remote_host_opts.auth_username);
- g_free(global_remote_opts.remote_host_opts.auth_password);
- global_remote_opts.src_type = CAPTURE_IFREMOTE;
- global_remote_opts.remote_host_opts.remote_host = g_strdup(host);
- global_remote_opts.remote_host_opts.remote_port = g_strdup(remote_host->remote_port);
- global_remote_opts.remote_host_opts.auth_type = remote_host->auth_type;
- global_remote_opts.remote_host_opts.auth_username = g_strdup(remote_host->auth_username);
- global_remote_opts.remote_host_opts.auth_password = g_strdup(remote_host->auth_password);
- global_remote_opts.remote_host_opts.datatx_udp = FALSE;
- global_remote_opts.remote_host_opts.nocap_rpcap = TRUE;
- global_remote_opts.remote_host_opts.nocap_local = FALSE;
-#ifdef HAVE_PCAP_SETSAMPLING
- global_remote_opts.sampling_method = CAPTURE_SAMP_NONE;
- global_remote_opts.sampling_param = 0;
-#endif
-
- if_list = get_remote_interface_list(global_remote_opts.remote_host_opts.remote_host,
- global_remote_opts.remote_host_opts.remote_port,
- global_remote_opts.remote_host_opts.auth_type,
- global_remote_opts.remote_host_opts.auth_username,
- global_remote_opts.remote_host_opts.auth_password,
- &err, &err_str);
- if (if_list != NULL) {
- /* New remote interface */
- insert_new_rows(if_list);
- refresh_non_local_interface_lists();
- }
-}
-
-
-/* Retrieve the list of remote interfaces according to selected
- * options and re-fill interface name combobox */
-static void
-update_remote_interface_list(void)
-{
- GtkWidget *iftype_cbx;
- GList *if_list;
- int err;
- gchar *err_str;
-
- if (cap_open_w == NULL)
- return;
- iftype_cbx = (GtkWidget *)g_object_get_data(G_OBJECT(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY)), E_REMOTE_HOST_TE_KEY);
- if_list = get_remote_interface_list(global_remote_opts.remote_host_opts.remote_host,
- global_remote_opts.remote_host_opts.remote_port,
- global_remote_opts.remote_host_opts.auth_type,
- global_remote_opts.remote_host_opts.auth_username,
- global_remote_opts.remote_host_opts.auth_password,
- &err, &err_str);
- if (if_list == NULL &&
- (err == CANT_GET_INTERFACE_LIST || err == DONT_HAVE_PCAP)) {
- gpointer dialog = simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_str);
- g_free(err_str);
-
- /* Fall back to previous interface list */
- simple_dialog_set_cb(dialog, error_list_remote_interface_cb, iftype_cbx);
- return;
- } else {
- /* New remote interface */
- insert_new_rows(if_list);
- refresh_non_local_interface_lists();
- }
-}
-
-/* User changed an interface entry of "Remote interface" dialog */
-static void
-capture_remote_adjust_sensitivity(GtkWidget *tb _U_, gpointer parent_w)
-{
- GtkWidget *auth_passwd_rb,
- *username_lb, *username_te,
- *passwd_lb, *passwd_te;
- gboolean state;
-
- auth_passwd_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
- E_REMOTE_AUTH_PASSWD_KEY);
- username_lb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
- E_REMOTE_USERNAME_LB_KEY);
- username_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
- E_REMOTE_USERNAME_TE_KEY);
- passwd_lb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_REMOTE_PASSWD_LB_KEY);
- passwd_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_REMOTE_PASSWD_TE_KEY);
-
- state = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(auth_passwd_rb));
- gtk_widget_set_sensitive(GTK_WIDGET(username_lb), state);
- gtk_widget_set_sensitive(GTK_WIDGET(username_te), state);
- gtk_widget_set_sensitive(GTK_WIDGET(passwd_lb), state);
- gtk_widget_set_sensitive(GTK_WIDGET(passwd_te), state);
-}
-
-
-/* user requested to accept remote interface options */
-static void
-capture_remote_ok_cb(GtkWidget *win _U_, GtkWidget *remote_w)
-{
- GtkWidget *host_te, *port_te, *username_te, *passwd_te, *auth_passwd_rb;
- gchar *hostname;
- struct remote_host *rh;
-
- if (remote_w == NULL) {
- return;
- }
-
- host_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_HOST_TE_KEY);
- hostname = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(host_te));
- port_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_PORT_TE_KEY);
- username_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w),
- E_REMOTE_USERNAME_TE_KEY);
- passwd_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_PASSWD_TE_KEY);
- auth_passwd_rb = (GtkWidget *) g_object_get_data(G_OBJECT(remote_w), E_REMOTE_AUTH_PASSWD_KEY);
- g_free(global_remote_opts.remote_host_opts.remote_host);
- global_remote_opts.remote_host_opts.remote_host = hostname;
- g_free(global_remote_opts.remote_host_opts.remote_port);
- global_remote_opts.remote_host_opts.remote_port = g_strdup(gtk_entry_get_text(GTK_ENTRY(port_te)));
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(auth_passwd_rb)))
- global_remote_opts.remote_host_opts.auth_type = CAPTURE_AUTH_PWD;
- else
- global_remote_opts.remote_host_opts.auth_type = CAPTURE_AUTH_NULL;
- g_free(global_remote_opts.remote_host_opts.auth_username);
- global_remote_opts.remote_host_opts.auth_username =
- g_strdup(gtk_entry_get_text(GTK_ENTRY(username_te)));
-
- g_free(global_remote_opts.remote_host_opts.auth_password);
- global_remote_opts.remote_host_opts.auth_password =
- g_strdup(gtk_entry_get_text(GTK_ENTRY(passwd_te)));
-
- rh = (struct remote_host *)g_malloc (sizeof (*rh));
- rh->r_host = g_strdup(global_remote_opts.remote_host_opts.remote_host);
- rh->remote_port = g_strdup(global_remote_opts.remote_host_opts.remote_port);
- rh->auth_type = global_remote_opts.remote_host_opts.auth_type;
- rh->auth_password = g_strdup("");
- rh->auth_username = g_strdup("");
-
- recent_add_remote_host(hostname, rh);
-
- update_remote_interface_list();
- fill_remote_list();
- window_destroy(GTK_WIDGET(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY)));
-}
-
-static void
-capture_remote_cancel_cb(GtkWidget *win, gpointer data)
-{
- window_cancel_button_cb (win, data);
-}
-
-static void
-select_if_type_cb(GtkComboBox *iftype_cbx, gpointer data _U_)
-{
- gchar *string;
- GtkWidget *port_te, *auth_rb, *user_te, *pass_te;
- GtkWidget *remote_w;
- struct remote_host *rh;
-
- int new_iftype = gtk_combo_box_get_active(GTK_COMBO_BOX(iftype_cbx));
- gint num_remote = recent_get_remote_host_list_size();
-
- if (new_iftype != -1 && new_iftype == num_remote+1) {
- recent_free_remote_host_list();
- num_remote += 2;
- while (num_remote--) { /* Remove separator lines and "Clear" item */
- gtk_combo_box_text_remove (GTK_COMBO_BOX_TEXT(iftype_cbx), num_remote);
- }
- remote_w = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY);
- window_destroy(GTK_WIDGET(remote_w));
- capture_remote_cb(GTK_WIDGET(iftype_cbx), FALSE);
- } else {
- string = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(iftype_cbx));
- rh = recent_get_remote_host(string);
- g_free (string);
- if (rh) {
- remote_w = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY);
- port_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_PORT_TE_KEY);
- gtk_entry_set_text(GTK_ENTRY(port_te), rh->remote_port);
- auth_rb = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_AUTH_PASSWD_KEY);
- if (rh->auth_type == CAPTURE_AUTH_PWD) {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auth_rb), TRUE);
- } else {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auth_rb), FALSE);
- }
- user_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_USERNAME_TE_KEY);
- gtk_entry_set_text(GTK_ENTRY(user_te), rh->auth_username);
- pass_te = (GtkWidget *)g_object_get_data(G_OBJECT(remote_w), E_REMOTE_PASSWD_TE_KEY);
- gtk_entry_set_text(GTK_ENTRY(pass_te), rh->auth_password);
- }
- }
-}
-
-/* Show remote capture interface parameters dialog */
-static void
-capture_remote_cb(GtkWidget *w _U_, gboolean focus_username)
-{
- GtkWidget *remote_w,
- *main_vb, *host_grid,
- *host_lb, *host_te, *port_lb, *port_te,
- *auth_fr, *auth_vb,
- *auth_null_rb, *auth_passwd_rb, *auth_passwd_grid,
- *user_lb, *user_te, *passwd_lb, *passwd_te,
- *bbox, *ok_but, *cancel_bt;
- gchar *title;
- GSList *auth_group;
-
- title = create_user_window_title("Wireshark: Remote Interface");
- remote_w = dlg_window_new(title);
- gtk_window_set_transient_for(GTK_WINDOW(remote_w), GTK_WINDOW(interface_management_w));
- g_object_set_data(G_OBJECT(remote_w), E_CAP_REMOTE_CALLER_PTR_KEY, interface_management_w);
- g_object_set_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY, remote_w);
- g_free(title);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_container_add(GTK_CONTAINER(remote_w), main_vb);
-
- /* Host/port table */
- host_grid = ws_gtk_grid_new();
- ws_gtk_grid_set_row_spacing(GTK_GRID(host_grid), DLG_LABEL_SPACING);
- ws_gtk_grid_set_column_spacing(GTK_GRID(host_grid), DLG_UNRELATED_SPACING);
- gtk_box_pack_start(GTK_BOX(main_vb), host_grid, FALSE, FALSE, 0);
-
- /* Host row */
- host_lb = gtk_label_new("Host:");
- ws_gtk_grid_attach_defaults(GTK_GRID (host_grid), host_lb, 0, 0, 1, 1);
-
- host_te = iftype_combo_box_new();
- ws_gtk_grid_attach_defaults(GTK_GRID (host_grid), host_te, 1, 0, 1, 1);
-
- /* Port row */
- port_lb = gtk_label_new("Port:");
- ws_gtk_grid_attach_defaults(GTK_GRID (host_grid), port_lb, 0, 1, 1, 1);
-
- port_te = gtk_entry_new();
- gtk_widget_set_tooltip_text(port_te, "Enter the TCP port number used by RPCAP server at remote host "
- "(leave it empty for default port number).");
- ws_gtk_grid_attach_defaults(GTK_GRID (host_grid), port_te, 1, 1, 1, 1);
-
- /* Authentication options frame */
- auth_fr = gtk_frame_new("Authentication");
- gtk_box_pack_start(GTK_BOX (main_vb), auth_fr, TRUE, TRUE, 0);
-
- auth_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(auth_vb), 5);
- gtk_container_add(GTK_CONTAINER(auth_fr), auth_vb);
-
- auth_null_rb = gtk_radio_button_new_with_label(NULL,
- "Null authentication");
- gtk_box_pack_start(GTK_BOX(auth_vb), auth_null_rb, TRUE, TRUE, 0);
-
- auth_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(auth_null_rb));
- auth_passwd_rb = gtk_radio_button_new_with_label(auth_group,
- "Password authentication");
- gtk_box_pack_start(GTK_BOX(auth_vb), auth_passwd_rb, TRUE, TRUE, 0);
- g_signal_connect(auth_passwd_rb, "toggled",
- G_CALLBACK(capture_remote_adjust_sensitivity), remote_w);
-
- auth_passwd_grid = ws_gtk_grid_new();
- ws_gtk_grid_set_row_spacing(GTK_GRID(auth_passwd_grid), DLG_LABEL_SPACING);
- ws_gtk_grid_set_column_spacing(GTK_GRID(auth_passwd_grid), DLG_UNRELATED_SPACING);
-
- gtk_box_pack_start(GTK_BOX(auth_vb), auth_passwd_grid, FALSE, FALSE, 0);
-
- user_lb = gtk_label_new("Username:");
- ws_gtk_grid_attach_defaults(GTK_GRID (auth_passwd_grid), user_lb, 0, 0, 1, 1);
-
- user_te = gtk_entry_new();
- ws_gtk_grid_attach_defaults(GTK_GRID (auth_passwd_grid), user_te, 1, 0, 1, 1);
-
- passwd_lb = gtk_label_new("Password:");
- ws_gtk_grid_attach_defaults(GTK_GRID (auth_passwd_grid), passwd_lb, 0, 1, 1, 1);
-
- passwd_te = gtk_entry_new();
- gtk_entry_set_visibility(GTK_ENTRY(passwd_te), FALSE);
- ws_gtk_grid_attach_defaults(GTK_GRID (auth_passwd_grid), passwd_te, 1, 1, 1, 1);
-
- /* Button row: "OK" and "Cancel" buttons */
- bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CANCEL, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 5);
-
- ok_but = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- gtk_widget_set_can_default(ok_but, TRUE);
- g_signal_connect(ok_but, "clicked", G_CALLBACK(capture_remote_ok_cb), remote_w);
- gtk_widget_set_tooltip_text(ok_but,
- "Accept remote host parameters and lookup "
- "remote interfaces.");
- g_object_set_data(G_OBJECT(remote_w), E_REMOTE_OK_BT_KEY, ok_but);
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- gtk_widget_set_tooltip_text(cancel_bt, "Cancel and exit dialog.");
- window_set_cancel_button(remote_w, cancel_bt, capture_remote_cancel_cb);
-
- if (focus_username) {
- /* Give the initial focus to the "Username" entry box. */
- gtk_widget_grab_focus(user_te);
- }
-
- gtk_widget_grab_default(ok_but);
-
- /* Catch the "activate" signal on the text
- entries, so that if the user types Return there, we act as if the
- "OK" button had been selected, as happens if Return is typed if some
- widget that *doesn't* handle the Return key has the input focus. */
- dlg_set_activate(port_te, ok_but);
- dlg_set_activate(user_te, ok_but);
- dlg_set_activate(passwd_te, ok_but);
-
- g_signal_connect(remote_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
-
- g_object_set_data(G_OBJECT(remote_w), E_REMOTE_HOST_TE_KEY, host_te);
- g_object_set_data(G_OBJECT(remote_w), E_REMOTE_PORT_TE_KEY, port_te);
- g_object_set_data(G_OBJECT(remote_w), E_REMOTE_AUTH_NULL_KEY, auth_null_rb);
- g_object_set_data(G_OBJECT(remote_w), E_REMOTE_AUTH_PASSWD_KEY, auth_passwd_rb);
- g_object_set_data(G_OBJECT(remote_w), E_REMOTE_USERNAME_LB_KEY, user_lb);
- g_object_set_data(G_OBJECT(remote_w), E_REMOTE_USERNAME_TE_KEY, user_te);
- g_object_set_data(G_OBJECT(remote_w), E_REMOTE_PASSWD_LB_KEY, passwd_lb);
- g_object_set_data(G_OBJECT(remote_w), E_REMOTE_PASSWD_TE_KEY, passwd_te);
-
- if (global_remote_opts.remote_host_opts.auth_type == CAPTURE_AUTH_PWD)
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auth_passwd_rb), TRUE);
- else
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auth_null_rb), TRUE);
- capture_remote_adjust_sensitivity(NULL, remote_w);
-
- gtk_widget_show_all(remote_w);
- window_present(remote_w);
-}
-
-/* user requested to destroy the dialog */
-static void
-options_remote_destroy_cb(GtkWidget *win, gpointer user_data _U_)
-{
- GtkWidget *caller;
-
- caller = (GtkWidget *)g_object_get_data(G_OBJECT(win), E_OPT_REMOTE_CALLER_PTR_KEY);
- g_object_set_data(G_OBJECT(caller), E_OPT_REMOTE_DIALOG_PTR_KEY, NULL);
-}
-
-/* user requested to accept remote interface options */
-static void
-options_remote_ok_cb(GtkWidget *win _U_, GtkWidget *parent_w)
-{
- GtkWidget *datatx_udp_cb, *nocap_rpcap_cb;
-#ifdef HAVE_PCAP_SETSAMPLING
- GtkWidget *samp_none_rb, *samp_count_rb, *samp_timer_rb,
- *samp_count_sb, *samp_timer_sb;
-#endif
- interface_t device;
-
- if (parent_w == NULL)
- return;
-
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
- g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
- datatx_udp_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_DATATX_UDP_CB_KEY);
- nocap_rpcap_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_NOCAP_RPCAP_CB_KEY);
-
- device.remote_opts.remote_host_opts.datatx_udp =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(datatx_udp_cb));
- device.remote_opts.remote_host_opts.nocap_rpcap =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(nocap_rpcap_cb));
-
-#ifdef HAVE_PCAP_SETSAMPLING
- samp_none_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_NONE_RB_KEY);
- samp_count_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_COUNT_RB_KEY);
- samp_timer_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_TIMER_RB_KEY);
- samp_count_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_COUNT_SB_KEY);
- samp_timer_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_TIMER_SB_KEY);
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_none_rb)))
- device.remote_opts.sampling_method = CAPTURE_SAMP_NONE;
- else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_count_rb))) {
- device.remote_opts.sampling_method = CAPTURE_SAMP_BY_COUNT;
- device.remote_opts.sampling_param = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(samp_count_sb));
- } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_timer_rb))) {
- device.remote_opts.sampling_method = CAPTURE_SAMP_BY_TIMER;
- device.remote_opts.sampling_param = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(samp_timer_sb));
- }
-#endif /* HAVE_PCAP_SETSAMPLING*/
- g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
- window_destroy(GTK_WIDGET(parent_w));
-}
-#endif /*HAVE_PCAP_REMOTE*/
-
-#ifdef HAVE_PCAP_SETSAMPLING
-static void
-options_prep_adjust_sensitivity(GtkWidget *tb _U_, gpointer parent_w)
-{
- GtkWidget *samp_count_rb, *samp_timer_rb,
- *samp_count_sb, *samp_timer_sb;
-
- samp_count_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_COUNT_RB_KEY);
- samp_timer_rb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_TIMER_RB_KEY);
- samp_count_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_COUNT_SB_KEY);
- samp_timer_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_TIMER_SB_KEY);
-
- if (samp_count_sb && samp_count_rb)
- gtk_widget_set_sensitive(GTK_WIDGET(samp_count_sb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_count_rb)));
-
- if (samp_timer_sb && samp_timer_rb)
- gtk_widget_set_sensitive(GTK_WIDGET(samp_timer_sb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_timer_rb)));
-}
-
-#endif /*HAVE_PCAP_SETSAMPLING*/
-#ifdef HAVE_PCAP_REMOTE
-static void
-options_remote_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- GtkWidget *opt_remote_w, *main_vb;
- GtkWidget *caller, *bbox, *ok_but, *cancel_bt;
- GtkWidget *capture_fr, *capture_vb;
- GtkWidget *nocap_rpcap_cb, *datatx_udp_cb;
-#ifdef HAVE_PCAP_SETSAMPLING
- GtkWidget *sampling_fr, *sampling_vb, *sampling_grid, *sampling_lb,
- *samp_none_rb, *samp_count_rb, *samp_timer_rb,
- *samp_count_sb, *samp_timer_sb;
- GtkAdjustment *samp_count_adj, *samp_timer_adj;
- GSList *samp_group;
-#endif
- interface_t device;
-
- caller = gtk_widget_get_toplevel(w);
- opt_remote_w = (GtkWidget *)g_object_get_data(G_OBJECT(caller), E_OPT_REMOTE_DIALOG_PTR_KEY);
- if (opt_remote_w != NULL) {
- reactivate_window(opt_remote_w);
- return;
- }
-
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
- opt_remote_w = dlg_window_new("Remote Capture Settings");
- gtk_window_set_modal(GTK_WINDOW(opt_remote_w), TRUE);
- gtk_window_set_transient_for(GTK_WINDOW(opt_remote_w), GTK_WINDOW(caller));
- gtk_window_set_type_hint(GTK_WINDOW(opt_remote_w), GDK_WINDOW_TYPE_HINT_DIALOG);
-
- g_object_set_data(G_OBJECT(opt_remote_w), E_OPT_REMOTE_CALLER_PTR_KEY, caller);
- g_object_set_data(G_OBJECT(caller), E_OPT_REMOTE_DIALOG_PTR_KEY, opt_remote_w);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_container_add(GTK_CONTAINER(opt_remote_w), main_vb);
-
- /* Remote capture options */
- capture_fr = gtk_frame_new("Capture Options");
- gtk_box_pack_start(GTK_BOX (main_vb), capture_fr, TRUE, TRUE, 0);
-
- capture_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(capture_vb), 5);
- gtk_container_add(GTK_CONTAINER(capture_fr), capture_vb);
-
- nocap_rpcap_cb = gtk_check_button_new_with_mnemonic("Do not capture own RPCAP traffic");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(nocap_rpcap_cb),
- device.remote_opts.remote_host_opts.nocap_rpcap);
- gtk_box_pack_start(GTK_BOX (capture_vb), nocap_rpcap_cb, TRUE, TRUE, 0);
-
- datatx_udp_cb = gtk_check_button_new_with_mnemonic("Use UDP for data transfer");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(datatx_udp_cb),
- device.remote_opts.remote_host_opts.datatx_udp);
- gtk_box_pack_start(GTK_BOX (capture_vb), datatx_udp_cb, TRUE, TRUE, 0);
-
-
-#ifdef HAVE_PCAP_SETSAMPLING
- /* Sampling options */
- sampling_fr = gtk_frame_new("Sampling Options");
- gtk_box_pack_start(GTK_BOX (main_vb), sampling_fr, TRUE, TRUE, 0);
-
- sampling_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(sampling_vb), 5);
- gtk_container_add(GTK_CONTAINER(sampling_fr), sampling_vb);
-
- sampling_grid = ws_gtk_grid_new();
- ws_gtk_grid_set_row_spacing(GTK_GRID(sampling_grid), DLG_LABEL_SPACING);
- ws_gtk_grid_set_column_spacing(GTK_GRID(sampling_grid), DLG_UNRELATED_SPACING);
- gtk_box_pack_start(GTK_BOX(sampling_vb), sampling_grid, FALSE, FALSE, 0);
-
- /* "No sampling" row */
- samp_none_rb = gtk_radio_button_new_with_label(NULL, "None");
- if (device.remote_opts.sampling_method == CAPTURE_SAMP_NONE)
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(samp_none_rb), TRUE);
- g_signal_connect(samp_none_rb, "toggled",
- G_CALLBACK(options_prep_adjust_sensitivity), opt_remote_w);
- ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), samp_none_rb, 0, 0, 1, 1);
-
- /* "Sampling by counter" row */
- samp_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(samp_none_rb));
- samp_count_rb = gtk_radio_button_new_with_label(samp_group, "1 of");
- if (device.remote_opts.sampling_method == CAPTURE_SAMP_BY_COUNT)
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(samp_count_rb), TRUE);
- g_signal_connect(samp_count_rb, "toggled",
- G_CALLBACK(options_prep_adjust_sensitivity), opt_remote_w);
- ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), samp_count_rb, 0, 1, 1, 1);
-
- samp_count_adj = (GtkAdjustment *) gtk_adjustment_new(
- (gfloat)device.remote_opts.sampling_param,
- 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
- samp_count_sb = gtk_spin_button_new(samp_count_adj, 0, 0);
- gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(samp_count_sb), TRUE);
- ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), samp_count_sb, 1, 1, 1, 1);
-
- sampling_lb = gtk_label_new("packets");
- gtk_misc_set_alignment(GTK_MISC(sampling_lb), 0, 0.5f);
- ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), sampling_lb, 2, 1, 1, 1);
-
- /* "Sampling by timer" row */
- samp_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(samp_count_rb));
- samp_timer_rb = gtk_radio_button_new_with_label(samp_group, "1 every");
- if (device.remote_opts.sampling_method == CAPTURE_SAMP_BY_TIMER)
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(samp_timer_rb), TRUE);
- g_signal_connect(samp_timer_rb, "toggled",
- G_CALLBACK(options_prep_adjust_sensitivity), opt_remote_w);
- ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), samp_timer_rb, 0, 2, 1, 1);
-
- samp_timer_adj = (GtkAdjustment *) gtk_adjustment_new(
- (gfloat)device.remote_opts.sampling_param,
- 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
- samp_timer_sb = gtk_spin_button_new(samp_timer_adj, 0, 0);
- gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(samp_timer_sb), TRUE);
- ws_gtk_grid_attach_defaults(GTK_GRID(sampling_grid), samp_timer_sb, 1, 2, 1, 1);
-
- sampling_lb = gtk_label_new("milliseconds");
- gtk_misc_set_alignment(GTK_MISC(sampling_lb), 0, 0.5f);
- ws_gtk_grid_attach_defaults(GTK_GRID (sampling_grid), sampling_lb, 2, 2, 1, 1);
-#endif
-
- /* Button row: "Start" and "Cancel" buttons */
- bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CANCEL, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 5);
-
- ok_but = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- g_signal_connect(ok_but, "clicked", G_CALLBACK(options_remote_ok_cb), opt_remote_w);
- gtk_widget_set_tooltip_text(ok_but, "Accept parameters and close dialog");
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- gtk_widget_set_tooltip_text(cancel_bt, "Cancel and exit dialog.");
- window_set_cancel_button(opt_remote_w, cancel_bt, window_cancel_button_cb);
-
- gtk_widget_grab_default(ok_but);
-
- g_signal_connect(opt_remote_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(opt_remote_w, "destroy", G_CALLBACK(options_remote_destroy_cb), NULL);
-
- g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_NOCAP_RPCAP_CB_KEY, nocap_rpcap_cb);
- g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_DATATX_UDP_CB_KEY, datatx_udp_cb);
-
-#ifdef HAVE_PCAP_SETSAMPLING
- g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_NONE_RB_KEY, samp_none_rb);
- g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_COUNT_RB_KEY, samp_count_rb);
- g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_COUNT_SB_KEY, samp_count_sb);
- g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_TIMER_RB_KEY, samp_timer_rb);
- g_object_set_data(G_OBJECT(opt_remote_w), E_CAP_SAMP_TIMER_SB_KEY, samp_timer_sb);
-#endif
-
-#ifdef HAVE_PCAP_SETSAMPLING
- /* Set the sensitivity of various widgets as per the settings of other
- widgets. */
- options_prep_adjust_sensitivity(NULL, opt_remote_w);
-#endif
-
- gtk_widget_show_all(opt_remote_w);
- window_present(opt_remote_w);
-}
-
-#endif /* HAVE_PCAP_REMOTE */
-
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
-
-static void
-compile_bpf_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
-{
- /* Note that we no longer have an "About Wireshark" dialog box. */
- compile_bpf_w = NULL;
-}
-
-static void
-select_first_entry(void)
-{
- GtkWidget *view;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkTreeSelection *selection;
-
- view = (GtkWidget *)g_object_get_data(G_OBJECT(compile_bpf_w), E_COMPILE_TREE_VIEW_INTERFACES);
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
- gtk_tree_model_get_iter_first(model, &iter);
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
- gtk_tree_selection_select_iter(selection, &iter);
-}
-
-static void
-add_page(gchar *name, gchar *text, gboolean error)
-{
- GtkWidget *view, *icon;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- view = (GtkWidget *)g_object_get_data(G_OBJECT(compile_bpf_w), E_COMPILE_TREE_VIEW_INTERFACES);
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
- gtk_list_store_append (GTK_LIST_STORE(model), &iter);
- if (error) {
-#ifdef HAVE_GDK_GRESOURCE
- icon = pixbuf_to_widget("/org/wireshark/image/stock_icons/14x14/x-expert-error.png");
-#else
- icon = pixbuf_to_widget(expert_error_pb_data);
-#endif
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, COMPILE_ERROR, 1, SIGN, gtk_image_get_pixbuf(GTK_IMAGE(icon)), INAME, name, -1);
- } else {
-#ifdef HAVE_GDK_GRESOURCE
- icon = pixbuf_to_widget("/org/wireshark/image/expert_ok.png");
-#else
- icon = pixbuf_to_widget(expert_ok_pb_data);
-#endif
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, COMPILE_ERROR, 0, SIGN, gtk_image_get_pixbuf(GTK_IMAGE(icon)), INAME, name, -1);
- }
- g_hash_table_insert(compile_results, name, text);
-}
-
-static void
-compile_tree_select_cb(GtkTreeSelection *sel, gpointer dummy _U_)
-{
- gchar *name, *text;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkWidget *textview;
- GtkTextBuffer *buffer;
- guint error;
-
- if (gtk_tree_selection_get_selected(sel, &model, &iter))
- {
- gtk_tree_model_get(model, &iter, COMPILE_ERROR, &error, INAME, &name, -1);
- text = (gchar *)g_hash_table_lookup(compile_results, name);
- textview = (GtkWidget *)g_object_get_data(G_OBJECT(compile_bpf_w), CR_MAIN_NB);
- if (error == 1) {
- gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_CHAR);
- } else {
- gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_NONE);
- }
- buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
- gtk_text_buffer_set_text(buffer, text, -1);
- gtk_widget_show_all(compile_bpf_w);
- }
-}
-
-static void
-compile_results_prep(GtkWidget *w _U_, gpointer data _U_)
-{
- GtkWidget *main_box, *main_vb, *bbox, *ok_btn, *top_hb, *ct_sb;
- GtkListStore *store;
- GtkWidget *view, *scrolled_win, *textview;
- GtkTreeSelection *selection;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
- PangoFontDescription *font;
-
- if (compile_bpf_w != NULL) {
- /* There's already an "About Wireshark" dialog box; reactivate it. */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The requested dialog is already open. Please close it first.");
- return;
- }
-
- compile_bpf_w = dlg_window_new("Compile selected BPFs");
- /* set the initial position (must be done, before show is called!) */
- /* default position is not appropriate for the about dialog */
- gtk_window_set_position(GTK_WINDOW(compile_bpf_w), GTK_WIN_POS_CENTER_ON_PARENT);
- gtk_window_set_default_size(GTK_WINDOW(compile_bpf_w), 600, 400);
- gtk_window_set_modal(GTK_WINDOW(compile_bpf_w), TRUE);
- gtk_window_set_transient_for(GTK_WINDOW(compile_bpf_w), GTK_WINDOW(cap_open_w));
- gtk_container_set_border_width(GTK_CONTAINER(compile_bpf_w), 6);
-
- main_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 12, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_box), 6);
- gtk_container_add(GTK_CONTAINER(compile_bpf_w), main_box);
- gtk_widget_show(main_box);
-
- /* Top row: Interfaces tree and notebook */
- top_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10, FALSE);
- gtk_box_pack_start(GTK_BOX(main_box), top_hb, TRUE, TRUE, 0);
- gtk_widget_show(top_hb);
-
- /* scrolled window on the left for the categories tree */
- ct_sb = scrolled_window_new(NULL, NULL);
- gtk_widget_set_size_request(GTK_WIDGET(ct_sb), 50, -1);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(ct_sb),
- GTK_SHADOW_IN);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ct_sb),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_box_pack_start(GTK_BOX(top_hb), ct_sb, TRUE, TRUE, 0);
- gtk_widget_show(ct_sb);
- g_object_set_data(G_OBJECT(compile_bpf_w), E_COMPILE_SW_SCROLLW_KEY, ct_sb);
-
- store = gtk_list_store_new(3, G_TYPE_UINT, GDK_TYPE_PIXBUF, G_TYPE_STRING);
- view = gtk_tree_view_new_with_model (GTK_TREE_MODEL(store));
- gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL (store));
- g_object_set(G_OBJECT(view), "headers-visible", FALSE, NULL);
- g_object_set_data(G_OBJECT(compile_bpf_w), E_COMPILE_TREE_VIEW_INTERFACES, view);
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
- column = gtk_tree_view_column_new();
- renderer = gtk_cell_renderer_text_new();
- gtk_tree_view_column_pack_start(column, renderer, TRUE);
- gtk_tree_view_column_set_attributes(column, renderer, "text", COMPILE_ERROR, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
- gtk_tree_view_column_set_visible(column, FALSE);
- column = gtk_tree_view_column_new();
- renderer = gtk_cell_renderer_pixbuf_new();
- gtk_tree_view_column_pack_start(column, renderer, FALSE);
- gtk_tree_view_column_set_attributes(column, renderer, "pixbuf", SIGN, NULL);
- renderer = gtk_cell_renderer_text_new();
- gtk_tree_view_column_pack_start(column, renderer, TRUE);
- gtk_tree_view_column_set_attributes(column, renderer, "text", INAME, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
- gtk_tree_view_column_set_resizable(gtk_tree_view_get_column(GTK_TREE_VIEW(view), 0), TRUE);
-
- g_signal_connect(selection, "changed", G_CALLBACK(compile_tree_select_cb), NULL);
- gtk_container_add(GTK_CONTAINER(ct_sb), view);
- gtk_widget_show(view);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 10, FALSE);
- gtk_box_pack_start(GTK_BOX(top_hb), main_vb, TRUE, TRUE, 0);
- gtk_widget_show(main_vb);
- g_object_set_data(G_OBJECT(compile_bpf_w), CR_MAIN_NB, main_vb);
-
- font = pango_font_description_from_string("Monospace");
- textview = gtk_text_view_new();
-#if GTK_CHECK_VERSION(3, 0, 0)
- gtk_widget_override_font(textview, font);
-#else
- gtk_widget_modify_font(textview, font);
-#endif
- scrolled_win = gtk_scrolled_window_new(NULL, NULL);
- gtk_widget_set_size_request(GTK_WIDGET(scrolled_win), 350, -1);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_win),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_win),
- GTK_SHADOW_IN);
- gtk_container_add(GTK_CONTAINER(scrolled_win), textview);
- gtk_box_pack_start(GTK_BOX(main_vb), scrolled_win, TRUE, TRUE, 0);
- g_object_set_data(G_OBJECT(compile_bpf_w), CR_MAIN_NB, textview);
-
- /* Button row */
- bbox = dlg_button_row_new(GTK_STOCK_OK, NULL);
- gtk_box_pack_start(GTK_BOX(main_box), bbox, FALSE, FALSE, 0);
-
- ok_btn = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- gtk_widget_grab_focus(ok_btn);
- gtk_widget_grab_default(ok_btn);
- window_set_cancel_button(compile_bpf_w, ok_btn, window_cancel_button_cb);
-
- g_signal_connect(compile_bpf_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(compile_bpf_w, "destroy", G_CALLBACK(compile_bpf_destroy_cb), NULL);
-
- gtk_widget_show_all(compile_bpf_w);
- window_present(compile_bpf_w);
-
- compile_results = g_hash_table_new(g_str_hash, g_str_equal);
-}
-
-static void
-capture_all_filter_compile_cb(GtkWidget *w _U_, gpointer user_data _U_)
-{
- pcap_t *pd;
- struct bpf_program fcode;
-
- GtkWidget *filter_cm;
- gchar *filter_text;
- guint i;
- gboolean set = FALSE;
-
- filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY);
-
- if (!filter_cm)
- return;
-
- if (global_capture_opts.all_ifaces->len > 0) {
- 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.selected || device.hidden) {
- continue;
- }
- if (device.active_dlt == -1) {
- g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
- }
- if (!set) {
- set = TRUE;
- compile_results_prep(NULL, NULL);
- }
- pd = pcap_open_dead(device.active_dlt, DUMMY_SNAPLENGTH);
-
- filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
- g_mutex_lock(pcap_compile_mtx);
-#ifdef PCAP_NETMASK_UNKNOWN
- if (pcap_compile(pd, &fcode, filter_text, 1 /* Do optimize */, PCAP_NETMASK_UNKNOWN) < 0)
-#else
- if (pcap_compile(pd, &fcode, filter_text, 1 /* Do optimize */, 0) < 0)
-#endif
- {
- g_mutex_unlock(pcap_compile_mtx);
- add_page(device.name, g_strdup(pcap_geterr(pd)), TRUE);
- } else {
- GString *bpf_code_dump = g_string_new("");
- struct bpf_insn *insn = fcode.bf_insns;
- int ii, n = fcode.bf_len;
- gchar *bpf_code_str;
-
- for (ii = 0; ii < n; ++insn, ++ii) {
- g_string_append(bpf_code_dump, bpf_image(insn, ii));
- g_string_append(bpf_code_dump, "\n");
- }
- bpf_code_str = g_string_free(bpf_code_dump, FALSE);
- g_mutex_unlock(pcap_compile_mtx);
- add_page(device.name, g_strdup(bpf_code_str), FALSE);
- g_free(bpf_code_str);
- }
- g_free(filter_text);
- pcap_close(pd);
- }
- }
- select_first_entry();
-}
-#endif /* HAVE_PCAP_OPEN_DEAD && HAVE_BPF_IMAGE */
-
-
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
-static void
-compile_results_win(gchar *text, gboolean error)
-{
- GtkWidget *main_box, *bbox, *ok_btn, *results_w;
- GtkWidget *scrolled_win, *textview;
- PangoFontDescription *font;
- GtkTextBuffer *buffer;
-
- results_w = dlg_window_new("Compile results");
- /* set the initial position (must be done, before show is called!) */
- /* default position is not appropriate for the about dialog */
- gtk_window_set_position(GTK_WINDOW(results_w), GTK_WIN_POS_CENTER_ON_PARENT);
- gtk_window_set_default_size(GTK_WINDOW(results_w), 400, 400);
- gtk_window_set_modal(GTK_WINDOW(results_w), TRUE);
- gtk_window_set_transient_for(GTK_WINDOW(results_w), GTK_WINDOW(opt_edit_w));
- gtk_container_set_border_width(GTK_CONTAINER(results_w), 6);
- main_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 12, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_box), 6);
- gtk_container_add(GTK_CONTAINER(results_w), main_box);
- gtk_widget_show(main_box);
- font = pango_font_description_from_string("Monospace");
- textview = gtk_text_view_new();
-#if GTK_CHECK_VERSION(3, 0, 0)
- gtk_widget_override_font(textview, font);
-#else
- gtk_widget_modify_font(textview, font);
-#endif
- scrolled_win = gtk_scrolled_window_new(NULL, NULL);
- gtk_widget_set_size_request(GTK_WIDGET(scrolled_win), 350, -1);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_win),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_win),
- GTK_SHADOW_IN);
- gtk_container_add(GTK_CONTAINER(scrolled_win), textview);
- gtk_box_pack_start(GTK_BOX(main_box), scrolled_win, TRUE, TRUE, 0);
- if (error == 1) {
- gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_CHAR);
- } else {
- gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_NONE);
- }
- buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
- gtk_text_buffer_set_text(buffer, g_strdup(text), -1);
- /* Button row */
- bbox = dlg_button_row_new(GTK_STOCK_OK, NULL);
- gtk_box_pack_start(GTK_BOX(main_box), bbox, FALSE, FALSE, 0);
-
- ok_btn = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- gtk_widget_grab_focus(ok_btn);
- gtk_widget_grab_default(ok_btn);
- window_set_cancel_button(results_w, ok_btn, window_cancel_button_cb);
-
- g_signal_connect(results_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(results_w, "destroy", G_CALLBACK(compile_bpf_destroy_cb), NULL);
-
- gtk_widget_show_all(results_w);
- window_present(results_w);
-}
-
-
-static void
-capture_filter_compile_cb(GtkWidget *w _U_, gpointer user_data _U_)
-{
- pcap_t *pd;
- struct bpf_program fcode;
-
- GtkWidget *filter_cm;
- gchar *filter_text;
- gpointer ptr;
- int dlt;
- GtkWidget *linktype_combo_box = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY);
-
- if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(linktype_combo_box), &ptr)) {
- g_assert_not_reached(); /* Programming error: somehow nothing is active */
- }
- if ((dlt = GPOINTER_TO_INT(ptr)) == -1) {
- g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
- }
- pd = pcap_open_dead(dlt, DUMMY_SNAPLENGTH);
- filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(opt_edit_w), E_CFILTER_CM_KEY);
- filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
- g_mutex_lock(pcap_compile_mtx);
-#ifdef PCAP_NETMASK_UNKNOWN
- if (pcap_compile(pd, &fcode, filter_text, 1 /* Do optimize */, PCAP_NETMASK_UNKNOWN) < 0) {
-#else
- if (pcap_compile(pd, &fcode, filter_text, 1 /* Do optimize */, 0) < 0) {
-#endif
- g_mutex_unlock(pcap_compile_mtx);
- compile_results_win(g_strdup(pcap_geterr(pd)), 1);
- } else {
- GString *bpf_code_dump = g_string_new("");
- struct bpf_insn *insn = fcode.bf_insns;
- int i, n = fcode.bf_len;
-
- gchar *bpf_code_str;
-
- g_mutex_unlock(pcap_compile_mtx);
-
- for (i = 0; i < n; ++insn, ++i) {
- g_string_append(bpf_code_dump, bpf_image(insn, i));
- g_string_append(bpf_code_dump, "\n");
- }
-
- bpf_code_str = g_string_free(bpf_code_dump, FALSE);
- compile_results_win(g_strdup(bpf_code_str), 0);
-
- g_free(bpf_code_str);
- }
- g_free(filter_text);
-
- pcap_close(pd);
-}
-#endif /* HAVE_PCAP_OPEN_DEAD && HAVE_BPF_IMAGE */
-
-static void
-options_edit_destroy_cb(GtkWidget *win, gpointer user_data _U_)
-{
- GtkWidget *caller;
-
- caller = (GtkWidget *)g_object_get_data(G_OBJECT(win), E_OPT_EDIT_CALLER_PTR_KEY);
- g_object_set_data(G_OBJECT(caller), E_OPT_EDIT_DIALOG_PTR_KEY, NULL);
-}
-
-static void
-update_options_table(gint indx)
-{
- interface_t device;
- GtkTreePath *path;
- GtkTreeView *if_cb;
- GtkTreeModel *model;
- GtkTreeIter iter;
- gchar *temp, *path_str, *snaplen_string, *linkname;
- GList *list;
- link_row *linkr = NULL;
- gboolean enabled;
-
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
-
- if (!device.hidden) {
- if (device.no_addresses == 0) {
- temp = g_strdup_printf("<b>%s</b>", device.display_name);
- } else {
- temp = g_strdup_printf("<b>%s</b>\n<span size='small'>%s</span>", device.display_name, device.addresses);
- }
- linkname = NULL;
- for (list=device.links; list!=NULL; list=g_list_next(list))
- {
- linkr = (link_row*)(list->data);
- if (linkr->dlt == device.active_dlt) {
- linkname = g_strdup(linkr->name);
- break;
- }
- }
- if (!linkname)
- linkname = g_strdup("unknown");
- snaplen_string = g_strdup_printf("%d", device.snaplen);
- if (cap_open_w) {
- if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- path_str = g_strdup_printf("%d", indx);
- path = gtk_tree_path_new_from_string(path_str);
- model = gtk_tree_view_get_model(if_cb);
- gtk_tree_model_get_iter(model, &iter, path);
- gtk_tree_model_get(model, &iter, CAPTURE, &enabled, -1);
- if (enabled == FALSE) {
- device.selected = TRUE;
- global_capture_opts.num_selected++;
- global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
- g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
- }
- #if defined(HAVE_PCAP_CREATE)
- gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp, LINK, linkname, PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, BUFFER, (guint) device.buffer, MONITOR, device.monitor_mode_supported?(device.monitor_mode_enabled?"enabled":"disabled"):"n/a", FILTER, device.cfilter, -1);
- #elif defined(CAN_SET_CAPTURE_BUFFER_SIZE)
- gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp,LINK, linkname, PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, BUFFER, (guint) device.buffer, FILTER, device.cfilter, -1);
- #else
- gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp,LINK, linkname, PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, FILTER, device.cfilter, -1);
- #endif
- if (global_capture_opts.num_selected > 0) {
- gtk_widget_set_sensitive(ok_bt, TRUE);
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- gtk_widget_set_sensitive(all_compile_bt, TRUE);
-#endif
- } else {
- gtk_widget_set_sensitive(ok_bt, FALSE);
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- gtk_widget_set_sensitive(all_compile_bt, FALSE);
-#endif
- }
- gtk_tree_path_free (path);
- g_free(path_str);
- }
- if (interfaces_dialog_window_present()) {
- update_selected_interface(g_strdup(device.name));
- }
- if (get_welcome_window() != NULL) {
- change_interface_selection(g_strdup(device.name), device.selected);
- }
- g_free(linkname);
- }
- set_sensitivity_for_start_icon();
-}
-
-
-static void
-save_options_cb(GtkWidget *win _U_, gpointer user_data _U_)
-{
- GtkWidget *snap_cb, *snap_sb, *promisc_cb,
-#ifdef HAVE_PCAP_CREATE
- *monitor_cb,
-#endif
- *filter_cm, *linktype_combo_box;
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- GtkWidget *buffer_size_sb;
-#endif
- GtkWidget *extcap_vbox = NULL;
-
- interface_t device;
- gpointer ptr = NULL;
- int dlt = -1;
- gchar *filter_text;
-
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
- global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
- snap_cb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_CB_KEY);
- snap_sb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_SB_KEY);
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- buffer_size_sb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_BUFFER_SIZE_SB_KEY);
-#endif
- promisc_cb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_PROMISC_KEY);
-#ifdef HAVE_PCAP_CREATE
- monitor_cb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_MONITOR_KEY);
-#endif
- filter_cm = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CFILTER_CM_KEY);
-
- linktype_combo_box = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY);
-
- extcap_vbox = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_EXTCAP_KEY);
-
- if (device.links != NULL) {
- if (ws_combo_box_get_active_pointer(GTK_COMBO_BOX(linktype_combo_box), &ptr)) {
- /* Even though device.links != NULL, we might not have an active pointer
- * if all of the available links are unsupported, so the failure of
- * ws_combo_box_get_active_pointer() is not cause for
- * g_assert_not_reached().
- */
- if (ptr != NULL && (dlt = GPOINTER_TO_INT(ptr)) == -1)
- g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
- }
- }
- device.active_dlt = dlt;
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- device.buffer = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(buffer_size_sb));
-#endif
- device.pmode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(promisc_cb));
- device.has_snaplen = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(snap_cb));
- if (device.has_snaplen) {
- device.snaplen = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(snap_sb));
- if (device.snaplen < MIN_PACKET_SIZE)
- device.snaplen = MIN_PACKET_SIZE;
- } else {
- device.snaplen = WTAP_MAX_PACKET_SIZE_STANDARD;
- }
- filter_text = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(filter_cm));
- g_free(device.cfilter);
- g_assert(filter_text != NULL);
- device.cfilter = filter_text;
-
- if (device.external_cap_args_settings != NULL)
- g_hash_table_unref(device.external_cap_args_settings);
-
- if (extcap_vbox != NULL)
- device.external_cap_args_settings = extcap_gtk_get_state(extcap_vbox);
-
- /* Destroy the args data linked in the gtk widget */
-#if 0
- extcap_gtk_free_args(extcap_vbox);
-#endif
-
-#ifdef HAVE_PCAP_CREATE
- /* if dumpcap reported that the interface does not support monitor
- mode, we disable monitor mode even if the user explicitly selected it */
- device.monitor_mode_enabled = device.monitor_mode_supported ?
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(monitor_cb)) : FALSE;
-#endif
- g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
- window_destroy(opt_edit_w);
- update_options_table(marked_row);
- update_properties_all();
-}
-
-static void
-adjust_snap_sensitivity(GtkWidget *tb _U_, gpointer parent_w _U_)
-{
- GtkWidget *snap_cb, *snap_sb;
- interface_t device;
-
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
- global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
-
- snap_cb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_CB_KEY);
- snap_sb = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_SB_KEY);
-
- /* The snapshot length spinbox is sensitive if the "Limit each packet
- to" checkbox is on. */
- gtk_widget_set_sensitive(GTK_WIDGET(snap_sb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(snap_cb)));
- device.has_snaplen = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(snap_cb));
- if (!device.has_snaplen) {
- gtk_spin_button_set_value(GTK_SPIN_BUTTON (snap_sb), WTAP_MAX_PACKET_SIZE_STANDARD);
- device.snaplen = WTAP_MAX_PACKET_SIZE_STANDARD;
- }
- g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
-}
-
-static GtkWidget *build_extcap_options(const gchar *name, GHashTable *hash) {
- GtkWidget *ret_box = NULL;
- GList *arglist = NULL;
- GList *elem = NULL;
-
- arglist = extcap_get_if_configuration( name );
- for ( elem = g_list_first(arglist); elem; elem = elem->next )
- {
- GSList *widget_list;
-
-#if GTK_CHECK_VERSION(3, 0, 0)
- ret_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 3);
-#else
- ret_box = ws_gtk_vbox_new(FALSE, 3);
-#endif
- widget_list = extcap_populate_gtk_vbox((GList *) elem->data, ret_box, hash);
- g_object_set_data(G_OBJECT(ret_box), EXTCAP_GTK_DATA_KEY_WIDGETLIST, widget_list);
- }
-
- return ret_box;
-}
-
-/*
- * If we have an AirPcap "Wireless Settings" checkbox, have two columns
- * (vboxes) of settings, and put the buffer size in the right column.
- *
- * If we have remote capture support, and if this is a remote interface,
- * have two columns of settings, have a "Remote Sttings" button, and
- * put it in the right column.
- *
- * If we can set the buffer size, then have two columns of settings
- * and, if we don't have a "Remote Settings" button, put it in the
- * right column.
- *
- * We avoid having the right column if we don't need it, because it
- * steals 3 pixels.
- */
-#if defined(HAVE_AIRPCAP) || defined(HAVE_PCAP_REMOTE) || defined(CAN_SET_CAPTURE_BUFFER_SIZE)
-#define HAVE_TWO_SETTING_COLUMNS
-# if !defined(HAVE_PCAP_REMOTE)
-# define BUFFER_SIZE_IN_RIGHT_COLUMN
-# endif /* !defined(HAVE_PCAP_REMOTE) */
-#endif /* defined(HAVE_AIRPCAP) || defined(HAVE_PCAP_REMOTE) || defined(CAN_SET_CAPTURE_BUFFER_SIZE) */
-
-void options_interface_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *column _U_, gpointer userdata)
-{
- GtkWidget *caller, *window, *swindow = NULL, *if_view,
- *main_vb, *if_hb, *if_lb, *if_lb_name,
- *main_hb, *left_vb,
-#ifdef HAVE_TWO_SETTING_COLUMNS
- *right_vb,
-#endif
- *capture_fr, *capture_vb,
- *if_ip_hb, *if_ip_lb = NULL, *if_ip_name,
- *if_vb_left, *if_vb_right,
- *linktype_hb, *linktype_lb, *linktype_combo_box,
- *snap_hb, *snap_cb, *snap_sb, *snap_lb,
- *promisc_cb,
-#ifdef HAVE_PCAP_CREATE
- *monitor_cb,
-#endif
- *filter_hb, *filter_bt, *filter_te, *filter_cm,
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- *compile_bt,
-#endif
- *bbox, *ok_but, *cancel_bt,
- *extcap_vbox,
- *help_bt;
-
- GList *cf_entry, *list, *cfilter_list;
- GtkAdjustment *snap_adj;
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- GtkAdjustment *buffer_size_adj;
- GtkWidget *buffer_size_lb, *buffer_size_sb, *buffer_size_hb;
-#endif
-#ifdef HAVE_PCAP_REMOTE
- GtkWidget *remote_bt;
-#endif
-#ifdef HAVE_AIRPCAP
- GtkWidget *advanced_bt;
-#endif
- interface_t device;
- GtkTreeModel *model;
- GtkTreeIter iter;
- link_row *temp;
- gboolean found = FALSE;
- gint num_link_types, num_supported_link_types, first_supported_index;
- guint i;
- gchar *tok, *name;
- GtkCellRenderer *renderer;
- GtkListStore *store;
- const gchar *new_cfilter;
- GHashTable *extcap_hash;
-
- window = (GtkWidget *)userdata;
- caller = gtk_widget_get_toplevel(GTK_WIDGET(window));
- opt_edit_w = (GtkWidget *)g_object_get_data(G_OBJECT(caller), E_OPT_EDIT_DIALOG_PTR_KEY);
- if (opt_edit_w != NULL) {
- reactivate_window(opt_edit_w);
- return;
- }
-
- device.name = NULL;
- device.display_name = NULL;
- device.no_addresses = 0;
- device.addresses = NULL;
- device.links = NULL;
- device.active_dlt = -1;
- device.pmode = FALSE;
-#ifdef HAVE_PCAP_CREATE
- device.monitor_mode_enabled = FALSE;
- device.monitor_mode_supported = FALSE;
-#endif
- device.has_snaplen = FALSE;
- device.snaplen = WTAP_MAX_PACKET_SIZE_STANDARD;
- device.cfilter = NULL;
- device.timestamp_type = NULL;
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- device.buffer = DEFAULT_CAPTURE_BUFFER_SIZE;
-#endif
- device.external_cap_args_settings = NULL;
-
- model = gtk_tree_view_get_model(view);
- gtk_tree_model_get_iter (model, &iter, path);
-
- if (window == get_welcome_window()) {
- gtk_tree_model_get(model, &iter, IFACE_NAME, &name, -1);
- } else if (window == cap_open_w) {
- gtk_tree_model_get(model, &iter, IFACE_HIDDEN_NAME, &name, -1);
- } else {
- 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 (strcmp(device.name, name) == 0) {
- marked_interface = i;
- break;
- }
- }
- // not sure if this can happen, just to be sure...
- if (gtk_tree_path_get_depth(path) == 0) {
- marked_row = 0;
- } else {
- marked_row = gtk_tree_path_get_indices(path)[0];
- }
- opt_edit_w = dlg_window_new("Edit Interface Settings");
- gtk_window_set_modal(GTK_WINDOW(opt_edit_w), TRUE);
- gtk_window_set_type_hint (GTK_WINDOW (opt_edit_w), GDK_WINDOW_TYPE_HINT_DIALOG);
- g_object_set_data(G_OBJECT(opt_edit_w), E_OPT_EDIT_CALLER_PTR_KEY, caller);
- g_object_set_data(G_OBJECT(caller), E_OPT_EDIT_DIALOG_PTR_KEY, opt_edit_w);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_container_add(GTK_CONTAINER(opt_edit_w), main_vb);
-
- /* Capture-related options frame */
- capture_fr = gtk_frame_new("Capture");
- gtk_box_pack_start(GTK_BOX (main_vb), capture_fr, TRUE, TRUE, 0);
-
- capture_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(capture_vb), 5);
- gtk_container_add(GTK_CONTAINER(capture_fr), capture_vb);
-
- /* Interface row */
- if_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(capture_vb), if_hb, FALSE, FALSE, 3);
-
- if_lb = gtk_label_new("Interface: ");
- gtk_box_pack_start(GTK_BOX(if_hb), if_lb, FALSE, FALSE, 3);
-
- if_lb_name = gtk_label_new(device.display_name);
- gtk_box_pack_start(GTK_BOX(if_hb), if_lb_name, FALSE, FALSE, 3);
-
- /* IP addresses row */
- if_ip_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
-
- gtk_widget_set_tooltip_text(if_ip_hb, "Lists the IP address(es) "
- "assigned to the selected interface. ");
- if_vb_left = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(if_ip_hb), if_vb_left, FALSE, FALSE, 3);
- if_vb_right = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
-
- if_ip_lb = gtk_label_new("IP address:");
- gtk_misc_set_alignment(GTK_MISC(if_ip_lb), 0, 0); /* Left justified */
- gtk_box_pack_start(GTK_BOX(if_vb_left), if_ip_lb, FALSE, FALSE, 0);
- if (device.no_addresses > 0) {
- gchar *temp_addresses = g_strdup(device.addresses);
- gtk_box_pack_start(GTK_BOX(capture_vb), if_ip_hb, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(if_ip_hb), if_vb_right, TRUE, TRUE, 3);
- swindow = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(swindow), GTK_SHADOW_IN);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_widget_set_size_request(GTK_WIDGET(swindow),-1, 50);
- if_view = gtk_tree_view_new ();
- g_object_set(G_OBJECT(if_view), "headers-visible", FALSE, NULL);
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes ("",
- GTK_CELL_RENDERER(renderer),
- "text", 0,
- NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(if_view), column);
- store = gtk_list_store_new(1, G_TYPE_STRING);
- for (tok = strtok (temp_addresses, "\n"); tok; tok = strtok(NULL, "\n")) {
- gtk_list_store_append (store, &iter);
- gtk_list_store_set (store, &iter, 0, tok, -1);
- }
- gtk_tree_view_set_model(GTK_TREE_VIEW(if_view), GTK_TREE_MODEL (store));
- gtk_container_add (GTK_CONTAINER (swindow), if_view);
- gtk_box_pack_start(GTK_BOX(if_vb_right), swindow, TRUE, TRUE, 0);
- g_free(temp_addresses);
- } else {
- gtk_box_pack_start(GTK_BOX(capture_vb), if_ip_hb, FALSE, FALSE, 0);
- gtk_box_pack_start(GTK_BOX(if_ip_hb), if_vb_right, FALSE, FALSE, 3);
- if_ip_name = gtk_label_new("none");
- gtk_misc_set_alignment(GTK_MISC(if_ip_name), 0, 0); /* Left justified */
- gtk_box_pack_start(GTK_BOX(if_vb_right), if_ip_name, FALSE, FALSE, 0);
- }
- main_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_hb), 0);
- gtk_box_pack_start(GTK_BOX(capture_vb), main_hb, FALSE, FALSE, 3);
-
- left_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(left_vb), 0);
- gtk_box_pack_start(GTK_BOX(main_hb), left_vb, TRUE, TRUE, 0);
-
-#ifdef HAVE_TWO_SETTING_COLUMNS
- right_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(right_vb), 0);
- gtk_box_pack_start(GTK_BOX(main_hb), right_vb, FALSE, FALSE, 3);
-#endif
-
- /* Linktype row */
- linktype_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(left_vb), linktype_hb, FALSE, FALSE, 0);
-
- linktype_lb = gtk_label_new("Link-layer header type:");
- gtk_box_pack_start(GTK_BOX(linktype_hb), linktype_lb, FALSE, FALSE, 3);
-
- linktype_combo_box = ws_combo_box_new_text_and_pointer();
- g_object_set_data(G_OBJECT(linktype_combo_box), E_CAP_LT_CBX_LABEL_KEY, linktype_lb);
- /* Default to "use the default" */
- /* Datalink menu index is not reset; it will be restored with last used value */
-
- g_object_set_data(G_OBJECT(linktype_combo_box), E_CAP_IFACE_IP_KEY, if_ip_lb);
- /*
- * XXX - in some cases, this is "multiple link-layer header types", e.g.
- * some 802.11 interfaces on FreeBSD 5.2 and later, where you can request
- * fake Ethernet, 802.11, or 802.11-plus-radio-information headers.
- *
- * In other cases, it's "multiple link-layer types", e.g., with recent
- * versions of libpcap, a DAG card on an "HDLC" WAN, where you can
- * request Cisco HDLC or PPP depending on what type of traffic is going
- * over the WAN, or an Ethernet interface, where you can request Ethernet
- * or DOCSIS, the latter being for some Cisco cable modem equipment that
- * can be configured to send raw DOCSIS frames over an Ethernet inside
- * Ethernet low-level framing, for traffic capture purposes.
- *
- * We leave it as "multiple link-layer types" for now.
- */
- gtk_widget_set_tooltip_text(linktype_combo_box, "The selected interface supports multiple link-layer types; select the desired one.");
- gtk_box_pack_start (GTK_BOX(linktype_hb), linktype_combo_box, FALSE, FALSE, 0);
- g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY, linktype_combo_box);
- num_link_types = 0;
- num_supported_link_types = 0;
- first_supported_index = -1;
- for (list=device.links; list!=NULL; list=g_list_next(list))
- {
- temp = (link_row*)(list->data);
- if (temp->dlt == -1)
- {
- ws_combo_box_append_text_and_pointer_full(GTK_COMBO_BOX(linktype_combo_box),
- NULL,
- temp->name,
- GINT_TO_POINTER(-1), /* Flag as "not supported" */
- FALSE);
- }
- else
- {
- ws_combo_box_append_text_and_pointer(GTK_COMBO_BOX(linktype_combo_box),
- temp->name,
- GINT_TO_POINTER(temp->dlt));
- /* Record the index of the first supported link type (and thus the first
- * one in the list to be active) for use determining the default selected
- * element. */
- if (first_supported_index == -1)
- {
- first_supported_index = num_link_types;
- }
- if (temp->dlt == device.active_dlt)
- {
- ws_combo_box_set_active(GTK_COMBO_BOX(linktype_combo_box), num_link_types);
- found = TRUE;
- }
- num_supported_link_types++;
- }
- num_link_types++;
- }
- gtk_widget_set_sensitive(linktype_lb, num_link_types >= 2);
- gtk_widget_set_sensitive(linktype_combo_box, num_link_types >= 2);
- if (!found && first_supported_index >= 0)
- {
- ws_combo_box_set_active(GTK_COMBO_BOX(linktype_combo_box),first_supported_index);
- }
- g_signal_connect(linktype_combo_box, "changed", G_CALLBACK(select_link_type_cb), NULL);
-
- /* Promiscuous mode row */
- promisc_cb = gtk_check_button_new_with_mnemonic(
- "Capture packets in _promiscuous mode");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_cb),
- device.pmode);
- gtk_widget_set_tooltip_text(promisc_cb,
- "Usually a network adapter will only capture the traffic sent to its own network address. "
- "If you want to capture all traffic that the network adapter can \"see\", mark this option. "
- "See the FAQ for some more details of capturing packets from a switched network.");
- gtk_box_pack_start (GTK_BOX(left_vb), promisc_cb, FALSE, FALSE, 0);
- g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_PROMISC_KEY, promisc_cb);
-
-#ifdef HAVE_PCAP_CREATE
- /* Monitor mode row */
- monitor_cb = gtk_check_button_new_with_mnemonic( "Capture packets in monitor mode");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(monitor_cb), device.monitor_mode_enabled);
- gtk_widget_set_sensitive(monitor_cb, device.monitor_mode_supported);
- g_signal_connect(monitor_cb, "toggled", G_CALLBACK(capture_prep_monitor_changed_cb), NULL);
-
- gtk_widget_set_tooltip_text(monitor_cb,
- "Usually a Wi-Fi adapter will, even in promiscuous mode, only capture the traffic on the BSS to which it's associated. "
- "If you want to capture all traffic that the Wi-Fi adapter can \"receive\", mark this option. "
- "In order to see IEEE 802.11 headers or to see radio information for captured packets, "
- "it might be necessary to turn this option on.\n\n"
- "Note that, in monitor mode, the adapter might disassociate from the network to which it's associated.");
- gtk_box_pack_start (GTK_BOX(left_vb), monitor_cb, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_MONITOR_KEY, monitor_cb);
-#endif
-
- /*
- * This controls the sensitivity of both the link-type list and, if
- * you have it, the monitor mode checkbox. That's why we do this
- * now.
- */
-
- /* Capture length row */
- snap_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start (GTK_BOX(left_vb), snap_hb, FALSE, FALSE, 0);
-
- snap_cb = gtk_check_button_new_with_mnemonic("_Limit each packet to");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(snap_cb),
- device.has_snaplen);
- g_signal_connect(snap_cb, "toggled", G_CALLBACK(adjust_snap_sensitivity), NULL);
- gtk_widget_set_tooltip_text(snap_cb,
- "Limit the maximum number of bytes to be captured from each packet. This size includes the "
- "link-layer header and all subsequent headers. ");
- gtk_box_pack_start(GTK_BOX(snap_hb), snap_cb, FALSE, FALSE, 0);
-
- snap_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat) device.snaplen,
- MIN_PACKET_SIZE, WTAP_MAX_PACKET_SIZE_STANDARD, 1.0, 10.0, 0.0);
- snap_sb = gtk_spin_button_new (snap_adj, 0, 0);
- gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (snap_sb), TRUE);
- gtk_widget_set_size_request(snap_sb, 80, -1);
- gtk_box_pack_start (GTK_BOX(snap_hb), snap_sb, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_CB_KEY, snap_cb);
- g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_SNAP_SB_KEY, snap_sb);
- snap_lb = gtk_label_new("bytes");
- gtk_misc_set_alignment(GTK_MISC(snap_lb), 0, 0.5f);
- gtk_box_pack_start(GTK_BOX(snap_hb), snap_lb, FALSE, FALSE, 0);
- gtk_widget_set_sensitive(GTK_WIDGET(snap_sb), device.has_snaplen);
-
- /* Filter row */
- filter_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(capture_vb), filter_hb, FALSE, FALSE, 0);
-
- filter_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_CAPTURE_FILTER_ENTRY);
- g_signal_connect(filter_bt, "clicked", G_CALLBACK(capture_filter_construct_cb), NULL);
- g_signal_connect(filter_bt, "destroy", G_CALLBACK(filter_button_destroy_cb), NULL);
- gtk_widget_set_tooltip_text(filter_bt,
- "Select a capture filter to reduce the amount of packets to be captured. "
- "See \"Capture Filters\" in the online help for further information how to use it."
- );
- gtk_box_pack_start(GTK_BOX(filter_hb), filter_bt, FALSE, FALSE, 3);
-
- /* Create the capture filter combo box*/
- filter_cm = gtk_combo_box_text_new_with_entry();
- g_object_set_data(G_OBJECT(opt_edit_w), E_CFILTER_CM_KEY, filter_cm);
- filter_te = gtk_bin_get_child(GTK_BIN(filter_cm));
- colorize_filter_te_as_empty(filter_te);
- g_signal_connect(filter_te, "changed", G_CALLBACK(capture_filter_check_syntax_cb), NULL);
- g_signal_connect(filter_te, "destroy", G_CALLBACK(capture_filter_destroy_cb), NULL);
-
- cfilter_list = recent_get_cfilter_list(name);
- for (cf_entry = cfilter_list; cf_entry != NULL; cf_entry = g_list_next(cf_entry)) {
- new_cfilter = (const gchar *)cf_entry->data;
- /* If this is the current dfilter or the default cfilter, don't put
- it in the list, as it'll be added later. */
- if ((device.cfilter == NULL || strcmp(device.cfilter, new_cfilter) != 0) &&
- (global_capture_opts.default_options.cfilter == NULL || strcmp(global_capture_opts.default_options.cfilter, new_cfilter) != 0)) {
- gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(filter_cm), new_cfilter);
- }
- }
- if (global_capture_opts.default_options.cfilter && (strlen(global_capture_opts.default_options.cfilter) > 0)) {
- /* If this is the current dfilter, don't put it in the list, as it'll be
- added later. */
- if (device.cfilter == NULL || strcmp(device.cfilter, global_capture_opts.default_options.cfilter) != 0) {
- gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(filter_cm), global_capture_opts.default_options.cfilter);
- }
- }
- if (device.cfilter && (strlen(device.cfilter) > 0)) {
- gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(filter_cm), device.cfilter);
- gtk_combo_box_set_active(GTK_COMBO_BOX(filter_cm), 0);
- }
-
- gtk_widget_set_tooltip_text(filter_cm,
- "Enter a capture filter to reduce the amount of packets to be captured. "
- "See \"Capture Filters\" in the online help for further information how to use it. "
- "Syntax checking can be disabled in Preferences -> Capture -> Syntax check capture filter."
- );
- gtk_box_pack_start(GTK_BOX(filter_hb), filter_cm, TRUE, TRUE, 3);
-
- /* let an eventually capture filters dialog know the text entry to fill in */
- g_object_set_data(G_OBJECT(filter_bt), E_FILT_TE_PTR_KEY, filter_te);
-
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- compile_bt = gtk_button_new_with_label("Compile BPF");
- g_signal_connect(compile_bt, "clicked", G_CALLBACK(capture_filter_compile_cb), NULL);
- gtk_widget_set_tooltip_text(compile_bt,
- "Compile the capture filter expression and show the BPF (Berkeley Packet Filter) code.");
- /* We can't compile without any supported link-types, so disable the button in that case */
- gtk_widget_set_sensitive(compile_bt, (num_supported_link_types >= 1));
- gtk_box_pack_start(GTK_BOX(filter_hb), compile_bt, FALSE, FALSE, 3);
-#endif
-
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- buffer_size_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- buffer_size_lb = gtk_label_new("Buffer size:");
- gtk_box_pack_start (GTK_BOX(buffer_size_hb), buffer_size_lb, FALSE, FALSE, 0);
-
- buffer_size_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat) device.buffer,
- 1, WTAP_MAX_PACKET_SIZE_STANDARD, 1.0, 10.0, 0.0);
- buffer_size_sb = gtk_spin_button_new (buffer_size_adj, 0, 0);
- gtk_spin_button_set_value(GTK_SPIN_BUTTON (buffer_size_sb), (gfloat) device.buffer);
- gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (buffer_size_sb), TRUE);
- gtk_widget_set_size_request(buffer_size_sb, 80, -1);
- gtk_widget_set_tooltip_text(buffer_size_sb,
- "The memory buffer size used while capturing. If you notice packet drops, you can try to increase this size.");
- gtk_box_pack_start (GTK_BOX(buffer_size_hb), buffer_size_sb, FALSE, FALSE, 0);
- g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_BUFFER_SIZE_SB_KEY, buffer_size_sb);
- buffer_size_lb = gtk_label_new("mebibyte(s)");
- gtk_box_pack_start (GTK_BOX(buffer_size_hb), buffer_size_lb, FALSE, FALSE, 3);
- gtk_misc_set_alignment(GTK_MISC(buffer_size_lb), 1, 0);
-#ifdef BUFFER_SIZE_IN_RIGHT_COLUMN
- gtk_box_pack_start (GTK_BOX(right_vb), buffer_size_hb, FALSE, FALSE, 0);
-#else /* BUFFER_SIZE_IN_RIGHT_COLUMN */
- gtk_box_pack_start (GTK_BOX(left_vb), buffer_size_hb, FALSE, FALSE, 0);
-#endif /* BUFFER_SIZE_IN_RIGHT_COLUMN */
-#endif /* CAN_SET_CAPTURE_BUFFER_SIZE */
-
-#ifdef HAVE_PCAP_REMOTE
- /*
- * *IF* this is a remote interface, add the "Remote Settings"
- * button. Do *not* add it for other interfaces, as that could
- * lead users to believe that it could somehow be enabled.
- */
- /* Both the callback and the data are global */
- if (strncmp (device.name, "rpcap://", 8) == 0) {
- remote_bt = gtk_button_new_with_label("Remote Settings");
- gtk_widget_set_tooltip_text(remote_bt, "Various settings for remote capture.");
-
- g_signal_connect(remote_bt, "clicked", G_CALLBACK(options_remote_cb), NULL);
-
- gtk_box_pack_start(GTK_BOX(right_vb), remote_bt, FALSE, FALSE, 0);
- gtk_widget_show(remote_bt);
- }
-#endif
-
-#ifdef HAVE_AIRPCAP
- /*
- * *IF* this is an AirPcap interface, add the "Wireless Settings"
- * button. Do *not* add it for other interfaces, as that can
- * confuse users, so that they ask why this is grayed out on
- * their non-Windows machine and ask how to enable it.
- */
- airpcap_if_selected = get_airpcap_if_from_name(g_airpcap_if_list, device.name);
- if (airpcap_if_selected != NULL) {
- advanced_bt = gtk_button_new_with_label("Wireless Settings");
-
- /* Both the callback and the data are global */
- g_signal_connect(advanced_bt,"clicked", G_CALLBACK(options_airpcap_advanced_cb), wireless_tb);
-
- gtk_box_pack_start(GTK_BOX(right_vb), advanced_bt, FALSE, FALSE, 0);
- gtk_widget_show(advanced_bt);
- }
-#endif
-
- extcap_hash = device.external_cap_args_settings;
- extcap_vbox = build_extcap_options(device.name, extcap_hash);
- if (extcap_vbox != NULL) {
- gtk_box_pack_start(GTK_BOX(capture_vb), extcap_vbox, FALSE, FALSE, 5);
- gtk_widget_show(extcap_vbox);
- }
- g_object_set_data(G_OBJECT(opt_edit_w), E_CAP_EXTCAP_KEY, extcap_vbox);
-
-/* Button row: "Start", "Cancel" and "Help" buttons */
- bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CANCEL, GTK_STOCK_HELP, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 5);
-
- ok_but = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- g_signal_connect(ok_but, "clicked", G_CALLBACK(save_options_cb), NULL);
- gtk_widget_set_tooltip_text(ok_but,
- "Accept interface settings.");
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- gtk_widget_set_tooltip_text(cancel_bt,
- "Cancel and exit dialog.");
- window_set_cancel_button(opt_edit_w, cancel_bt, window_cancel_button_cb);
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- gtk_widget_set_tooltip_text(help_bt,
- "Show help about capturing.");
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_CAPTURE_OPTIONS_DIALOG);
- dlg_set_activate(filter_te, ok_but);
- gtk_widget_grab_focus(filter_te);
- g_signal_connect(opt_edit_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(opt_edit_w, "destroy", G_CALLBACK(options_edit_destroy_cb), NULL);
- gtk_widget_show_all(opt_edit_w);
- window_present(opt_edit_w);
-}
-
-static void toggle_callback(GtkCellRendererToggle *cell _U_,
- gchar *path_str,
- gpointer data _U_)
-{
- /* get the treemodel from somewhere */
- GtkTreeIter iter;
- GtkTreeView *if_cb;
- GtkTreeModel *model;
- GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
- gboolean enabled;
- GtkWidget *pcap_ng_cb, *filter_cm;
- interface_t device;
- gchar *name;
- gint indx = -1;
- guint i;
-
- /* Initialise device */
- device.cfilter = NULL;
-
- if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- model = gtk_tree_view_get_model(if_cb);
- gtk_tree_model_get_iter (model, &iter, path);
- gtk_tree_model_get (model, &iter, CAPTURE, &enabled, IFACE_HIDDEN_NAME, &name, -1);
- /* Look for the right interface. The number of interfaces shown might be less
- * than the real number. Therefore the path index does not correspond
- * necessarily to the position in the list */
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- if (strcmp(device.name, name) == 0) {
- indx = i;
- break;
- }
- }
- if (enabled == FALSE) {
- device.selected = TRUE;
- global_capture_opts.num_selected++;
- } else {
- device.selected = FALSE;
- global_capture_opts.num_selected--;
- }
- if (indx != -1) {
- global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, indx);
- g_array_insert_val(global_capture_opts.all_ifaces, indx, device);
- pcap_ng_cb = (GtkWidget *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_PCAP_NG_KEY);
- if (global_capture_opts.num_selected >= 2) {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pcap_ng_cb), TRUE);
- gtk_widget_set_sensitive(pcap_ng_cb, FALSE);
- } else {
- gtk_widget_set_sensitive(pcap_ng_cb, TRUE);
- }
- if (global_capture_opts.num_selected > 0) {
- gtk_widget_set_sensitive(ok_bt, TRUE);
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- gtk_widget_set_sensitive(all_compile_bt, TRUE);
-#endif
- } else {
- gtk_widget_set_sensitive(ok_bt, FALSE);
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- gtk_widget_set_sensitive(all_compile_bt, FALSE);
-#endif
- }
- /* do something with the new enabled value, and set the new
- enabled value in your treemodel */
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, CAPTURE, device.selected, -1);
- if (interfaces_dialog_window_present()) {
- update_selected_interface(g_strdup(device.name));
- }
- if (get_welcome_window() != NULL) {
- change_interface_selection(g_strdup(device.name), device.selected);
- }
- }
- if (device.cfilter != NULL) {
- g_free(device.cfilter);
- device.cfilter = NULL;
- update_filter_string(device.name, NULL);
- }
- global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, indx);
- g_array_insert_val(global_capture_opts.all_ifaces, indx, device);
- gtk_tree_path_free (path);
- filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY);
- if (strcmp(gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm)),"") != 0) {
- capture_all_filter_check_syntax_cb(NULL, NULL);
- }
- update_properties_all();
-}
-
-void enable_selected_interface(gchar *name, gboolean selected)
-{
- GtkTreeIter iter;
- GtkTreeView *if_cb;
- GtkTreeModel *model;
- gchar *name_str;
-
- if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- model = gtk_tree_view_get_model(if_cb);
- gtk_tree_model_get_iter_first(model, &iter);
- do {
- gtk_tree_model_get(model, &iter, IFACE_HIDDEN_NAME, &name_str, -1);
- if (strcmp(name, name_str) == 0) {
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, CAPTURE, selected, -1);
- break;
- }
- }
- while (gtk_tree_model_iter_next(model, &iter));
- if (global_capture_opts.num_selected > 0) {
- gtk_widget_set_sensitive(ok_bt, TRUE);
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- gtk_widget_set_sensitive(all_compile_bt, TRUE);
-#endif
- } else {
- gtk_widget_set_sensitive(ok_bt, FALSE);
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- gtk_widget_set_sensitive(all_compile_bt, FALSE);
-#endif
- }
-}
-
-
-static void capture_all_cb(GtkToggleButton *button, gpointer d _U_)
-{
- GtkTreeIter iter;
- GtkTreeView *if_cb;
- GtkTreeModel *model;
- GtkWidget *filter_cm, *pcap_ng_cb;
- gchar *interface = NULL, *filter_text = NULL;
- gboolean enabled = FALSE, capture_set = FALSE, pseudo = FALSE;
- guint16 num_temp, i;
- interface_t device;
-
- if (gtk_toggle_button_get_active(button))
- enabled = TRUE;
- if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- model = gtk_tree_view_get_model(if_cb);
- pcap_ng_cb = (GtkWidget *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_PCAP_NG_KEY);
- num_temp = global_capture_opts.num_selected++;
- filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY);
- filter_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(filter_cm));
- if (gtk_tree_model_get_iter_first(model, &iter)) {
- do {
- gtk_tree_model_get (model, &iter, CAPTURE, &capture_set, IFACE_HIDDEN_NAME, &interface, -1);
- if (strcmp(interface, "any") == 0) {
- pseudo = TRUE;
- }
- if (!capture_set && enabled && !pseudo) {
- num_temp++;
- } else if (capture_set && (!enabled || (enabled && pseudo))) {
- num_temp--;
- }
- if (!pseudo) {
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, CAPTURE, enabled, -1);
- if (strlen(filter_text) != 0) {
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- if (strcmp(device.name, interface) == 0) {
- g_array_remove_index(global_capture_opts.all_ifaces, i);
- g_free(device.cfilter);
- device.cfilter = g_strdup(filter_text);
- g_array_insert_val(global_capture_opts.all_ifaces, i, device);
- update_filter_string(device.name, filter_text);
- }
- }
- }
- } else {
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, CAPTURE, FALSE, -1);
- }
- pseudo = FALSE;
- } while (gtk_tree_model_iter_next(model, &iter));
- }
- if (num_temp >= 2) {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pcap_ng_cb), TRUE);
- gtk_widget_set_sensitive(pcap_ng_cb, FALSE);
- } else if (num_temp <= 1) {
- gtk_widget_set_sensitive(pcap_ng_cb, TRUE);
- }
- if (interfaces_dialog_window_present()) {
- select_all_interfaces(enabled);
- }
- if (get_welcome_window() != NULL) {
- change_selection_for_all(enabled);
- }
- if (global_capture_opts.num_selected != num_temp) {
- global_capture_opts.num_selected = num_temp;
- }
- if (global_capture_opts.num_selected > 0) {
- gtk_widget_set_sensitive(ok_bt, TRUE);
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- gtk_widget_set_sensitive(all_compile_bt, TRUE);
-#endif
- } else {
- gtk_widget_set_sensitive(ok_bt, FALSE);
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- gtk_widget_set_sensitive(all_compile_bt, FALSE);
-#endif
- }
- set_sensitivity_for_start_icon();
-}
-
-
-static gboolean get_all_prom_mode(void)
-{
- interface_options interface_opts;
- guint i;
-
- 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.promisc_mode) {
- return FALSE;
- }
- }
- return TRUE;
-}
-
-static void promisc_mode_callback(GtkToggleButton *button, gpointer d _U_)
-{
- GtkTreeIter iter;
- GtkTreeView *if_cb;
- GtkTreeModel *model;
- gboolean enabled = FALSE;
- interface_t device;
- interface_options interface_opts;
- guint i;
-
- if (gtk_toggle_button_get_active(button))
- enabled = TRUE;
-
- if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- model = gtk_tree_view_get_model(if_cb);
- if (gtk_tree_model_get_iter_first(model, &iter)) {
- do {
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, PMODE, enabled?"enabled":"disabled", -1);
- } while (gtk_tree_model_iter_next(model, &iter));
- }
-
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, i);
- device.pmode = (enabled?TRUE:FALSE);
- g_array_insert_val(global_capture_opts.all_ifaces, i, device);
- }
-
- for (i = 0; i < global_capture_opts.ifaces->len; i++) {
- interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
- global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, i);
- interface_opts.promisc_mode = (enabled?TRUE:FALSE);
- g_array_insert_val(global_capture_opts.ifaces, i, interface_opts);
- }
-}
-
-#if defined (HAVE_PCAP_REMOTE)
-static void
-show_remote_dialog(GtkWidget *w)
-{
-
- g_free(global_remote_opts.remote_host_opts.remote_host);
- g_free(global_remote_opts.remote_host_opts.remote_port);
- g_free(global_remote_opts.remote_host_opts.auth_username);
- g_free(global_remote_opts.remote_host_opts.auth_password);
- global_remote_opts.src_type = CAPTURE_IFREMOTE;
- global_remote_opts.remote_host_opts.remote_host = g_strdup(global_capture_opts.default_options.remote_host);
- global_remote_opts.remote_host_opts.remote_port = g_strdup(global_capture_opts.default_options.remote_port);
- global_remote_opts.remote_host_opts.auth_type = global_capture_opts.default_options.auth_type;
- global_remote_opts.remote_host_opts.auth_username = g_strdup(global_capture_opts.default_options.auth_username);
- global_remote_opts.remote_host_opts.auth_password = g_strdup(global_capture_opts.default_options.auth_password);
- global_remote_opts.remote_host_opts.datatx_udp = global_capture_opts.default_options.datatx_udp;
- global_remote_opts.remote_host_opts.nocap_rpcap = global_capture_opts.default_options.nocap_rpcap;
- global_remote_opts.remote_host_opts.nocap_local = global_capture_opts.default_options.nocap_local;
-#ifdef HAVE_PCAP_SETSAMPLING
- global_remote_opts.sampling_method = global_capture_opts.default_options.sampling_method;
- global_remote_opts.sampling_param = global_capture_opts.default_options.sampling_param;
-#endif
- capture_remote_cb(GTK_WIDGET(w), FALSE);
-}
-#endif
-
-static void change_pipe_name_cb(gpointer dialog _U_, gint btn, gpointer data)
-{
- guint i;
- interface_t device;
- gchar *temp, *optname, *snaplen_string/*, *oldname = ""*/;
- GtkTreeView *if_cb;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkWidget *pipe_te;
-
- switch(btn) {
- case(ESD_BTN_OK):
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- if (strcmp((gchar *)data, device.name) == 0) {
- simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK,
- "%sA pipe with this name already exists.%s",
- simple_dialog_primary_start(), simple_dialog_primary_end());
- if_cb = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY));
- pipe_te = (GtkWidget *) g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
- model = gtk_tree_view_get_model(if_cb);
- if (gtk_tree_model_get_iter_first (model, &iter)) {
- do {
- gtk_tree_model_get(model, &iter, 0, &optname, -1);
- if (strcmp(optname, (gchar *) data) == 0) {
- gtk_list_store_set (GTK_LIST_STORE(model), &iter, 0, pipe_name, -1);
- gtk_entry_set_text(GTK_ENTRY(pipe_te), pipe_name);
- break;
- }
- } while (gtk_tree_model_iter_next(model, &iter));
- g_free(optname);
- }
- 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 (strcmp(pipe_name, device.name) == 0) {
- g_free(device.name);
- g_free(device.display_name);
- device.name = g_strdup((gchar *)data);
- device.display_name = g_strdup(device.name);
- g_array_remove_index(global_capture_opts.all_ifaces, i);
- g_array_insert_val(global_capture_opts.all_ifaces, i, device);
- temp = g_strdup_printf("<b>%s</b>", device.display_name);
- snaplen_string = g_strdup_printf("%d", device.snaplen);
- if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- model = gtk_tree_view_get_model(if_cb);
- if (gtk_tree_model_get_iter_first (model, &iter)) {
- do {
- gtk_tree_model_get(model, &iter, IFACE_HIDDEN_NAME, &optname, -1);
- if (strcmp(optname, pipe_name) == 0) {
-#if defined(HAVE_PCAP_CREATE)
- gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp, LINK, "", PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, BUFFER, (guint) device.buffer, MONITOR, device.monitor_mode_supported?(device.monitor_mode_enabled?"enabled":"disabled"):"n/a", FILTER, device.cfilter, -1);
-#elif defined(CAN_SET_CAPTURE_BUFFER_SIZE)
- gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp,LINK, "", PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, BUFFER, (guint) device.buffer, FILTER, device.cfilter, -1);
-#else
- gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp,LINK, "", PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, FILTER, device.cfilter, -1);
-#endif
-#if 0
- oldname = g_strdup(pipe_name);
-#endif
- pipe_name = g_strdup(device.name);
- break;
- }
- } while (gtk_tree_model_iter_next(model, &iter));
-
- g_free(optname);
- }
- if (global_capture_opts.num_selected > 0) {
- gtk_widget_set_sensitive(ok_bt, TRUE);
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- gtk_widget_set_sensitive(all_compile_bt, TRUE);
-#endif
- } else {
- gtk_widget_set_sensitive(ok_bt, FALSE);
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- gtk_widget_set_sensitive(all_compile_bt, FALSE);
-#endif
- }
- refresh_non_local_interface_lists();
- break;
- }
- }
- break;
- case(ESD_BTN_CANCEL): {
- if_cb = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY));
- pipe_te = (GtkWidget *) g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
- model = gtk_tree_view_get_model(if_cb);
-
- if (gtk_tree_model_get_iter_first (model, &iter)) {
- do {
- gtk_tree_model_get(model, &iter, 0, &optname, -1);
- if (strcmp(optname, (gchar *) data) == 0) {
- gtk_list_store_set (GTK_LIST_STORE(model), &iter, 0, pipe_name, -1);
- gtk_entry_set_text(GTK_ENTRY(pipe_te), pipe_name);
- break;
- }
- } while (gtk_tree_model_iter_next(model, &iter));
- g_free(optname);
- }
- break;
- }
- default:
- g_assert_not_reached();
- }
-}
-
-static void
-add_pipe_cb(gpointer w _U_)
-{
- interface_t device;
- gint indx;
- GtkTreeView *if_cb;
- GtkTreeModel *model;
- GtkTreeIter iter;
- gchar *temp, *path_str, *snaplen_string;
- GtkWidget *pipe_te;
- const gchar *g_save_file;
- gchar *name;
- guint i;
- gpointer dialog;
-
- if (!pipe_name)
- return;
-
- pipe_te = (GtkWidget *) g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
- g_save_file = gtk_entry_get_text(GTK_ENTRY(pipe_te));
- name = g_strdup(g_save_file);
- if (strcmp(name, "New pipe") == 0 || strcmp(name, "") == 0) {
- g_free(name);
- return;
- }
- if (strcmp(pipe_name, "New pipe") != 0) {
- if (strcmp(pipe_name, name) != 0) {
- dialog = simple_dialog(ESD_TYPE_CONFIRMATION, ESD_BTNS_OK_CANCEL,
- "%sDo you want to change %s to %s?%s",
- simple_dialog_primary_start(), pipe_name, name, simple_dialog_primary_end());
- simple_dialog_set_cb(dialog, change_pipe_name_cb, name);
- }
- } else {
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- if (strcmp(name, device.name) == 0) {
- g_free(name);
- return;
- }
- }
- pipe_name = g_strdup(g_save_file);
- memset(&device, 0, sizeof(device));
- device.name = g_strdup(g_save_file);
- device.display_name = g_strdup(device.name);
- device.hidden = FALSE;
- device.selected = TRUE;
- device.type = IF_PIPE;
- device.pmode = global_capture_opts.default_options.promisc_mode;
- device.has_snaplen = global_capture_opts.default_options.has_snaplen;
- device.snaplen = global_capture_opts.default_options.snaplen;
- device.cfilter = g_strdup(global_capture_opts.default_options.cfilter);
- device.timestamp_type = g_strdup(global_capture_opts.default_options.timestamp_type);
- device.addresses = NULL;
- device.no_addresses = 0;
- device.last_packets = 0;
- device.links = NULL;
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- device.buffer = DEFAULT_CAPTURE_BUFFER_SIZE;
-#endif
- device.active_dlt = -1;
- device.if_info.name = g_strdup(g_save_file);
- device.if_info.friendly_name = NULL;
- device.if_info.vendor_description = NULL;
- device.if_info.addrs = NULL;
- device.if_info.loopback = FALSE;
- device.if_info.type = IF_PIPE;
- device.if_info.extcap = NULL;
- device.external_cap_args_settings = NULL;
-#if defined(HAVE_PCAP_CREATE)
- device.monitor_mode_enabled = FALSE;
- device.monitor_mode_supported = FALSE;
-#endif
- global_capture_opts.num_selected++;
-
- indx = global_capture_opts.all_ifaces->len;
- temp = g_strdup_printf("<b>%s</b>", device.display_name);
-
- snaplen_string = g_strdup_printf("%d", device.snaplen);
-
- if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- path_str = g_strdup_printf("%d", indx);
- model = gtk_tree_view_get_model(if_cb);
- gtk_tree_model_get_iter_from_string(model, &iter, path_str);
- g_array_append_val(global_capture_opts.all_ifaces, device);
- gtk_list_store_append (GTK_LIST_STORE(model), &iter);
-#if defined(HAVE_PCAP_CREATE)
- gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp, LINK, "", PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, BUFFER, (guint) device.buffer, MONITOR, device.monitor_mode_supported?(device.monitor_mode_enabled?"enabled":"disabled"):"n/a", FILTER, device.cfilter, -1);
-#elif defined(CAN_SET_CAPTURE_BUFFER_SIZE)
- gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp,LINK, "", PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, BUFFER, (guint) device.buffer, FILTER, device.cfilter, -1);
-#else
- gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp,LINK, "", PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, FILTER, device.cfilter, -1);
-#endif
- if (global_capture_opts.num_selected > 0) {
- gtk_widget_set_sensitive(ok_bt, TRUE);
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- gtk_widget_set_sensitive(all_compile_bt, TRUE);
-#endif
- } else {
- gtk_widget_set_sensitive(ok_bt, FALSE);
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- gtk_widget_set_sensitive(all_compile_bt, FALSE);
-#endif
- }
-
- /* Refresh all places that are displaying an interface list
- that includes interfaces other than local interfaces
- (such as pipes). */
- refresh_non_local_interface_lists();
-
- g_free(name);
- }
-}
-
-static void
-pipe_new_bt_clicked_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
- GtkTreeView *pipe_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY));
- GtkListStore *store;
- GtkTreeIter iter;
-
- /* Add a new entry to the pipe list. */
-
- store = GTK_LIST_STORE(gtk_tree_view_get_model(pipe_l));
- gtk_list_store_append(store, &iter);
-
- gtk_list_store_set(store, &iter, 0, "New pipe", -1);
- pipe_name = "New pipe";
-
- /* Select the item. */
- gtk_tree_selection_select_iter(gtk_tree_view_get_selection(pipe_l), &iter);
-
- gtk_editable_select_region(GTK_EDITABLE(name_te), 0, -1);
-
- gtk_widget_grab_focus(name_te);
-}
-
-static void
-pipe_del_bt_clicked_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- GtkWidget *pipe_l = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY);
- GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
- GtkTreeSelection *sel;
- GtkTreeModel *model, *optmodel;
- GtkTreeIter iter, optiter;
- GtkTreeView *if_cb;
- GtkTreePath *path;
- gchar *name, *optname = NULL;
- guint i;
- gint32 num;
-
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pipe_l));
- /* If something was selected */
-
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- gtk_tree_model_get(model, &iter, 0, &name, -1);
- path = gtk_tree_model_get_path(model, &iter);
- if (gtk_tree_path_get_depth(path) == 0) {
- num = 0;
- } else {
- num = gtk_tree_path_get_indices(path)[0];
- }
- if (name != NULL && num < (gint)global_capture_opts.all_ifaces->len) {
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- if (strcmp(g_array_index(global_capture_opts.all_ifaces, interface_t, i).name, name) == 0) {
- g_array_remove_index(global_capture_opts.all_ifaces, i);
- break;
- }
- }
- gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
- gtk_entry_set_text(GTK_ENTRY(name_te), "");
- if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- optmodel = gtk_tree_view_get_model(if_cb);
- if (gtk_tree_model_get_iter_first (optmodel, &optiter)) {
- do {
- gtk_tree_model_get(optmodel, &optiter, IFACE_HIDDEN_NAME, &optname, -1);
- if (optname != NULL && strcmp(optname, name) == 0) {
- gtk_list_store_remove(GTK_LIST_STORE(gtk_tree_view_get_model(if_cb)), &optiter);
- break;
- }
- } while (gtk_tree_model_iter_next(optmodel, &optiter));
- g_free(optname);
- }
- }
- g_free(name);
- }
-
- if (gtk_tree_model_get_iter_first (model, &iter)) {
- gtk_tree_selection_select_iter(sel, &iter);
- } else {
- gtk_widget_set_sensitive(name_te, FALSE);
- }
-
- /* Refresh all places that are displaying an interface list
- that includes interfaces other than local interfaces
- (such as pipes). */
- refresh_non_local_interface_lists();
-}
-
-static void
-pipe_name_te_changed_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
- GtkWidget *pipe_l = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY);
- const gchar *name;
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pipe_l));
- name = gtk_entry_get_text(GTK_ENTRY(name_te));
-
- /* if something was selected */
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, name, -1);
- }
-}
-
-static void
-fill_pipe_list(void)
-{
- guint i;
- interface_t device;
- GtkTreeIter iter;
- GtkTreeView *pipe_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY));
- GtkListStore *store = GTK_LIST_STORE(gtk_tree_view_get_model(pipe_l));
-
- 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.type == IF_PIPE) {
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, device.name, -1);
- } else {
- continue;
- }
- }
-}
-
-static void
-pipe_sel_list_cb(GtkTreeSelection *sel, gpointer data _U_)
-{
- /* GtkWidget *pipe_l = GTK_WIDGET(gtk_tree_selection_get_tree_view(sel));*/
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY);
- GtkWidget *del_bt = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_PIPE_DEL_KEY);
- gchar *name = NULL;
-
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- gtk_tree_model_get(model, &iter, 0, &name, -1);
- if (name) {
- if (name_te != NULL) {
- gtk_entry_set_text(GTK_ENTRY(name_te), name ? name : "");
- gtk_widget_set_sensitive(name_te, TRUE);
- selected_name = gtk_entry_get_text(GTK_ENTRY(name_te));
- pipe_name = g_strdup(selected_name);
- }
- if (del_bt != NULL) {
- gtk_widget_set_sensitive(del_bt, TRUE);
- }
- g_free(name);
- }
- }
-}
-
-static void
-cancel_pipe_cb (gpointer w _U_)
-{
-#ifdef HAVE_PCAP_REMOTE
- if (interface_management_w && G_IS_OBJECT(interface_management_w)) {
- GtkWidget *remote_w;
- remote_w = (GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_DIALOG_PTR_KEY);
- if (remote_w != NULL && G_IS_OBJECT(remote_w))
- window_destroy(remote_w);
- }
-#endif
- window_destroy(GTK_WIDGET(interface_management_w));
- pipe_name = NULL;
-}
-
-static void
-fill_local_list(void)
-{
- guint i;
- interface_t device;
- GtkTreeIter iter;
- GtkListStore *store;
- GtkTreeView *local_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_LOCAL_L_KEY));
-
-#ifdef _WIN32
- store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN);
-#else
- store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_BOOLEAN);
-#endif
-
- 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.local && device.type != IF_PIPE && device.type != IF_STDIN) {
- gtk_list_store_append(store, &iter);
-
-#ifdef _WIN32
- gtk_list_store_set(store, &iter, 0, device.friendly_name, 1, device.name, 2, device.hidden, -1);
-#else
- gtk_list_store_set(store, &iter, 0, device.name, 1, device.hidden, -1);
-#endif
- } else {
- continue;
- }
- }
- gtk_tree_view_set_model(GTK_TREE_VIEW(local_l), GTK_TREE_MODEL(store));
-}
-
-static void local_hide_cb(GtkCellRendererToggle *cell _U_,
- gchar *path_str,
- gpointer data _U_)
-{
- gboolean hide, hide_enabled = TRUE;
- gchar *name;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
- GtkTreeView *local_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_LOCAL_L_KEY));
-
- model = gtk_tree_view_get_model(local_l);
- gtk_tree_model_get_iter (model, &iter, path);
- gtk_tree_model_get (model, &iter, 0+LOCAL_OFFSET, &name, 1+LOCAL_OFFSET, &hide, -1);
-
- /* See if this is the currently selected capturing device */
- if ((prefs.capture_device != NULL) && (*prefs.capture_device != '\0')) {
- 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 ((strcmp(device.display_name, prefs.capture_device) == 0) &&
- (strcmp(device.name, name) == 0)) {
- /* Don't allow current interface to be hidden */
- hide_enabled = FALSE;
- break;
- }
- }
- }
-
- if (hide_enabled) {
- if (hide) {
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, 1+LOCAL_OFFSET, FALSE, -1);
- } else {
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, 1+LOCAL_OFFSET, TRUE, -1);
- }
- } else {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Default interface cannot be hidden");
- }
-}
-
-static void
-apply_local_cb(GtkWidget *win _U_, gpointer *data _U_)
-{
- GtkTreeIter iter;
- GtkTreeModel *model;
- gchar *name, *new_hide;
- gboolean hide;
- gint first_if = TRUE;
- GtkTreeView *local_l;
-
- if (global_capture_opts.all_ifaces->len > 0) {
- local_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_LOCAL_L_KEY));
- model = gtk_tree_view_get_model(local_l);
-
- new_hide = (gchar*)g_malloc0(MAX_VAL_LEN);
-
- if (gtk_tree_model_get_iter_first (model, &iter)) {
- do {
- gtk_tree_model_get(model, &iter, 0+LOCAL_OFFSET, &name, 1+LOCAL_OFFSET, &hide, -1);
- if (!hide) {
- continue;
- } else {
- if (first_if != TRUE) {
- g_strlcat (new_hide, ",", MAX_VAL_LEN);
- }
- g_strlcat (new_hide, name, MAX_VAL_LEN);
- first_if = FALSE;
- }
- } while (gtk_tree_model_iter_next(model, &iter));
- g_free(name);
- }
- /* write new "hidden" string to preferences */
- g_free(prefs.capture_devices_hide);
- prefs.capture_devices_hide = new_hide;
- hide_interface(g_strdup(new_hide));
-
- /* Refresh all places that are displaying an interface list
- that includes local interfaces, in case we've changed
- a property of the interface list that changes how it's
- displayed. */
- refresh_local_interface_lists();
-
- /* save changes to the preferences file */
- if (!prefs.gui_use_pref_save) {
- prefs_main_write();
- }
- }
-}
-
-void
-capture_dlg_refresh_if (void)
-{
- GtkTreeView *view;
-
- if (interface_management_w)
- fill_local_list();
-
- view = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- create_and_fill_model(GTK_TREE_VIEW(view));
- update_properties_all();
-}
-
-/*
- * We've been asked to rescan the system looking for interfaces.
- */
-static void
-rescan_local_cb(GtkWidget *button _U_, gpointer *data _U_)
-{
- /* Refresh all places that are displaying an interface list
- that includes local interfaces. */
- refresh_local_interface_lists();
-}
-
-#if defined(HAVE_PCAP_REMOTE)
-static void
-fill_remote_list(void)
-{
- guint i;
- interface_t device;
- GtkTreeIter iter, child;
- gchar *host = "";
- GtkTreeView *remote_l;
- GtkTreeStore *store;
-
- num_selected = 0;
- remote_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY));
- store = gtk_tree_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING);
- 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.local) {
- continue;
- } else {
- /* fill the store */
- if (strcmp(host, device.remote_opts.remote_host_opts.remote_host) != 0) {
- host = g_strdup(device.remote_opts.remote_host_opts.remote_host);
- gtk_tree_store_append(store, &iter, NULL);
- gtk_tree_store_set(store, &iter, 0, host, 3, "FALSE", -1);
- gtk_tree_store_append(store, &child, &iter);
- gtk_tree_store_set(store, &child, 1, device.name, 2, device.hidden, 3, "TRUE", -1);
- } else {
- gtk_tree_store_append(store, &child, &iter);
- gtk_tree_store_set(store, &child, 1, device.name, 2, device.hidden, 3, "TRUE", -1);
- }
- }
- }
- gtk_tree_view_set_model(GTK_TREE_VIEW(remote_l), GTK_TREE_MODEL(store));
- gtk_tree_view_expand_all(GTK_TREE_VIEW(remote_l));
-}
-
-static void
-button_hide_cb(GtkTreeViewColumn *column _U_, GtkCellRenderer *renderer,
- GtkTreeModel *model, GtkTreeIter *iter, gpointer data _U_)
-{
- gchar *enabled;
-
- gtk_tree_model_get(model, iter, 3, &enabled, -1);
- if (strcmp(enabled, "TRUE") == 0) {
- g_object_set(G_OBJECT(renderer), "visible", TRUE, NULL);
- } else if (strcmp(enabled, "FALSE") == 0){
- g_object_set(G_OBJECT(renderer), "visible", FALSE, NULL);
- }
-}
-
-static void remote_hide_cb(GtkCellRendererToggle *cell _U_,
- gchar *path_str,
- gpointer data _U_)
-{
- gboolean hide;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
- GtkTreeView *remote_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY));
-
- model = gtk_tree_view_get_model(remote_l);
- gtk_tree_model_get_iter (model, &iter, path);
- gtk_tree_model_get (model, &iter, 2, &hide, -1);
-
- if (hide) {
- gtk_tree_store_set(GTK_TREE_STORE(model), &iter, 2, FALSE, -1);
- } else {
- gtk_tree_store_set(GTK_TREE_STORE(model), &iter, 2, TRUE, -1);
- }
-}
-
-static void
-ok_remote_cb(GtkWidget *win _U_, gpointer *data _U_)
-{
- GtkTreeIter iter, child;
- GtkTreeModel *model;
- gchar *name, *new_hide;
- gboolean hide;
- gint first_if = TRUE;
-
- GtkTreeView *remote_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY));
- model = gtk_tree_view_get_model(remote_l);
-
- new_hide = (char *)g_malloc0(MAX_VAL_LEN);
-
- if (gtk_tree_model_get_iter_first (model, &iter)) {
- do {
- gtk_tree_model_get(model, &iter, 1, &name, 2, &hide, -1);
- if (!name && gtk_tree_model_iter_children(model, &child, &iter)) {
- do {
- gtk_tree_model_get(model, &child, 1, &name, 2, &hide, -1);
- if (!hide) {
- continue;
- } else {
- if (first_if != TRUE) {
- g_strlcat (new_hide, ",", MAX_VAL_LEN);
- }
- g_strlcat (new_hide, name, MAX_VAL_LEN);
- first_if = FALSE;
- }
- } while (gtk_tree_model_iter_next(model, &child));
- }
- } while (gtk_tree_model_iter_next(model, &iter));
- g_free(name);
- }
- hide_interface(new_hide);
-
- /* Refresh all places that are displaying an interface list
- that includes interfaces other than local interfaces
- (such as remote interfaces). */
- refresh_non_local_interface_lists();
-}
-
-static gboolean
-select_host_cb(GtkTreeSelection *selection _U_,
- GtkTreeModel *model,
- GtkTreePath *path,
- gboolean path_currently_selected _U_,
- gpointer data _U_)
-{
- GtkTreeIter iter;
-
- gtk_tree_model_get_iter (model, &iter, path);
- if (gtk_tree_model_iter_has_child(model, &iter)) {
- num_selected++;
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_REMOTE_DEL_BT_KEY), TRUE);
- return TRUE;
- } else {
- return FALSE;
- }
-}
-
-static void
-remove_remote_host(GtkWidget *w _U_, gpointer data _U_)
-{
- GtkTreeIter iter, child;
- GtkTreeModel *model;
- gchar *host;
- gint num_children, i;
- interface_t device;
- GtkTreeView *remote_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY));
- GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(remote_l));
-
- model = gtk_tree_view_get_model(remote_l);
- if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
- gtk_tree_model_get(model, &iter, 0, &host, -1);
- if ((num_children = gtk_tree_model_iter_n_children(model, &iter)) > 0) {
- for (i = num_children-1; i >= 0; i--) {
- if (gtk_tree_model_iter_nth_child(model, &child, &iter, i)) {
- gtk_tree_store_remove(GTK_TREE_STORE(model), &child);
- }
- }
- }
- gtk_tree_store_remove(GTK_TREE_STORE(model), &iter);
- if (--num_selected == 0) {
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(interface_management_w), E_REMOTE_DEL_BT_KEY), FALSE);
- }
- for (i = global_capture_opts.all_ifaces->len-1; i >= 0; i--) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- if (device.local) {
- continue;
- } else {
- if (strcmp(host, device.remote_opts.remote_host_opts.remote_host) == 0) {
- g_array_remove_index(global_capture_opts.all_ifaces, i);
- capture_opts_free_interface_t(&device);
- }
- }
- }
-
- /* Refresh all places that are displaying an interface list
- that includes interfaces other than local interfaces
- (such as remote interfaces). */
- refresh_non_local_interface_lists();
- }
-}
-#endif
-
-static void
-show_add_interfaces_dialog(GtkWidget *bt _U_, GtkWidget *parent_win)
-{
- GtkWidget *vbox, *top_hb;
- GtkWidget *hbox, *bbox, *list_bb, *edit_fr, *pipe_fr, *pipe_sc, *pipe_l, *props_fr, *props_vb;
- GtkWidget *main_nb;
- GtkWidget *temp_page, *tmp;
- GtkWidget *pipe_hb, *pipe_bt, *pipe_lb, *pipe_te, *pipe_vb;
- GtkWidget *add_bt, *cancel_bt, *new_bt, *del_bt, *middle_hb;
- GtkWidget *local_fr, *local_l, *local_sc, *local_vb;
- GtkWidget *apply_bt, *refresh_bt;
- GtkCellRenderer *renderer, *toggle_renderer;
- GtkTreeViewColumn *column;
- GtkTreeSelection *sel;
- GtkListStore *store;
-#if defined(HAVE_PCAP_REMOTE)
- GtkWidget *remote_fr, *remote_l, *remote_sc, *remote_vb;
- GtkWidget *delete_bt, *add_but, *ok_but;
- GtkWidget *button_hbox, *help_hbox;
- GtkTreeSelection *selection;
-#endif
-
- if (interface_management_w != NULL && G_IS_OBJECT(interface_management_w)) {
- /* There's already a "Manage Interfaces" dialog box; reactivate it. */
- reactivate_window(interface_management_w);
- return;
- }
-
- interface_management_w = window_new(GTK_WINDOW_TOPLEVEL, "Interface Management");
- gtk_window_set_transient_for(GTK_WINDOW(interface_management_w), GTK_WINDOW(parent_win));
- gtk_window_set_destroy_with_parent(GTK_WINDOW(interface_management_w), TRUE);
-
- gtk_window_set_default_size(GTK_WINDOW(interface_management_w), 700, 300);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_add(GTK_CONTAINER(interface_management_w), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 12);
-
- main_nb = gtk_notebook_new();
- gtk_box_pack_start(GTK_BOX(vbox), main_nb, TRUE, TRUE, 0);
-
- /* --- Pipes --- */
- temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- tmp = gtk_label_new("Pipes");
- gtk_widget_show(tmp);
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX (hbox), tmp, TRUE, TRUE, 0);
-
- gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
-
- /* Pipe row */
- pipe_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 20, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(pipe_hb), 5);
- gtk_box_pack_start(GTK_BOX(temp_page), pipe_hb, TRUE, TRUE, 0);
-
- /* Container for each row of widgets */
- pipe_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(pipe_vb), 0);
- gtk_box_pack_start(GTK_BOX (pipe_hb), pipe_vb, TRUE, TRUE, 0);
- gtk_widget_show(pipe_vb);
-
- /* Top row: Buttons and pipe list */
- top_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX (pipe_vb), top_hb, TRUE, TRUE, 0);
- gtk_widget_show(top_hb);
-
- edit_fr = gtk_frame_new("");
- gtk_box_pack_start(GTK_BOX(top_hb), edit_fr, FALSE, FALSE, 0);
- gtk_widget_show(edit_fr);
-
- list_bb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, TRUE);
- gtk_container_set_border_width(GTK_CONTAINER(list_bb), 5);
- gtk_container_add(GTK_CONTAINER(edit_fr), list_bb);
- gtk_widget_show(list_bb);
-
- new_bt = ws_gtk_button_new_from_stock(GTK_STOCK_NEW);
- g_signal_connect(new_bt, "clicked", G_CALLBACK(pipe_new_bt_clicked_cb), NULL);
- gtk_widget_show(new_bt);
- gtk_box_pack_start (GTK_BOX (list_bb), new_bt, FALSE, FALSE, 0);
- gtk_widget_set_tooltip_text (new_bt, "Add a new pipe (with default properties)");
-
- del_bt = ws_gtk_button_new_from_stock(GTK_STOCK_DELETE);
- g_signal_connect(del_bt, "clicked", G_CALLBACK(pipe_del_bt_clicked_cb), NULL);
- gtk_widget_show(del_bt);
- gtk_widget_set_sensitive(del_bt, FALSE);
- gtk_box_pack_start (GTK_BOX (list_bb), del_bt, FALSE, FALSE, 0);
- gtk_widget_set_tooltip_text (del_bt, "Remove the selected pipe from the list");
- g_object_set_data(G_OBJECT(interface_management_w), E_CAP_PIPE_DEL_KEY, del_bt);
-
- pipe_fr = gtk_frame_new("Pipes");
- gtk_box_pack_start(GTK_BOX(top_hb), pipe_fr, TRUE, TRUE, 0);
- gtk_widget_show(pipe_fr);
-
- pipe_sc = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(pipe_sc),
- GTK_SHADOW_IN);
-
- gtk_container_set_border_width (GTK_CONTAINER (pipe_sc), 5);
- gtk_container_add(GTK_CONTAINER(pipe_fr), pipe_sc);
- gtk_widget_show(pipe_sc);
-
- store = gtk_list_store_new(1, G_TYPE_STRING);
- pipe_l = tree_view_new(GTK_TREE_MODEL(store));
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(pipe_l), FALSE);
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);
- gtk_tree_view_column_set_expand(column, TRUE);
- gtk_tree_view_column_set_sort_column_id(column, 0);
- gtk_tree_view_append_column(GTK_TREE_VIEW(pipe_l), column);
-
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pipe_l));
- gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
- g_object_set_data(G_OBJECT(interface_management_w), E_CAP_PIPE_L_KEY, pipe_l);
- g_signal_connect(sel, "changed", G_CALLBACK(pipe_sel_list_cb), pipe_vb);
- gtk_container_add(GTK_CONTAINER(pipe_sc), pipe_l);
- gtk_widget_show(pipe_l);
-
- fill_pipe_list();
-
- g_object_unref(G_OBJECT(store));
-
- props_fr = gtk_frame_new("");
- gtk_box_pack_start(GTK_BOX(pipe_vb), props_fr, FALSE, FALSE, 0);
- gtk_widget_show(props_fr);
-
- props_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(props_vb), 5);
- gtk_container_add(GTK_CONTAINER(props_fr), props_vb);
- gtk_widget_show(props_vb);
-
- middle_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX (props_vb), middle_hb, TRUE, TRUE, 0);
- gtk_widget_show(middle_hb);
-
- pipe_lb = gtk_label_new("Pipe:");
- gtk_box_pack_start(GTK_BOX(middle_hb), pipe_lb, FALSE, FALSE, 3);
- pipe_te = gtk_entry_new();
- gtk_widget_set_tooltip_text(GTK_WIDGET(pipe_te),
- "Enter the name of the pipe data should be captured from. "
- );
- gtk_box_pack_start(GTK_BOX(middle_hb), pipe_te, TRUE, TRUE, 3);
- gtk_widget_set_sensitive(pipe_te, FALSE);
- pipe_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_BROWSE);
- gtk_widget_set_tooltip_text(GTK_WIDGET(pipe_bt),
- "Select a pipe from which data should be captured, "
- "instead of entering the pipe name directly. "
- );
- gtk_box_pack_start(GTK_BOX(middle_hb), pipe_bt, FALSE, FALSE, 0);
- g_signal_connect(pipe_te, "changed", G_CALLBACK(pipe_name_te_changed_cb), NULL);
- g_signal_connect(pipe_bt, "clicked", G_CALLBACK(capture_prep_pipe_cb), pipe_te);
-
- bbox = dlg_button_row_new(GTK_STOCK_SAVE, GTK_STOCK_CLOSE, NULL);
- gtk_box_pack_start(GTK_BOX(temp_page), bbox, FALSE, FALSE, 5);
-
- add_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_SAVE);
- g_signal_connect(add_bt, "clicked", G_CALLBACK(add_pipe_cb), interface_management_w);
- gtk_widget_set_tooltip_text(GTK_WIDGET(add_bt), "Add pipe to the list of interfaces.");
-
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- g_signal_connect(GTK_WIDGET(cancel_bt), "clicked", G_CALLBACK(cancel_pipe_cb), interface_management_w);
- gtk_widget_set_tooltip_text(GTK_WIDGET(cancel_bt), "Cancel and exit dialog.");
-
- gtk_widget_show(bbox);
- gtk_widget_show(temp_page);
-
- g_object_set_data(G_OBJECT(interface_management_w), E_CAP_PIPE_TE_KEY, pipe_te);
-
- /* --- Local interfaces --- */
- temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- tmp = gtk_label_new("Local Interfaces");
- gtk_widget_show(tmp);
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(hbox), tmp, TRUE, TRUE, 0);
- gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
-
- local_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(local_vb), 0);
- gtk_box_pack_start(GTK_BOX(temp_page), local_vb, TRUE, TRUE, 0);
- gtk_widget_show(local_vb);
-
- local_fr = gtk_frame_new("Local Interfaces");
- gtk_box_pack_start(GTK_BOX(local_vb), local_fr, TRUE, TRUE, 0);
- gtk_widget_show(local_fr);
-
- local_sc = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(local_sc),
- GTK_SHADOW_IN);
-
- gtk_container_set_border_width (GTK_CONTAINER (local_sc), 5);
- gtk_container_add(GTK_CONTAINER(local_fr), local_sc);
- gtk_widget_show(local_sc);
-
- local_l = gtk_tree_view_new();
-
-#ifdef _WIN32
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Friendly Name", renderer, "text", 0, NULL);
- gtk_tree_view_column_set_expand(column, TRUE);
- gtk_tree_view_column_set_sort_column_id(column, 0);
- gtk_tree_view_append_column(GTK_TREE_VIEW(local_l), column);
-#endif
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Interface Name", renderer, "text", 0+LOCAL_OFFSET, NULL);
- gtk_tree_view_column_set_expand(column, TRUE);
- gtk_tree_view_column_set_sort_column_id(column, 0+LOCAL_OFFSET);
- gtk_tree_view_append_column(GTK_TREE_VIEW(local_l), column);
-
- toggle_renderer = gtk_cell_renderer_toggle_new();
- column = gtk_tree_view_column_new_with_attributes("Hide", GTK_CELL_RENDERER(toggle_renderer), "active", 1+LOCAL_OFFSET, NULL);
- g_signal_connect (G_OBJECT(toggle_renderer), "toggled", G_CALLBACK (local_hide_cb), NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(local_l), column);
- gtk_cell_renderer_toggle_set_active(GTK_CELL_RENDERER_TOGGLE(toggle_renderer), TRUE);
-
- g_object_set_data(G_OBJECT(interface_management_w), E_CAP_LOCAL_L_KEY, local_l);
- gtk_container_add(GTK_CONTAINER(local_sc), local_l);
- gtk_widget_show(local_l);
-
- fill_local_list();
-
- bbox = dlg_button_row_new(GTK_STOCK_REFRESH, GTK_STOCK_APPLY, GTK_STOCK_CLOSE, NULL);
-
- gtk_box_pack_start(GTK_BOX(temp_page), bbox, FALSE, FALSE, 5);
- refresh_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_REFRESH);
- g_signal_connect(refresh_bt, "clicked", G_CALLBACK(rescan_local_cb), NULL);
- gtk_widget_set_tooltip_text(GTK_WIDGET(refresh_bt), "Rescan the local interfaces and refresh the list");
-
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- g_signal_connect(GTK_WIDGET(cancel_bt), "clicked", G_CALLBACK(cancel_pipe_cb), interface_management_w);
- gtk_widget_set_tooltip_text(GTK_WIDGET(cancel_bt), "Cancel and exit dialog.");
-
- apply_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_APPLY);
- g_signal_connect(GTK_WIDGET(apply_bt), "clicked", G_CALLBACK(apply_local_cb), NULL);
- gtk_widget_set_tooltip_text(GTK_WIDGET(apply_bt), "Apply the changes to the general list of local interfaces");
-
- gtk_widget_show(bbox);
- gtk_widget_show(temp_page);
-
-
-#if defined (HAVE_PCAP_REMOTE)
- /* --- remote interfaces --- */
- temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- tmp = gtk_label_new("Remote Interfaces");
- gtk_widget_show(tmp);
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX (hbox), tmp, TRUE, TRUE, 0);
- gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
-
- remote_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(remote_vb), 0);
- gtk_box_pack_start(GTK_BOX(temp_page), remote_vb, TRUE, TRUE, 0);
- gtk_widget_show(remote_vb);
-
- remote_fr = gtk_frame_new("Remote Interfaces");
- gtk_box_pack_start(GTK_BOX(remote_vb), remote_fr, TRUE, TRUE, 0);
- gtk_widget_show(remote_fr);
-
- remote_sc = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(remote_sc),
- GTK_SHADOW_IN);
-
- gtk_container_set_border_width (GTK_CONTAINER (remote_sc), 5);
- gtk_container_add(GTK_CONTAINER(remote_fr), remote_sc);
- gtk_widget_show(remote_sc);
-
- remote_l = gtk_tree_view_new();
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Host", renderer, "text", 0, NULL);
- gtk_tree_view_column_set_expand(column, TRUE);
- gtk_tree_view_column_set_sort_column_id(column, 0);
- gtk_tree_view_append_column(GTK_TREE_VIEW(remote_l), column);
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Name", renderer, "text", 1, NULL);
- gtk_tree_view_column_set_expand(column, TRUE);
- gtk_tree_view_column_set_sort_column_id(column, 1);
- gtk_tree_view_append_column(GTK_TREE_VIEW(remote_l), column);
-
- toggle_renderer = gtk_cell_renderer_toggle_new();
- column = gtk_tree_view_column_new_with_attributes("Hide", GTK_CELL_RENDERER(toggle_renderer), "active", 2, NULL);
- g_signal_connect (G_OBJECT(toggle_renderer), "toggled", G_CALLBACK (remote_hide_cb), NULL);
- gtk_tree_view_column_set_cell_data_func(column, toggle_renderer, button_hide_cb, NULL, FALSE);
- gtk_tree_view_append_column(GTK_TREE_VIEW(remote_l), column);
- gtk_cell_renderer_toggle_set_active(GTK_CELL_RENDERER_TOGGLE(toggle_renderer), TRUE);
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Control", renderer, "text", 3, NULL);
- gtk_tree_view_column_set_visible(column, FALSE);
- gtk_tree_view_append_column(GTK_TREE_VIEW(remote_l), column);
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(remote_l));
- gtk_tree_selection_set_select_function(selection, select_host_cb, NULL, FALSE);
-
- g_object_set_data(G_OBJECT(interface_management_w), E_CAP_REMOTE_L_KEY, remote_l);
- gtk_container_add(GTK_CONTAINER(remote_sc), remote_l);
- gtk_widget_show(remote_l);
-
- recent_remote_host_list_foreach(populate_existing_remotes, NULL);
- fill_remote_list();
-
- bbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(temp_page), bbox, FALSE, FALSE, 5);
- gtk_widget_show(bbox);
-
- button_hbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_end(GTK_BOX(bbox), button_hbox, FALSE, FALSE, 0);
- gtk_widget_show(button_hbox);
- gtk_box_set_spacing(GTK_BOX(button_hbox), DLG_BUTTON_SPACING);
-
- help_hbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_start(GTK_BOX(bbox), help_hbox, FALSE, FALSE, 0);
- gtk_widget_show(help_hbox);
- gtk_box_set_spacing(GTK_BOX(help_hbox), DLG_BUTTON_SPACING);
-
- add_but = ws_gtk_button_new_from_stock(GTK_STOCK_ADD);
- g_object_set_data(G_OBJECT(bbox), GTK_STOCK_ADD, add_but);
- gtk_box_pack_start(GTK_BOX(help_hbox), add_but, FALSE, FALSE, 0);
- g_signal_connect(add_but, "clicked", G_CALLBACK(show_remote_dialog), NULL);
- gtk_widget_set_tooltip_text(GTK_WIDGET(add_but), "Add a remote host to the list");
- gtk_widget_show(add_but);
-
- delete_bt = ws_gtk_button_new_from_stock(GTK_STOCK_DELETE);
- g_object_set_data(G_OBJECT(bbox), GTK_STOCK_DELETE, delete_bt);
- gtk_box_pack_start(GTK_BOX(help_hbox), delete_bt, FALSE, FALSE, 0);
- g_signal_connect(delete_bt, "clicked", G_CALLBACK(remove_remote_host), NULL);
- gtk_widget_set_tooltip_text(GTK_WIDGET(delete_bt), "Remove a remote host from the list");
- gtk_widget_set_sensitive(GTK_WIDGET(delete_bt), FALSE);
- g_object_set_data(G_OBJECT(interface_management_w), E_REMOTE_DEL_BT_KEY, delete_bt);
- gtk_widget_show(delete_bt);
-
- ok_but = ws_gtk_button_new_from_stock(GTK_STOCK_APPLY);
- gtk_box_pack_end(GTK_BOX(button_hbox), ok_but, FALSE, FALSE, 0);
- g_signal_connect(GTK_WIDGET(ok_but), "clicked", G_CALLBACK(ok_remote_cb), NULL);
- gtk_widget_set_tooltip_text(GTK_WIDGET(ok_but), "Apply the changes to the general list of local interfaces");
- gtk_widget_show(ok_but);
-
- cancel_bt = ws_gtk_button_new_from_stock(GTK_STOCK_CLOSE);
- gtk_box_pack_end(GTK_BOX(button_hbox), cancel_bt, FALSE, FALSE, 0);
- g_signal_connect(GTK_WIDGET(cancel_bt), "clicked", G_CALLBACK(cancel_pipe_cb), interface_management_w);
- gtk_widget_set_tooltip_text(GTK_WIDGET(cancel_bt), "Cancel and exit dialog.");
- gtk_widget_show(cancel_bt);
-
- gtk_widget_show(temp_page);
-
-#endif
- gtk_widget_show_all(interface_management_w);
-}
-
-/* show capture prepare (options) dialog */
-
-/* XXX: Warning:
- Note that capture_interface_list() is called directly (or indirectly) during the
- creation of (and changes to) the capture options dialog window.
-
- Also note that capture_interface_list() indirectly runs the gtk main loop temporarily
- to process queued events (which may include button-presses, key-presses, etc).
- (This is done while awaiting a response from dumpcap which is invoked to obtain
- the capture interface list).
- This means other Wireshark callbacks can be invoked while the capture options window
- is being created or updated (in effect an "interrupt" can occur).
-
- Needless to say, "race conditions" may occur in "interrupt" code which depends upon the exact
- state of the capture options dialog window and which may be invoked during the
- creation of (or changes to) the capture options dialog window.
-
- For example: if a user hits "Capture:Options" and then immediately hits "Capture:Start",
- capture_start_cb() may be invoked before capture_prep_cb() has been completed (i.e., during
- a call to capture_interface_list() in the code which creates the capture options window).
- capture_start_cb() depends upon certain properties of the capture options window having been
- initialized and thus fails if the properties have not (yet) been initialized.
-
- An interlock has been added to handle this particular situation;
- Ideally a more general solution should be implemented since it's probably difficult
- (if not nearly impossible) to identify all the possible "race conditions".
-
- ? Prevent the temporary running of the gtk main loop in cases wherein dumpcap is invoked for a
- simple request/reply ? (e.g., capture_interface_list()) ??
-
- ? Other ??
-*/
-
-static gboolean
-columns_menu_handler(GtkWidget *widget, GdkEvent *event, gpointer data)
-{
- GtkWidget *menu = (GtkWidget *)data;
- GdkEventButton *event_button = NULL;
-
- /* context menu handler */
- if (event->type == GDK_BUTTON_PRESS) {
- event_button = (GdkEventButton *) event;
-
- /* To quote the "Gdk Event Structures" doc:
- * "Normally button 1 is the left mouse button, 2 is the middle button, and 3 is the right button" */
- if (event_button->button == 3) {
- gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, widget,
- event_button->button,
- event_button->time);
- g_signal_stop_emission_by_name(widget, "button_press_event");
- return TRUE;
- }
- }
- return FALSE;
-}
-
-static void
-update_properties_all(void)
-{
- unsigned int i;
- interface_t device;
- gboolean capture_all;
- gboolean promisc_all;
- gboolean filter_all;
- gchar * filter_str;
- GtkWidget *promisc_b;
- GtkWidget *capture_b;
- GtkWidget *all_filter_te;
-
- /* If we don't have a Capture Options dialog open, there's nothing
- for us to do. */
- if (!cap_open_w)
- return;
-
- /* Determine whether all interfaces:
-
- are selected for capturing;
-
- all selected interfaces are in promiscuous mode;
-
- all selected interfaces have the same capture filter.
-
- Start out by assuming that all three are the case, and change that
- once we find an interface where it's not the case. */
- capture_all = TRUE;
- promisc_all = TRUE;
- filter_all = TRUE;
- filter_str = NULL;
- 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) {
- if (!device.selected) {
- /* This interface isn't selected, so not all interfaces are selected. */
- capture_all = FALSE;
- } else {
- /* This interface is selected; is it in promiscuous mode? */
- if (!device.pmode) {
- /* No, so not all selected interfaces are in promiscuous mode. */
- promisc_all = FALSE;
- }
- /* Have we seen the same capture filter on all interfaces at
- which we've looked so far? */
- if (device.cfilter != NULL && filter_all) {
- /* Yes. Is this the first interface for which we've seen a
- filter? */
- if (filter_str == NULL) {
- /* First selected interface - save its capture filter;
- there aren't any filters against which to compare. */
- filter_str = g_strdup(device.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(device.cfilter, filter_str) != 0) {
- /* No, so not all selected interfaces have the same capture
- filter. */
- g_free(filter_str);
- filter_str = NULL;
- filter_all = FALSE;
- }
- }
- }
- }
- }
- }
-
- /* If all interfaces are selected, check the "capture on all interfaces"
- checkbox, otherwise un-check it. */
- capture_b = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_KEY_ALL);
- g_signal_handler_block(capture_b, capture_all_handler_id);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(capture_b), capture_all);
- g_signal_handler_unblock(capture_b, capture_all_handler_id);
-
- /* If all selected interfaces are in promiscuous mode, check the global
- "promiscuous mode" checkbox, otherwise un-check it. */
- promisc_b = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_PROMISC_KEY_ALL);
- g_signal_handler_block(promisc_b, promisc_all_handler_id);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_b), promisc_all);
- g_signal_handler_unblock(promisc_b, promisc_all_handler_id);
-
- /* If all selected interfaces have the same filter string, set the
- global filter string to it. */
- all_filter_te = gtk_bin_get_child(GTK_BIN(g_object_get_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY)));
- if (filter_all) {
- /* Either no interfaces were selected, or all selected interfaces
- have the same filter. In the former case, make the global capture
- filter empty; in the latter case, make it that filter. */
- if (filter_str != NULL) {
- gtk_entry_set_text(GTK_ENTRY(all_filter_te), filter_str);
- g_free(filter_str);
- } else {
- gtk_entry_set_text(GTK_ENTRY(all_filter_te), "");
- }
- } else {
- /* Not all selected interfaces have the same filter, so there is no
- global capture filter; make it empty to reflect that. */
- gtk_entry_set_text(GTK_ENTRY(all_filter_te), "");
- }
-}
-
-
-static gboolean
-column_button_pressed_cb (GtkWidget *widget, GdkEvent *event, gpointer data)
-{
- GtkWidget *col = (GtkWidget *) data;
- GtkTreeView *view;
- GtkWidget *menu = (GtkWidget *)g_object_get_data(G_OBJECT(columns_menu_object), PM_COLUMNS_KEY);
-
- view = (GtkTreeView *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY);
- g_object_set_data(G_OBJECT(view), E_MCAPTURE_COLUMNS_COLUMN_KEY, col);
- return columns_menu_handler (widget, event, menu);
-}
-
-
-void
-capture_prep_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- GtkWidget *main_vb,
- *main_hb, *left_vb, *right_vb,
- *capture_fr, *capture_vb,
- *all_hb, *all_cb,
- *promisc_cb, *pcap_ng_cb,
- *file_fr, *file_vb,
- *file_hb, *file_bt, *file_lb, *file_te,
- *multi_hb, *multi_grid, *multi_files_on_cb,
- *ring_filesize_cb, *ring_filesize_sb, *ring_filesize_cbx,
- *file_interval_cb, *file_interval_sb, *file_interval_cbx,
- *ringbuffer_nbf_cb, *ringbuffer_nbf_sb, *ringbuffer_nbf_lb,
- *stop_files_cb, *stop_files_sb, *stop_files_lb,
- *limit_fr, *limit_vb, *limit_hb, *limit_grid,
- *stop_packets_cb, *stop_packets_sb, *stop_packets_lb,
- *stop_filesize_cb, *stop_filesize_sb, *stop_filesize_cbx,
- *stop_duration_cb, *stop_duration_sb, *stop_duration_cbx,
- *display_fr, *display_vb,
- *sync_cb, *auto_scroll_cb, *hide_info_cb,
- *resolv_fr, *resolv_vb,
- *m_resolv_cb, *n_resolv_cb, *t_resolv_cb, *e_resolv_cb,
- *bbox, *close_bt,
- *all_filter_cm, *all_filter_te, *all_filter_bt, *all_filter_hb,
- *all_vb,
- *help_bt;
-#ifdef HAVE_AIRPCAP
- GtkWidget *decryption_cb;
- int err;
- gchar *err_str;
-#endif
- GtkWidget *iftype_cbx;
-
- GtkAdjustment *ringbuffer_nbf_adj,
- *stop_packets_adj, *stop_filesize_adj, *stop_duration_adj, *stop_files_adj,
- *ring_filesize_adj, *file_interval_adj;
- int row;
- guint32 value;
- gchar *cap_title;
- GtkWidget *view;
- GtkWidget *swindow;
- GtkCellRenderer *renderer;
- GtkCellRenderer *toggle_renderer;
- GtkTreeSelection *selection;
- GtkTreeViewColumn *column;
- gboolean if_present = TRUE;
- GList *all_cfilter_list, *cf_entry;
- window_geometry_t tl_geom;
- const gchar *new_cfilter;
-
- if (interfaces_dialog_window_present()) {
- destroy_if_window();
- }
- if (cap_open_w != NULL && G_IS_OBJECT(cap_open_w)) {
- /* There's already a "Capture Options" dialog box; reactivate it. */
- reactivate_window(cap_open_w);
- return;
- }
- init_columns_menu();
-
- /* use user-defined title if preference is set */
-
- cap_title = create_user_window_title("Wireshark: Capture Options");
-
- cap_open_complete = FALSE;
- cap_open_w = dlg_window_new(cap_title);
- g_free(cap_title);
-
-#ifdef HAVE_AIRPCAP
- /* update airpcap interface list */
-
- /* load the airpcap interfaces */
- g_airpcap_if_list = get_airpcap_interface_list(&err, &err_str);
-
- /* If we don't get a list don't do any thing.
- * If the error is AIRPCAP_NOT_LOADED it avoids an unnecessary rescan of the packet list
- * ( see airpcap_loader.h for error codes).
- */
- if (g_airpcap_if_list == NULL) {
- if (err == CANT_GET_AIRPCAP_INTERFACE_LIST) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_str);
- g_free(err_str);
- }
- }else{
- decryption_cb = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_DECRYPTION_KEY);
- /* XXXX update_decryption_mode_list() triggers a rescan, should only be done if the mode is changed */
- update_decryption_mode_list(decryption_cb);
- /* select the first as default (THIS SHOULD BE CHANGED) */
- airpcap_if_active = airpcap_get_default_if(g_airpcap_if_list);
- }
-#endif
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), DLG_OUTER_MARGIN);
- gtk_container_add(GTK_CONTAINER(cap_open_w), main_vb);
-
- /* Capture-related options frame */
- capture_fr = frame_new("Capture");
- gtk_box_pack_start(GTK_BOX (main_vb), capture_fr, TRUE, TRUE, 0);
-
- capture_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(capture_vb), DLG_OUTER_MARGIN);
- gtk_container_add(GTK_CONTAINER(capture_fr), capture_vb);
-
- swindow = gtk_scrolled_window_new (NULL, NULL);
- gtk_widget_set_size_request(swindow, 676, 100);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(swindow), GTK_SHADOW_IN);
-
- view = gtk_tree_view_new ();
- gtk_tree_view_set_rules_hint(GTK_TREE_VIEW (view), TRUE);
- g_signal_connect(view, "row-activated", G_CALLBACK(options_interface_cb), (gpointer)cap_open_w);
-
- toggle_renderer = gtk_cell_renderer_toggle_new();
- column = gtk_tree_view_column_new_with_attributes("Capture", GTK_CELL_RENDERER(toggle_renderer), "active", CAPTURE, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
- g_signal_connect (G_OBJECT(toggle_renderer), "toggled", G_CALLBACK (toggle_callback), NULL);
- g_object_set (GTK_TREE_VIEW(view), "has-tooltip", TRUE, NULL);
- g_signal_connect (GTK_TREE_VIEW(view), "query-tooltip", G_CALLBACK (query_tooltip_tree_view_cb), NULL);
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes ("",
- GTK_CELL_RENDERER(renderer),
- "text", IFACE_HIDDEN_NAME,
- NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
- gtk_tree_view_column_set_visible(column, FALSE);
-
- renderer = gtk_cell_renderer_text_new ();
- gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW (view), -1, "Interface", renderer, "markup", INTERFACE, NULL);
- column = gtk_tree_view_get_column(GTK_TREE_VIEW (view), INTERFACE);
- gtk_tree_view_column_set_min_width(column, 200);
- gtk_tree_view_column_set_resizable(column, TRUE );
- gtk_tree_view_column_set_alignment(column, 0.5f);
- g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(INTERFACE));
- if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("INTERFACE"))
- gtk_tree_view_column_set_visible(column, TRUE);
- else
- gtk_tree_view_column_set_visible(column, FALSE);
- g_object_set(G_OBJECT(renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes ("Link-layer header", renderer, "text", LINK, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
- gtk_tree_view_column_set_clickable(column, TRUE);
- gtk_tree_view_column_set_reorderable(column, TRUE);
- gtk_tree_view_column_set_resizable(gtk_tree_view_get_column(GTK_TREE_VIEW (view),LINK), TRUE );
- g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(LINK));
- g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
- G_CALLBACK(column_button_pressed_cb), column);
- if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("LINK"))
- gtk_tree_view_column_set_visible(column, TRUE);
- else
- gtk_tree_view_column_set_visible(column, FALSE);
- gtk_tree_view_column_set_alignment(column, 0.5f);
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Prom. Mode", renderer, "text", PMODE, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
- g_object_set(renderer, "xalign", 0.5f, NULL);
- gtk_tree_view_column_set_clickable(column, TRUE);
- gtk_tree_view_column_set_reorderable(column, TRUE);
- g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(PMODE));
- g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
- G_CALLBACK(column_button_pressed_cb), column);
- if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("PMODE"))
- gtk_tree_view_column_set_visible(column, TRUE);
- else
- gtk_tree_view_column_set_visible(column, FALSE);
- gtk_tree_view_column_set_alignment(column, 0.5f);
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Snaplen [B]", renderer, "text", SNAPLEN, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
- gtk_tree_view_column_set_clickable(column, TRUE);
- gtk_tree_view_column_set_reorderable(column, TRUE);
- g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(SNAPLEN));
- g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
- G_CALLBACK(column_button_pressed_cb), column);
- if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("SNAPLEN"))
- gtk_tree_view_column_set_visible(column, TRUE);
- else
- gtk_tree_view_column_set_visible(column, FALSE);
- g_object_set(renderer, "xalign", 0.5f, NULL);
-
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Buffer [MiB]", renderer, "text", BUFFER, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
- gtk_tree_view_column_set_reorderable(column, TRUE);
- g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(BUFFER));
- gtk_tree_view_column_set_clickable(column, TRUE);
- g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
- G_CALLBACK(column_button_pressed_cb), column);
- if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("BUFFER"))
- gtk_tree_view_column_set_visible(column, TRUE);
- else
- gtk_tree_view_column_set_visible(column, FALSE);
- g_object_set(renderer, "xalign", 0.5f, NULL);
-#endif
-
-#if defined (HAVE_PCAP_CREATE)
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes ("Mon. Mode", renderer, "text", MONITOR, NULL);
- gtk_tree_view_column_set_cell_data_func(column, renderer, activate_monitor, NULL, FALSE);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
- gtk_tree_view_column_set_reorderable(column, TRUE);
- g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(MONITOR));
- gtk_tree_view_column_set_clickable(column, TRUE);
- g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
- G_CALLBACK(column_button_pressed_cb), column);
- if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("MONITOR"))
- gtk_tree_view_column_set_visible(column, TRUE);
- else
- gtk_tree_view_column_set_visible(column, FALSE);
- g_object_set(renderer, "xalign", 0.5f, NULL);
-#endif
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Capture Filter", renderer, "text", FILTER, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
- gtk_tree_view_column_set_alignment(column, 0.5f);
- create_and_fill_model(GTK_TREE_VIEW(view));
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
- gtk_tree_view_column_set_clickable(column, TRUE);
- gtk_tree_view_column_set_reorderable(column, TRUE);
- g_object_set_data(G_OBJECT(column), E_MCAPTURE_COLUMNS_COL_KEY, GINT_TO_POINTER(FILTER));
- g_signal_connect(gtk_tree_view_column_get_button(column), "button_press_event",
- G_CALLBACK(column_button_pressed_cb), column);
- if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("FILTER"))
- gtk_tree_view_column_set_visible(column, TRUE);
- else
- gtk_tree_view_column_set_visible(column, FALSE);
- gtk_container_add (GTK_CONTAINER (swindow), view);
- gtk_box_pack_start(GTK_BOX(capture_vb), swindow, TRUE, TRUE, 0);
-
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY, view);
-
- main_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_UNRELATED_SPACING, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_hb), 0);
- gtk_box_pack_start(GTK_BOX(capture_vb), main_hb, FALSE, FALSE, 0);
- all_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(all_vb), 0);
- gtk_box_pack_start(GTK_BOX(main_hb), all_vb, TRUE, TRUE, 0);
-
- all_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_UNRELATED_SPACING, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(all_hb), 0);
- gtk_box_pack_start(GTK_BOX(all_vb), all_hb, TRUE, TRUE, 0);
-
- left_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(left_vb), 0);
- gtk_box_pack_start(GTK_BOX(all_hb), left_vb, TRUE, TRUE, 0);
-
- right_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(right_vb), 0);
- gtk_box_pack_start(GTK_BOX(all_hb), right_vb, FALSE, FALSE, 3);
-
- all_cb = gtk_check_button_new_with_mnemonic( "Capture on all interfaces");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(all_cb), FALSE);
- capture_all_handler_id = g_signal_connect(all_cb, "toggled", G_CALLBACK(capture_all_cb), NULL);
- gtk_widget_set_tooltip_text(all_cb, "Activate the box to capture on all interfaces. "
- "Deactivate it to capture on none and set the interfaces individually.");
- gtk_box_pack_start(GTK_BOX(left_vb), all_cb, TRUE, TRUE, 0);
-
- gtk_widget_set_sensitive(GTK_WIDGET(all_cb), if_present);
- /* Promiscuous mode row */
- promisc_cb = gtk_check_button_new_with_mnemonic("Use _promiscuous mode on all interfaces");
- if (!global_capture_session.session_started) {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_cb), prefs.capture_prom_mode);
- } else {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_cb), get_all_prom_mode());
- }
- promisc_all_handler_id = g_signal_connect(promisc_cb, "toggled", G_CALLBACK(promisc_mode_callback), NULL);
-
- gtk_widget_set_tooltip_text(promisc_cb,
- "Usually a network adapter will only capture the traffic sent to its own network address. "
- "If you want to capture all traffic that all network adapters can \"see\", select this option. "
- "If you want to set this option on a per-interface basis, do not select this option. "
- "Instead, select the individual checkboxes in the interface list's \"Prom. Mode\" column. "
- "See the FAQ for some more details of capturing packets from a switched network.");
- gtk_box_pack_start(GTK_BOX(left_vb), promisc_cb, TRUE, TRUE, DLG_LABEL_SPACING);
-
- iftype_cbx = gtk_button_new_with_label("Manage Interfaces");
- gtk_widget_set_tooltip_text(iftype_cbx, "Add a new interface or pipe to capture from or remove "
- "an interface from the list.");
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_IFTYPE_CBX_KEY, iftype_cbx);
-
- gtk_box_pack_start(GTK_BOX(right_vb), iftype_cbx, FALSE, FALSE, 0);
- g_signal_connect(iftype_cbx, "clicked", G_CALLBACK(show_add_interfaces_dialog), NULL);
- gtk_widget_show(iftype_cbx);
-
- main_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_UNRELATED_SPACING, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_hb), 0);
- gtk_box_pack_start(GTK_BOX(main_vb), main_hb, FALSE, FALSE, 0);
-
- left_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(left_vb), 0);
- gtk_box_pack_start(GTK_BOX(main_hb), left_vb, TRUE, TRUE, 0);
-
- right_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(right_vb), 0);
- gtk_box_pack_start(GTK_BOX(main_hb), right_vb, FALSE, FALSE, 0);
-
- /* Filter row */
- all_filter_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(all_vb), all_filter_hb, FALSE, FALSE, DLG_LABEL_SPACING);
-
- all_filter_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_CAPTURE_FILTER_ENTRY);
- g_signal_connect(all_filter_bt, "clicked", G_CALLBACK(capture_filter_construct_cb), NULL);
- g_signal_connect(all_filter_bt, "destroy", G_CALLBACK(filter_button_destroy_cb), NULL);
- gtk_widget_set_tooltip_text(all_filter_bt,
- "Select a capture filter for all selected interfaces to reduce the amount of packets to be captured. "
- "See \"Capture Filters\" in the online help for further information how to use it."
- );
- gtk_box_pack_start(GTK_BOX(all_filter_hb), all_filter_bt, FALSE, FALSE, 0);
-
- /* Create the capture filter combo box*/
- all_filter_cm = gtk_combo_box_text_new_with_entry();
- g_object_set_data(G_OBJECT(cap_open_w), E_ALL_CFILTER_CM_KEY, all_filter_cm);
- all_filter_te = gtk_bin_get_child(GTK_BIN(all_filter_cm));
- colorize_filter_te_as_empty(all_filter_te);
- g_signal_connect(all_filter_te, "changed", G_CALLBACK(capture_all_filter_check_syntax_cb), NULL);
- g_signal_connect(all_filter_te, "destroy", G_CALLBACK(capture_filter_destroy_cb), NULL);
-
- all_cfilter_list = recent_get_cfilter_list(NULL);
- for (cf_entry = all_cfilter_list; cf_entry != NULL; cf_entry = g_list_next(cf_entry)) {
- new_cfilter = (const gchar *)cf_entry->data;
- /* If this is the default cfilter, don't put it in the list, as it'll
- be added later. */
- if (global_capture_opts.default_options.cfilter == NULL || strcmp(global_capture_opts.default_options.cfilter, new_cfilter) != 0) {
- gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(all_filter_cm), new_cfilter);
- }
- }
- if (global_capture_opts.default_options.cfilter && (strlen(global_capture_opts.default_options.cfilter) > 0)) {
- gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(all_filter_cm), global_capture_opts.default_options.cfilter);
- gtk_combo_box_set_active(GTK_COMBO_BOX(all_filter_cm), 0);
- }
-
- gtk_widget_set_tooltip_text(all_filter_cm,
- "Enter a capture filter for all selected interfaces to reduce the amount of packets to be captured. "
- "See \"Capture Filters\" in the online help for further information how to use it. "
- "Syntax checking can be disabled in Preferences -> Capture -> Syntax check capture filter."
- );
- gtk_box_pack_start(GTK_BOX(all_filter_hb), all_filter_cm, TRUE, TRUE, DLG_BUTTON_SPACING);
-
- /* let an eventually capture filters dialog know the text entry to fill in */
- g_object_set_data(G_OBJECT(all_filter_bt), E_FILT_TE_PTR_KEY, all_filter_te);
-
-#if defined(HAVE_PCAP_OPEN_DEAD) && defined(HAVE_BPF_IMAGE)
- all_compile_bt = gtk_button_new_with_label("Compile selected BPFs");
- g_signal_connect(all_compile_bt, "clicked", G_CALLBACK(capture_all_filter_compile_cb), NULL);
- gtk_widget_set_tooltip_text(all_compile_bt,
- "Compile the capture filter expression and show the BPF (Berkeley Packet Filter) code.");
- /* We can't compile without any supported link-types, so disable the button in that case */
- gtk_box_pack_start(GTK_BOX(all_filter_hb), all_compile_bt, FALSE, FALSE, DLG_BUTTON_SPACING);
- if (global_capture_opts.num_selected > 0) {
- gtk_widget_set_sensitive(all_compile_bt, TRUE);
- } else {
- gtk_widget_set_sensitive(all_compile_bt, FALSE);
- }
-#endif
-
- /* Capture file-related options frame */
- file_fr = frame_new("Capture Files");
- gtk_box_pack_start(GTK_BOX (left_vb), file_fr, TRUE, TRUE, 0);
-
- file_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(file_vb), DLG_OUTER_MARGIN);
- gtk_container_add(GTK_CONTAINER(file_fr), file_vb);
-
- /* File row */
- file_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(file_vb), file_hb, FALSE, FALSE, 0);
-
- file_lb = gtk_label_new("File:");
- gtk_box_pack_start(GTK_BOX(file_hb), file_lb, FALSE, FALSE, 3);
-
- file_te = gtk_entry_new();
- gtk_widget_set_tooltip_text(file_te,
- "Enter the file name to which captured data will be written. "
- "If you don't enter something here, a temporary file will be used."
- );
- gtk_box_pack_start(GTK_BOX(file_hb), file_te, TRUE, TRUE, 3);
-
- file_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_BROWSE);
- gtk_widget_set_tooltip_text(file_bt,
- "Select a file to which captured data will be written, "
- "instead of entering the file name directly. "
- );
- gtk_box_pack_start(GTK_BOX(file_hb), file_bt, FALSE, FALSE, 0);
-
- g_signal_connect(file_bt, "clicked", G_CALLBACK(capture_prep_file_cb), file_te);
-
- /* multiple files table */
- /* XXX We want multi_grid to shrink to its minimum size horizontally
- * and be left-aligned within file_fr. Using a horizontal GtkBox works
- * in Gtk2 but not Gtk3. The situation gets sillier below with limit_fr
- * and limit_grid because we have both horizontal and vertical GtkBoxes.
- */
- multi_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(file_vb), multi_hb, FALSE, FALSE, 0);
- multi_grid = ws_gtk_grid_new();
- ws_gtk_grid_set_row_spacing(GTK_GRID(multi_grid), DLG_LABEL_SPACING);
- ws_gtk_grid_set_column_spacing(GTK_GRID(multi_grid), DLG_UNRELATED_SPACING);
- gtk_box_pack_start(GTK_BOX(multi_hb), multi_grid, FALSE, FALSE, 0);
- row = 0;
-
- /* multiple files row */
- multi_files_on_cb = gtk_check_button_new_with_mnemonic("Use _multiple files");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(multi_files_on_cb),
- global_capture_opts.multi_files_on);
- g_signal_connect(multi_files_on_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity),
- cap_open_w);
- gtk_widget_set_tooltip_text(multi_files_on_cb,
- "Instead of using a single capture file, multiple files will be created. "
- "The generated file names will contain an incrementing number and the start time of the capture.");
- ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), multi_files_on_cb, 0, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- /* Pcapng row */
- pcap_ng_cb = gtk_check_button_new_with_mnemonic("Use pcapng format");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pcap_ng_cb), global_capture_opts.use_pcapng);
- gtk_widget_set_tooltip_text(pcap_ng_cb, "Capture packets in the next-generation capture file format. "
- "This is still experimental.");
- ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), pcap_ng_cb, 2, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
- row++;
-
- /* Ring buffer filesize row */
- ring_filesize_cb = gtk_check_button_new_with_label("Next file every");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ring_filesize_cb),
- global_capture_opts.has_autostop_filesize || !global_capture_opts.has_file_interval);
- g_signal_connect(ring_filesize_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
- gtk_widget_set_tooltip_text(ring_filesize_cb,
- "If the selected file size is exceeded, capturing switches to the next file.\n"
- "PLEASE NOTE: at least one of the \"Next file every\" options MUST be selected.");
- ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ring_filesize_cb, 0, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- ring_filesize_adj = (GtkAdjustment *) gtk_adjustment_new(0.0,
- 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
- ring_filesize_sb = gtk_spin_button_new (ring_filesize_adj, 0, 0);
- gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (ring_filesize_sb), TRUE);
- gtk_widget_set_size_request(ring_filesize_sb, 80, -1);
- ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ring_filesize_sb, 1, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- ring_filesize_cbx = size_unit_combo_box_new(global_capture_opts.autostop_filesize);
- ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ring_filesize_cbx, 2, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- value = size_unit_combo_box_set_value(global_capture_opts.autostop_filesize);
- gtk_adjustment_set_value(ring_filesize_adj, (gdouble) value);
-
- row++;
-
- /* Ring buffer duration row */
- file_interval_cb = gtk_check_button_new_with_label("Next file every");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(file_interval_cb),
- global_capture_opts.has_file_interval);
- g_signal_connect(file_interval_cb, "toggled",
- G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
- gtk_widget_set_tooltip_text(file_interval_cb,
- "If the selected duration is exceeded, capturing switches to the next file.\n"
- "PLEASE NOTE: at least one of the \"Next file every\" options MUST be selected.");
- ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), file_interval_cb, 0, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- file_interval_adj = (GtkAdjustment *)gtk_adjustment_new(0.0,
- 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
- file_interval_sb = gtk_spin_button_new (file_interval_adj, 0, 0);
- gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (file_interval_sb), TRUE);
- gtk_widget_set_size_request(file_interval_sb, 80, -1);
- ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), file_interval_sb, 1, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- file_interval_cbx = time_unit_combo_box_new(global_capture_opts.file_interval);
- ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), file_interval_cbx, 2, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- value = time_unit_combo_box_convert_value(global_capture_opts.file_interval);
- gtk_adjustment_set_value(file_interval_adj, (gdouble) value);
- row++;
-
- /* Ring buffer files row */
- ringbuffer_nbf_cb = gtk_check_button_new_with_label("Ring buffer with");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ringbuffer_nbf_cb),
- global_capture_opts.has_ring_num_files);
- g_signal_connect(ringbuffer_nbf_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
- gtk_widget_set_tooltip_text(ringbuffer_nbf_cb,
- "After capturing has switched to the next file and the given number of files has exceeded, "
- "the oldest file will be removed."
- );
- ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ringbuffer_nbf_cb, 0, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- ringbuffer_nbf_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat) global_capture_opts.ring_num_files,
- 2/*RINGBUFFER_MIN_NUM_FILES*/, RINGBUFFER_MAX_NUM_FILES, 1.0, 10.0, 0.0);
- ringbuffer_nbf_sb = gtk_spin_button_new (ringbuffer_nbf_adj, 0, 0);
- gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (ringbuffer_nbf_sb), TRUE);
- gtk_widget_set_size_request(ringbuffer_nbf_sb, 80, -1);
- g_signal_connect(ringbuffer_nbf_sb, "changed", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
- ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ringbuffer_nbf_sb, 1, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- ringbuffer_nbf_lb = gtk_label_new("files");
- gtk_misc_set_alignment(GTK_MISC(ringbuffer_nbf_lb), 0, 0.5f);
- ws_gtk_grid_attach_extended(GTK_GRID (multi_grid), ringbuffer_nbf_lb, 2, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- row++;
-
- /* Capture limits frame */
- limit_fr = frame_new("Stop Capture Automatically After...");
- gtk_box_pack_start(GTK_BOX (left_vb), limit_fr, TRUE, TRUE, 0);
-
- limit_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(limit_vb), DLG_OUTER_MARGIN);
- gtk_container_add(GTK_CONTAINER(limit_fr), limit_vb);
-
- /* limits table */
- limit_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(limit_vb), limit_hb, FALSE, FALSE, 0);
- limit_grid = ws_gtk_grid_new();
- ws_gtk_grid_set_row_spacing(GTK_GRID(limit_grid), DLG_LABEL_SPACING);
- ws_gtk_grid_set_column_spacing(GTK_GRID(limit_grid), DLG_UNRELATED_SPACING);
- gtk_box_pack_start(GTK_BOX(limit_hb), limit_grid, FALSE, FALSE, 0);
- row = 0;
-
- /* Packet count row */
- stop_packets_cb = gtk_check_button_new();
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(stop_packets_cb),
- global_capture_opts.has_autostop_packets);
- g_signal_connect(stop_packets_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
- gtk_widget_set_tooltip_text(stop_packets_cb, "Stop capturing after the specified number of packets have been captured.");
- ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_packets_cb, 0, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- stop_packets_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat)global_capture_opts.autostop_packets,
- 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
- stop_packets_sb = gtk_spin_button_new (stop_packets_adj, 0, 0);
- gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (stop_packets_sb), TRUE);
- gtk_widget_set_size_request(stop_packets_sb, 80, -1);
- ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_packets_sb, 1, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- stop_packets_lb = gtk_label_new("packet(s)");
- gtk_misc_set_alignment(GTK_MISC(stop_packets_lb), 0, 0.5f);
- ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_packets_lb, 2, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- /* Filesize row */
- stop_filesize_cb = gtk_check_button_new();
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(stop_filesize_cb),
- global_capture_opts.has_autostop_filesize);
- g_signal_connect(stop_filesize_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
- gtk_widget_set_tooltip_text(stop_filesize_cb, "Stop capturing after the specified amount of data has been captured.");
- ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_filesize_cb, 3, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- stop_filesize_adj = (GtkAdjustment *) gtk_adjustment_new(0.0,
- 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
- stop_filesize_sb = gtk_spin_button_new (stop_filesize_adj, 0, 0);
- gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (stop_filesize_sb), TRUE);
- gtk_widget_set_size_request(stop_filesize_sb, 80, -1);
- ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_filesize_sb, 4, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- stop_filesize_cbx = size_unit_combo_box_new(global_capture_opts.autostop_filesize);
- ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_filesize_cbx, 5, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- value = size_unit_combo_box_set_value(global_capture_opts.autostop_filesize);
- gtk_adjustment_set_value(stop_filesize_adj, (gdouble) value);
-
- row++;
-
- /* Files row */
- stop_files_cb = gtk_check_button_new();
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(stop_files_cb),
- global_capture_opts.has_autostop_files);
- g_signal_connect(stop_files_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
- gtk_widget_set_tooltip_text(stop_files_cb, "Stop capturing after the given number of \"file switches\" have been done.");
- ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_files_cb, 0, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- stop_files_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat)global_capture_opts.autostop_files,
- 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
- stop_files_sb = gtk_spin_button_new (stop_files_adj, 0, 0);
- gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (stop_files_sb), TRUE);
- gtk_widget_set_size_request(stop_files_sb, 80, -1);
- ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_files_sb, 1, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- stop_files_lb = gtk_label_new("file(s)");
- gtk_misc_set_alignment(GTK_MISC(stop_files_lb), 0, 0.5f);
- ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_files_lb, 2, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- /* Duration row */
- stop_duration_cb = gtk_check_button_new();
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(stop_duration_cb),
- global_capture_opts.has_autostop_duration);
- g_signal_connect(stop_duration_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
- gtk_widget_set_tooltip_text(stop_duration_cb, "Stop capturing after the specified amount of time has passed.");
- ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_duration_cb, 3, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- stop_duration_adj = (GtkAdjustment *) gtk_adjustment_new(0.0,
- 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0);
- stop_duration_sb = gtk_spin_button_new (stop_duration_adj, 0, 0);
- gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (stop_duration_sb), TRUE);
- gtk_widget_set_size_request(stop_duration_sb, 80, -1);
- ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_duration_sb, 4, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- stop_duration_cbx = time_unit_combo_box_new(global_capture_opts.autostop_duration);
- ws_gtk_grid_attach_extended(GTK_GRID (limit_grid), stop_duration_cbx, 5, row, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_FILL), 0, 0);
-
- value = time_unit_combo_box_convert_value(global_capture_opts.autostop_duration);
- gtk_adjustment_set_value(stop_duration_adj, (gdouble) value);
- row++;
-
- /* Display-related options frame */
- display_fr = frame_new("Display Options");
- gtk_box_pack_start(GTK_BOX (right_vb), display_fr, TRUE, TRUE, 0);
-
- display_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_LABEL_SPACING, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(display_vb), DLG_OUTER_MARGIN);
- gtk_container_add(GTK_CONTAINER(display_fr), display_vb);
-
- /* "Update display in real time" row */
- sync_cb = gtk_check_button_new_with_mnemonic(
- "_Update list of packets in real time");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sync_cb),
- global_capture_opts.real_time_mode);
- g_signal_connect(sync_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w);
- gtk_widget_set_tooltip_text(sync_cb,
- "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.");
- gtk_box_pack_start(GTK_BOX (display_vb), sync_cb, FALSE, TRUE, 0);
-
- /* "Auto-scroll live update" row */
- auto_scroll_cb = gtk_check_button_new_with_mnemonic("_Automatically scroll during live capture");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auto_scroll_cb), auto_scroll_live);
- gtk_widget_set_tooltip_text(auto_scroll_cb,
- "This will scroll the \"Packet List\" automatically to the latest captured packet, "
- "when the \"Update List of packets in real time\" option is used.");
- gtk_box_pack_start(GTK_BOX (display_vb), auto_scroll_cb, FALSE, TRUE, 0);
-
- /* "Hide capture info" row */
- hide_info_cb = gtk_check_button_new_with_mnemonic("_Hide capture info dialog");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(hide_info_cb), !global_capture_opts.show_info);
- gtk_widget_set_tooltip_text(hide_info_cb, "Hide the capture info dialog while capturing.");
- gtk_box_pack_start(GTK_BOX (display_vb), hide_info_cb, FALSE, TRUE, 0);
-
- /* Name Resolution frame */
- resolv_fr = frame_new("Name Resolution");
- gtk_box_pack_start(GTK_BOX (right_vb), resolv_fr, TRUE, TRUE, 0);
-
- resolv_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_LABEL_SPACING, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(resolv_vb), DLG_OUTER_MARGIN);
- gtk_container_add(GTK_CONTAINER(resolv_fr), resolv_vb);
-
- m_resolv_cb = gtk_check_button_new_with_mnemonic(
- "Resolve _MAC addresses");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_resolv_cb),
- gbl_resolv_flags.mac_name);
- gtk_widget_set_tooltip_text(m_resolv_cb, "Perform MAC layer name resolution while capturing.");
- gtk_box_pack_start(GTK_BOX (resolv_vb), m_resolv_cb, FALSE, TRUE, 0);
-
- n_resolv_cb = gtk_check_button_new_with_mnemonic(
- "Resolve _network-layer names");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(n_resolv_cb),
- gbl_resolv_flags.network_name);
- gtk_widget_set_tooltip_text(n_resolv_cb, "Perform network layer name resolution while capturing.");
- gtk_box_pack_start(GTK_BOX (resolv_vb), n_resolv_cb, FALSE, TRUE, 0);
-
- t_resolv_cb = gtk_check_button_new_with_mnemonic(
- "Resolve _transport-layer name");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(t_resolv_cb),
- gbl_resolv_flags.transport_name);
- gtk_widget_set_tooltip_text(t_resolv_cb,
- "Perform transport layer name resolution while capturing.");
- gtk_box_pack_start(GTK_BOX (resolv_vb), t_resolv_cb, FALSE, TRUE, 0);
-
- e_resolv_cb = gtk_check_button_new_with_mnemonic(
- "Use _external network name resolver");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(e_resolv_cb),
- gbl_resolv_flags.use_external_net_name_resolver);
- gtk_widget_set_tooltip_text(e_resolv_cb,
- "Use the (system's) configured name resolver (e.g., DNS) to resolve network names.");
- gtk_box_pack_start(GTK_BOX (resolv_vb), e_resolv_cb, FALSE, TRUE, 0);
-
- /* Button row: "Start", "Cancel" and "Help" buttons */
- bbox = dlg_button_row_new(WIRESHARK_STOCK_CAPTURE_START, GTK_STOCK_CLOSE, GTK_STOCK_HELP, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 5);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_CAPTURE_START);
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(capture_start_cb), NULL);
- gtk_widget_set_tooltip_text(ok_bt, "Start the capture process.");
- if (global_capture_opts.num_selected > 0) {
- gtk_widget_set_sensitive(ok_bt, TRUE);
- } else {
- gtk_widget_set_sensitive(ok_bt, FALSE);
- }
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- gtk_widget_set_tooltip_text(close_bt,
- "Exit dialog.");
- window_set_cancel_button(cap_open_w, close_bt, window_cancel_button_cb);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- gtk_widget_set_tooltip_text(help_bt,
- "Show help about capturing.");
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), GUINT_TO_POINTER(HELP_CAPTURE_OPTIONS_DIALOG));
- gtk_widget_grab_default(ok_bt);
-
- /* Attach pointers to needed widgets to the capture prefs window/object */
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_KEY_ALL, all_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_PROMISC_KEY_ALL, promisc_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_PCAP_NG_KEY, pcap_ng_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_FILE_TE_KEY, file_te);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_MULTI_FILES_ON_CB_KEY, multi_files_on_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_NBF_CB_KEY, ringbuffer_nbf_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_NBF_SB_KEY, ringbuffer_nbf_sb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_NBF_LB_KEY, ringbuffer_nbf_lb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_FILESIZE_CB_KEY, ring_filesize_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_FILESIZE_SB_KEY, ring_filesize_sb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_RING_FILESIZE_CBX_KEY, ring_filesize_cbx);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_FILE_INTERVAL_CB_KEY, file_interval_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_FILE_INTERVAL_SB_KEY, file_interval_sb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_FILE_INTERVAL_CBX_KEY, file_interval_cbx);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_SYNC_KEY, sync_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_AUTO_SCROLL_KEY, auto_scroll_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_HIDE_INFO_KEY, hide_info_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_PACKETS_CB_KEY, stop_packets_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_PACKETS_SB_KEY, stop_packets_sb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_PACKETS_LB_KEY, stop_packets_lb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILESIZE_CB_KEY, stop_filesize_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILESIZE_SB_KEY, stop_filesize_sb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILESIZE_CBX_KEY, stop_filesize_cbx);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_DURATION_CB_KEY, stop_duration_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_DURATION_SB_KEY, stop_duration_sb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_DURATION_CBX_KEY, stop_duration_cbx);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILES_CB_KEY, stop_files_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILES_SB_KEY, stop_files_sb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_STOP_FILES_LB_KEY, stop_files_lb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_M_RESOLVE_KEY, m_resolv_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_N_RESOLVE_KEY, n_resolv_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_T_RESOLVE_KEY, t_resolv_cb);
- g_object_set_data(G_OBJECT(cap_open_w), E_CAP_E_RESOLVE_KEY, e_resolv_cb);
-
- /* Set the sensitivity of various widgets as per the settings of other
- widgets. */
- capture_prep_adjust_sensitivity(NULL, cap_open_w);
-
- update_properties_all();
- update_visible_columns_menu ();
-
- /* Catch the "activate" signal on the text
- entries, so that if the user types Return there, we act as if the
- "OK" button had been selected, as happens if Return is typed if some
- widget that *doesn't* handle the Return key has the input focus. */
- /*dlg_set_activate(gtk_bin_get_child(GTK_BIN(if_cb)), ok_bt);*/
- dlg_set_activate(file_te, ok_bt);
- dlg_set_activate(all_filter_te, ok_bt);
- gtk_widget_grab_focus(all_filter_te);
-
- g_signal_connect(cap_open_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(cap_open_w, "destroy", G_CALLBACK(capture_prep_destroy_cb), NULL);
-
- window_get_geometry(top_level, &tl_geom);
- gtk_window_set_default_size(GTK_WINDOW(cap_open_w), tl_geom.width * 8 / 10, -1);
-
- gtk_widget_show_all(cap_open_w);
- window_present(cap_open_w);
-
- cap_open_complete = TRUE; /* "Capture:Start" is now OK */
- global_capture_session.session_started = TRUE;
-}
-
-/* user pressed the "Start" button (in dialog or toolbar) */
-void
-capture_start_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- interface_options interface_opts;
- guint i;
- gchar * filter_str;
-
-#ifdef HAVE_AIRPCAP
- airpcap_if_active = airpcap_if_selected;
- if (airpcap_if_active)
- airpcap_set_toolbar_start_capture(airpcap_if_active);
-#endif
-
- /* XXX - will closing this remove a temporary file? */
- if(!do_file_close(&cfile, FALSE, " before starting a new capture")){
- return;
- }
- 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);
- if (success)
- window_destroy(GTK_WIDGET(cap_open_w));
- if (!success)
- return; /* error in options dialog */
- }
- if (global_capture_opts.num_selected == 0) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "You didn't specify an interface on which to capture packets.");
- return;
- }
-
- /* everything's prepared, now it's really time to start the capture */
-
- /* XXX - we might need to init other pref data as well... */
- main_auto_scroll_live_changed(auto_scroll_live);
-
- /* XXX - can this ever happen? */
- if (global_capture_session.state != CAPTURE_STOPPED)
- return;
-
- /* close the currently loaded capture file */
- cf_close((capture_file *)global_capture_session.cf);
-
- /* Copy the selected interfaces to the set of interfaces to use for
- this capture. */
- collect_ifaces(&global_capture_opts);
-
- if (capture_start(&global_capture_opts, &global_capture_session, &global_info_data, main_window_update)) {
- /* The capture succeeded, which means the capture filters specified are
- valid; add them to the recent capture filter lists for the interfaces.
-
- If the same capture filter is used for all the selected interfaces,
- add it to the global recent capture filter list as well. */
- filter_str = NULL;
- 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_str == NULL) {
- /* First selected interface - save its capture filter. */
- filter_str = g_strdup(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_str) != 0) {
- /* No, so not all selected interfaces have the same capture filter. */
- g_free(filter_str);
- filter_str = NULL;
- }
- }
- }
- }
- if (filter_str != NULL) {
- if (filter_str[0] != '\0') {
- recent_add_cfilter(NULL, filter_str);
- }
- g_free(filter_str);
- }
- }
-}
-
-
-/* user change linktype selection;, convert to internal DLT value */
-static void
-select_link_type_cb(GtkWidget *linktype_combo_box, gpointer data _U_)
-{
- gpointer ptr;
- int dlt;
- interface_t device;
-
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
- global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
- if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(linktype_combo_box), &ptr)) {
- g_assert_not_reached(); /* Programming error: somehow nothing is active */
- }
- if ((dlt = GPOINTER_TO_INT(ptr)) == -1) {
- g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */
- }
- device.active_dlt = dlt;
- g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
- capture_filter_check_syntax_cb(linktype_combo_box, data);
-}
-
-/* user pressed "File" button */
-static void
-capture_prep_file_cb(GtkWidget *file_bt, GtkWidget *file_te)
-{
- file_selection_browse(file_bt, file_te, "Wireshark: Specify a Capture File", FILE_SELECTION_WRITE_BROWSE);
-}
-
-/* user pressed "Pipe" button */
-static void
-capture_prep_pipe_cb(GtkWidget *pipe_bt, GtkWidget *pipe_te)
-{
- file_selection_browse(pipe_bt, pipe_te, "Wireshark: Specify a Pipe", FILE_SELECTION_WRITE_BROWSE);
-}
-
-
-/* convert dialog settings into capture_opts values */
-static gboolean
-capture_dlg_prep(gpointer parent_w) {
- GtkWidget *pcap_ng_cb,
- *file_te, *multi_files_on_cb, *ringbuffer_nbf_sb, *ringbuffer_nbf_cb,
- *sync_cb, *auto_scroll_cb, *hide_info_cb,
- *stop_packets_cb, *stop_packets_sb,
- *stop_filesize_cb, *stop_filesize_sb, *stop_filesize_cbx,
- *stop_duration_cb, *stop_duration_sb, *stop_duration_cbx,
- *ring_filesize_cb, *ring_filesize_sb, *ring_filesize_cbx,
- *file_interval_cb, *file_interval_sb, *file_interval_cbx,
- *stop_files_cb, *stop_files_sb,
- *m_resolv_cb, *n_resolv_cb, *t_resolv_cb, *e_resolv_cb;
- const gchar *g_save_file;
- gchar *cf_name;
- gchar *dirname;
- gint32 tmp;
-
- pcap_ng_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_PCAP_NG_KEY);
- file_te = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_TE_KEY);
- multi_files_on_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_MULTI_FILES_ON_CB_KEY);
- ringbuffer_nbf_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_CB_KEY);
- ringbuffer_nbf_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_SB_KEY);
- ring_filesize_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_CB_KEY);
- ring_filesize_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_SB_KEY);
- ring_filesize_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_CBX_KEY);
- file_interval_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_INTERVAL_CB_KEY);
- file_interval_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_INTERVAL_SB_KEY);
- file_interval_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_INTERVAL_CBX_KEY);
- sync_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SYNC_KEY);
- auto_scroll_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_AUTO_SCROLL_KEY);
- hide_info_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_HIDE_INFO_KEY);
- stop_packets_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_CB_KEY);
- stop_packets_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_SB_KEY);
- stop_filesize_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_CB_KEY);
- stop_filesize_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_SB_KEY);
- stop_filesize_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_CBX_KEY);
- stop_duration_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_CB_KEY);
- stop_duration_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_SB_KEY);
- stop_duration_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_CBX_KEY);
- stop_files_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_CB_KEY);
- stop_files_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_SB_KEY);
- m_resolv_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_M_RESOLVE_KEY);
- n_resolv_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_N_RESOLVE_KEY);
- t_resolv_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_T_RESOLVE_KEY);
- e_resolv_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_E_RESOLVE_KEY);
-
- if (global_capture_opts.num_selected == 0) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "You didn't specify an interface on which to capture packets.");
- return FALSE;
- }
- global_capture_opts.use_pcapng =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pcap_ng_cb));
- /* Wireshark always saves to a capture file. */
- global_capture_opts.saving_to_file = TRUE;
- g_save_file = gtk_entry_get_text(GTK_ENTRY(file_te));
- if (g_save_file && g_save_file[0]) {
- /* User specified a file to which the capture should be written. */
- global_capture_opts.save_file = g_strdup(g_save_file);
- global_capture_opts.orig_save_file = g_strdup(g_save_file);
- /* Save the directory name for future file dialogs. */
- cf_name = g_strdup(g_save_file);
- dirname = get_dirname(cf_name); /* Overwrites cf_name */
- set_last_open_dir(dirname);
- g_free(cf_name);
- } else {
- /* User didn't specify a file; save to a temporary file. */
- global_capture_opts.save_file = NULL;
- }
-
- global_capture_opts.has_autostop_packets =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_packets_cb));
- if (global_capture_opts.has_autostop_packets)
- global_capture_opts.autostop_packets =
- gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(stop_packets_sb));
-
- global_capture_opts.has_autostop_duration =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_duration_cb));
- if (global_capture_opts.has_autostop_duration) {
- global_capture_opts.autostop_duration =
- gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(stop_duration_sb));
- global_capture_opts.autostop_duration =
- time_unit_combo_box_get_value(stop_duration_cbx, global_capture_opts.autostop_duration);
- }
-
- global_capture_opts.real_time_mode =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sync_cb));
-
- auto_scroll_live =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(auto_scroll_cb));
-
- global_capture_opts.show_info =
- !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hide_info_cb));
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_resolv_cb)))
- gbl_resolv_flags.mac_name = TRUE;
- else
- gbl_resolv_flags.mac_name = FALSE;
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(n_resolv_cb)))
- gbl_resolv_flags.network_name = TRUE;
- else
- gbl_resolv_flags.network_name = FALSE;
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(t_resolv_cb)))
- gbl_resolv_flags.transport_name = TRUE;
- else
- gbl_resolv_flags.transport_name = FALSE;
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(e_resolv_cb)))
- gbl_resolv_flags.use_external_net_name_resolver = TRUE;
- else
- gbl_resolv_flags.use_external_net_name_resolver = FALSE;
-
- global_capture_opts.has_ring_num_files =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ringbuffer_nbf_cb));
-
- global_capture_opts.ring_num_files =
- gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(ringbuffer_nbf_sb));
- if (global_capture_opts.ring_num_files > RINGBUFFER_MAX_NUM_FILES)
- global_capture_opts.ring_num_files = RINGBUFFER_MAX_NUM_FILES;
-#if RINGBUFFER_MIN_NUM_FILES > 0
- else if (global_capture_opts.ring_num_files < RINGBUFFER_MIN_NUM_FILES)
- global_capture_opts.ring_num_files = RINGBUFFER_MIN_NUM_FILES;
-#endif
-
- global_capture_opts.multi_files_on =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(multi_files_on_cb));
-
- global_capture_opts.has_file_interval =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(file_interval_cb));
- if (global_capture_opts.has_file_interval) {
- global_capture_opts.file_interval =
- gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(file_interval_sb));
- global_capture_opts.file_interval =
- time_unit_combo_box_get_value(file_interval_cbx, global_capture_opts.file_interval);
- }
-
- global_capture_opts.has_autostop_files =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_files_cb));
- if (global_capture_opts.has_autostop_files)
- global_capture_opts.autostop_files =
- gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(stop_files_sb));
-
- if (global_capture_opts.multi_files_on) {
- global_capture_opts.has_autostop_filesize =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ring_filesize_cb));
- if (global_capture_opts.has_autostop_filesize) {
- tmp = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(ring_filesize_sb));
- tmp = size_unit_combo_box_convert_value(ring_filesize_cbx, tmp);
- if (tmp != 0) {
- global_capture_opts.autostop_filesize = tmp;
- } else {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "%sMultiple files: Requested file size too large.%s\n\n"
- "The setting \"Next file every x byte(s)\" can't be greater than %u bytes (2GiB).",
- simple_dialog_primary_start(), simple_dialog_primary_end(), (guint32)G_MAXINT + 1);
- return FALSE;
- }
- }
-
- /* test if the settings are ok for a ringbuffer */
- if (global_capture_opts.save_file == NULL) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "%sMultiple files: No capture file name given.%s\n\n"
- "You must specify a filename if you want to use multiple files.",
- simple_dialog_primary_start(), simple_dialog_primary_end());
- return FALSE;
- } else if (!global_capture_opts.has_autostop_filesize && !global_capture_opts.has_file_interval) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "%sMultiple files: No file limit given.%s\n\n"
- "You must specify a file size or interval at which is switched to the next capture file\n"
- "if you want to use multiple files.",
- simple_dialog_primary_start(), simple_dialog_primary_end());
- g_free(global_capture_opts.save_file);
- global_capture_opts.save_file = NULL;
- return FALSE;
- }
- } else {
- global_capture_opts.has_autostop_filesize =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_filesize_cb));
- if (global_capture_opts.has_autostop_filesize) {
- tmp = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(stop_filesize_sb));
- tmp = size_unit_combo_box_convert_value(stop_filesize_cbx, tmp);
- if (tmp != 0) {
- global_capture_opts.autostop_filesize = tmp;
- } else {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "%sStop Capture: Requested file size too large.%s\n\n"
- "The setting \"after x byte(s)\" can't be greater than %u bytes (2GiB).",
- simple_dialog_primary_start(), simple_dialog_primary_end(), (guint32)G_MAXINT + 1);
- return FALSE;
- }
- }
- } /* multi_files_on */
- return TRUE;
-}
-
-static GtkTreeModel *
-create_and_fill_model(GtkTreeView *view)
-{
- GtkListStore *store;
- GtkTreeIter iter;
- GList *list;
- char *temp, *snaplen_string, *linkname;
- guint i;
- link_row *linkr = NULL;
- interface_t device;
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- gint buffer;
-#endif
- gint snaplen;
- gboolean hassnap, pmode;
-
-#if defined(HAVE_PCAP_CREATE)
- store = gtk_list_store_new (9, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING);
-#elif defined(CAN_SET_CAPTURE_BUFFER_SIZE)
- store = gtk_list_store_new (8, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING);
-#else
- store = gtk_list_store_new (7, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
-#endif
-
- 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) {
- if (device.no_addresses == 0) {
- temp = g_strdup_printf("<b>%s</b>", device.display_name);
- } else {
- temp = g_strdup_printf("<b>%s</b>\n<span size='small'>%s</span>", device.display_name, device.addresses);
- }
- set_active_dlt(&device, global_capture_opts.default_options.linktype);
- linkname = NULL;
- for (list = device.links; list != NULL; list = g_list_next(list)) {
- linkr = (link_row*)(list->data);
- if (linkr->dlt == device.active_dlt) {
- linkname = g_strdup(linkr->name);
- break;
- }
- }
- if (!linkname)
- linkname = g_strdup("unknown");
- if (capture_dev_user_pmode_find(device.name, &pmode)) {
- device.pmode = pmode;
- }
- if (capture_dev_user_snaplen_find(device.name, &hassnap, &snaplen)) {
- /* Default snap length set in preferences */
- device.snaplen = snaplen;
- device.has_snaplen = hassnap;
- } else {
- /* No preferences set yet, use default values */
- device.snaplen = WTAP_MAX_PACKET_SIZE_STANDARD;
- device.has_snaplen = FALSE;
- }
-
- snaplen_string = g_strdup_printf("%d", device.snaplen);
-
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- if (capture_dev_user_buffersize_find(device.name) != -1) {
- buffer = capture_dev_user_buffersize_find(device.name);
- device.buffer = buffer;
- } else {
- device.buffer = DEFAULT_CAPTURE_BUFFER_SIZE;
- }
-#endif
- global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, i);
- g_array_insert_val(global_capture_opts.all_ifaces, i, device);
- gtk_list_store_append (store, &iter);
-#if defined(HAVE_PCAP_CREATE)
- gtk_list_store_set (store, &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp, LINK, linkname, PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, BUFFER, (guint) device.buffer, MONITOR, device.monitor_mode_supported?(device.monitor_mode_enabled?"enabled":"disabled"):"n/a", FILTER, device.cfilter, -1);
-#elif defined(CAN_SET_CAPTURE_BUFFER_SIZE)
- gtk_list_store_set (store, &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp, LINK, linkname, PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, BUFFER, (guint) device.buffer, FILTER, device.cfilter, -1);
-#else
- gtk_list_store_set (store, &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp, LINK, linkname, PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, FILTER, device.cfilter, -1);
-#endif
- g_free(linkname);
- }
- }
- gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store));
- return GTK_TREE_MODEL(store);
-}
-
-static gboolean
-query_tooltip_tree_view_cb (GtkWidget *widget,
- gint x,
- gint y,
- gboolean keyboard_tip,
- GtkTooltip *tooltip,
- gpointer data _U_)
-{
- GtkTreeIter iter;
- GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
- GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
- GtkTreePath *path = NULL;
- gchar *tmp;
- GtkTreeViewColumn *column;
- GtkCellRenderer* renderer = NULL;
- GList *renderer_list;
- gint idx;
-
- char buffer[512];
-
- if (!gtk_tree_view_get_tooltip_context (tree_view, &x, &y, keyboard_tip, &model, &path, &iter))
- return FALSE;
-
- gtk_tree_model_get (model, &iter, 0, &tmp, -1);
-
- if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tree_view), (gint) x, (gint) y, NULL, &column, NULL, NULL)) {
- idx = col_title_to_index((const gchar *)gtk_tree_view_column_get_title(column));
-
- switch (idx)
- {
- case CAPTURE: g_snprintf (buffer, sizeof(buffer), "Choose which interface (network adapter) will be used to capture packets from. "
- "Be sure to select the correct one, as it's a common mistake to select the wrong interface.");
- break;
- case INTERFACE: g_snprintf (buffer, sizeof(buffer), "Lists the interface name and the IP address(es) assigned to it. ");
- break;
- case LINK: g_snprintf (buffer, sizeof(buffer), "Link-layer type the interface supports.");
- break;
- case PMODE: g_snprintf (buffer, sizeof(buffer), "Usually a network adapter will only capture the traffic sent to its own network address. "
- "If you want to capture all traffic that the network adapter can \"see\", promiscuous mode should be configured.");
- break;
- case SNAPLEN: g_snprintf(buffer, sizeof(buffer), "Limit the maximum number of bytes to be captured from each packet. This size includes the "
- "link-layer header and all subsequent headers.");
- break;
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- case BUFFER: g_snprintf (buffer, sizeof(buffer), "The memory buffer size used while capturing. "
- "If you notice packet drops, you can try increasing this size.");
- break;
-#endif
-#if defined(HAVE_PCAP_CREATE)
- case MONITOR: g_snprintf (buffer, sizeof(buffer), "Usually a Wi-Fi adapter will, even in promiscuous mode, only capture "
- "the traffic on the BSS to which it's associated. "
- "If you want to capture all traffic that the Wi-Fi adapter can \"receive\", select this option. "
- "In order to see IEEE 802.11 headers or to see radio information for captured packets, "
- "it might be necessary to turn this option on.\n\n"
- "Note that, in monitor mode, the adapter might disassociate from the network to which it's associated.");
- break;
-#endif
- case FILTER: g_snprintf(buffer, sizeof(buffer), "Selected capture filter to reduce the amount of packets to be captured.");
- break;
- default: g_snprintf(buffer, sizeof(buffer), "another option");
- }
-
- gtk_tooltip_set_markup (tooltip, buffer);
- renderer_list = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
- /* get the first renderer */
- if (g_list_first(renderer_list)) {
- renderer = (GtkCellRenderer*)g_list_nth_data(renderer_list, 0);
- gtk_tree_view_set_tooltip_cell (tree_view, tooltip, path, column, renderer);
- }
- }
- gtk_tree_path_free (path);
-
- return TRUE;
-}
-
-#if defined (HAVE_PCAP_CREATE)
-static void
-activate_monitor(GtkTreeViewColumn *tree_column _U_, GtkCellRenderer *renderer,
- GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data _U_)
-{
- interface_t device;
- GtkTreePath *path = gtk_tree_model_get_path(tree_model, iter);
- int indx = 0;
-
- if (gtk_tree_path_get_depth(path) == 0) {
- indx = 0;
- } else {
- indx = gtk_tree_path_get_indices(path)[0];
- }
-
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, indx);
-
- if (device.monitor_mode_supported == TRUE) {
- g_object_set(G_OBJECT(renderer), "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, NULL);
- } else {
- g_object_set(G_OBJECT(renderer), "mode", GTK_CELL_RENDERER_MODE_INERT, NULL);
- }
-}
-#endif
-
-/* user requested to destroy the dialog */
-static void
-capture_prep_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
-{
- GtkWidget *fs;
-#ifdef HAVE_PCAP_REMOTE
- GList *if_list;
-#endif
-
- if (!cap_open_w || !G_IS_OBJECT(cap_open_w))
- return;
- /* Is there a file selection dialog associated with this
- Capture Options dialog? */
- fs = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_FILE_SEL_DIALOG_PTR_KEY);
-
-#ifdef HAVE_PCAP_REMOTE
- if_list = (GList *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IF_LIST_KEY);
- if (if_list && g_list_length(if_list)>0) {
- free_interface_list(if_list);
- }
-#endif
-
- if (fs != NULL && G_IS_OBJECT(fs)) {
- /* Yes. Destroy it. */
- window_destroy(fs);
- }
-
- /* Note that we no longer have a "Capture Options" dialog box. */
- cap_open_w = NULL;
-
-#ifdef HAVE_AIRPCAP
- /* update airpcap toolbar */
- if (airpcap_if_active)
- airpcap_set_toolbar_stop_capture(airpcap_if_active);
-#endif
-}
-
-
-#ifdef HAVE_PCAP_CREATE
-/* user changed the setting of the monitor-mode checkbox */
-static void
-capture_prep_monitor_changed_cb(GtkWidget *monitor, gpointer argp _U_)
-{
- GList *lt_entry;
- gchar *if_string;
- gboolean monitor_mode;
- if_capabilities_t *caps;
- gint linktype_count = 0, i;
- data_link_info_t *data_link_info;
- interface_t device;
- link_row *linkr;
- GtkWidget *linktype_combo_box = (GtkWidget *) g_object_get_data(G_OBJECT(opt_edit_w), E_CAP_LT_CBX_KEY);
- GtkWidget *linktype_lb = (GtkWidget *)g_object_get_data(G_OBJECT(linktype_combo_box), E_CAP_LT_CBX_LABEL_KEY);
- gchar *auth_str = NULL;
-
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, marked_interface);
- global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, marked_interface);
-
-
- if_string = g_strdup(device.name);
- monitor_mode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(monitor));
-#ifdef HAVE_PCAP_REMOTE
- if (device.remote_opts.remote_host_opts.auth_type == CAPTURE_AUTH_PWD) {
- auth_str = g_strdup_printf("%s:%s", device.remote_opts.remote_host_opts.auth_username,
- device.remote_opts.remote_host_opts.auth_password);
- }
-#endif
- caps = capture_get_if_capabilities(if_string, monitor_mode, auth_str, NULL, main_window_update);
- g_free(auth_str);
-
- if (caps != NULL) {
- g_signal_handlers_disconnect_by_func(linktype_combo_box, G_CALLBACK(select_link_type_cb), NULL );
- ws_combo_box_clear_text_and_pointer(GTK_COMBO_BOX(linktype_combo_box));
- for (i = (gint)g_list_length(device.links)-1; i >= 0; i--) {
- GList* rem = g_list_nth(device.links, i);
- device.links = g_list_remove_link(device.links, rem);
- g_list_free_1(rem);
- }
- device.active_dlt = -1;
- linktype_count = 0;
- device.monitor_mode_supported = caps->can_set_rfmon;
- device.monitor_mode_enabled = monitor_mode;
- for (lt_entry = caps->data_link_types; lt_entry != NULL; lt_entry = g_list_next(lt_entry)) {
- linkr = (link_row *)g_malloc(sizeof(link_row));
- data_link_info = (data_link_info_t *)lt_entry->data;
- /*
- * For link-layer types libpcap/WinPcap doesn't know about, the
- * name will be "DLT n", and the description will be null.
- * We mark those as unsupported, and don't allow them to be
- * used - capture filters won't work on them, for example.
- */
- if (data_link_info->description != NULL) {
- ws_combo_box_append_text_and_pointer(GTK_COMBO_BOX(linktype_combo_box),
- data_link_info->description,
- GINT_TO_POINTER(data_link_info->dlt));
- linkr->dlt = data_link_info->dlt;
- if (linktype_count == 0) {
- device.active_dlt = data_link_info->dlt;
- }
- linkr->name = g_strdup(data_link_info->description);
- } else {
- gchar *str;
- /* XXX - should we just omit them? */
- str = g_strdup_printf("%s (not supported)", data_link_info->name);
- ws_combo_box_append_text_and_pointer_full(GTK_COMBO_BOX(linktype_combo_box),
- NULL,
- str,
- GINT_TO_POINTER(-1), /* Flag as "not supported" */
- FALSE);
- linkr->dlt = -1;
- linkr->name = g_strdup(str);
- g_free(str);
- }
- device.links = g_list_append(device.links, linkr);
- linktype_count++;
- }
- free_if_capabilities(caps);
- } else {
- /* We don't know whether this supports monitor mode or not;
- don't ask for monitor mode. */
- device.monitor_mode_enabled = FALSE;
- device.monitor_mode_supported = FALSE;
- }
- gtk_widget_set_sensitive(linktype_lb, linktype_count >= 2);
- gtk_widget_set_sensitive(linktype_combo_box, linktype_count >= 2);
- ws_combo_box_set_active(GTK_COMBO_BOX(linktype_combo_box),0);
- g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
-}
-#endif
-
-/*
- * Adjust the sensitivity of various widgets as per the current setting
- * of other widgets.
- */
-static void
-capture_prep_adjust_sensitivity(GtkWidget *tb _U_, gpointer parent_w)
-{
- GtkWidget *multi_files_on_cb, *ringbuffer_nbf_cb, *ringbuffer_nbf_sb, *ringbuffer_nbf_lb,
- *ring_filesize_cb, *ring_filesize_sb, *ring_filesize_cbx,
- *file_interval_cb, *file_interval_sb, *file_interval_cbx,
- *sync_cb, *auto_scroll_cb,
- *stop_packets_cb, *stop_packets_sb, *stop_packets_lb,
- *stop_filesize_cb, *stop_filesize_sb, *stop_filesize_cbx,
- *stop_duration_cb, *stop_duration_sb, *stop_duration_cbx,
- *stop_files_cb, *stop_files_sb, *stop_files_lb;
-
- multi_files_on_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_MULTI_FILES_ON_CB_KEY);
- ringbuffer_nbf_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_CB_KEY);
- ringbuffer_nbf_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_SB_KEY);
- ringbuffer_nbf_lb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_NBF_LB_KEY);
- ring_filesize_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_CB_KEY);
- ring_filesize_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_SB_KEY);
- ring_filesize_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_RING_FILESIZE_CBX_KEY);
- file_interval_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_INTERVAL_CB_KEY);
- file_interval_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_INTERVAL_SB_KEY);
- file_interval_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_FILE_INTERVAL_CBX_KEY);
- sync_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SYNC_KEY);
- auto_scroll_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_AUTO_SCROLL_KEY);
- stop_packets_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_CB_KEY);
- stop_packets_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_SB_KEY);
- stop_packets_lb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_PACKETS_LB_KEY);
- stop_filesize_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_CB_KEY);
- stop_filesize_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_SB_KEY);
- stop_filesize_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILESIZE_CBX_KEY);
- stop_duration_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_CB_KEY);
- stop_duration_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_SB_KEY);
- stop_duration_cbx = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_DURATION_CBX_KEY);
- stop_files_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_CB_KEY);
- stop_files_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_SB_KEY);
- stop_files_lb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_STOP_FILES_LB_KEY);
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sync_cb))) {
- /* "Update list of packets in real time" captures enabled; we don't
- support ring buffer mode for those captures, so turn ring buffer
- mode off if it's on, and make its toggle button, and the spin
- button for the number of ring buffer files (and the spin button's
- label), insensitive. */
-#if 0
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(multi_files_on_cb), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(multi_files_on_cb), FALSE);
-#endif
-
- /* Auto-scroll mode is meaningful only in "Update list of packets
- in real time" captures, so make its toggle button sensitive. */
- gtk_widget_set_sensitive(GTK_WIDGET(auto_scroll_cb), TRUE);
-
- /*gtk_widget_set_sensitive(GTK_WIDGET(hide_info_cb), TRUE);*/
- } else {
- /* "Update list of packets in real time" captures disabled; that
- means ring buffer mode is OK, so make its toggle button
- sensitive. */
-/* gtk_widget_set_sensitive(GTK_WIDGET(multi_files_on_cb), TRUE);*/
-
- /* Auto-scroll mode is meaningful only in "Update list of packets
- in real time" captures, so make its toggle button insensitive. */
- gtk_widget_set_sensitive(GTK_WIDGET(auto_scroll_cb), FALSE);
-
- /*gtk_widget_set_sensitive(GTK_WIDGET(hide_info_cb), FALSE);*/
- }
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(multi_files_on_cb))) {
- /* Ring buffer mode enabled. */
-
- /* Force at least one of the "file switch" conditions (we need at least one) */
- if ((gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ring_filesize_cb)) == FALSE) &&
- (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(file_interval_cb)) == FALSE)) {
- if (tb == ring_filesize_cb)
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(file_interval_cb), TRUE);
- else
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ring_filesize_cb), TRUE);
- }
-
- gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_cb), TRUE);
- gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_sb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ringbuffer_nbf_cb)));
- gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_lb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ringbuffer_nbf_cb)));
-
- /* The ring filesize spinbox is sensitive if the "Next capture file
- after N kilobytes" checkbox is on. */
- gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_cb), TRUE);
- gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_sb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ring_filesize_cb)));
- gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_cbx),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ring_filesize_cb)));
-
- /* The ring interval spinbox is sensitive if the "Next capture file
- after N seconds" checkbox is on. */
- gtk_widget_set_sensitive(GTK_WIDGET(file_interval_cb), TRUE);
- gtk_widget_set_sensitive(GTK_WIDGET(file_interval_sb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(file_interval_cb)));
- gtk_widget_set_sensitive(GTK_WIDGET(file_interval_cbx),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(file_interval_cb)));
-
- gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_cb), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_sb), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_cbx), FALSE);
-
- gtk_widget_set_sensitive(GTK_WIDGET(stop_files_cb), TRUE);
- gtk_widget_set_sensitive(GTK_WIDGET(stop_files_sb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_files_cb)));
- gtk_widget_set_sensitive(GTK_WIDGET(stop_files_lb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_files_cb)));
- } else {
- /* Ring buffer mode disabled. */
- gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_cb), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_sb), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(ringbuffer_nbf_lb), FALSE);
-
- gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_cb), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_sb),FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(ring_filesize_cbx),FALSE);
-
- gtk_widget_set_sensitive(GTK_WIDGET(file_interval_cb), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(file_interval_sb),FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(file_interval_cbx),FALSE);
-
- /* The maximum file size spinbox is sensitive if the "Stop capture
- after N kilobytes" checkbox is on. */
- gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_cb), TRUE);
- gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_sb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_filesize_cb)));
- gtk_widget_set_sensitive(GTK_WIDGET(stop_filesize_cbx),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_filesize_cb)));
-
- gtk_widget_set_sensitive(GTK_WIDGET(stop_files_cb), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(stop_files_sb), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(stop_files_lb), FALSE);
- }
-
- /* The maximum packet count spinbox is sensitive if the "Stop capture
- after N packets" checkbox is on. */
- gtk_widget_set_sensitive(GTK_WIDGET(stop_packets_sb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_packets_cb)));
- gtk_widget_set_sensitive(GTK_WIDGET(stop_packets_lb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_packets_cb)));
-
- /* The capture duration spinbox is sensitive if the "Stop capture
- after N seconds" checkbox is on. */
- gtk_widget_set_sensitive(GTK_WIDGET(stop_duration_sb),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_duration_cb)));
- gtk_widget_set_sensitive(GTK_WIDGET(stop_duration_cbx),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_duration_cb)));
-}
-
-gboolean capture_dlg_window_present(void)
-{
- return (cap_open_w?TRUE:FALSE);
-}
-
-/*
- * Refresh everything visible that shows an interface list that
- * includes local interfaces.
- */
-void
-refresh_local_interface_lists(void)
-{
- /* Reload the local interface list. */
- scan_local_interfaces(main_window_update);
-
- /* If there's an interfaces dialog up, refresh it. */
- if (interfaces_dialog_window_present())
- refresh_if_window();
-
- /* If there's a capture options dialog up, refresh it. */
- if (capture_dlg_window_present())
- capture_dlg_refresh_if();
-
- /* If the welcome screen is up, refresh its interface list. */
- if (get_welcome_window() != NULL)
- welcome_if_panel_reload();
-
- /* Refresh the 802.11 toolbar. */
- tb80211_refresh_interfaces();
-}
-
-/*
- * Refresh everything visible that shows an interface list that
- * includes non-local interfaces.
- */
-void
-refresh_non_local_interface_lists(void)
-{
- /* If there's a capture options dialog up, refresh it. */
- if (capture_dlg_window_present())
- capture_dlg_refresh_if();
-
- /* If the welcome screen is up, refresh its interface list. */
- if (get_welcome_window() != NULL)
- welcome_if_panel_reload();
-}
-
-#endif /* HAVE_LIBPCAP */
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/capture_dlg.h b/ui/gtk/capture_dlg.h
deleted file mode 100644
index 0dfeea5a93..0000000000
--- a/ui/gtk/capture_dlg.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/* capture_dlg.h
- * Definitions for the "Capture Options" dialog and dialog windows popped
- * up from it
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __CAPTURE_DLG_H__
-#define __CAPTURE_DLG_H__
-
-/* extern GtkWidget* wireless_tb; */
-
-/** @file
- * "Capture Options" dialog box.
- * @ingroup dialog_group
- */
-#include "capture_opts.h"
-#include <gtk/gtk.h>
-#include "ws_attributes.h"
-
-#define CR_MAIN_NB "compile_results_main_notebook"
-
-/** Initialize background capture filter syntax checking
- */
-void capture_filter_init(void);
-
-/** User requested the "Capture Options" dialog box by menu or toolbar.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-void capture_prep_cb(GtkWidget *widget, gpointer data);
-
-/** User requested capture start by menu or toolbar.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-void capture_start_cb(GtkWidget *widget, gpointer data);
-
-/** User requested capture stop by menu or toolbar.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-void capture_stop_cb(GtkWidget *widget, gpointer data);
-
-/** User requested capture restart by menu or toolbar.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-void capture_restart_cb(GtkWidget *widget, gpointer data);
-
-/** User requested the "Capture Airpcap" dialog box by menu or toolbar.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-void
-capture_air_cb(GtkWidget *widget, gpointer data);
-
-gboolean
-capture_dlg_window_present(void);
-
-void
-enable_selected_interface(gchar *name, gboolean selected);
-
-void
-options_interface_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *column _U_, gpointer userdata);
-
-void
-capture_dlg_refresh_if(void);
-
-void
-update_visible_columns_menu (void);
-
-void
-update_visible_tree_view_columns(void);
-
-/*
- * Refresh everything visible that shows an interface list that
- * includes local interfaces.
- */
-extern void refresh_local_interface_lists(void);
-
-/*
- * Refresh everything visible that shows an interface list that
- * includes non-local interfaces.
- */
-extern void refresh_non_local_interface_lists(void);
-
-#endif /* capture_dlg.h */
diff --git a/ui/gtk/capture_file_dlg.c b/ui/gtk/capture_file_dlg.c
deleted file mode 100644
index bae633e28e..0000000000
--- a/ui/gtk/capture_file_dlg.c
+++ /dev/null
@@ -1,2365 +0,0 @@
-/* capture_file_dlg.c
- * Dialog boxes for handling capture files
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <wsutil/filesystem.h>
-#include <epan/prefs.h>
-
-#include "globals.h"
-#include <epan/color_filters.h>
-
-#include <wsutil/file_util.h>
-
-#include "ui/util.h"
-#include "ui/alert_box.h"
-#include "ui/simple_dialog.h"
-#include "ui/file_dialog.h"
-#include "ui/recent.h"
-#include "ui/ws_ui_util.h"
-
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/old-gtk-compat.h"
-#include "ui/gtk/keys.h"
-#include "ui/gtk/filter_dlg.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/file_dlg.h"
-#include "ui/gtk/capture_file_dlg.h"
-#include "ui/gtk/drag_and_drop.h"
-#include "ui/gtk/export_pdu_dlg.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/color_dlg.h"
-#include "ui/gtk/packet_list.h"
-#ifdef HAVE_LIBPCAP
-#include "ui/gtk/capture_dlg.h"
-#endif
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/range_utils.h"
-#include "ui/gtk/filter_autocomplete.h"
-
-#ifdef _WIN32
-#define USE_WIN32_FILE_DIALOGS
-#endif
-
-#ifdef USE_WIN32_FILE_DIALOGS
-#include <gdk/gdkwin32.h>
-#include <windows.h>
-#include "ui/win32/file_dlg_win32.h"
-#endif
-
-static gboolean do_file_save(capture_file *cf, gboolean dont_reopen);
-static gboolean file_save_as_cmd(capture_file *cf,
- gboolean must_support_all_comments,
- gboolean dont_reopen);
-static void file_select_file_type_cb(GtkWidget *w, gpointer data);
-static int set_file_type_list(GtkWidget *combo_box, capture_file *cf,
- gboolean must_support_all_comments);
-static gboolean test_file_close(capture_file *cf, gboolean from_quit,
- const char *before_what);
-
-#define E_FILE_TYPE_COMBO_BOX_KEY "file_type_combo_box"
-#define E_COMPRESSED_CB_KEY "compressed_cb"
-
-#define PREVIEW_TABLE_KEY "preview_table_key"
-#define PREVIEW_FORMAT_KEY "preview_format_key"
-#define PREVIEW_SIZE_KEY "preview_size_key"
-#define PREVIEW_DATA_RECORDS_KEY "preview_data_records_key"
-#define PREVIEW_FIRST_ELAPSED_KEY "preview_first_elapsed_key"
-
-/* XXX - can we make these not be static? */
-static gboolean color_selected;
-
-#define PREVIEW_STR_MAX 200
-
-
-/* set a new filename for the preview widget */
-static wtap *
-preview_set_filename(GtkWidget *prev, const gchar *cf_name)
-{
- GtkWidget *label;
- wtap *wth;
- int err = 0;
- gchar *err_info;
- gchar string_buff[PREVIEW_STR_MAX];
- gint64 filesize;
-
-
- /* init preview labels */
- label = (GtkWidget *)g_object_get_data(G_OBJECT(prev), PREVIEW_FORMAT_KEY);
- gtk_label_set_text(GTK_LABEL(label), "-");
- label = (GtkWidget *)g_object_get_data(G_OBJECT(prev), PREVIEW_SIZE_KEY);
- gtk_label_set_text(GTK_LABEL(label), "-");
- label = (GtkWidget *)g_object_get_data(G_OBJECT(prev), PREVIEW_DATA_RECORDS_KEY);
- gtk_label_set_text(GTK_LABEL(label), "-");
- label = (GtkWidget *)g_object_get_data(G_OBJECT(prev), PREVIEW_FIRST_ELAPSED_KEY);
- gtk_label_set_text(GTK_LABEL(label), "-");
-
- if (!cf_name) {
- return NULL;
- }
-
- if (test_for_directory(cf_name) == EISDIR) {
- label = (GtkWidget *)g_object_get_data(G_OBJECT(prev), PREVIEW_FORMAT_KEY);
- gtk_label_set_text(GTK_LABEL(label), "directory");
- return NULL;
- }
-
- wth = wtap_open_offline(cf_name, WTAP_TYPE_AUTO, &err, &err_info, TRUE);
- if (wth == NULL) {
- label = (GtkWidget *)g_object_get_data(G_OBJECT(prev), PREVIEW_FORMAT_KEY);
- if (err == WTAP_ERR_FILE_UNKNOWN_FORMAT) {
- gtk_label_set_text(GTK_LABEL(label), "unknown file format");
- } else {
- gtk_label_set_text(GTK_LABEL(label), "error opening file");
- }
- return NULL;
- }
-
- /* Find the size of the file. */
- filesize = wtap_file_size(wth, &err);
- if (filesize == -1) {
- gtk_label_set_text(GTK_LABEL(label), "error getting file size");
- wtap_close(wth);
- return NULL;
- }
- g_snprintf(string_buff, PREVIEW_STR_MAX, "%" G_GINT64_MODIFIER "d bytes", filesize);
- label = (GtkWidget *)g_object_get_data(G_OBJECT(prev), PREVIEW_SIZE_KEY);
- gtk_label_set_text(GTK_LABEL(label), string_buff);
-
- /* type */
- g_strlcpy(string_buff, wtap_file_type_subtype_string(wtap_file_type_subtype(wth)), PREVIEW_STR_MAX);
- label = (GtkWidget *)g_object_get_data(G_OBJECT(prev), PREVIEW_FORMAT_KEY);
- gtk_label_set_text(GTK_LABEL(label), string_buff);
-
- return wth;
-}
-
-
-/* do a preview run on the currently selected capture file */
-static void
-preview_do(GtkWidget *prev, wtap *wth)
-{
- GtkWidget *label;
- int err;
- gchar *err_info;
- ws_file_preview_stats stats;
- ws_file_preview_stats_status status;
- gchar string_buff[PREVIEW_STR_MAX];
- gchar first_buff[PREVIEW_STR_MAX];
- time_t ti_time;
- struct tm *ti_tm;
- unsigned int elapsed_time;
-
- status = get_stats_for_preview(wth, &stats, &err, &err_info);
-
- if(status == PREVIEW_READ_ERROR) {
- /* XXX - give error details? */
- g_free(err_info);
- g_snprintf(string_buff, PREVIEW_STR_MAX, "error after reading %u records", stats.records);
- label = (GtkWidget *)g_object_get_data(G_OBJECT(prev), PREVIEW_DATA_RECORDS_KEY);
- gtk_label_set_text(GTK_LABEL(label), string_buff);
- wtap_close(wth);
- return;
- }
-
- /* packet count */
- if(status == PREVIEW_TIMED_OUT) {
- g_snprintf(string_buff, PREVIEW_STR_MAX, "more than %u data records (preview timeout)", stats.data_records);
- } else {
- g_snprintf(string_buff, PREVIEW_STR_MAX, "%u", stats.data_records);
- }
- label = (GtkWidget *)g_object_get_data(G_OBJECT(prev), PREVIEW_DATA_RECORDS_KEY);
- gtk_label_set_text(GTK_LABEL(label), string_buff);
-
- /* First packet */
- if(stats.have_times) {
- /*
- * We saw at least one record with a time stamp, so we can give
- * a start time (if we have a mix of records with and without
- * time stamps, and there were records without time stamps
- * before the one with a time stamp, this may be inaccurate).
- */
- ti_time = (long)stats.start_time;
- ti_tm = localtime( &ti_time );
- if (ti_tm) {
- g_snprintf(first_buff, PREVIEW_STR_MAX,
- "%04d-%02d-%02d %02d:%02d:%02d",
- ti_tm->tm_year + 1900,
- ti_tm->tm_mon + 1,
- ti_tm->tm_mday,
- ti_tm->tm_hour,
- ti_tm->tm_min,
- ti_tm->tm_sec);
- } else {
- g_snprintf(first_buff, PREVIEW_STR_MAX, "?");
- }
- } else {
- g_snprintf(first_buff, PREVIEW_STR_MAX, "unknown");
- }
-
- /* Elapsed time */
- if(status == PREVIEW_SUCCEEDED && stats.have_times) {
- /*
- * We didn't time out, so we looked at all packets, and we got
- * at least one packet with a time stamp, so we can calculate
- * an elapsed time from the time stamp of the last packet with
- * with a time stamp (if we have a mix of records with and without
- * time stamps, and there were records without time stamps after
- * the last one with a time stamp, this may be inaccurate).
- */
- elapsed_time = (unsigned int)(stats.stop_time-stats.start_time);
- if (elapsed_time/86400) {
- g_snprintf(string_buff, PREVIEW_STR_MAX, "%s / %02u days %02u:%02u:%02u",
- first_buff, elapsed_time/86400, elapsed_time%86400/3600, elapsed_time%3600/60, elapsed_time%60);
- } else {
- g_snprintf(string_buff, PREVIEW_STR_MAX, "%s / %02u:%02u:%02u",
- first_buff, elapsed_time%86400/3600, elapsed_time%3600/60, elapsed_time%60);
- }
- } else {
- g_snprintf(string_buff, PREVIEW_STR_MAX, "%s / unknown", first_buff);
- }
- label = (GtkWidget *)g_object_get_data(G_OBJECT(prev), PREVIEW_FIRST_ELAPSED_KEY);
- gtk_label_set_text(GTK_LABEL(label), string_buff);
-
- wtap_close(wth);
-}
-
-#if 0
-/* as the dialog layout will look very ugly when using the file chooser preview mechanism,
- simply use the same layout as in GTK2.0 */
-static void
-update_preview_cb (GtkFileChooser *file_chooser, gpointer data)
-{
- GtkWidget *prev = GTK_WIDGET(data);
- char *cf_name;
- gboolean have_preview;
-
- cf_name = gtk_file_chooser_get_preview_filename(file_chooser);
-
- have_preview = preview_set_filename(prev, cf_name);
-
- g_free(cf_name);
-
- have_preview = TRUE;
- gtk_file_chooser_set_preview_widget_active(file_chooser, have_preview);
-}
-#endif
-
-
-/* the filename text entry changed */
-static void
-file_open_entry_changed(GtkWidget *w _U_, gpointer file_sel)
-{
- GtkWidget *prev = (GtkWidget *)g_object_get_data(G_OBJECT(file_sel), PREVIEW_TABLE_KEY);
- gchar *cf_name;
- gboolean have_preview;
- wtap *wth;
-
- /* get the filename */
- cf_name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file_sel));
-
- /* set the filename to the preview */
- wth = preview_set_filename(prev, cf_name);
- have_preview = (wth != NULL);
-
- g_free(cf_name);
-
- /* make the preview widget sensitive */
- gtk_widget_set_sensitive(prev, have_preview);
-
- /*
- * XXX - if the Open button isn't sensitive, you can't type into
- * the location bar and select the file or directory you've typed.
- * See
- *
- * https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=1791
- *
- * It's not as if allowing users to click Open when they've
- * selected a file that's not a valid capture file will cause
- * anything worse than an error dialog, so we'll leave the Open
- * button sensitive for now. Perhaps making it sensitive if
- * cf_name is NULL would also work, although I don't know whether
- * there are any cases where it would be non-null when you've
- * typed in the location bar.
- *
- * XXX - Bug 1791 also notes that, with the line removed, Bill
- * Meier "somehow managed to get the file chooser window somewhat
- * wedged in that neither the cancel or open buttons were responsive".
- * That seems a bit odd, given that, without this line, we're not
- * monkeying with the Open button's sensitivity, but...
- */
-#if 0
- /* make the open/save/... dialog button sensitive */
-
- gtk_dialog_set_response_sensitive(file_sel, GTK_RESPONSE_ACCEPT, have_preview);
-#endif
-
- /* do the actual preview */
- if (have_preview)
- preview_do(prev, wth);
-}
-
-
-/* copied from summary_dlg.c */
-static GtkWidget *
-add_string_to_grid_sensitive(GtkWidget *grid, guint *row, const gchar *title, const gchar *value, gboolean sensitive)
-{
- GtkWidget *label;
- gchar *indent;
-
- if (strlen(value) != 0) {
- indent = g_strdup_printf(" %s", title);
- } else {
- indent = g_strdup(title);
- }
- label = gtk_label_new(indent);
- g_free(indent);
- gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
- gtk_widget_set_sensitive(label, sensitive);
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 0, *row, 1, 1);
-
- label = gtk_label_new(value);
- gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
- gtk_widget_set_sensitive(label, sensitive);
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 1, *row, 1, 1);
-
- *row = *row + 1;
-
- return label;
-}
-
-static GtkWidget *
-add_string_to_grid(GtkWidget *grid, guint *row, const gchar *title, const gchar *value)
-{
- return add_string_to_grid_sensitive(grid, row, title, value, TRUE);
-}
-
-
-
-static GtkWidget *
-preview_new(void)
-{
- GtkWidget *grid, *label;
- guint row;
-
- grid = ws_gtk_grid_new();
- ws_gtk_grid_set_column_spacing(GTK_GRID(grid), 6);
- ws_gtk_grid_set_row_spacing(GTK_GRID(grid), 3);
- row = 0;
-
- label = add_string_to_grid(grid, &row, "Format:", "-");
- g_object_set_data(G_OBJECT(grid), PREVIEW_FORMAT_KEY, label);
- label = add_string_to_grid(grid, &row, "Size:", "-");
- g_object_set_data(G_OBJECT(grid), PREVIEW_SIZE_KEY, label);
- label = add_string_to_grid(grid, &row, "Packets:", "-");
- g_object_set_data(G_OBJECT(grid), PREVIEW_DATA_RECORDS_KEY, label);
- label = add_string_to_grid(grid, &row, "Start / elapsed:", "-");
- g_object_set_data(G_OBJECT(grid), PREVIEW_FIRST_ELAPSED_KEY, label);
-
- return grid;
-}
-
-#ifndef USE_WIN32_FILE_DIALOGS
-
-/*
- ------------------------------------------------
- |top_level win |
- | ------------------------------------------- |
- | |file_chooser_dialog [vbox] | |
- | | -------------------------------------- | |
- | | |[file_browser] T/T | | |
- | | | | | |
- | | | | | |
- | | | | | |
- | | -------------------------------------- | |
- | | | |
- | | -------------------------------------- | |
- | | |[alignment] F/F | | |
- | | | -------------------------------- | | |
- | | | |main_hb [extra_widget] | | | |
- | | | | ------------- ---------- | | | |
- | | | | |main_vb F/F| |grid F/F| | | | |
- | | | | | item | | row | | | | |
- | | | | | item | | row | | | | |
- | | | | | item | | row | | | | |
- | | | | | item | | row | | | | |
- | | | | | item | | row | | | | |
- | | | | ------------- ---------- | | | |
- | | | -------------------------------- | | |
- | | -------------------------------------- | |
- | | | |
- | | -------------------------------------- | |
- | | |btn_row F/F | | |
- | | -------------------------------------- | |
- | ------------------------------------------- |
- ------------------------------------------------
-
- Notes:
- 1. T/T & F/F above refer to the
- gtk_box_pack_start() 'expand'/'fill' args
- used to pack the widget into the enclosing GtkBox.
- 2. The 'Alignment' widget is actually internal to
- the GtkFileChooser widget.
-
- Gtk3: Expand/Fill effect
-
- Vertical
- (file_chooser): expand/fills.
- main_hb does not expand/fill [explicitly set via vexpand = FALSE].
- btn_row does not expand/fill.
- So: vertical resize (drog lower edge down).
- expands (file_chooser) but leaves others as is.
- Also: grid rows are "vexpand' so grid
- vertically epands/fills in main_hb.
- That is: it will be the same height as
- the main_vb.
- Since vexpand is "inherited upwards", main_hb vexpand set to FALSE
- to prevent vertical expansion of same.
-
- Horizontal
- (file_chooser) & btn_row: expand/fill.
- main_vb & grid do not expand.
- So: horizontal resize (drag right edge to the right)
- expands all but the "extra widget".
-*/
-
-/* Open a file */
-static gboolean
-gtk_open_file(GtkWidget *w, GString *file_name, gint *type, GString *display_filter)
-{
- GtkWidget *file_open_w;
- GtkWidget *main_hb, *main_vb, *filter_hbox, *filter_bt, *filter_te;
- GtkWidget *prev;
- GtkWidget *format_type_co;
- GtkCellRenderer *cell;
- gint i;
-
- /* No Apply button, and "OK" just sets our text widget, it doesn't
- activate it (i.e., it doesn't cause us to try to open the file). */
- static construct_args_t args = {
- "Wireshark: Display Filter",
- FALSE,
- FALSE,
- TRUE
- };
- gchar *cf_name;
-
- if (!file_name || !display_filter)
- return FALSE;
-
- file_open_w = file_selection_new("Wireshark: Open Capture File",
- GTK_WINDOW(top_level),
- FILE_SELECTION_OPEN);
- /* it's annoying, that the file chooser dialog is already shown here,
- so we cannot use the correct gtk_window_set_default_size() to resize it */
- gtk_widget_set_size_request(file_open_w, DEF_WIDTH, DEF_HEIGHT);
-
- if (file_name->len > 0) {
- gchar *dirname = g_path_get_dirname(file_name->str);
-
- file_selection_set_current_folder(file_open_w, dirname);
- g_free(dirname);
- } else {
- switch (prefs.gui_fileopen_style) {
-
- case FO_STYLE_LAST_OPENED:
- /* The user has specified that we should start out in the last directory
- we looked in. If we've already opened a file, use its containing
- directory, if we could determine it, as the directory, otherwise
- use the "last opened" directory saved in the preferences file if
- there was one. */
- /* This is now the default behaviour in file_selection_new() */
- break;
-
- case FO_STYLE_SPECIFIED:
- /* The user has specified that we should always start out in a
- specified directory; if they've specified that directory,
- start out by showing the files in that dir. */
- if (prefs.gui_fileopen_dir[0] != '\0')
- file_selection_set_current_folder(file_open_w, prefs.gui_fileopen_dir);
- break;
- }
- }
-
- main_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_set_vexpand(main_hb, FALSE); /* prevents "inheritance" from child VEXPAND */
- /* so hbox doesn't expand vertically even */
- /* tho grid rows have VEXPAND. */
-#endif
- file_selection_set_extra_widget(file_open_w, main_hb);
- gtk_widget_show(main_hb);
-
- /* Container for each row of widgets */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_box_pack_start(GTK_BOX(main_hb), main_vb, FALSE, FALSE, 0);
- gtk_widget_show(main_vb);
-
- format_type_co = gtk_combo_box_text_new();
- cell = gtk_cell_renderer_text_new();
- gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(format_type_co), cell, TRUE);
-
- gtk_widget_set_tooltip_text(format_type_co, "Format type of capture file");
- gtk_box_pack_start(GTK_BOX(main_vb), format_type_co, FALSE, FALSE, 0);
-
- gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(format_type_co), (const gchar *) "Automatically detect file type");
- for (i = 0; open_routines[i].name != NULL; i += 1) {
- gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(format_type_co), open_routines[i].name);
- }
-
- gtk_combo_box_set_active(GTK_COMBO_BOX(format_type_co), 0);
- gtk_widget_show(format_type_co);
-
- /* Filter row */
- filter_hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(filter_hbox), 0);
- gtk_box_pack_start(GTK_BOX(main_vb), filter_hbox, FALSE, FALSE, 0);
- gtk_widget_show(filter_hbox);
-
- filter_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_DISPLAY_FILTER_ENTRY);
- g_signal_connect(filter_bt, "clicked",
- G_CALLBACK(display_filter_construct_cb), &args);
- g_signal_connect(filter_bt, "destroy",
- G_CALLBACK(filter_button_destroy_cb), NULL);
- gtk_box_pack_start(GTK_BOX(filter_hbox), filter_bt, FALSE, FALSE, 0);
- gtk_widget_show(filter_bt);
- gtk_widget_set_tooltip_text(filter_bt, "Open the \"Display Filter\" dialog to edit/apply filters");
-
- filter_te = gtk_entry_new();
- g_object_set_data(G_OBJECT(filter_bt), E_FILT_TE_PTR_KEY, filter_te);
- gtk_box_pack_start(GTK_BOX(filter_hbox), filter_te, TRUE, TRUE, 3);
- g_signal_connect(filter_te, "changed",
- G_CALLBACK(filter_te_syntax_check_cb), NULL);
- g_object_set_data(G_OBJECT(filter_hbox), E_FILT_AUTOCOMP_PTR_KEY, NULL);
- g_signal_connect(filter_te, "key-press-event", G_CALLBACK(filter_string_te_key_pressed_cb), NULL);
- g_signal_connect(file_open_w, "key-press-event", G_CALLBACK(filter_parent_dlg_key_pressed_cb), NULL);
- colorize_filter_te_as_empty(filter_te);
- gtk_entry_set_text(GTK_ENTRY(filter_te), display_filter->str);
- gtk_widget_show(filter_te);
- gtk_widget_set_tooltip_text(filter_te, "Enter a display filter.");
-
- g_object_set_data(G_OBJECT(file_open_w), E_RFILTER_TE_KEY, filter_te);
-
- /* Preview widget */
- prev = preview_new();
- g_object_set_data(G_OBJECT(file_open_w), PREVIEW_TABLE_KEY, prev);
- gtk_widget_show_all(prev);
- gtk_box_pack_start(GTK_BOX(main_hb), prev, FALSE, FALSE, 0);
-
- g_signal_connect(GTK_FILE_CHOOSER(file_open_w), "selection-changed",
- G_CALLBACK(file_open_entry_changed), file_open_w);
- file_open_entry_changed(file_open_w, file_open_w);
-
- g_object_set_data(G_OBJECT(file_open_w), E_DFILTER_TE_KEY,
- g_object_get_data(G_OBJECT(w), E_DFILTER_TE_KEY));
-
- cf_name = file_selection_run(file_open_w);
-
- if (cf_name == NULL) {
- /* User cancelled or closed the dialog. */
- return FALSE;
- }
-
- g_string_printf(file_name, "%s", cf_name);
- g_free(cf_name);
- g_string_printf(display_filter, "%s", gtk_entry_get_text(GTK_ENTRY(filter_te)));
-
- *type = gtk_combo_box_get_active((GtkComboBox *) format_type_co);
-
- /* We've crossed the Rubicon; get rid of the file selection box. */
- window_destroy(GTK_WIDGET(file_open_w));
-
- return TRUE;
-}
-#endif /* USE_WIN32_FILE_DIALOGS */
-
-/* Open a file */
-
-/*
- * <platform/>_open_file routines should upon entry...
- * Set the path and fill in the filename if the path+filename is provided.
- * Set the display filter if provided. Filter syntax should be checked.
- * ...and upon exit...
- * Return TRUE on "OK" and "FALSE" on "Cancel".
- * Close the window.
- */
-
-static void
-file_open_cmd(capture_file *cf, GtkWidget *w _U_)
-{
- GString *file_name = g_string_new("");
- GString *display_filter = g_string_new("");
- dfilter_t *rfcode = NULL;
- gchar *err_msg;
- int err;
- int type = WTAP_TYPE_AUTO;
-
- /*
- * Loop until the user either selects a file or gives up.
- */
- for (;;) {
-#ifdef USE_WIN32_FILE_DIALOGS
- if (win32_open_file(GDK_WINDOW_HWND(gtk_widget_get_window(top_level)), file_name, &type, display_filter)) {
-#else /* USE_WIN32_FILE_DIALOGS */
- if (gtk_open_file(top_level, file_name, &type, display_filter)) {
-#endif /* USE_WIN32_FILE_DIALOGS */
-
- /* Only close the old file now that we know we want to open another one. */
- cf_close(cf);
- /* apply our filter */
- if (dfilter_compile(display_filter->str, &rfcode, &err_msg)) {
- cf_set_rfcode(&cfile, 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, display_filter->str, err_msg);
- g_free(err_msg);
- continue;
- }
-
- /* Try to open the capture file. This closes the current file if it succeeds. */
- if (cf_open(&cfile, file_name->str, type, FALSE, &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. */
- if (rfcode != NULL){
- dfilter_free(rfcode);
- rfcode = NULL;
- }
- continue;
- }
-
- switch (cf_read(&cfile, 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_string_free(file_name, TRUE);
- g_string_free(display_filter, TRUE);
- return;
- }
- /* Save the name of the containing directory specified in the path name,
- if any; we can write over cf_name, which is a good thing, given that
- "get_dirname()" does write over its argument. */
- set_last_open_dir(get_dirname(file_name->str));
- }
- g_string_free(file_name, TRUE);
- g_string_free(display_filter, TRUE);
- return;
- }
-}
-
-void
-file_open_cmd_cb(GtkWidget *widget, gpointer data _U_) {
- /* If there's unsaved data, let the user save it first.
- If they cancel out of it, don't quit. */
- if (test_file_close(&cfile, FALSE, " before opening a new capture file"))
- file_open_cmd(&cfile, widget);
-}
-
-#ifndef USE_WIN32_FILE_DIALOGS
-static gboolean
-gtk_merge_file(GtkWidget *w, GString *file_name, GString *display_filter, int *merge_type)
-{
- GtkWidget *file_merge_w;
- GtkWidget *main_hb, *main_vb, *filter_hbox, *filter_bt, *filter_te;
- GtkWidget *prepend_rb, *chrono_rb, *append_rb, *prev;
-
- /* No Apply button, and "OK" just sets our text widget, it doesn't
- activate it (i.e., it doesn't cause us to try to open the file). */
- static construct_args_t args = {
- "Wireshark: Display Filter",
- FALSE,
- FALSE,
- TRUE
- };
- gchar *cf_name;
-
- if (!file_name || !display_filter || !merge_type)
- return FALSE;
-
- /* Default to saving all packets, in the file's current format. */
-
- file_merge_w = file_selection_new("Wireshark: Merge with Capture File",
- GTK_WINDOW(top_level),
- FILE_SELECTION_OPEN);
- /* it's annoying, that the file chooser dialog is already shown here,
- so we cannot use the correct gtk_window_set_default_size() to resize it */
- gtk_widget_set_size_request(file_merge_w, DEF_WIDTH, DEF_HEIGHT);
-
- if (file_name->len > 0) {
- gchar *dirname = g_path_get_dirname(file_name->str);
-
- file_selection_set_current_folder(file_merge_w, dirname);
- g_free(dirname);
- } else {
- switch (prefs.gui_fileopen_style) {
-
- case FO_STYLE_LAST_OPENED:
- /* The user has specified that we should start out in the last directory
- we looked in. If we've already opened a file, use its containing
- directory, if we could determine it, as the directory, otherwise
- use the "last opened" directory saved in the preferences file if
- there was one. */
- /* This is now the default behaviour in file_selection_new() */
- break;
-
- case FO_STYLE_SPECIFIED:
- /* The user has specified that we should always start out in a
- specified directory; if they've specified that directory,
- start out by showing the files in that dir. */
- if (prefs.gui_fileopen_dir[0] != '\0')
- file_selection_set_current_folder(file_merge_w, prefs.gui_fileopen_dir);
- break;
- }
- }
-
- main_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_set_vexpand(main_hb, FALSE); /* prevents "inheritance" from child VEXPAND */
- /* so hbox doesn't expand vertically even */
- /* tho grid rows have VEXPAND. */
-#endif
- file_selection_set_extra_widget(file_merge_w, main_hb);
- gtk_widget_show(main_hb);
-
- /* Container for each row of widgets */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_box_pack_start(GTK_BOX(main_hb), main_vb, FALSE, FALSE, 0);
- gtk_widget_show(main_vb);
-
- /* Filter row */
- filter_hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(filter_hbox), 0);
- gtk_box_pack_start(GTK_BOX(main_vb), filter_hbox, FALSE, FALSE, 0);
- gtk_widget_show(filter_hbox);
-
- filter_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_DISPLAY_FILTER_ENTRY);
- g_signal_connect(filter_bt, "clicked",
- G_CALLBACK(display_filter_construct_cb), &args);
- g_signal_connect(filter_bt, "destroy",
- G_CALLBACK(filter_button_destroy_cb), NULL);
- gtk_box_pack_start(GTK_BOX(filter_hbox), filter_bt, FALSE, TRUE, 0);
- gtk_widget_show(filter_bt);
- gtk_widget_set_tooltip_text(filter_bt, "Open the \"Display Filter\" dialog to edit/apply filters");
-
- filter_te = gtk_entry_new();
- g_object_set_data(G_OBJECT(filter_bt), E_FILT_TE_PTR_KEY, filter_te);
- gtk_box_pack_start(GTK_BOX(filter_hbox), filter_te, TRUE, TRUE, 3);
- g_signal_connect(filter_te, "changed",
- G_CALLBACK(filter_te_syntax_check_cb), NULL);
- g_object_set_data(G_OBJECT(filter_hbox), E_FILT_AUTOCOMP_PTR_KEY, NULL);
- g_signal_connect(filter_te, "key-press-event", G_CALLBACK(filter_string_te_key_pressed_cb), NULL);
- g_signal_connect(file_merge_w, "key-press-event", G_CALLBACK(filter_parent_dlg_key_pressed_cb), NULL);
- colorize_filter_te_as_empty(filter_te);
- gtk_entry_set_text(GTK_ENTRY(filter_te), display_filter->str);
- gtk_widget_show(filter_te);
- gtk_widget_set_tooltip_text(filter_te, "Enter a display filter.");
-
- g_object_set_data(G_OBJECT(file_merge_w), E_RFILTER_TE_KEY, filter_te);
-
- /* Merge type */
- prepend_rb = gtk_radio_button_new_with_mnemonic_from_widget(NULL,
- "Prepend packets");
- gtk_widget_set_tooltip_text(prepend_rb, "Insert packets from the selected file before the current file. Packet timestamps will be ignored.");
- gtk_box_pack_start(GTK_BOX(main_vb), prepend_rb, FALSE, FALSE, 0);
- gtk_widget_show(prepend_rb);
-
- chrono_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(prepend_rb), "Merge chronologically");
- gtk_widget_set_tooltip_text(chrono_rb, "Insert packets in chronological order.");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chrono_rb), TRUE);
- gtk_box_pack_start(GTK_BOX(main_vb), chrono_rb, FALSE, FALSE, 0);
- gtk_widget_show(chrono_rb);
-
- append_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(prepend_rb), "Append packets");
- gtk_widget_set_tooltip_text(append_rb, "Insert packets from the selected file after the current file. Packet timestamps will be ignored.");
- gtk_box_pack_start(GTK_BOX(main_vb), append_rb, FALSE, FALSE, 0);
- gtk_widget_show(append_rb);
-
- /* Preview widget */
- prev = preview_new();
- g_object_set_data(G_OBJECT(file_merge_w), PREVIEW_TABLE_KEY, prev);
- gtk_widget_show_all(prev);
- gtk_box_pack_start(GTK_BOX(main_hb), prev, FALSE, FALSE, 0);
-
- g_signal_connect(GTK_FILE_CHOOSER(file_merge_w), "selection-changed",
- G_CALLBACK(file_open_entry_changed), file_merge_w);
- file_open_entry_changed(file_merge_w, file_merge_w);
-
- g_object_set_data(G_OBJECT(file_merge_w), E_DFILTER_TE_KEY,
- g_object_get_data(G_OBJECT(w), E_DFILTER_TE_KEY));
-
- cf_name = file_selection_run(file_merge_w);
- if (cf_name == NULL) {
- /* User cancelled or closed the dialog. */
- return FALSE;
- }
-
- g_string_printf(file_name, "%s", cf_name);
- g_free(cf_name);
- g_string_printf(display_filter, "%s", gtk_entry_get_text(GTK_ENTRY(filter_te)));
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chrono_rb))) {
- *merge_type = 0;
- } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prepend_rb))) {
- *merge_type = -1;
- } else {
- *merge_type = 1;
- }
-
- /* We've crossed the Rubicon; get rid of the file selection box. */
- window_destroy(GTK_WIDGET(file_merge_w));
-
- return TRUE;
-}
-#endif /* USE_WIN32_FILE_DIALOGS */
-
-/* Merge existing with another file */
-
-/*
- * <platform/>_merge_file routines should upon entry...
- * Set the path and fill in the filename if the path+filename is provided.
- * Set the display filter if provided. Filter syntax should be checked.
- * ...and upon exit...
- * Return TRUE on "OK" and "FALSE" on "Cancel".
- * Close the window.
- */
-
-static void
-file_merge_cmd(GtkWidget *w _U_)
-{
- GString *file_name = g_string_new("");
- GString *display_filter = g_string_new("");
- int merge_type;
- dfilter_t *rfcode = NULL;
- gchar *err_msg;
- int err;
- int file_type;
- cf_status_t merge_status;
- char *in_filenames[2];
- char *tmpname = NULL;
-
- /*
- * Loop until the user either selects a file or gives up.
- */
- for (;;) {
- g_string_truncate(file_name, 0);
- g_string_truncate(display_filter, 0);
-#ifdef USE_WIN32_FILE_DIALOGS
- if (win32_merge_file(GDK_WINDOW_HWND(gtk_widget_get_window(top_level)), file_name, display_filter, &merge_type)) {
-#else /* USE_WIN32_FILE_DIALOGS */
- if (gtk_merge_file(top_level, file_name, display_filter, &merge_type)) {
-#endif /* USE_WIN32_FILE_DIALOGS */
-
- /* Get the specified read filter and try to compile it. */
- if (!dfilter_compile(display_filter->str, &rfcode, &err_msg)) {
- /* 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, display_filter->str, err_msg);
- g_free(err_msg);
- continue;
- }
-
- file_type = cfile.cd_t;
-
- /* Try to merge or append the two files */
- if (merge_type == 0) {
- /* chronological order */
- in_filenames[0] = cfile.filename;
- in_filenames[1] = file_name->str;
- merge_status = cf_merge_files_to_tempfile(top_level, &tmpname, 2, in_filenames, file_type, FALSE);
- } else if (merge_type < 0) {
- /* prepend file */
- in_filenames[0] = file_name->str;
- in_filenames[1] = cfile.filename;
- merge_status = cf_merge_files_to_tempfile(top_level, &tmpname, 2, in_filenames, file_type, TRUE);
- } else {
- /* append file */
- in_filenames[0] = cfile.filename;
- in_filenames[1] = file_name->str;
- merge_status = cf_merge_files_to_tempfile(top_level, &tmpname, 2, in_filenames, file_type, TRUE);
- }
-
- if (merge_status != CF_OK) {
- dfilter_free(rfcode);
- g_free(tmpname);
- continue;
- }
-
- cf_close(&cfile);
-
- /* Try to open the merged capture file. This closes the current file if it succeeds. */
- if (cf_open(&cfile, tmpname, WTAP_TYPE_AUTO, TRUE /* temporary file */, &err) != CF_OK) {
- /* We couldn't open it; fail. */
- dfilter_free(rfcode);
- g_free(tmpname);
- g_string_free(file_name, TRUE);
- g_string_free(display_filter, TRUE);
- 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(&cfile, rfcode);
-
- switch (cf_read(&cfile, 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);
- g_string_free(file_name, TRUE);
- g_string_free(display_filter, TRUE);
- return;
- }
- }
-
- /* Save the name of the containing directory specified in the path name,
- if any; we can write over cf_merged_name, which is a good thing, given that
- "get_dirname()" does write over its argument. */
- if (tmpname) {
- set_last_open_dir(get_dirname(tmpname));
- g_free(tmpname);
- }
- g_string_free(file_name, TRUE);
- g_string_free(display_filter, TRUE);
- return;
- }
-}
-
-void
-file_merge_cmd_cb(GtkWidget *widget, gpointer data _U_) {
- /* If there's unsaved data, let the user save it first.
- If they cancel out of it, don't merge. */
- GtkWidget *msg_dialog;
- gchar *display_basename;
- gint response;
-
- if (prefs.gui_ask_unsaved) {
- if (cf_has_unsaved_data(&cfile)) {
- /* This file has unsaved data; ask the user whether to save the
- capture. */
- if (cfile.is_tempfile) {
- msg_dialog = gtk_message_dialog_new(GTK_WINDOW(top_level),
- (GtkDialogFlags)(GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT),
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_NONE,
- "Do you want to save the captured packets before merging another capture file into it?");
-
- gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(msg_dialog),
- "A temporary capture file can't be merged.");
- } else {
- /*
- * Format the message.
- */
- display_basename = g_filename_display_basename(cfile.filename);
- msg_dialog = gtk_message_dialog_new(GTK_WINDOW(top_level),
- (GtkDialogFlags)(GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT),
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_NONE,
- "Do you want to save the changes you've made "
- "to the capture file \"%s\" before merging another capture file into it?",
- display_basename);
- g_free(display_basename);
- gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(msg_dialog),
- "The changes must be saved before the files are merged.");
- }
-
- gtk_dialog_add_button(GTK_DIALOG(msg_dialog),
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
- gtk_dialog_add_button(GTK_DIALOG(msg_dialog),
- WIRESHARK_STOCK_SAVE, GTK_RESPONSE_ACCEPT);
- gtk_dialog_set_alternative_button_order(GTK_DIALOG(msg_dialog),
- GTK_RESPONSE_ACCEPT,
- GTK_RESPONSE_CANCEL,
- -1);
- gtk_dialog_set_default_response(GTK_DIALOG(msg_dialog),
- GTK_RESPONSE_ACCEPT);
-
- response = gtk_dialog_run(GTK_DIALOG(msg_dialog));
- gtk_widget_destroy(msg_dialog);
-
- switch (response) {
-
- case GTK_RESPONSE_ACCEPT:
- /* Save the file but don't close it */
- do_file_save(&cfile, FALSE);
- break;
-
- case GTK_RESPONSE_CANCEL:
- case GTK_RESPONSE_NONE:
- case GTK_RESPONSE_DELETE_EVENT:
- default:
- /* Don't do the merge. */
- return;
- }
- }
- }
-
- /* Do the merge. */
- file_merge_cmd(widget);
-}
-
-#ifdef HAVE_LIBPCAP
-static void
-do_capture_stop(capture_file *cf)
-{
- /* Stop the capture (complete with UI updates). */
- capture_stop_cb(NULL, NULL);
-
- /* Now run the main loop until the capture stops and we finish
- reading it; we need to run the main loop so we respond to
- messages on the sync pipe and the sync pipe being closed. */
- while (cf->state == FILE_READ_IN_PROGRESS)
- gtk_main_iteration();
-}
-#endif
-
-/* Returns true if the current file has been saved or if the user has chosen
- * to discard it, ie if it is safe to continue with the call to close, and
- * false otherwise. */
-gboolean
-test_file_close(capture_file *cf, gboolean from_quit, const char *before_what)
-{
- GtkWidget *msg_dialog;
- gchar *display_basename;
- gint response;
- gboolean capture_in_progress;
-
- if (cf->state == FILE_CLOSED)
- return TRUE; /* already closed, nothing to do */
-
-#ifdef HAVE_LIBPCAP
- if (cf->state == FILE_READ_IN_PROGRESS) {
- /* This is true if we're reading a capture file *or* if we're doing
- a live capture. If we're reading a capture file, the main loop
- is busy reading packets, and only accepting input from the
- progress dialog, so we can't get here, so this means we're
- doing a capture. */
- capture_in_progress = TRUE;
- } else
-#endif
- capture_in_progress = FALSE;
-
- if (prefs.gui_ask_unsaved) {
- if (cf_has_unsaved_data(cf) || capture_in_progress) {
- /* This file has unsaved data or there's a capture in progress;
- ask the user whether to save the data. */
- if (cf->is_tempfile) {
- msg_dialog = gtk_message_dialog_new(GTK_WINDOW(top_level),
- (GtkDialogFlags)(GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT),
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_NONE,
- capture_in_progress ?
- "Do you want to stop the capture and save the captured packets%s?" :
- "Do you want to save the captured packets%s?",
- before_what);
-
- gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(msg_dialog),
- "Your captured packets will be lost if you don't save them.");
- } else {
- /*
- * Format the message.
- */
- display_basename = g_filename_display_basename(cf->filename);
- if (capture_in_progress) {
- msg_dialog = gtk_message_dialog_new(GTK_WINDOW(top_level),
- (GtkDialogFlags)(GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT),
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_NONE,
- "Do you want to stop the capture and save the captured packets%s?",
- before_what);
- } else {
- msg_dialog = gtk_message_dialog_new(GTK_WINDOW(top_level),
- (GtkDialogFlags)(GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT),
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_NONE,
- "Do you want to save the changes you've made "
- "to the capture file \"%s\"%s?",
- display_basename, before_what);
- }
- g_free(display_basename);
- gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(msg_dialog),
- capture_in_progress ?
- "Your captured packets will be lost if you don't save them." :
- "Your changes will be lost if you don't save them.");
- }
-
- /* If this is from a Quit operation, use "quit and don't save"
- rather than just "don't save". */
- gtk_dialog_add_button(GTK_DIALOG(msg_dialog),
- (from_quit ?
- (cf->state == FILE_READ_IN_PROGRESS ?
- WIRESHARK_STOCK_STOP_QUIT_DONT_SAVE :
- WIRESHARK_STOCK_QUIT_DONT_SAVE) :
- (capture_in_progress ?
- WIRESHARK_STOCK_STOP_DONT_SAVE :
- WIRESHARK_STOCK_DONT_SAVE)),
- GTK_RESPONSE_REJECT);
- gtk_dialog_add_button(GTK_DIALOG(msg_dialog),
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
- gtk_dialog_add_button(GTK_DIALOG(msg_dialog),
- (capture_in_progress ?
- WIRESHARK_STOCK_STOP_SAVE :
- WIRESHARK_STOCK_SAVE),
- GTK_RESPONSE_ACCEPT);
- gtk_dialog_set_alternative_button_order(GTK_DIALOG(msg_dialog),
- GTK_RESPONSE_ACCEPT,
- GTK_RESPONSE_CANCEL,
- GTK_RESPONSE_REJECT,
- -1);
- gtk_dialog_set_default_response(GTK_DIALOG(msg_dialog),
- GTK_RESPONSE_ACCEPT);
-
- response = gtk_dialog_run(GTK_DIALOG(msg_dialog));
- gtk_widget_destroy(msg_dialog);
-
- switch (response) {
-
- case GTK_RESPONSE_ACCEPT:
-#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)
- do_capture_stop(cf);
-#endif
- /* Save the file and close it */
- if (do_file_save(cf, TRUE) == FALSE)
- return FALSE;
- break;
-
- case GTK_RESPONSE_REJECT:
-#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)
- do_capture_stop(cf);
-#endif
- break;
-
- case GTK_RESPONSE_CANCEL:
- case GTK_RESPONSE_NONE:
- case GTK_RESPONSE_DELETE_EVENT:
- default:
- /* Don't close the file (and don't stop any capture in progress). */
- return FALSE; /* file not closed */
- }
- } else {
- /* unchanged file, safe to close */
- return TRUE;
- }
- } else {
- /* User asked not to be bothered by those prompts, just close it.
- XXX - should that apply only to saving temporary files? */
-#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)
- do_capture_stop(cf);
-#endif
- return TRUE;
- }
- return TRUE; /* shouldn't get here? */
-}
-
-gboolean
-do_file_close(capture_file *cf, gboolean from_quit, const char *before_what)
-{
- if (test_file_close(cf, from_quit, before_what)) {
- cf_close(cf);
- return TRUE;
- }
- return FALSE;
-}
-
-/* Close a file */
-void
-file_close_cmd_cb(GtkWidget *widget _U_, gpointer data _U_) {
- (void)do_file_close(&cfile, FALSE, "");
-}
-
-#define RESPONSE_DISCARD_COMMENTS_AND_SAVE 1
-#define RESPONSE_SAVE_IN_ANOTHER_FORMAT 2
-
-static check_savability_t
-check_save_with_comments(capture_file *cf)
-{
- guint32 comment_types;
- GtkWidget *msg_dialog;
- gint response;
-
- /* What types of comments do we have? */
- comment_types = cf_comment_types(cf);
-
- /* Does the file's format support all the comments we have? */
- if (wtap_dump_supports_comment_types(cf->cd_t, comment_types)) {
- /* Yes. Let the save happen; we can save all the comments, so
- there's no need to delete them. */
- return SAVE;
- }
-
- /* No. Are there formats in which we can write this file that
- supports all the comments in this file? */
- if (wtap_dump_can_write(cf->linktypes, comment_types)) {
- /* Yes. Offer the user a choice of "Save in a format that
- supports comments", "Discard comments and save in the
- file's own format", or "Cancel", meaning "don't bother
- saving the file at all". */
- msg_dialog = gtk_message_dialog_new(GTK_WINDOW(top_level),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_NONE,
- "The capture has comments, but the file's format "
- "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 file's format?");
- gtk_dialog_add_buttons(GTK_DIALOG(msg_dialog),
- "Discard comments and save",
- RESPONSE_DISCARD_COMMENTS_AND_SAVE,
- GTK_STOCK_CANCEL,
- GTK_RESPONSE_CANCEL,
- "Save in another format",
- RESPONSE_SAVE_IN_ANOTHER_FORMAT,
- NULL);
- gtk_dialog_set_alternative_button_order(GTK_DIALOG(msg_dialog),
- RESPONSE_SAVE_IN_ANOTHER_FORMAT,
- GTK_RESPONSE_CANCEL,
- RESPONSE_DISCARD_COMMENTS_AND_SAVE,
- -1);
- gtk_dialog_set_default_response(GTK_DIALOG(msg_dialog),
- RESPONSE_SAVE_IN_ANOTHER_FORMAT);
- } else {
- /* No. Offer the user a choice of "Discard comments and
- save in the file's format" or "Cancel". */
- msg_dialog = gtk_message_dialog_new(GTK_WINDOW(top_level),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_NONE,
- "The capture has comments, but no file format in which it "
- "can be saved supports comments. Do you want to discard "
- "the comments and save in the file's format?");
- gtk_dialog_add_buttons(GTK_DIALOG(msg_dialog),
- GTK_STOCK_CANCEL,
- GTK_RESPONSE_CANCEL,
- "Discard comments and save",
- RESPONSE_DISCARD_COMMENTS_AND_SAVE,
- NULL);
- gtk_dialog_set_alternative_button_order(GTK_DIALOG(msg_dialog),
- RESPONSE_DISCARD_COMMENTS_AND_SAVE,
- GTK_RESPONSE_CANCEL,
- -1);
- gtk_dialog_set_default_response(GTK_DIALOG(msg_dialog),
- GTK_RESPONSE_CANCEL);
- }
-
- response = gtk_dialog_run(GTK_DIALOG(msg_dialog));
- gtk_widget_destroy(msg_dialog);
-
- switch (response) {
-
- case RESPONSE_SAVE_IN_ANOTHER_FORMAT:
- /* Let the user select another format. */
- return SAVE_IN_ANOTHER_FORMAT;
-
- case RESPONSE_DISCARD_COMMENTS_AND_SAVE:
- /* Save without the comments and, if that succeeds, delete the
- comments. */
- return SAVE_WITHOUT_COMMENTS;
-
- case GTK_RESPONSE_CANCEL:
- case GTK_RESPONSE_NONE:
- case GTK_RESPONSE_DELETE_EVENT:
- default:
- /* Just give up. */
- return CANCELLED;
- }
-}
-
-/*
- * Save the capture file in question, prompting the user for a file
- * name to save to if necessary.
- */
-static gboolean
-do_file_save(capture_file *cf, gboolean dont_reopen)
-{
- char *fname;
- gboolean discard_comments;
- cf_write_status_t status;
-
- 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 file_save_as_cmd(cf, FALSE, dont_reopen);
- } else {
- if (cf->unsaved_changes) {
- /* 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 (check_save_with_comments(cf)) {
-
- 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 file_save_as_cmd(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. */
- g_assert_not_reached();
- return TRUE;
- }
-
- /* 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. */
- fname = g_strdup(cf->filename);
- status = cf_save_records(cf, fname, cf->cd_t, cf->iscompressed,
- 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 (discard_comments)
- packet_list_queue_draw();
- 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 r file system? */
- break;
-
- case CF_WRITE_ABORTED:
- /* The write was aborted; just drive on. */
- break;
- }
- g_free(fname);
- }
- /* Otherwise just do nothing. */
- }
-
- return TRUE;
-}
-
-void
-file_save_cmd_cb(GtkWidget *w _U_, gpointer data _U_) {
- do_file_save(&cfile, FALSE);
-}
-
-/* Attach a list of the valid 'save as' file types to a combo_box by
- checking what Wiretap supports. Make the default type the first
- in the list. If must_supprt_comments is true, restrict the list
- to those formats that support comments (currently, just pcapng).
-
- Returns the default file type. */
-static int
-set_file_type_list(GtkWidget *combo_box, capture_file *cf,
- gboolean must_support_all_comments)
-{
- guint32 required_comment_types;
- GArray *savable_file_types_subtypes;
- guint i;
- int ft;
- int default_ft = -1;
-
- /* What types of comments do we have to support? */
- if (must_support_all_comments)
- required_comment_types = cf_comment_types(cf); /* all the ones the file has */
- else
- required_comment_types = 0; /* none of them */
-
- /* What types of file can we save this file as? */
- savable_file_types_subtypes = wtap_get_savable_file_types_subtypes(cf->cd_t,
- cf->linktypes,
- required_comment_types);
-
- if (savable_file_types_subtypes != NULL) {
- /* OK, we have at least one file type we can save this file as.
- (If we didn't, we shouldn't have gotten here in the first
- place.) Add them all to the combo box. */
- for (i = 0; i < savable_file_types_subtypes->len; i++) {
- ft = g_array_index(savable_file_types_subtypes, int, i);
- if (default_ft == -1)
- default_ft = ft; /* first file type is the default */
- ws_combo_box_append_text_and_pointer(GTK_COMBO_BOX(combo_box),
- wtap_file_type_subtype_string(ft),
- GINT_TO_POINTER(ft));
- }
- g_array_free(savable_file_types_subtypes, TRUE);
- }
-
- return default_ft;
-}
-
-static void
-file_select_file_type_cb(GtkWidget *w, gpointer parent_arg)
-{
- GtkWidget *parent = (GtkWidget *)parent_arg;
- int new_file_type;
- gpointer ptr;
- GtkWidget *compressed_cb;
-
- compressed_cb = (GtkWidget *)g_object_get_data(G_OBJECT(parent), E_COMPRESSED_CB_KEY);
- if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(w), &ptr)) {
- /* XXX - this can happen when we clear the list of file types
- and then reconstruct it. */
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compressed_cb), FALSE);
- gtk_widget_set_sensitive(compressed_cb, FALSE);
- return;
- }
- new_file_type = GPOINTER_TO_INT(ptr);
-
- if (!wtap_dump_can_compress(new_file_type)) {
- /* Can't compress this file type; turn off compression and make
- the compression checkbox insensitive. */
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compressed_cb), FALSE);
- gtk_widget_set_sensitive(compressed_cb, FALSE);
- } else
- gtk_widget_set_sensitive(compressed_cb, TRUE);
-}
-
-static check_savability_t
-gtk_check_save_as_with_comments(GtkWidget *w, capture_file *cf, int file_type)
-{
- guint32 comment_types;
- GtkWidget *msg_dialog;
- gint response;
-
- /* What types of comments do we have? */
- comment_types = cf_comment_types(cf);
-
- /* Does the file's format support all the comments we have? */
- if (wtap_dump_supports_comment_types(file_type, comment_types)) {
- /* Yes. Let the save happen; we can save all the comments, so
- there's no need to delete them. */
- return SAVE;
- }
-
- /* No. Are there formats in which we can write this file that
- supports all the comments in this file? */
- if (wtap_dump_can_write(cf->linktypes, comment_types)) {
- /* Yes. Offer the user a choice of "Save in a format that
- supports comments", "Discard comments and save in the
- format you selected", or "Cancel", meaning "don't bother
- saving the file at all". */
- msg_dialog = gtk_message_dialog_new(GTK_WINDOW(w),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_NONE,
- "The capture has comments, but 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?");
- gtk_dialog_add_buttons(GTK_DIALOG(msg_dialog),
- "Discard comments and save",
- RESPONSE_DISCARD_COMMENTS_AND_SAVE,
- GTK_STOCK_CANCEL,
- GTK_RESPONSE_CANCEL,
- "Save in another format",
- RESPONSE_SAVE_IN_ANOTHER_FORMAT,
- NULL);
- gtk_dialog_set_alternative_button_order(GTK_DIALOG(msg_dialog),
- RESPONSE_SAVE_IN_ANOTHER_FORMAT,
- GTK_RESPONSE_CANCEL,
- RESPONSE_DISCARD_COMMENTS_AND_SAVE,
- -1);
- gtk_dialog_set_default_response(GTK_DIALOG(msg_dialog),
- RESPONSE_SAVE_IN_ANOTHER_FORMAT);
- } else {
- /* No. Offer the user a choice of "Discard comments and
- save in the format you selected" or "Cancel". */
- msg_dialog = gtk_message_dialog_new(GTK_WINDOW(w),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_NONE,
- "The capture has comments, but 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?");
- gtk_dialog_add_buttons(GTK_DIALOG(msg_dialog),
- GTK_STOCK_CANCEL,
- GTK_RESPONSE_CANCEL,
- "Discard comments and save",
- RESPONSE_DISCARD_COMMENTS_AND_SAVE,
- NULL);
- gtk_dialog_set_alternative_button_order(GTK_DIALOG(msg_dialog),
- RESPONSE_DISCARD_COMMENTS_AND_SAVE,
- GTK_RESPONSE_CANCEL,
- -1);
- gtk_dialog_set_default_response(GTK_DIALOG(msg_dialog),
- GTK_RESPONSE_CANCEL);
- }
-
- response = gtk_dialog_run(GTK_DIALOG(msg_dialog));
- gtk_widget_destroy(msg_dialog);
-
- switch (response) {
-
- case RESPONSE_SAVE_IN_ANOTHER_FORMAT:
- /* OK, the only other format we support is pcapng. Make that
- the one and only format in the combo box, and return to
- let the user continue with the dialog.
-
- XXX - removing all the formats from the combo box will clear
- the compressed checkbox; get the current value and restore
- it.
-
- XXX - we know pcapng can be compressed; if we ever end up
- supporting saving comments in a format that *can't* be
- compressed, such as NetMon format, we must check this. */
- /* XXX - need a compressed checkbox here! */
- return SAVE_IN_ANOTHER_FORMAT;
-
- case RESPONSE_DISCARD_COMMENTS_AND_SAVE:
- /* Save without the comments and, if that succeeds, delete the
- comments. */
- return SAVE_WITHOUT_COMMENTS;
-
- case GTK_RESPONSE_CANCEL:
- case GTK_RESPONSE_NONE:
- case GTK_RESPONSE_DELETE_EVENT:
- default:
- /* Just give up. */
- return CANCELLED;
- }
-}
-
-#ifndef USE_WIN32_FILE_DIALOGS
-/* "Save as" */
-static gboolean
-gtk_save_as_file(GtkWidget *w _U_, capture_file *cf, GString *file_name, int *file_type,
- gboolean *compressed, gboolean must_support_all_comments)
-{
- GtkWidget *file_save_as_w;
- GtkWidget *main_vb, *ft_hb, *ft_lb, *ft_combo_box, *compressed_cb;
- int default_ft;
- char *cf_name;
- gpointer ptr;
-
- if (!file_name || !file_type || !compressed)
- return FALSE;
-
- /* Default to saving in the file's current format. */
-
- /* build the file selection */
- file_save_as_w = file_selection_new("Wireshark: Save Capture File As",
- GTK_WINDOW(top_level),
- FILE_SELECTION_SAVE);
-
- /* Container for each row of widgets */
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 5, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- file_selection_set_extra_widget(file_save_as_w, main_vb);
- gtk_widget_show(main_vb);
-
- /* File type row */
- ft_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(main_vb), ft_hb, FALSE, FALSE, 0);
- gtk_widget_show(ft_hb);
-
- ft_lb = gtk_label_new("File type:");
- gtk_box_pack_start(GTK_BOX(ft_hb), ft_lb, FALSE, FALSE, 0);
- gtk_widget_show(ft_lb);
-
- ft_combo_box = ws_combo_box_new_text_and_pointer();
-
- /* Generate the list of file types we can save. */
- default_ft = set_file_type_list(ft_combo_box, cf, must_support_all_comments);
- gtk_box_pack_start(GTK_BOX(ft_hb), ft_combo_box, FALSE, FALSE, 0);
- gtk_widget_show(ft_combo_box);
- g_object_set_data(G_OBJECT(file_save_as_w), E_FILE_TYPE_COMBO_BOX_KEY, ft_combo_box);
-
- /* compressed - if the file is currently compressed, and the default
- file type supports compression, turn the checkbox on */
- compressed_cb = gtk_check_button_new_with_label("Compress with gzip");
- gtk_box_pack_start(GTK_BOX(ft_hb), compressed_cb, FALSE, FALSE, 0);
- if (cf->iscompressed && wtap_dump_can_compress(default_ft))
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compressed_cb), TRUE);
- gtk_widget_show(compressed_cb);
- g_object_set_data(G_OBJECT(file_save_as_w), E_COMPRESSED_CB_KEY, compressed_cb);
-
- /* Ok: now "select" the default filetype which invokes file_select_file_type_cb */
- g_signal_connect(ft_combo_box, "changed", G_CALLBACK(file_select_file_type_cb), file_save_as_w);
- ws_combo_box_set_active(GTK_COMBO_BOX(ft_combo_box), 0);
-
- cf_name = file_selection_run(file_save_as_w);
-
- if (cf_name == NULL) {
- /* User cancelled or closed the dialog. */
- return FALSE;
- }
-
- if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(ft_combo_box), &ptr)) {
- g_assert_not_reached(); /* Programming error: somehow nothing is active */
- }
- *file_type = GPOINTER_TO_INT(ptr);
- *compressed = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(compressed_cb));
-
- /* We've crossed the Rubicon; get rid of the file selection box. */
- window_destroy(GTK_WIDGET(file_save_as_w));
-
- g_string_printf(file_name, "%s", cf_name);
- g_free(cf_name);
- return TRUE;
-}
-#endif /* USE_WIN32_FILE_DIALOGS */
-
-static void
-file_add_extension(GString *file_name, int file_type, gboolean compressed) {
- gchar *file_name_lower;
- GString *file_suffix;
- GSList *extensions_list, *extension;
- gboolean add_extension;
-
- /*
- * Append the default file extension if there's none given by
- * the user or if they gave one that's not one of the valid
- * extensions for the file type.
- */
- file_name_lower = g_utf8_strdown(file_name->str, -1);
- file_suffix = g_string_new("");
- extensions_list = wtap_get_file_extensions_list(file_type, FALSE);
- if (extensions_list != NULL) {
- /* We have one or more extensions for this file type.
- Start out assuming we need to add the default one. */
- add_extension = TRUE;
-
- /* OK, see if the file has one of those extensions. */
- for (extension = extensions_list; extension != NULL;
- extension = g_slist_next(extension)) {
- g_string_printf(file_suffix, ".%s", (char *)extension->data);
- if (g_str_has_suffix(file_name_lower, file_suffix->str)) {
- /*
- * The file name has one of the extensions for
- * this file type.
- */
- add_extension = FALSE;
- break;
- }
- g_string_append(file_suffix, ".gz");
- if (g_str_has_suffix(file_name_lower, file_suffix->str)) {
- /*
- * The file name has one of the extensions for
- * this file type.
- */
- add_extension = FALSE;
- break;
- }
- }
- } else {
- /* We have no extensions for this file type. Don't add one. */
- add_extension = FALSE;
- }
- g_free(file_name_lower);
- g_string_free(file_suffix, TRUE);
- if (add_extension) {
- if (wtap_default_file_extension(file_type) != NULL) {
- g_string_append_printf(file_name, ".%s",
- wtap_default_file_extension(file_type));
- if (compressed) {
- g_string_append(file_name, ".gz");
- }
- }
- }
-}
-
-/* Save a file with a user-specified name */
-
-/*
- * <platform/>_save_as_file routines should upon entry...
- * Set the path and fill in the filename if the path+filename is provided.
- * ...and upon exit...
- * Return TRUE on "OK" and "FALSE" on "Cancel".
- * Close the window.
- */
-
-static gboolean
-file_save_as_cmd(capture_file *cf, gboolean must_support_all_comments,
- gboolean dont_reopen)
-{
- GString *file_name = g_string_new("");
- int file_type;
- gboolean compressed;
- gchar *dirname;
- gboolean discard_comments = FALSE;
- cf_write_status_t status;
-
- /*
- * Loop until the user either selects a file or gives up.
- */
- for (;;) {
-#ifdef USE_WIN32_FILE_DIALOGS
- if (win32_save_as_file(GDK_WINDOW_HWND(gtk_widget_get_window(top_level)), cf,
- file_name, &file_type, &compressed, must_support_all_comments)) {
- /* They discarded comments, so redraw the packet details window
- to reflect any packets that no longer have comments. */
- packet_list_queue_draw();
-#else /* USE_WIN32_FILE_DIALOGS */
- if (gtk_save_as_file(top_level, cf, file_name, &file_type, &compressed, must_support_all_comments)) {
-#endif /* USE_WIN32_FILE_DIALOGS */
-
- /* 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. */
-#ifdef USE_WIN32_FILE_DIALOGS
- switch (win32_check_save_as_with_comments(GDK_WINDOW_HWND(gtk_widget_get_window(top_level)), cf, file_type)) {
-#else /* USE_WIN32_FILE_DIALOGS */
- switch (gtk_check_save_as_with_comments(top_level, cf, file_type)) {
-#endif /* USE_WIN32_FILE_DIALOGS */
-
- 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_all_comments = TRUE;
- continue;
-
- case CANCELLED:
- /* The user said "forget it". Just get rid of the dialog box
- and return. */
- g_string_free(file_name, TRUE);
- return FALSE;
- }
-
- file_add_extension(file_name, file_type, compressed);
-
-#ifndef _WIN32
- /* If the file exists and it's user-immutable or not writable,
- ask the user whether they want to override that. */
- if (!file_target_unwritable_ui(top_level, file_name->str)) {
- /* They don't. Let them try another file name or cancel. */
- continue;
- }
-#endif
-
- /* Attempt to save the file */
- status = cf_save_records(&cfile, file_name->str, file_type, compressed,
- 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 = get_dirname(file_name->str); /* Overwrites file_name->str */
- set_last_open_dir(dirname);
- /* If we discarded comments, redraw the packet list to reflect
- any packets that no longer have comments. */
- if (discard_comments)
- packet_list_queue_draw();
- break;
-
- case CF_WRITE_ERROR:
- /* The save failed; let the user try again. */
- continue;
-
- case CF_WRITE_ABORTED:
- /* The user aborted the save; just return. */
- g_string_free(file_name, TRUE);
- return FALSE;
- }
- } else {
- g_string_free(file_name, TRUE);
- return FALSE;
- }
- g_string_free(file_name, TRUE);
- return TRUE;
- }
-}
-
-void
-file_save_as_cmd_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- file_save_as_cmd(&cfile, FALSE, FALSE);
-}
-
-#ifndef USE_WIN32_FILE_DIALOGS
-static gboolean
-gtk_export_specified_packets_file(GtkWidget *w _U_, GString *file_name, int *file_type,
- gboolean *compressed, packet_range_t *range)
-{
- GtkWidget *file_export_specified_packets_w;
- GtkWidget *main_vb, *ft_hb, *ft_lb, *ft_combo_box, *range_fr, *range_grid,
- *compressed_cb;
- char *cf_name;
- gpointer ptr;
-
- if (!file_name || !file_type || !compressed || !range)
- return FALSE;
-
- /* Default to writing out all displayed packets, in the file's current format. */
-
- /* build the file selection */
- file_export_specified_packets_w = file_selection_new("Wireshark: Export Specified Packets",
- GTK_WINDOW(top_level),
- FILE_SELECTION_SAVE);
-
- /* Container for each row of widgets */
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 5, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- file_selection_set_extra_widget(file_export_specified_packets_w, main_vb);
- gtk_widget_show(main_vb);
-
- /*** Packet Range frame ***/
- range_fr = gtk_frame_new("Packet Range");
- gtk_box_pack_start(GTK_BOX(main_vb), range_fr, FALSE, FALSE, 0);
- gtk_widget_show(range_fr);
-
- /* grid table */
- range_grid = range_new(range, TRUE);
- gtk_container_add(GTK_CONTAINER(range_fr), range_grid);
- gtk_widget_show(range_grid);
-
- /* File type row */
- ft_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(main_vb), ft_hb, FALSE, FALSE, 0);
-
- gtk_widget_show(ft_hb);
-
- ft_lb = gtk_label_new("File type:");
- gtk_box_pack_start(GTK_BOX(ft_hb), ft_lb, FALSE, FALSE, 0);
- gtk_widget_show(ft_lb);
-
- ft_combo_box = ws_combo_box_new_text_and_pointer();
-
- /* Generate the list of file types we can save. */
- set_file_type_list(ft_combo_box, &cfile, FALSE);
- gtk_box_pack_start(GTK_BOX(ft_hb), ft_combo_box, FALSE, FALSE, 0);
- gtk_widget_show(ft_combo_box);
- g_object_set_data(G_OBJECT(file_export_specified_packets_w), E_FILE_TYPE_COMBO_BOX_KEY, ft_combo_box);
-
- /* dynamic values in the range frame */
- range_update_dynamics(range_grid);
-
- /* compressed */
- compressed_cb = gtk_check_button_new_with_label("Compress with gzip");
- gtk_box_pack_start(GTK_BOX(ft_hb), compressed_cb, FALSE, FALSE, 0);
- gtk_widget_show(compressed_cb);
- g_object_set_data(G_OBJECT(file_export_specified_packets_w), E_COMPRESSED_CB_KEY, compressed_cb);
-
- /* Ok: now "select" the default filetype which invokes file_select_file_type_cb */
- g_signal_connect(ft_combo_box, "changed", G_CALLBACK(file_select_file_type_cb), file_export_specified_packets_w);
- ws_combo_box_set_active(GTK_COMBO_BOX(ft_combo_box), 0);
-
- cf_name = file_selection_run(file_export_specified_packets_w);
- if (cf_name == NULL) {
- /* User cancelled or closed the dialog. */
- return FALSE;
- }
-
- if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(ft_combo_box), &ptr)) {
- g_assert_not_reached(); /* Programming error: somehow nothing is active */
- }
- *file_type = GPOINTER_TO_INT(ptr);
- *compressed = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(compressed_cb));
-
- /* We've crossed the Rubicon; get rid of the file export box. */
- window_destroy(GTK_WIDGET(file_export_specified_packets_w));
-
- g_string_printf(file_name, "%s", cf_name);
- g_free(cf_name);
- return TRUE;
-}
-#endif /* USE_WIN32_FILE_DIALOGS */
-
-/*
- * <platform/>_export_specified_packets_file routines should upon entry...
- * Set the path and fill in the filename if the path+filename is provided.
- * ...and upon exit...
- * Not initialize range.
- * Return TRUE on "OK" and "FALSE" on "Cancel".
- * Close the window.
- */
-
-void
-file_export_specified_packets_cmd_cb(GtkWidget *w _U_, gpointer data _U_) {
- GString *file_name = g_string_new("");
- int file_type;
- gboolean compressed;
- packet_range_t range;
- cf_write_status_t status;
- gchar *dirname;
- gchar *display_basename;
- GtkWidget *msg_dialog;
-
- /* init the packet range */
- packet_range_init(&range, &cfile);
- range.process_filtered = TRUE;
- range.include_dependents = TRUE;
-
- /*
- * Loop until the user either selects a file or gives up.
- */
- for (;;) {
-#ifdef USE_WIN32_FILE_DIALOGS
- if (win32_export_specified_packets_file(GDK_WINDOW_HWND(gtk_widget_get_window(top_level)),
- &cfile, file_name, &file_type, &compressed, &range)) {
-#else /* USE_WIN32_FILE_DIALOGS */
- if (gtk_export_specified_packets_file(w, file_name, &file_type, &compressed, &range)) {
-#endif /* USE_WIN32_FILE_DIALOGS */
-
- /* Check whether the range is valid. */
- if (!range_check_validity_modal(top_level, &range)) {
- /* The range isn't valid; the user was told that, and dismissed
- the dialog telling them that, so let them fix the range
- and try again, or cancel. */
- continue;
- }
-
- /* XXX - Check for comments? */
-
- /*
- * Check that we're not going to save on top of the current
- * capture file.
- * We do it here so we catch all cases ...
- * Unfortunately, the file requester gives us an absolute file
- * name and the read file name may be relative (if supplied on
- * the command line). From Joerg Mayer.
- */
- if (files_identical(cfile.filename, file_name->str)) {
- display_basename = g_filename_display_basename(file_name->str);
- msg_dialog = gtk_message_dialog_new(GTK_WINDOW(top_level),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_OK,
- "The file \"%s\" is the capture file from which you're exporting the packets.",
- display_basename);
- g_free(display_basename);
- gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(msg_dialog),
- "You cannot export packets on top of the current capture file.");
- gtk_dialog_run(GTK_DIALOG(msg_dialog));
- gtk_widget_destroy(msg_dialog);
- continue;
- }
-
- file_add_extension(file_name, file_type, compressed);
-
-#ifndef _WIN32
- /* If the file exists and it's user-immutable or not writable,
- ask the user whether they want to override that. */
- if (!file_target_unwritable_ui(top_level, file_name->str)) {
- /* They don't. Let them try another file name or cancel. */
- continue;
- }
-#endif
-
- /* Attempt to export the file */
- status = cf_export_specified_packets(&cfile, file_name->str, &range, file_type,
- compressed);
- switch (status) {
-
- case CF_WRITE_OK:
- /* The write succeeded; get rid of the file selection box. */
- /* cf_export_specified_packets() might already closed our dialog! */
-
- /* Save the directory name for future file dialogs.
- XXX - should there be separate ones for "Save As" and
- "Export Specified Packets"? */
- dirname = get_dirname(file_name->str); /* Overwrites file_name->str */
- set_last_open_dir(dirname);
- break;
-
- case CF_WRITE_ERROR:
- /* The save failed; let the user try again. */
- continue;
-
- case CF_WRITE_ABORTED:
- /* The user aborted the save; just return. */
- g_string_free(file_name, TRUE);
- return;
- }
- }
- g_string_free(file_name, TRUE);
- return;
- }
-}
-
-
-void
-file_export_pdu_ok_cb(GtkWidget *widget _U_, gpointer data)
-{
- GtkWidget *msg_dialog;
- gchar *display_basename;
- gint response;
-
- if (prefs.gui_ask_unsaved && cf_has_unsaved_data(&cfile)) {
- if (cfile.is_tempfile) {
- msg_dialog = gtk_message_dialog_new(GTK_WINDOW(top_level),
- (GtkDialogFlags)(GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT),
- GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE,
- "Do you want to save the captured packets before exporting PDUs?");
-
- gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(msg_dialog),
- "After the export, the captured packets will no longer be accessible.");
- }
- else {
- display_basename = g_filename_display_basename(cfile.filename);
- msg_dialog = gtk_message_dialog_new(GTK_WINDOW(top_level),
- (GtkDialogFlags)(GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT),
- GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE,
- "Do you want to save the changes you've made "
- "to the capture file \"%s\" before exporting PDUs from it?",
- display_basename);
- g_free(display_basename);
- gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(msg_dialog),
- "Unsaved changes will be discarded when PDUs are exported.");
- }
-
- gtk_dialog_add_button(GTK_DIALOG(msg_dialog),
- WIRESHARK_STOCK_DONT_SAVE, GTK_RESPONSE_CLOSE);
- gtk_dialog_add_button(GTK_DIALOG(msg_dialog),
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
- gtk_dialog_add_button(GTK_DIALOG(msg_dialog),
- WIRESHARK_STOCK_SAVE, GTK_RESPONSE_ACCEPT);
- gtk_dialog_set_alternative_button_order(GTK_DIALOG(msg_dialog),
- GTK_RESPONSE_ACCEPT,
- GTK_RESPONSE_CANCEL,
- GTK_RESPONSE_CLOSE,
- -1);
- gtk_dialog_set_default_response(GTK_DIALOG(msg_dialog), GTK_RESPONSE_ACCEPT);
-
- response = gtk_dialog_run(GTK_DIALOG(msg_dialog));
- gtk_widget_destroy(msg_dialog);
-
- switch (response) {
- case GTK_RESPONSE_CLOSE:
- /* nothing to do, user chose to discard the unsaved data */
- break;
-
- case GTK_RESPONSE_ACCEPT:
- /* save the file but don't close it */
- do_file_save(&cfile, FALSE);
- break;
-
- case GTK_RESPONSE_CANCEL:
- case GTK_RESPONSE_NONE:
- case GTK_RESPONSE_DELETE_EVENT:
- default:
- /* don't do the export. */
- return;
- }
- }
-
- export_pdu_action(data);
-}
-
-
-/* Reload a file using the current read and display filters */
-void
-file_reload_cmd_cb(GtkWidget *w _U_, gpointer data _U_) {
- cf_reload(&cfile);
-}
-
-/******************** Color Filters *********************************/
-/*
- * Keep a static pointer to the current "Color Export" window, if
- * any, so that if somebody tries to do "Export"
- * while there's already a "Color Export" window up, we just pop
- * up the existing one, rather than creating a new one.
- */
-static GtkWidget *file_color_import_w;
-
-/* sets the file path to the global color filter file.
- WARNING: called by both the import and the export dialog.
-*/
-static void
-color_global_cb(GtkWidget *widget _U_, gpointer data)
-{
- GtkWidget *fs_widget = (GtkWidget *)data;
- gchar *path;
-
- /* decide what file to open (from dfilter code) */
- path = get_datafile_path("colorfilters");
-
- gtk_file_chooser_select_filename(GTK_FILE_CHOOSER(fs_widget), path);
-
- g_free(path);
-}
-
-/* Import color filters */
-void
-file_color_import_cmd_cb(GtkWidget *color_filters, gpointer filter_list _U_)
-{
-#ifdef USE_WIN32_FILE_DIALOGS
- win32_import_color_file(GDK_WINDOW_HWND(gtk_widget_get_window(top_level)), color_filters);
-#else /* USE_WIN32_FILE_DIALOGS */
- GtkWidget *main_vb, *cfglobal_but;
- gchar *cf_name, *s, *err_msg = NULL;
-
- /* No Apply button, and "OK" just sets our text widget, it doesn't
- activate it (i.e., it doesn't cause us to try to open the file). */
-
- file_color_import_w = file_selection_new("Wireshark: Import Color Filters",
- GTK_WINDOW(top_level),
- FILE_SELECTION_OPEN);
-
- /* Container for each row of widgets */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- file_selection_set_extra_widget(file_color_import_w, main_vb);
- gtk_widget_show(main_vb);
-
- cfglobal_but = gtk_button_new_with_label("Global Color Filter File");
- gtk_box_pack_start(GTK_BOX(main_vb), cfglobal_but, FALSE, FALSE, 0);
- g_signal_connect(cfglobal_but, "clicked",
- G_CALLBACK(color_global_cb), file_color_import_w);
- gtk_widget_show(cfglobal_but);
-
- /*
- * Loop until the user either selects a file or gives up.
- */
- for (;;) {
- cf_name = file_selection_run(file_color_import_w);
- if (cf_name == NULL) {
- /* User cancelled or closed the dialog. */
- return;
- }
-
- /* Try to open the color filter file. */
- if (!color_filters_import(cf_name, color_filters, &err_msg, color_filter_add_cb)) {
- /* 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. */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg);
- g_free(err_msg);
- g_free(cf_name);
- continue;
- }
-
- /* We've crossed the Rubicon; get rid of the file selection box. */
- window_destroy(GTK_WIDGET(file_color_import_w));
-
- /* Save the name of the containing directory specified in the path name,
- if any; we can write over cf_name, which is a good thing, given that
- "get_dirname()" does write over its argument. */
- s = get_dirname(cf_name);
- set_last_open_dir(s);
-
- g_free(cf_name);
- return;
- }
-#endif /* USE_WIN32_FILE_DIALOGS */
-}
-
-/*
- * Set the "Export only selected filters" toggle button as appropriate for
- * the current output file type and count of selected filters.
- *
- * Called when the "Export" dialog box is created and when the selected
- * count changes.
- */
-static void
-color_set_export_selected_sensitive(GtkWidget * cfselect_cb)
-{
- /* We can request that only the selected filters be saved only if
- there *are* selected filters. */
- if (color_selected_count() != 0)
- gtk_widget_set_sensitive(cfselect_cb, TRUE);
- else {
- /* Force the "Export only selected filters" toggle to "false", turn
- off the flag it controls. */
- color_selected = FALSE;
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cfselect_cb), FALSE);
- gtk_widget_set_sensitive(cfselect_cb, FALSE);
- }
-}
-
-static void
-color_toggle_selected_cb(GtkWidget *widget, gpointer data _U_)
-{
- color_selected = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
-}
-
-void
-file_color_export_cmd_cb(GtkWidget *w _U_, gpointer filter_list)
-{
-#ifdef USE_WIN32_FILE_DIALOGS
- win32_export_color_file(GDK_WINDOW_HWND(gtk_widget_get_window(top_level)), &cfile, filter_list);
-#else /* USE_WIN32_FILE_DIALOGS */
- GtkWidget *file_color_export_w;
- GtkWidget *main_vb, *cfglobal_but;
- GtkWidget *cfselect_cb;
- gchar *cf_name;
- gchar *dirname;
- gchar *err_msg = NULL;
-
- color_selected = FALSE;
-
- file_color_export_w = file_selection_new("Wireshark: Export Color Filters",
- GTK_WINDOW(top_level),
- FILE_SELECTION_SAVE);
-
- /* Container for each row of widgets */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- file_selection_set_extra_widget(file_color_export_w, main_vb);
- gtk_widget_show(main_vb);
-
- cfselect_cb = gtk_check_button_new_with_label("Export only selected filters");
- gtk_box_pack_start(GTK_BOX(main_vb), cfselect_cb, FALSE, FALSE, 0);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cfselect_cb), FALSE);
- g_signal_connect(cfselect_cb, "toggled",
- G_CALLBACK(color_toggle_selected_cb), NULL);
- gtk_widget_show(cfselect_cb);
- color_set_export_selected_sensitive(cfselect_cb);
-
- cfglobal_but = gtk_button_new_with_label("Global Color Filter File");
- gtk_box_pack_start(GTK_BOX(main_vb), cfglobal_but, FALSE, FALSE, 0);
- g_signal_connect(cfglobal_but, "clicked",
- G_CALLBACK(color_global_cb), file_color_export_w);
- gtk_widget_show(cfglobal_but);
-
- /*
- * Loop until the user either selects a file or gives up.
- */
- for (;;) {
- cf_name = file_selection_run(file_color_export_w);
- if (cf_name == NULL) {
- /* User cancelled or closed the dialog. */
- return;
- }
-
-#ifndef _WIN32
- /* If the file exists and it's user-immutable or not writable,
- ask the user whether they want to override that. */
- if (!file_target_unwritable_ui(file_color_export_w, cf_name)) {
- /* They don't. Let them try another file name or cancel. */
- g_free(cf_name);
- continue;
- }
-#endif
-
- /* Write out the filters (all, or only the ones that are currently
- displayed or selected) to the file with the specified name. */
- if (!color_filters_export(cf_name, (GSList *)filter_list, color_selected, &err_msg)) {
- /* The write failed; 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 error, try again. */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg);
- g_free(err_msg);
- g_free(cf_name);
- continue;
- }
-
- /* The write succeeded; get rid of the file selection box. */
- window_destroy(GTK_WIDGET(file_color_export_w));
-
- /* Save the directory name for future file dialogs. */
- dirname = get_dirname(cf_name); /* Overwrites cf_name */
- set_last_open_dir(dirname);
- g_free(cf_name);
- }
-#endif /* USE_WIN32_FILE_DIALOGS */
-}
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/capture_file_dlg.h b/ui/gtk/capture_file_dlg.h
deleted file mode 100644
index deda5f8943..0000000000
--- a/ui/gtk/capture_file_dlg.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/* capture_file_dlg.h
- * Definitions for dialog boxes for handling files
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __CAPTURE_FILE_DLG_H__
-#define __CAPTURE_FILE_DLG_H__
-
-#include "cfile.h"
-
-/** @file
- * "Open" / "Close" / "Save" / "Save As" / etc dialog boxes.
- * @ingroup dialog_group
- */
-
-/** If there are unsaved changes, ask the user whether to save them,
- * discard them, or cancel the operation that would cause the changes
- * to be lost if not saved.
- *
- * @param cf the capture_file structure for the file to be closed
- * @param from_quit TRUE if this is from a quit operation
- * @param before_what description of the operation, or a null string
- * for an explicit close operation
- *
- * @return TRUE if the user didn't cancel the operation, FALSE if they did
- */
-gboolean do_file_close(capture_file *cf, gboolean from_quit, const char *before_what);
-
-/** User requested the "Open" dialog box.
- *
- * @param widget parent widget
- * @param data unused
- */
-void file_open_cmd_cb(GtkWidget *widget, gpointer data);
-
-/** User requested the "Merge" dialog box.
- *
- * @param widget parent widget
- * @param data unused
- */
-void file_merge_cmd_cb(GtkWidget *widget, gpointer data);
-
-/** User requested the "Save" dialog box.
- *
- * @param widget parent widget
- * @param data unused
- */
-void file_save_cmd_cb(GtkWidget *widget, gpointer data);
-
-/** User requested the "Save As" dialog box.
- *
- * @param widget parent widget
- * @param data unused
- */
-void file_save_as_cmd_cb(GtkWidget *widget, gpointer data);
-
-/** User requested "Close".
- *
- * @param widget parent widget
- * @param data unused
- */
-void file_close_cmd_cb(GtkWidget *widget, gpointer data);
-
-/** User requested the "Export Specified Packets" dialog box.
- *
- * @param widget parent widget
- * @param data unused
- */
-void file_export_specified_packets_cmd_cb(GtkWidget *widget, gpointer data);
-
-/** User requested the "Export PDUs to file" dialogue box
- * and pressed OK to start the export
- *
- * @param widget parent widget
- * @param data pointer to internal data used by the export pdu part
- */
-void file_export_pdu_ok_cb(GtkWidget *widget, gpointer data);
-
-/** User requested "Reload".
- *
- * @param widget parent widget
- * @param data unused
- */
-void file_reload_cmd_cb(GtkWidget *widget, gpointer data);
-
-/** User requested "Import". Currently only called from the color dialog.
- *
- * @param widget parent widget
- * @param data unused
- */
-void file_color_import_cmd_cb(GtkWidget *widget, gpointer data);
-
-/** User requested "Export". Currently only called from the color dialog.
- *
- * @param widget parent widget
- * @param data unused
- */
-void file_color_export_cmd_cb(GtkWidget *widget, gpointer data);
-
-#endif /* capture_file_dlg.h */
diff --git a/ui/gtk/capture_if_details_dlg_win32.c b/ui/gtk/capture_if_details_dlg_win32.c
deleted file mode 100644
index 2acdb47dfc..0000000000
--- a/ui/gtk/capture_if_details_dlg_win32.c
+++ /dev/null
@@ -1,2415 +0,0 @@
-/* capture_if_details_dlg.c
- * Routines for capture interface details window (only Win32!)
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-
-#if defined HAVE_LIBPCAP && defined _WIN32
-
-#include <time.h>
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include "epan/value_string.h"
-#include "epan/addr_resolv.h"
-
-#include "wsutil/str_util.h"
-
-#include "../../file.h"
-#include "ui/capture.h"
-
-#include "simple_dialog.h"
-
-#include "ui/gtk/main.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/capture_if_details_dlg_win32.h"
-
-#include <winsock2.h> /* Needed here to force a definition of WINVER */
- /* for some (all ?) Microsoft compilers newer than vc6. */
- /* (If windows.h were used instead, there might be */
- /* issues re winsock.h included before winsock2.h ) */
-#include <windowsx.h>
-
-#include <Ntddndis.h>
-
-#include "caputils/capture_win_ifnames.h"
-
-#include "caputils/capture_wpcap_packet.h"
-
-/* packet32.h requires sockaddr_storage
- * whether sockaddr_storage is defined or not depends on the Platform SDK
- * version installed. The only one not defining it is the SDK that comes
- * with MSVC 6.0 (WINVER 0x0400).
- *
- * copied from RFC2553 (and slightly modified because of datatypes) ...
- * XXX - defined more than once, move this to a header file */
-#ifndef WINVER
-#error WINVER not defined ...
-#endif
-#if (WINVER <= 0x0400) && defined(_MSC_VER)
-typedef unsigned short eth_sa_family_t;
-
-/*
- * Desired design of maximum size and alignment
- */
-#define ETH_SS_MAXSIZE 128 /* Implementation specific max size */
-#define ETH_SS_ALIGNSIZE (sizeof (gint64 /*int64_t*/))
- /* Implementation specific desired alignment */
-/*
- * Definitions used for sockaddr_storage structure paddings design.
- */
-#define ETH_SS_PAD1SIZE (ETH_SS_ALIGNSIZE - sizeof (eth_sa_family_t))
-#define ETH_SS_PAD2SIZE (ETH_SS_MAXSIZE - (sizeof (eth_sa_family_t) + \
- ETH_SS_PAD1SIZE + ETH_SS_ALIGNSIZE))
-
-struct sockaddr_storage {
- eth_sa_family_t __ss_family; /* address family */
- /* Following fields are implementation specific */
- char __ss_pad1[ETH_SS_PAD1SIZE];
- /* 6 byte pad, this is to make implementation */
- /* specific pad up to alignment field that */
- /* follows explicit in the data structure */
- gint64 /*int64_t*/ __ss_align; /* field to force desired structure */
- /* storage alignment */
- char __ss_pad2[ETH_SS_PAD2SIZE];
- /* 112 byte pad to achieve desired size, */
- /* _SS_MAXSIZE value minus size of ss_family */
- /* __ss_pad1, __ss_align fields is 112 */
-};
-/* ... copied from RFC2553 */
-#endif /* WINVER */
-
-#include <Packet32.h>
-
-#define DETAILS_STR_MAX 1024
-
-
-/* The informations and definitions used here are coming from various places on the web:
- *
- * ndiswrapper (various NDIS related definitions)
- * http://cvs.sourceforge.net/viewcvs.py/ndiswrapper/ndiswrapper/driver/
- *
- * ReactOS (various NDIS related definitions)
- * http://www.reactos.org/generated/doxygen/d2/d6d/ndis_8h-source.html
- *
- * IEEE802.11 "Detailed NDIS OID Log for a 802.11b Miniport"
- * http://www.ndis.com/papers/ieee802_11_log.htm
- *
- * FreeBSD (various NDIS related definitions)
- * http://lists.freebsd.org/pipermail/p4-projects/2004-January/003433.html
- *
- * MS WHDC "Network Drivers and Windows"
- * http://www.microsoft.com/whdc/archive/netdrv_up.mspx
- *
- * IEEE "Get IEEE 802" (the various 802.11 docs)
- * http://standards.ieee.org/getieee802/802.11.html
- *
- * MS MSDN "Network Devices: Windows Driver Kit"
- * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/NetXP_r/hh/NetXP_r/netref_4c297a96-2ba5-41ed-ab21-b7a9cfaa9b4d.xml.asp
- *
- * MS MSDN "Microsoft Windows CE .NET 4.2 Network Driver Reference"
- * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceddk40/html/cxgrfNetworkDriverReference.asp
- *
- * MS MSDN (some explanations of a special MS 802.11 Information Element)
- * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/randz/protocol/securing_public_wi-fi_hotspots.asp
- *
- * "WLANINFO fuer Windows XP"
- * http://www-pc.uni-regensburg.de/systemsw/TOOLS/wlaninfo.htm
- */
-
-/********************************************************************************/
-/* definitions that would usually come from the windows DDK (device driver kit) */
-/* and are not part of the ntddndis.h file delivered with WinPcap */
-
-/* Required OIDs */
-#define OID_GEN_VLAN_ID 0x0001021C
-
-/* Optional OIDs */
-#define OID_GEN_MEDIA_CAPABILITIES 0x00010201
-#define OID_GEN_PHYSICAL_MEDIUM 0x00010202
-
-/* Optional OIDs */
-#define OID_GEN_NETWORK_LAYER_ADDRESSES 0x00010118
-#define OID_GEN_TRANSPORT_HEADER_OFFSET 0x00010119
-
-/* Currently associated SSID (OID_802_11_SSID) */
-#define NDIS_ESSID_MAX_SIZE 32
-struct ndis_essid {
- ULONG length;
- UCHAR essid[NDIS_ESSID_MAX_SIZE+1];
-};
-
-
-/* some definitions needed for the following structs */
-#define NDIS_MAX_RATES_EX 16
-typedef UCHAR mac_address[/* ETH_ALEN */ 6];
-typedef UCHAR ndis_rates[NDIS_MAX_RATES_EX];
-
-/* configuration, e.g. frequency (OID_802_11_CONFIGURATION / OID_802_11_BSSID_LIST) */
-struct /*packed*/ ndis_configuration {
- ULONG length;
- ULONG beacon_period;
- ULONG atim_window;
- ULONG ds_config;
- struct ndis_configuration_fh {
- ULONG length;
- ULONG hop_pattern;
- ULONG hop_set;
- ULONG dwell_time;
- } fh_config;
-};
-
-/* bssid list item (OID_802_11_BSSID_LIST) */
-struct ndis_ssid_item {
- ULONG length;
- mac_address mac;
- UCHAR reserved[2];
- struct ndis_essid ssid;
- ULONG privacy;
- LONG rssi;
- UINT net_type;
- struct ndis_configuration config;
- UINT mode;
- ndis_rates rates;
- ULONG ie_length;
- UCHAR ies[1];
-};
-
-
-/* bssid list (OID_802_11_BSSID_LIST) */
-struct ndis_bssid_list {
- ULONG num_items;
- struct ndis_ssid_item items[1];
-};
-
-
-/******************************************************************************/
-/* OID_TCP_TASK_OFFLOAD specific definitions that would usually come from the */
-/* windows DDK (device driver kit) and are not part of the ntddndis.h file */
-/* delivered with WinPcap */
-
-/* optional OID */
-#define OID_TCP_TASK_OFFLOAD 0xFC010201
-
-/* task id's */
-typedef enum _NDIS_TASK {
- TcpIpChecksumNdisTask,
- IpSecNdisTask,
- TcpLargeSendNdisTask,
- MaxNdisTask
-} NDIS_TASK, *PNDIS_TASK;
-
-/* TaskBuffer content on TcpIpChecksumNdisTask */
-typedef struct _NDIS_TASK_TCP_IP_CHECKSUM
-{
- struct
- {
- ULONG IpOptionsSupported:1;
- ULONG TcpOptionsSupported:1;
- ULONG TcpChecksum:1;
- ULONG UdpChecksum:1;
- ULONG IpChecksum:1;
- } V4Transmit;
-
- struct
- {
- ULONG IpOptionsSupported:1;
- ULONG TcpOptionsSupported:1;
- ULONG TcpChecksum:1;
- ULONG UdpChecksum:1;
- ULONG IpChecksum:1;
- } V4Receive;
-
- struct
- {
- ULONG IpOptionsSupported:1;
- ULONG TcpOptionsSupported:1;
- ULONG TcpChecksum:1;
- ULONG UdpChecksum:1;
- } V6Transmit;
-
- struct
- {
- ULONG IpOptionsSupported:1;
- ULONG TcpOptionsSupported:1;
- ULONG TcpChecksum:1;
- ULONG UdpChecksum:1;
- } V6Receive;
-} NDIS_TASK_TCP_IP_CHECKSUM, *PNDIS_TASK_TCP_IP_CHECKSUM;
-
-/* TaskBuffer content on TcpLargeSendNdisTask */
-typedef struct _NDIS_TASK_TCP_LARGE_SEND
-{
- ULONG Version;
- ULONG MaxOffLoadSize;
- ULONG MinSegmentCount;
- BOOLEAN TcpOptions;
- BOOLEAN IpOptions;
-} NDIS_TASK_TCP_LARGE_SEND, *PNDIS_TASK_TCP_LARGE_SEND;
-
-/* Encapsulations */
-typedef enum _NDIS_ENCAPSULATION {
- UNSPECIFIED_Encapsulation,
- NULL_Encapsulation,
- IEEE_802_3_Encapsulation,
- IEEE_802_5_Encapsulation,
- LLC_SNAP_ROUTED_Encapsulation,
- LLC_SNAP_BRIDGED_Encapsulation
-} NDIS_ENCAPSULATION;
-
-/* Encapsulation format */
-typedef struct _NDIS_ENCAPSULATION_FORMAT {
- NDIS_ENCAPSULATION Encapsulation;
- struct {
- ULONG FixedHeaderSize : 1;
- ULONG Reserved : 31;
- } Flags;
- ULONG EncapsulationHeaderSize;
-} NDIS_ENCAPSULATION_FORMAT, *PNDIS_ENCAPSULATION_FORMAT;
-
-/* request struct */
-typedef struct _NDIS_TASK_OFFLOAD_HEADER
-{
- ULONG Version;
- ULONG Size;
- ULONG Reserved;
- UCHAR OffsetFirstTask;
- NDIS_ENCAPSULATION_FORMAT EncapsulationFormat;
-} NDIS_TASK_OFFLOAD_HEADER, *PNDIS_TASK_OFFLOAD_HEADER;
-
-/* response struct */
-#define NDIS_TASK_OFFLOAD_VERSION 1
-typedef struct _NDIS_TASK_OFFLOAD
-{
- ULONG Version;
- ULONG Size;
- NDIS_TASK Task;
- ULONG OffsetNextTask;
- ULONG TaskBufferLength;
- UCHAR TaskBuffer[1];
-} NDIS_TASK_OFFLOAD, *PNDIS_TASK_OFFLOAD;
-
-
-/***********************************************************************/
-/* value_string's for info functions */
-
-
-/* NDIS driver medium (OID_GEN_MEDIA_SUPPORTED / OID_GEN_MEDIA_IN_USE) */
-/* Do not use NdisMediumXXX to avoid any dependency on the SDK version installed */
-static const value_string win32_802_3_medium_vals[] = {
- { -6 /*WinPcap NdisMediumPpi*/, "802.11 + PPI" },
- { -5 /*WinPcap NdisMediumRadio80211*/, "802.11 + Radio" },
- { -4 /*WinPcap NdisMediumBare80211*/, "802.11" },
- { -3 /*WinPcap NdisMediumPPPSerial*/, "PPP Serial" },
- { -2 /*WinPcap NdisMediumCHDLC*/, "CHDLC" },
- { -1 /*WinPcap NdisMediumNull*/, "Null/Loopback" },
- { 0 /*NdisMedium802_3*/, "802.3 (Ethernet)" },
- { 1 /*NdisMedium802_5*/, "802.5 (Token Ring)" },
- { 2 /*NdisMediumFddi*/, "FDDI" },
- { 3 /*NdisMediumWan*/, "WAN" },
- { 4 /*NdisMediumLocalTalk*/, "Local Talk" },
- { 5 /*NdisMediumDix*/, "DIX" },
- { 6 /*NdisMediumArcnetRaw*/, "Arcnet Raw" },
- { 7 /*NdisMediumArcnet878_2*/, "Arcnet 878.2" },
- { 8 /*NdisMediumAtm*/, "ATM" },
- { 9 /*NdisMediumWirelessWan*/, "Wireless WAN" },
- { 10 /*NdisMediumIrda*/, "IrDA" },
- { 11 /*NdisMediumBpc*/, "Broadcast PC" },
- { 12 /*NdisMediumCoWan*/, "CoWAN" },
- { 13 /*NdisMedium1394*/, "IEEE 1394" },
- { 14 /*NdisMediumInfiniBand*/, "Infiniband" },
- { 15 /*NdisMediumTunnel*/, "Tunnel" },
- { 16 /*NdisMediumNative802_11*/, "Native 802.11" },
- { 17 /*NdisMediumLoopback*/, "Loopback" },
- { 18 /*NdisMediumWiMAX*/, "WiMAX" },
- { 19 /*NdisMediumIP*/, "IP" },
- { 0, NULL }
-};
-
-/* NDIS physical driver medium (OID_GEN_PHYSICAL_MEDIUM) */
-/* Do not use NdisPhysicalMediumXXX to avoid any dependency on the SDK version installed */
-static const value_string win32_802_3_physical_medium_vals[] = {
- { 0 /*NdisPhysicalMediumUnspecified*/, "Unspecified" },
- { 1 /*NdisPhysicalMediumWirelessLan*/, "Wireless LAN" },
- { 2 /*NdisPhysicalMediumCableModem*/, "Cable Modem (DOCSIS)" },
- { 3 /*NdisPhysicalMediumPhoneLine*/, "Phone Line" },
- { 4 /*NdisPhysicalMediumPowerLine*/, "Power Line" },
- { 5 /*NdisPhysicalMediumDSL*/, "DSL" },
- { 6 /*NdisPhysicalMediumFibreChannel*/, "Fibre Channel" },
- { 7 /*NdisPhysicalMedium1394*/, "IEEE 1394" },
- { 8 /*NdisPhysicalMediumWirelessWan*/, "Wireless WAN" },
- { 9 /*NdisPhysicalMediumNative802_11*/, "Native 802.11" },
- { 10 /*NdisPhysicalMediumBluetooth*/, "Bluetooth" },
- { 11 /*NdisPhysicalMediumInfiniband*/, "Infiniband" },
- { 12 /*NdisPhysicalMediumWiMax*/, "WiMAX" },
- { 13 /*NdisPhysicalMediumUWB*/, "Ultra Wideband (UWB)" },
- { 14 /*NdisPhysicalMedium802_3*/, "802.3 (Ethernet)" },
- { 15 /*NdisPhysicalMedium802_5*/, "802.5 (Token Ring)" },
- { 16 /*NdisPhysicalMediumIrda*/, "IrDA" },
- { 17 /*NdisPhysicalMediumWiredWAN*/, "Wired WAN" },
- { 18 /*NdisPhysicalMediumWiredCoWan*/, "Wired CoWAN" },
- { 19 /*NdisPhysicalMediumOther*/, "Other" },
- { 0, NULL }
-};
-
-static const value_string win32_802_11_infra_mode_vals[] = {
- { Ndis802_11IBSS, "Ad Hoc" },
- { Ndis802_11Infrastructure, "Access Point" },
- { Ndis802_11AutoUnknown, "Auto or unknown" },
- { 0, NULL }
-};
-
-static const value_string win32_802_11_auth_mode_vals[] = {
- { Ndis802_11AuthModeOpen, "Open System" },
- { Ndis802_11AuthModeShared, "Shared Key" },
- { Ndis802_11AuthModeAutoSwitch, "Auto Switch" },
- { Ndis802_11AuthModeWPA, "WPA" },
- { Ndis802_11AuthModeWPAPSK, "WPA-PSK (pre shared key)" },
- { Ndis802_11AuthModeWPANone, "WPA (ad hoc)" },
-#if (_MSC_VER != 1400) /* These are not defined in Ntddndis.h in MSVC2005/MSVC2005EE PSDK */
- { Ndis802_11AuthModeWPA2, "WPA2" },
- { Ndis802_11AuthModeWPA2PSK, "WPA2-PSK (pre shared key)" },
-#endif
- { 0, NULL }
-};
-
-static const value_string win32_802_11_network_type_vals[] = {
- { Ndis802_11FH, "FH (frequency-hopping spread-spectrum)" },
- { Ndis802_11DS, "DS (direct-sequence spread-spectrum)" },
- { Ndis802_11OFDM5, "5-GHz OFDM" },
- { Ndis802_11OFDM24, "2.4-GHz OFDM" },
-#if (_MSC_VER != 1400) /* These are not defined in Ntddndis.h in MSVC2005/MSVC2005EE PSDK */
- { Ndis802_11Automode, "Auto" },
-#endif
- { 0, NULL }
-};
-
-static const value_string win32_802_11_encryption_status_vals[] = {
- { Ndis802_11Encryption1Enabled, "WEP enabled, TKIP & AES disabled, transmit key available" },
- { Ndis802_11EncryptionDisabled, "WEP & TKIP & AES disabled, transmit key available" },
- { Ndis802_11Encryption1KeyAbsent, "WEP enabled, TKIP & AES disabled, transmit key unavailable" },
- { Ndis802_11EncryptionNotSupported, "WEP & TKIP & AES not supported" },
- { Ndis802_11Encryption2Enabled, "WEP & TKIP enabled, AES disabled, transmit key available" },
- { Ndis802_11Encryption2KeyAbsent, "WEP & TKIP enabled, AES disabled, transmit key unavailable" },
- { Ndis802_11Encryption3Enabled, "WEP & TKIP & AES enabled, transmit key available" },
- { Ndis802_11Encryption3KeyAbsent, "WEP & TKIP & AES enabled, transmit key unavailable" },
- { 0, NULL }
-};
-
-/* frequency to channel mapping (OID_802_11_CONFIGURATION) */
-static const value_string win32_802_11_channel_freq_vals[] = {
- { 2412000, "1 (2412 MHz)" },
- { 2417000, "2 (2417 MHz)" },
- { 2422000, "3 (2422 MHz)" },
- { 2427000, "4 (2427 MHz)" },
- { 2432000, "5 (2432 MHz)" },
- { 2437000, "6 (2437 MHz)" },
- { 2442000, "7 (2442 MHz)" },
- { 2447000, "8 (2447 MHz)" },
- { 2452000, "9 (2452 MHz)" },
- { 2457000, "10 (2457 MHz)" },
- { 2462000, "11 (2462 MHz)" },
- { 2467000, "12 (2467 MHz)" },
- { 2472000, "13 (2472 MHz)" },
- { 2484000, "14 (2484 MHz)" },
- { 0, NULL }
-};
-
-/* frequency to channel mapping (OID_802_11_CONFIGURATION) */
-static const value_string win32_802_11_channel_vals[] = {
- { 2412000, "1" },
- { 2417000, "2" },
- { 2422000, "3" },
- { 2427000, "4" },
- { 2432000, "5" },
- { 2437000, "6" },
- { 2442000, "7" },
- { 2447000, "8" },
- { 2452000, "9" },
- { 2457000, "10" },
- { 2462000, "11" },
- { 2467000, "12" },
- { 2472000, "13" },
- { 2484000, "14" },
- { 0, NULL }
-};
-
-
-/* Information Element IDs (802.11 Spec: "7.3.2 Information elements") */
-#define IE_ID_SSID 0
-#define IE_ID_SUPPORTED_RATES 1
-#define IE_ID_DS_PARAMETER_SET 3
-#define IE_ID_TIM 5
-#define IE_ID_COUNTRY 7
-#define IE_ID_ERP_INFORMATION 42
-#define IE_ID_WPA2 48
-#define IE_ID_EXTENDED_SUPPORT_RATES 50
-#define IE_ID_VENDOR_SPECIFIC 221
-
-#ifdef DEBUG_IE
-/* ElementID in NDIS_802_11_VARIABLE_IEs */
-static const value_string ie_id_vals[] = {
- { IE_ID_SSID, "SSID, 802.11" },
- { IE_ID_SUPPORTED_RATES, "Supported Rates, 802.11" },
- { 2, "FH Parameter Set, 802.11" },
- { IE_ID_DS_PARAMETER_SET, "DS Parameter Set, 802.11" },
- { 4, "CF Parameter Set, 802.11" },
- { IE_ID_TIM, "TIM, 802.11" },
- { 6, "IBSS Parameter Set, 802.11" },
- { IE_ID_COUNTRY, "Country, 802.11d" },
- { 8, "Hopping Pattern Parameters, 802.11d" },
- { 9, "Hopping Pattern Table, 802.11d" },
- { 10, "Request, 802.11d" },
- /* 11-15 reserved, 802.11d */
- { 16, "Challenge text, 802.11" },
- /* 17-31 reserved, 802.11h */
- { 32, "Power Constraint, 802.11h" },
- { 33, "Power Capability, 802.11h" },
- { 34, "TPC Request, 802.11h" },
- { 35, "TPC Report, 802.11h" },
- { 36, "Supported Channels, 802.11h" },
- { 37, "Channel Switch Announcement, 802.11h" },
- { 38, "Measurement Request, 802.11h" },
- { 39, "Measurement Report, 802.11h" },
- { 40, "Quiet, 802.11h" },
- { 41, "IBSS DFS, 802.11h" },
- { IE_ID_ERP_INFORMATION, "ERP information, 802.11g" },
- /* 43-47 reserved, 802.11i */
- { IE_ID_WPA2, "WPA2/RSN (Robust Secure Network), 802.11i" },
- /* 49 reserved, 802.11i */
- { IE_ID_EXTENDED_SUPPORT_RATES, "Extended Supported Rates, 802.11g" },
- /* 51-255 reserved, 802.11g */
- { IE_ID_VENDOR_SPECIFIC, "WPA, (not 802.11!)" },
- { 0, NULL }
-};
-#endif
-
-#if 0
-static const value_string oid_vals[] = {
- { OID_GEN_SUPPORTED_LIST, "OID_GEN_SUPPORTED_LIST" },
- { OID_GEN_HARDWARE_STATUS, "OID_GEN_HARDWARE_STATUS (only internally interesting)" },
- { OID_GEN_MEDIA_SUPPORTED, "OID_GEN_MEDIA_SUPPORTED" },
- { OID_GEN_MEDIA_IN_USE, "OID_GEN_MEDIA_IN_USE" },
- { OID_GEN_MAXIMUM_LOOKAHEAD, "OID_GEN_MAXIMUM_LOOKAHEAD (unused)" },
- { OID_GEN_MAXIMUM_FRAME_SIZE, "OID_GEN_MAXIMUM_FRAME_SIZE (unused)" },
- { OID_GEN_LINK_SPEED, "OID_GEN_LINK_SPEED" },
- { OID_GEN_TRANSMIT_BUFFER_SPACE, "OID_GEN_TRANSMIT_BUFFER_SPACE" },
- { OID_GEN_RECEIVE_BUFFER_SPACE, "OID_GEN_RECEIVE_BUFFER_SPACE" },
- { OID_GEN_TRANSMIT_BLOCK_SIZE, "OID_GEN_TRANSMIT_BLOCK_SIZE" },
- { OID_GEN_RECEIVE_BLOCK_SIZE, "OID_GEN_RECEIVE_BLOCK_SIZE" },
- { OID_GEN_VENDOR_ID, "OID_GEN_VENDOR_ID" },
- { OID_GEN_VENDOR_DESCRIPTION, "OID_GEN_VENDOR_DESCRIPTION" },
- { OID_GEN_CURRENT_PACKET_FILTER, "OID_GEN_CURRENT_PACKET_FILTER (info seems to be constant)" },
- { OID_GEN_CURRENT_LOOKAHEAD, "OID_GEN_CURRENT_LOOKAHEAD (only internally interesting)" },
- { OID_GEN_DRIVER_VERSION, "OID_GEN_DRIVER_VERSION" },
- { OID_GEN_MAXIMUM_TOTAL_SIZE, "OID_GEN_MAXIMUM_TOTAL_SIZE" },
- { OID_GEN_PROTOCOL_OPTIONS, "OID_GEN_PROTOCOL_OPTIONS (info not interesting)" },
- { OID_GEN_MAC_OPTIONS, "OID_GEN_MAC_OPTIONS" },
- { OID_GEN_MEDIA_CONNECT_STATUS, "OID_GEN_MEDIA_CONNECT_STATUS" },
- { OID_GEN_MAXIMUM_SEND_PACKETS, "OID_GEN_MAXIMUM_SEND_PACKETS (only internally interesting)" },
- { OID_GEN_VENDOR_DRIVER_VERSION, "OID_GEN_VENDOR_DRIVER_VERSION" },
- { OID_GEN_XMIT_OK, "OID_GEN_XMIT_OK" },
- { OID_GEN_RCV_OK, "OID_GEN_RCV_OK" },
- { OID_GEN_XMIT_ERROR, "OID_GEN_XMIT_ERROR" },
- { OID_GEN_RCV_ERROR, "OID_GEN_RCV_ERROR" },
- { OID_GEN_RCV_NO_BUFFER, "OID_GEN_RCV_NO_BUFFER" },
- { OID_GEN_DIRECTED_BYTES_XMIT, "OID_GEN_DIRECTED_BYTES_XMIT" },
- { OID_GEN_DIRECTED_FRAMES_XMIT, "OID_GEN_DIRECTED_FRAMES_XMIT" },
- { OID_GEN_MULTICAST_BYTES_XMIT, "OID_GEN_MULTICAST_BYTES_XMIT" },
- { OID_GEN_MULTICAST_FRAMES_XMIT, "OID_GEN_MULTICAST_FRAMES_XMIT" },
- { OID_GEN_BROADCAST_BYTES_XMIT, "OID_GEN_BROADCAST_BYTES_XMIT" },
- { OID_GEN_BROADCAST_FRAMES_XMIT, "OID_GEN_BROADCAST_FRAMES_XMIT" },
- { OID_GEN_DIRECTED_BYTES_RCV, "OID_GEN_DIRECTED_BYTES_RCV" },
- { OID_GEN_DIRECTED_FRAMES_RCV, "OID_GEN_DIRECTED_FRAMES_RCV" },
- { OID_GEN_MULTICAST_BYTES_RCV, "OID_GEN_MULTICAST_BYTES_RCV" },
- { OID_GEN_MULTICAST_FRAMES_RCV, "OID_GEN_MULTICAST_FRAMES_RCV" },
- { OID_GEN_BROADCAST_BYTES_RCV, "OID_GEN_BROADCAST_BYTES_RCV" },
- { OID_GEN_BROADCAST_FRAMES_RCV, "OID_GEN_BROADCAST_FRAMES_RCV" },
- { OID_GEN_RCV_CRC_ERROR, "OID_GEN_RCV_CRC_ERROR" },
- { OID_GEN_TRANSMIT_QUEUE_LENGTH, "OID_GEN_TRANSMIT_QUEUE_LENGTH" },
- { OID_GEN_GET_TIME_CAPS, "OID_GEN_GET_TIME_CAPS (unsupp, unused)" },
- { OID_GEN_GET_NETCARD_TIME, "OID_GEN_GET_NETCARD_TIME (unsupp, unused)" },
-
- { OID_GEN_PHYSICAL_MEDIUM, "OID_GEN_PHYSICAL_MEDIUM" },
- /*{ OID_GEN_MACHINE_NAME, "OID_GEN_MACHINE_NAME (unsupp, unused)" },*/
- { OID_GEN_VLAN_ID, "OID_GEN_VLAN_ID" },
- { OID_GEN_MEDIA_CAPABILITIES, "OID_GEN_MEDIA_CAPABILITIES (unsupp, unused)" },
-
- { OID_GEN_NETWORK_LAYER_ADDRESSES, "OID_GEN_NETWORK_LAYER_ADDRESSES (write only)" },
- { OID_GEN_TRANSPORT_HEADER_OFFSET, "OID_GEN_TRANSPORT_HEADER_OFFSET (write only)" },
-
- { OID_802_3_PERMANENT_ADDRESS, "OID_802_3_PERMANENT_ADDRESS" },
- { OID_802_3_CURRENT_ADDRESS, "OID_802_3_CURRENT_ADDRESS" },
- { OID_802_3_MAXIMUM_LIST_SIZE, "OID_802_3_MAXIMUM_LIST_SIZE (unused)" },
- { OID_802_3_MULTICAST_LIST, "OID_802_3_MULTICAST_LIST (unused)" }, /* XXX */
- { OID_802_3_MAC_OPTIONS, "OID_802_3_MAC_OPTIONS (unsupp, unused)" },
-
- { OID_802_3_RCV_ERROR_ALIGNMENT, "OID_802_3_RCV_ERROR_ALIGNMENT" },
- { OID_802_3_XMIT_ONE_COLLISION, "OID_802_3_XMIT_ONE_COLLISION" },
- { OID_802_3_XMIT_MORE_COLLISIONS, "OID_802_3_XMIT_MORE_COLLISIONS" },
- { OID_802_3_XMIT_DEFERRED, "OID_802_3_XMIT_DEFERRED" },
- { OID_802_3_XMIT_MAX_COLLISIONS, "OID_802_3_XMIT_MAX_COLLISIONS" },
- { OID_802_3_RCV_OVERRUN, "OID_802_3_RCV_OVERRUN" },
- { OID_802_3_XMIT_UNDERRUN, "OID_802_3_XMIT_UNDERRUN" },
- { OID_802_3_XMIT_HEARTBEAT_FAILURE, "OID_802_3_XMIT_HEARTBEAT_FAILURE (unsupp, used)" },
- { OID_802_3_XMIT_TIMES_CRS_LOST, "OID_802_3_XMIT_TIMES_CRS_LOST (unsupp, used)" },
- { OID_802_3_XMIT_LATE_COLLISIONS, "OID_802_3_XMIT_LATE_COLLISIONS" },
-
- { OID_802_11_BSSID, "OID_802_11_BSSID" },
- { OID_802_11_SSID, "OID_802_11_SSID" },
- { OID_802_11_NETWORK_TYPES_SUPPORTED, "OID_802_11_NETWORK_TYPES_SUPPORTED (info not interesting)" },
- { OID_802_11_NETWORK_TYPE_IN_USE, "OID_802_11_NETWORK_TYPE_IN_USE" },
- { OID_802_11_TX_POWER_LEVEL, "OID_802_11_TX_POWER_LEVEL (unsupp, used)" },
- { OID_802_11_RSSI, "OID_802_11_RSSI" },
- { OID_802_11_RSSI_TRIGGER, "OID_802_11_RSSI_TRIGGER (unsupp, unused)" },
- { OID_802_11_INFRASTRUCTURE_MODE, "OID_802_11_INFRASTRUCTURE_MODE" },
- { OID_802_11_FRAGMENTATION_THRESHOLD, "OID_802_11_FRAGMENTATION_THRESHOLD (unused)" },
- { OID_802_11_RTS_THRESHOLD, "OID_802_11_RTS_THRESHOLD (unused)" },
- { OID_802_11_NUMBER_OF_ANTENNAS, "OID_802_11_NUMBER_OF_ANTENNAS (unsupp, unused)" },
- { OID_802_11_RX_ANTENNA_SELECTED, "OID_802_11_RX_ANTENNA_SELECTED (unsupp, unused)" },
- { OID_802_11_TX_ANTENNA_SELECTED, "OID_802_11_TX_ANTENNA_SELECTED (unsupp, unused)" },
- { OID_802_11_SUPPORTED_RATES, "OID_802_11_SUPPORTED_RATES" },
- { OID_802_11_DESIRED_RATES, "OID_802_11_DESIRED_RATES (unsupp, used)" },
- { OID_802_11_CONFIGURATION, "OID_802_11_CONFIGURATION" },
- { OID_802_11_STATISTICS, "OID_802_11_STATISTICS (unsupp, unused)" },
- { OID_802_11_ADD_WEP, "OID_802_11_ADD_WEP (write only)" },
- { OID_802_11_REMOVE_WEP, "OID_802_11_REMOVE_WEP (write only)" },
- { OID_802_11_DISASSOCIATE, "OID_802_11_DISASSOCIATE (write only)" },
- { OID_802_11_POWER_MODE, "OID_802_11_POWER_MODE (info not interesting)" },
- { OID_802_11_BSSID_LIST, "OID_802_11_BSSID_LIST" },
- { OID_802_11_AUTHENTICATION_MODE, "OID_802_11_AUTHENTICATION_MODE" },
- { OID_802_11_PRIVACY_FILTER, "OID_802_11_PRIVACY_FILTER (info not interesting)" },
- { OID_802_11_BSSID_LIST_SCAN, "OID_802_11_BSSID_LIST_SCAN" },
- { OID_802_11_WEP_STATUS, "OID_802_11_WEP_STATUS (info not interesting?)" },
- { OID_802_11_ENCRYPTION_STATUS, "OID_802_11_ENCRYPTION_STATUS (unsupp, used)" },
- { OID_802_11_RELOAD_DEFAULTS, "OID_802_11_RELOAD_DEFAULTS (write only)" },
- { OID_802_11_ADD_KEY, "OID_802_11_ADD_KEY (write only)" },
- { OID_802_11_REMOVE_KEY, "OID_802_11_REMOVE_KEY (write only)" },
- { OID_802_11_ASSOCIATION_INFORMATION, "OID_802_11_ASSOCIATION_INFORMATION (unused)" }, /* XXX */
- { OID_802_11_TEST, "OID_802_11_TEST (write only)" },
-#if (_MSC_VER != 1400) /* These are not defined in Ntddndis.h in MSVC2005/MSVC2005EE PSDK */
- { OID_802_11_CAPABILITY, "OID_802_11_CAPABILITY (unsupp, unused)" },
- { OID_802_11_PMKID, "OID_802_11_PMKID (unsupp, unused)" },
-#endif
-
- /* Token-Ring list is utterly incomplete (contains only the values for MS Loopback Driver) */
- { OID_802_5_PERMANENT_ADDRESS, "OID_802_5_PERMANENT_ADDRESS (unused)" },
- { OID_802_5_CURRENT_ADDRESS, "OID_802_5_CURRENT_ADDRESS (unused)" },
- { OID_802_5_CURRENT_FUNCTIONAL, "OID_802_5_CURRENT_FUNCTIONAL (unused)" },
- { OID_802_5_CURRENT_GROUP, "OID_802_5_CURRENT_GROUP (unused)" },
- { OID_802_5_LAST_OPEN_STATUS, "OID_802_5_LAST_OPEN_STATUS (unused)" },
- { OID_802_5_CURRENT_RING_STATUS, "OID_802_5_CURRENT_RING_STATUS (unused)" },
- { OID_802_5_CURRENT_RING_STATE, "OID_802_5_CURRENT_RING_STATE (unused)" },
- { OID_802_5_LINE_ERRORS, "OID_802_5_LINE_ERRORS (unused)" },
- { OID_802_5_LOST_FRAMES, "OID_802_5_LOST_FRAMES (unused)" },
-
- /* FDDI list is utterly incomplete (contains only the values for MS Loopback Driver) */
- { OID_FDDI_LONG_PERMANENT_ADDR, "OID_FDDI_LONG_PERMANENT_ADDR (unused)" },
- { OID_FDDI_LONG_CURRENT_ADDR, "OID_FDDI_LONG_CURRENT_ADDR (unused)" },
- { OID_FDDI_LONG_MULTICAST_LIST, "OID_FDDI_LONG_MULTICAST_LIST (unused)" },
- { OID_FDDI_LONG_MAX_LIST_SIZE, "OID_FDDI_LONG_MAX_LIST_SIZE (unused)" },
- { OID_FDDI_SHORT_PERMANENT_ADDR, "OID_FDDI_SHORT_PERMANENT_ADDR (unused)" },
- { OID_FDDI_SHORT_CURRENT_ADDR, "OID_FDDI_SHORT_CURRENT_ADDR (unused)" },
- { OID_FDDI_SHORT_MULTICAST_LIST, "OID_FDDI_SHORT_MULTICAST_LIST (unused)" },
- { OID_FDDI_SHORT_MAX_LIST_SIZE, "OID_FDDI_SHORT_MAX_LIST_SIZE (unused)" },
-
- /* LocalTalk list is utterly incomplete (contains only the values for MS Loopback Driver) */
- { OID_LTALK_CURRENT_NODE_ID, "OID_LTALK_CURRENT_NODE_ID (unused)" },
-
- /* Arcnet list is utterly incomplete (contains only the values for MS Loopback Driver) */
- { OID_ARCNET_PERMANENT_ADDRESS, "OID_ARCNET_PERMANENT_ADDRESS (unused)" },
- { OID_ARCNET_CURRENT_ADDRESS, "OID_ARCNET_CURRENT_ADDRESS (unused)" },
-
- { OID_TCP_TASK_OFFLOAD, "OID_TCP_TASK_OFFLOAD" },
-
- /* PnP and power management OIDs */
- { OID_PNP_CAPABILITIES, "OID_PNP_CAPABILITIES (unused)" },
- { OID_PNP_SET_POWER, "OID_PNP_SET_POWER (write only)" },
- { OID_PNP_QUERY_POWER, "OID_PNP_QUERY_POWER (unused)" },
- { OID_PNP_ADD_WAKE_UP_PATTERN, "OID_PNP_ADD_WAKE_UP_PATTERN (write only)" },
- { OID_PNP_REMOVE_WAKE_UP_PATTERN, "OID_PNP_REMOVE_WAKE_UP_PATTERN (write only)" },
- { OID_PNP_WAKE_UP_PATTERN_LIST, "OID_PNP_WAKE_UP_PATTERN_LIST (unused)" },
- { OID_PNP_ENABLE_WAKE_UP, "OID_PNP_ENABLE_WAKE_UP (unused)" },
-
- /* Unknown OID's (seen on an "Intel(R) PRO/Wireless 2200BG" 802.11 interface) */
- { 0xFF100000, "Unknown 0xFF100000 (unused)" },
- { 0xFF100002, "Unknown 0xFF100002 (unused)" },
- { 0xFF100003, "Unknown 0xFF100003 (unused)" },
- { 0xFF100004, "Unknown 0xFF100004 (unused)" },
- { 0xFF100005, "Unknown 0xFF100005 (unused)" },
- { 0xFF100006, "Unknown 0xFF100006 (unused)" },
- { 0xFF100007, "Unknown 0xFF100007 (unused)" },
- { 0xFF100009, "Unknown 0xFF100009 (unused)" },
- { 0xFF10000b, "Unknown 0xFF10000b (unused)" },
- { 0xFF10000c, "Unknown 0xFF10000c (unused)" },
- { 0xFF10000e, "Unknown 0xFF10000e (unused)" },
- { 0xFF10000f, "Unknown 0xFF10000f (unused)" },
- /* continued by a lot more 0xFF... values */
-
- { 0, NULL }
-};
-#endif
-
-/***************************************************************************/
-/* debug functions, query or list supported NDIS OID's */
-
-#if 0
-static void
-supported_list(LPADAPTER adapter)
-{
- unsigned char values[10000];
- int length;
- gchar* tmp_str;
-
- g_warning("supported_list_unhandled");
- length = sizeof(values);
- if (wpcap_packet_request(adapter, OID_GEN_SUPPORTED_LIST, FALSE /* !set */, values, &length)) {
- guint32 *value = (guint32 *)values;
-
- while (length >= 4) {
- tmp_str = val_to_str_wmem(NULL, *value, oid_vals, "unknown (%d)");
- printf("OID: 0x%08X %s\n", *value, tmp_str);
- wmem_free(NULL, tmp_str);
-
- value++;
- length -= 4;
- }
- }
-}
-
-
-static gboolean
-supported_query_oid(LPADAPTER adapter, guint32 oid)
-{
- unsigned char values[10000];
- int length;
-
-
- length = sizeof(values);
- if (wpcap_packet_request(adapter, OID_GEN_SUPPORTED_LIST, FALSE /* !set */, values, &length)) {
- guint32 *value = (guint32 *) values;
-
- while (length >= 4) {
- if (*value == oid) {
- return TRUE;
- }
- value++;
- length -= 4;
- }
- }
-
- return FALSE;
-}
-#endif
-
-/******************************************************************************/
-/* info functions, get and display various NDIS driver values */
-
-
-#if 0
- GtkWidget *meter;
- GtkWidget *val_lb;
-
-static GtkWidget *
-add_meter_to_grid(GtkWidget *grid, guint *row, gchar *title,
- int value, gchar *value_title,
- int min, int max,
- int yellow_level,
- GList *scale)
-{
- GtkWidget *label;
- gchar *indent;
- GtkWidget *main_hb;
-
-
- /* the label */
- indent = g_strdup_printf(" %s", title);
- label = gtk_label_new(indent);
- g_free(indent);
- gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
- ws_gtk_grid_attach_extended(GTK_GRID(grid), label, 0, *row, 1, 1, GTK_EXPAND|GTK_FILL, 0, 0,0);
-
- /* the level meter */
- main_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6, FALSE);
-
- meter = gtk_vumeter_new ();
-
- gtk_vumeter_set_orientation(GTK_VUMETER(meter), GTK_VUMETER_LEFT_TO_RIGHT);
-
- gtk_vumeter_set_min_max(GTK_VUMETER(meter), &min, &max);
- gtk_vumeter_set_yellow_level (GTK_VUMETER(meter), yellow_level);
- gtk_vumeter_set_thickness (GTK_VUMETER(meter), 10);
- gtk_vumeter_set_thickness_reduction (GTK_VUMETER(meter), 2);
- gtk_vumeter_set_scale_hole_size (GTK_VUMETER(meter), 2);
- gtk_vumeter_set_colors_inverted (GTK_VUMETER(meter), TRUE);
-
- if (scale) {
- gtk_vumeter_set_scale_items(GTK_VUMETER(meter), scale);
- }
-
- gtk_vumeter_set_level(GTK_VUMETER(meter), value);
-
- gtk_box_pack_start (GTK_BOX(main_hb),
- meter,
- TRUE /*expand*/,
- TRUE /*fill*/,
- 0 /* padding */);
-
- val_lb = gtk_label_new(value_title);
- gtk_widget_set_size_request(val_lb, 50, -1);
- gtk_misc_set_alignment(GTK_MISC(val_lb), 1.0, 0.5);
-
- gtk_box_pack_start (GTK_BOX(main_hb),
- val_lb,
- FALSE /*expand*/,
- FALSE /*fill*/,
- 0 /* padding */);
-
- ws_gtk_grid_attach_extended(GTK_GRID(grid), main_hb, 1, *row, 1, 1, GTK_EXPAND|GTK_FILL, 0, 0,0);
-
- *row += 1;
-
- return meter;
-}
-
-#endif
-
-static void
-add_row_to_grid(GtkWidget *grid, guint *row, gchar *title, const gchar *value, gboolean sensitive)
-{
- GtkWidget *label;
- gchar *indent;
-
- if (strlen(value) != 0) {
- indent = g_strdup_printf(" %s", title);
- } else {
- indent = g_strdup(title);
- }
- label = gtk_label_new(indent);
- g_free(indent);
- gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
- gtk_widget_set_sensitive(label, sensitive);
- ws_gtk_grid_attach_extended(GTK_GRID(grid), label, 0, *row, 1, 1, GTK_EXPAND | GTK_FILL, 0, 0,0);
-
- label = gtk_label_new(value);
- gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
- gtk_widget_set_sensitive(label, sensitive);
- ws_gtk_grid_attach_extended(GTK_GRID(grid), label, 1, *row, 1, 1, GTK_EXPAND | GTK_FILL, 0, 0,0);
-
- *row += 1;
-}
-
-
-#if 0
-static void
-add_string_to_grid_sensitive(GtkWidget *grid, guint *row, gchar *title, gchar *value, gboolean sensitive)
-{
- add_row_to_grid(grid, row, title, value, sensitive);
-}
-#endif
-
-static void
-add_string_to_grid(GtkWidget *grid, guint *row, gchar *title, const gchar *value)
-{
- add_row_to_grid(grid, row, title, value, TRUE);
-}
-
-
-static void
-ssid_details(GtkWidget *grid, guint *row, struct ndis_essid *ssid_in) {
- struct ndis_essid ssid[2]; /* prevent an off by one error */
-
- ssid[0] = *ssid_in;
- g_assert(ssid->length <= NDIS_ESSID_MAX_SIZE);
-
- if (ssid->length != 0) {
- ssid->essid[ssid->length] = '\0';
- add_string_to_grid(grid, row, "SSID (Service Set IDentifier)", ssid->essid);
- } else {
- add_string_to_grid(grid, row, "SSID (Service Set IDentifier)", "(currently not associated with an SSID)");
- }
-}
-
-
-static GString *
-rates_details(unsigned char *values, int length) {
- int i;
- GString *Rates;
- float float_value;
- int int_value;
-
-
- Rates = g_string_new("");
-
- if (length != 0) {
- i = 0;
- while (length--) {
- if (values[i]) {
- if (i != 0) {
- g_string_append(Rates, "/");
- }
-
- float_value = ((float) (values[i] & 0x7F)) / 2;
-
- /* reduce the screen estate by showing fractions only where required */
- int_value = (int)float_value;
- if (float_value == (float)int_value) {
- g_string_append_printf(Rates, "%.0f", float_value);
- } else {
- g_string_append_printf(Rates, "%.1f", float_value);
- }
- }
- i++;
- }
- Rates = g_string_append(Rates, " MBits/s");
- } else {
- Rates = g_string_append(Rates, "-");
- }
-
- return Rates;
-}
-
-
-#if 0
-static GList *
-rates_vu_list(unsigned char *values, int length, int *max)
-{
- int i;
- GList *Rates = NULL;
- GtkVUMeterScaleItem *item;
-
- *max = 0;
-
- if (length == 0) {
- return NULL;
- }
-
- /* add a zero scale point */
- item = g_malloc(sizeof(GtkVUMeterScaleItem));
- item->level = 0;
- item->large = TRUE;
- item->label = "0";
- Rates = g_list_append(Rates, item);
-
- /* get the maximum rate */
- for(i=0; i<length; i++) {
- gint level;
-
- if (values[i]) {
- level = (values[i] & 0x7F) / 2;
-
- if (level > *max) {
- *max = level;
- }
- }
- }
-
- /* debug: fake the 108MBit entry (I don't own one :-) */
- *max = 108;
-
- item = g_malloc(sizeof(GtkVUMeterScaleItem));
- item->level = 108;
- item->large = TRUE;
- item->label = "108";
- Rates = g_list_append(Rates, item);
-
- for(i=0; i<length; i++) {
- if (values[i]) {
- /* reduce the screen estate by showing fractions only where required */
- item = g_malloc(sizeof(GtkVUMeterScaleItem));
-
- item->level = (values[i] & 0x7F) / 2;
-
- /* common data rates: */
- /* 802.11 (15.1) : mandatory: 2, 1 */
- /* 802.11a (17.1) : mandatory: 24, 12, 6 optional: 54, 48, 36, 18, 9 */
- /* 802.11b (18.1) : mandatory: 11, 5.5 (+ 2, 1) */
- /* 802.11g (19.1.1): mandatory: 24, 12, 11, 6, 5.5, 2, 1 optional: 54, 48, 36, 33, 22, 18, 9 */
- /* 802.11n: ? */
- /* proprietary: 108 */
-
- switch (item->level) {
- case 2:
- if (*max >= 108) {
- item->large = FALSE;
- item->label = NULL;
- } else {
- item->large = TRUE;
- item->label = "2";
- }
- break;
- case 5:
- item->large = TRUE;
- item->label = "5.5";
- break;
- case 11:
- item->large = TRUE;
- item->label = "11";
- break;
- case 18:
- item->large = TRUE;
- item->label = "18";
- break;
- case 24:
- item->large = TRUE;
- item->label = "24";
- break;
- case 36:
- item->large = TRUE;
- item->label = "36";
- break;
- case 48:
- item->large = TRUE;
- item->label = "48";
- break;
- case 54:
- item->large = TRUE;
- item->label = "54";
- break;
- case 72: /* XXX */
- item->large = TRUE;
- item->label = "72";
- break;
- case 96: /* XXX */
- item->large = TRUE;
- item->label = "96";
- break;
- case 108:
- item->large = TRUE;
- item->label = "108";
- break;
- default:
- item->large = FALSE;
- item->label = NULL;
- }
-
- Rates = g_list_append(Rates, item);
- }
- }
-
- return Rates;
-}
-#endif
-
-
-/* debugging only */
-static void
-hex(unsigned char *p, int len) {
- int i = 0;
-
- while (len) {
- g_warning("%u: 0x%x (%u) '%c'", i, *p, *p,
- g_ascii_isprint(*p) ? *p : '.');
-
- i++;
- p++;
- len--;
- }
-}
-
-
-static void
-capture_if_details_802_11_bssid_list(GtkWidget *main_vb, struct ndis_bssid_list *bssid_list)
-{
- struct ndis_ssid_item *bssid_item;
- unsigned char mac[6];
- const gchar *manuf_name;
- GString *Rates;
- gchar *tmp_str;
-
-
- if (bssid_list->num_items != 0) {
- static const char *titles[] = { "SSID", "MAC", "Vendor", "Privacy", "RSSI" , "Network Type" ,
- "Infra. Mode" , "Ch." , "Rates", "Country" };
- GtkWidget *list;
- gboolean privacy_required;
- gboolean privacy_wpa;
- gboolean privacy_wpa2;
-
- gchar ssid_buff [DETAILS_STR_MAX];
- gchar mac_buff [DETAILS_STR_MAX];
- gchar vendor_buff [DETAILS_STR_MAX];
- gchar privacy_buff [DETAILS_STR_MAX];
- gchar rssi_buff [DETAILS_STR_MAX];
- gchar nettype_buff [DETAILS_STR_MAX];
- gchar infra_buff [DETAILS_STR_MAX];
- gchar freq_buff [DETAILS_STR_MAX];
- gchar country_buff [DETAILS_STR_MAX] = "";
-
- list = simple_list_new(10, titles);
- gtk_box_pack_start(GTK_BOX(main_vb), list, TRUE /*expand*/, TRUE /*fill*/, 0 /* padding */);
-
- bssid_item = &bssid_list->items[0];
-
- while (bssid_list->num_items--) {
- privacy_required = FALSE;
- privacy_wpa = FALSE;
- privacy_wpa2 = FALSE;
-
- /* SSID */
- if (bssid_item->ssid.length > DETAILS_STR_MAX-1) {
- bssid_item->ssid.length = DETAILS_STR_MAX-1;
- }
- memcpy(ssid_buff, bssid_item->ssid.essid, bssid_item->ssid.length);
- ssid_buff[bssid_item->ssid.length] = '\0';
-
- /* MAC */
- memcpy(mac, &bssid_item->mac, sizeof(mac));
- g_snprintf(mac_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
- mac[0], mac[1], mac[2],
- mac[3], mac[4], mac[5]);
-
- /* Vendor */
- manuf_name = get_manuf_name_if_known(mac);
- if (manuf_name != NULL) {
- g_strlcpy(vendor_buff, manuf_name, DETAILS_STR_MAX);
- } else {
- vendor_buff[0] = '\0';
- }
-
- /* Supported Rates */
- Rates = rates_details(bssid_item->rates, NDIS_MAX_RATES_EX);
-
- /* RSSI */
- g_snprintf(rssi_buff, DETAILS_STR_MAX, "%d dBm", bssid_item->rssi);
-
- /* Privacy */
- /* (flag is set, if WEP (or higher) privacy is required) */
- if (bssid_item->privacy) {
- privacy_required = TRUE;
- }
-
- /* Network Type */
- tmp_str = val_to_str_wmem(NULL, bssid_item->net_type, win32_802_11_network_type_vals, "(0x%x)");
- g_snprintf(nettype_buff, sizeof(nettype_buff), "%s", tmp_str);
- wmem_free(NULL, tmp_str);
-
- /* Infrastructure Mode */
- tmp_str = val_to_str_wmem(NULL, bssid_item->mode, win32_802_11_infra_mode_vals, "(0x%x)");
- g_snprintf(infra_buff, sizeof(infra_buff), "%s", tmp_str);
- wmem_free(NULL, tmp_str);
-
- /* Channel */
- tmp_str = val_to_str_wmem(NULL, bssid_item->config.ds_config, win32_802_11_channel_vals, "(%u kHz)");
- g_snprintf(freq_buff, sizeof(freq_buff), "%s", tmp_str);
- wmem_free(NULL, tmp_str);
-
- /* XXX - IE Length is currently not really supported here */
- {
- int len = bssid_item->ie_length;
- unsigned char *iep = bssid_item->ies;
- unsigned char id;
- guint el_len;
- NDIS_802_11_FIXED_IEs *fixed_ies;
-/*#define DEBUG_IE*/
-#ifdef DEBUG_IE
- const gchar *manuf_name;
- gchar string_buff[DETAILS_STR_MAX];
-#endif
-
-
- fixed_ies = (NDIS_802_11_FIXED_IEs *)iep;
-
-/**
- UCHAR Timestamp[8];
- USHORT BeaconInterval;
- USHORT Capabilities;
- } NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs;
-**/
-
- iep += sizeof(NDIS_802_11_FIXED_IEs);
- len = bssid_item->ie_length - sizeof(NDIS_802_11_FIXED_IEs);
-
- while (len >= 2) {
- id = *iep;
- iep++;
- el_len = *iep;
- iep++;
- len -= 2;
-
-#ifdef DEBUG_IE
- tmp_str = val_to_str_wmem(NULL, id, ie_id_vals, "0x%x");
- g_warning("ID: %s (%u) Len: %u", tmp_str, id, el_len);
- wmem_free(NULL, tmp_str);
-#endif
-
- switch (id) {
- case(IE_ID_COUNTRY):
- if (el_len >= 6)
- g_snprintf(country_buff, sizeof(country_buff), "%c%c: Ch: %u-%u Max: %ddBm",
- iep[0], iep[1], iep[3], iep[4], iep[5]);
- break;
- case(IE_ID_WPA2):
- privacy_wpa2 = TRUE;
- break;
- case(IE_ID_VENDOR_SPECIFIC): /* WPA */
- privacy_wpa = TRUE;
-
-#ifdef DEBUG_IE
- /* include information from epan/packet-ieee80211.c dissect_vendor_ie_wpawme() */
- manuf_name = get_manuf_name_if_known(iep);
- if (manuf_name != NULL) {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X (%s) Type: %02X",
- *(iep), *(iep+1), *(iep+2), manuf_name, *(iep+3));
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X Type: %02X",
- *(iep), *(iep+1), *(iep+2), *(iep+3));
- }
-
- g_warning("%s", string_buff);
- iep += 4;
- el_len-= 4;
- len -= 4;
-
- g_warning("WPA IE: %u", id);
- hex(iep, el_len);
-#endif
- break;
-
- case(IE_ID_SSID):
- case(IE_ID_SUPPORTED_RATES):
- case(IE_ID_DS_PARAMETER_SET):
- case(IE_ID_TIM):
- case(IE_ID_ERP_INFORMATION):
- case(IE_ID_EXTENDED_SUPPORT_RATES):
- /* we already have that data, do nothing */
- break;
- default:
- /* unexpected IE_ID, print out hexdump */
- g_warning("Unknown IE ID: %u Len: %u", id, el_len);
- hex(iep, el_len);
- }
-
- iep += el_len;
- len -= el_len;
- }
- }
-
- if (privacy_required) {
- if (privacy_wpa2) {
- /* XXX - how to detect data encryption (TKIP and AES)? */
- /* XXX - how to detect authentication (PSK or not)? */
- g_snprintf(privacy_buff, DETAILS_STR_MAX, "WPA2");
- } else {
- if (privacy_wpa) {
- /* XXX - how to detect data encryption (TKIP and AES)? */
- /* XXX - how to detect authentication (PSK or not)? */
- g_snprintf(privacy_buff, DETAILS_STR_MAX, "WPA");
- } else {
- /* XXX - how to detect authentication (Open System and Shared Key)? */
- g_snprintf(privacy_buff, DETAILS_STR_MAX, "WEP");
- }
- }
- } else {
- g_snprintf(privacy_buff, DETAILS_STR_MAX, "None");
- }
-
- simple_list_append(list,
- 0, ssid_buff,
- 1, mac_buff,
- 2, vendor_buff,
- 3, privacy_buff,
- 4, rssi_buff,
- 5, nettype_buff,
- 6, infra_buff,
- 7, freq_buff,
- 8, Rates->str,
- 9, country_buff,
- -1);
-
- g_string_free(Rates, TRUE /* free_segment */);
-
- /* the bssid_list isn't an array, but a sequence of variable length items */
- bssid_item = (struct ndis_ssid_item *) (((char *) bssid_item) + bssid_item->length);
- }
- }
-}
-
-static int
-capture_if_details_802_11(GtkWidget *grid, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
- ULONG ulong_value;
- LONG rssi = -100;
- unsigned int uint_value;
- unsigned char values[100];
- struct ndis_essid ssid;
- int length;
- gchar string_buff[DETAILS_STR_MAX];
- GString *Rates;
- int entries = 0;
- const gchar *manuf_name;
- struct ndis_bssid_list *bssid_list;
- struct ndis_configuration *configuration;
- gchar* tmp_str;
-
- add_string_to_grid(grid, row, "Current network", "");
-
- /* SSID */
- length = sizeof(struct ndis_essid);
- memset(&ssid, 0, length);
- if (wpcap_packet_request(adapter, OID_802_11_SSID, FALSE /* !set */, (char *) &ssid, &length)) {
- ssid_details(grid, row, &ssid);
- entries++;
- } else {
- add_string_to_grid(grid, row, "SSID (Service Set IDentifier)", "-");
- }
-
- /* BSSID */
- length = sizeof(values);
- memset(values, 0, 6);
- if (wpcap_packet_request(adapter, OID_802_11_BSSID, FALSE /* !set */, values, &length)) {
- manuf_name = get_manuf_name_if_known(values);
- if (manuf_name != NULL) {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X (%s)",
- values[0], values[1], values[2],
- values[3], values[4], values[5],
- manuf_name);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
- values[0], values[1], values[2],
- values[3], values[4], values[5]);
- }
- entries++;
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "BSSID (Basic Service Set IDentifier)", string_buff);
-
- /* Network type in use */
- if (wpcap_packet_request_uint(adapter, OID_802_11_NETWORK_TYPE_IN_USE, &uint_value)) {
- tmp_str = val_to_str_wmem(NULL, uint_value, win32_802_11_network_type_vals, "(0x%x)");
- add_string_to_grid(grid, row, "Network type used", tmp_str);
- wmem_free(NULL, tmp_str);
- entries++;
- } else {
- add_string_to_grid(grid, row, "Network type used", "-");
- }
-
- /* Infrastructure mode */
- if (wpcap_packet_request_ulong(adapter, OID_802_11_INFRASTRUCTURE_MODE, &uint_value)) {
- tmp_str = val_to_str_wmem(NULL, uint_value, win32_802_11_infra_mode_vals, "(0x%x)");
- add_string_to_grid(grid, row, "Infrastructure mode", tmp_str);
- wmem_free(NULL, tmp_str);
- entries++;
- } else {
- add_string_to_grid(grid, row, "Infrastructure mode", "-");
- }
-
- /* Authentication mode */
- if (wpcap_packet_request_ulong(adapter, OID_802_11_AUTHENTICATION_MODE, &uint_value)) {
- tmp_str = val_to_str_wmem(NULL, uint_value, win32_802_11_auth_mode_vals, "(0x%x)");
- add_string_to_grid(grid, row, "Authentication mode", tmp_str);
- wmem_free(NULL, tmp_str);
- entries++;
- } else {
- add_string_to_grid(grid, row, "Authentication mode", "-");
- }
-
- /* Encryption (WEP) status */
- if (wpcap_packet_request_ulong(adapter, OID_802_11_ENCRYPTION_STATUS, &uint_value)) {
- tmp_str = val_to_str_wmem(NULL, uint_value, win32_802_11_encryption_status_vals, "(0x%x)");
- add_string_to_grid(grid, row, "Encryption status", tmp_str);
- wmem_free(NULL, tmp_str);
- entries++;
- } else {
- add_string_to_grid(grid, row, "Encryption status", "-");
- }
-
- /* TX power */
- if (wpcap_packet_request_ulong(adapter, OID_802_11_TX_POWER_LEVEL, &ulong_value)) {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%ld mW", ulong_value);
- add_string_to_grid(grid, row, "TX power", string_buff);
- entries++;
- } else {
- add_string_to_grid(grid, row, "TX power", "-");
- }
-
- /* RSSI */
- if (wpcap_packet_request_ulong(adapter, OID_802_11_RSSI, &rssi)) {
-#if 0
- int i;
- GList * scale_items = NULL;
- GList * current;
- GtkVUMeterScaleItem *item;
-
-
- for (i = 0; i <= 100; i++) {
- item = g_malloc(sizeof(GtkVUMeterScaleItem));
-
- item->level = i;
- item->large = !(i%5);
- item->label = NULL;
-
- switch (item->level) {
- case 0:
- item->label = "-100 ";
- break;
- case 20:
- item->label = "-80 ";
- break;
- case 40:
- item->label = "-60 ";
- break;
- case 60:
- item->label = "-40 ";
- break;
- case 80:
- item->label = "-20 ";
- break;
- case 100:
- item->label = "0";
- break;
- default:
- item->label = NULL;
- }
-
- scale_items = g_list_append(scale_items, item);
- }
-
- if (rssi < -100) {
- rssi = -100;
- }
- g_snprintf(string_buff, DETAILS_STR_MAX, "%ld dBm", rssi);
-
- add_meter_to_grid(grid, row, "RSSI (Received Signal Strength Indication)",
- rssi+100 , string_buff, -100+100, 0+100, -80+100, scale_items);
- current = scale_items;
- while (current != NULL) {
- g_free(current->data);
-
- current = g_list_next(current);
- }
- g_list_free(scale_items);
- entries++;
-#endif
- } else {
- add_string_to_grid(grid, row, "RSSI (Received Signal Strength Indication)", "-");
- }
-
- /* Supported Rates */
- length = sizeof(values);
- if (!wpcap_packet_request(adapter, OID_802_11_SUPPORTED_RATES, FALSE /* !set */, values, &length)) {
- length = 0;
- } else {
- entries++;
- }
-
- /* if we can get the link speed, show Supported Rates in level meter format */
- if (length != 0 && wpcap_packet_request_uint(adapter, OID_GEN_LINK_SPEED, &uint_value)) {
-#if 0
- int max;
- int yellow;
- GList *rates_list;
-
- GList * current;
-
-
- rates_list = rates_vu_list(values, length, &max);
-
- /* if we don't have a signal, we might not have a valid link speed */
- if (rssi == -100) {
- uint_value = 0;
- }
-
- uint_value /= 10 * 1000;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%u MBits/s", uint_value);
-
- if (max >= 54) {
- yellow = 2;
- } else {
- yellow = 1;
- }
-
- add_meter_to_grid(grid, row, "Link Speed",
- uint_value, string_buff, 0, max, yellow, rates_list);
- current = rates_list;
- while (current != NULL) {
- g_free(current->data);
-
- current = g_list_next(current);
- }
- g_list_free(rates_list);
-#endif
- }
-
- /* Supported Rates in String format */
- Rates = rates_details(values, length);
- add_string_to_grid(grid, row, "Supported Rates", Rates->str);
- g_string_free(Rates, TRUE /* free_segment */);
-
- /* Desired Rates */
- length = sizeof(values);
- if (!wpcap_packet_request(adapter, OID_802_11_DESIRED_RATES, FALSE /* !set */, values, &length)) {
- length = 0;
- } else {
- entries++;
- }
-
- Rates = rates_details(values, length);
- add_string_to_grid(grid, row, "Desired Rates", Rates->str);
- g_string_free(Rates, TRUE /* free_segment */);
-
- /* Configuration (e.g. frequency) */
- length = sizeof(values);
- if (wpcap_packet_request(adapter, OID_802_11_CONFIGURATION, FALSE /* !set */, (char *) values, &length)) {
- configuration = (struct ndis_configuration *) values;
-
- tmp_str = val_to_str_wmem(NULL, configuration->ds_config, win32_802_11_channel_freq_vals, "(%u kHz)");
- add_string_to_grid(grid, row, "Channel", tmp_str);
- wmem_free(NULL, tmp_str);
- entries++;
- } else {
- add_string_to_grid(grid, row, "Channel", "-");
- }
-
- /* BSSID list: first trigger a scan */
- length = sizeof(uint_value);
- if (wpcap_packet_request(adapter, OID_802_11_BSSID_LIST_SCAN, TRUE /* set */, (char *) &uint_value, &length)) {
-#if 0
- g_warning("BSSID list scan done");
- } else {
- g_warning("BSSID list scan failed");
-#endif
- }
-
- /* BSSID list: get scan results */
- /* XXX - we might have to wait up to 7 seconds! */
- length = sizeof(ULONG) + sizeof(struct ndis_ssid_item) * 16;
- bssid_list = g_malloc(length);
- /* some drivers don't set bssid_list->num_items to 0 if
- OID_802_11_BSSID_LIST returns no items (prism54 driver, e.g.,) */
- memset(bssid_list, 0, length);
-
- if (wpcap_packet_request(adapter, OID_802_11_BSSID_LIST, FALSE /* !set */, (char *) bssid_list, &length)) {
- add_string_to_grid(grid, row, "", "");
- add_string_to_grid(grid, row, "Available networks (BSSID list)", "");
-
- capture_if_details_802_11_bssid_list(main_vb, bssid_list);
- entries += bssid_list->num_items;
- } else {
- add_string_to_grid(grid, row, "Available networks (BSSID list)", "-");
- }
-
- g_free(bssid_list);
-
- return entries;
-}
-
-
-static int
-capture_if_details_802_3(GtkWidget *grid, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
- unsigned int uint_value;
- unsigned char values[100];
- int length;
- gchar string_buff[DETAILS_STR_MAX];
- const gchar *manuf_name;
- int entries = 0;
-
-
- add_string_to_grid(grid, row, "Characteristics", "");
-
- length = sizeof(values);
- if (wpcap_packet_request(adapter, OID_802_3_PERMANENT_ADDRESS, FALSE /* !set */, values, &length)) {
- manuf_name = get_manuf_name_if_known(values);
- if (manuf_name != NULL) {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X (%s)",
- values[0], values[1], values[2],
- values[3], values[4], values[5],
- manuf_name);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
- values[0], values[1], values[2],
- values[3], values[4], values[5]);
- }
- entries++;
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "Permanent station address", string_buff);
-
- length = sizeof(values);
- if (wpcap_packet_request(adapter, OID_802_3_CURRENT_ADDRESS, FALSE /* !set */, values, &length)) {
- manuf_name = get_manuf_name_if_known(values);
- if (manuf_name != NULL) {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X (%s)",
- values[0], values[1], values[2],
- values[3], values[4], values[5],
- manuf_name);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
- values[0], values[1], values[2],
- values[3], values[4], values[5]);
- }
- entries++;
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "Current station address", string_buff);
-
-
- add_string_to_grid(grid, row, "", "");
- add_string_to_grid(grid, row, "Statistics", "");
-
- if (wpcap_packet_request_uint(adapter, OID_802_3_RCV_ERROR_ALIGNMENT, &uint_value)) {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- entries++;
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "Packets received with alignment error", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_ONE_COLLISION, &uint_value)) {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- entries++;
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "Packets transmitted with one collision", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_MORE_COLLISIONS, &uint_value)) {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- entries++;
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "Packets transmitted with more than one collision", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_802_3_RCV_OVERRUN, &uint_value)) {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- entries++;
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "Packets not received due to overrun", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_DEFERRED, &uint_value)) {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- entries++;
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "Packets transmitted after deferred", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_MAX_COLLISIONS, &uint_value)) {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- entries++;
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "Packets not transmitted due to collisions", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_UNDERRUN, &uint_value)) {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- entries++;
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "Packets not transmitted due to underrun", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_HEARTBEAT_FAILURE, &uint_value)) {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- entries++;
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "Packets transmitted with heartbeat failure", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_TIMES_CRS_LOST, &uint_value)) {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- entries++;
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "Times carrier sense signal lost during transmission", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_LATE_COLLISIONS, &uint_value)) {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- entries++;
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "Times late collisions detected", string_buff);
-
- return entries;
-}
-
-static int
-capture_if_details_task_offload(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
- NDIS_TASK_OFFLOAD_HEADER *offload;
- unsigned char values[10000];
- int length;
- gchar string_buff[DETAILS_STR_MAX];
- int entries = 0;
- int TcpIpChecksumSupported = 0;
- int IpSecSupported = 0;
- int TcpLargeSendSupported = 0;
-
-
- /* Task Offload */
- offload = (NDIS_TASK_OFFLOAD_HEADER *) values;
- offload->Version = NDIS_TASK_OFFLOAD_VERSION;
- offload->Size = sizeof(NDIS_TASK_OFFLOAD_HEADER);
- offload->Reserved = 0;
- offload->OffsetFirstTask = 0;
- /* the EncapsulationFormat seems to be ignored on a query (using Ethernet values) */
- offload->EncapsulationFormat.Encapsulation = IEEE_802_3_Encapsulation;
- offload->EncapsulationFormat.Flags.FixedHeaderSize = 1;
- offload->EncapsulationFormat.Flags.Reserved = 0;
- offload->EncapsulationFormat.EncapsulationHeaderSize = 14; /* sizeof(struct ether_header) */;
-
- length = sizeof(values);
- if (wpcap_packet_request(adapter, OID_TCP_TASK_OFFLOAD, FALSE /* !set */, values, &length)) {
- NDIS_TASK_OFFLOAD *of;
- /* XXX - hmmm, using a tvb for this? */
- unsigned char *valuep = values + offload->OffsetFirstTask;
- length -= offload->OffsetFirstTask;
-
- do {
- of = (NDIS_TASK_OFFLOAD *) valuep;
-
- switch (of->Task) {
- case TcpIpChecksumNdisTask:
- {
- NDIS_TASK_TCP_IP_CHECKSUM *tic = (NDIS_TASK_TCP_IP_CHECKSUM *) (of->TaskBuffer);
-
- entries++;
- TcpIpChecksumSupported++;
-
- add_string_to_grid(table, row, "TCP/IP Checksum", "");
-
- g_snprintf(string_buff, DETAILS_STR_MAX, "");
- add_string_to_grid(table, row, "V4 transmit checksum", "");
-
- g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s, IP: %s",
- tic->V4Transmit.TcpChecksum ? "Yes" : "No",
- tic->V4Transmit.UdpChecksum ? "Yes" : "No",
- tic->V4Transmit.IpChecksum ? "Yes" : "No");
- add_string_to_grid(table, row, "Calculation supported", string_buff);
-
- g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
- tic->V4Transmit.TcpOptionsSupported ? "Yes" : "No",
- tic->V4Transmit.IpOptionsSupported ? "Yes" : "No");
- add_string_to_grid(table, row, "Options fields supported", string_buff);
-
- g_snprintf(string_buff, DETAILS_STR_MAX, "");
- add_string_to_grid(table, row, "V4 receive checksum", "");
-
- g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s, IP: %s",
- tic->V4Receive.TcpChecksum ? "Yes" : "No",
- tic->V4Receive.UdpChecksum ? "Yes" : "No",
- tic->V4Receive.IpChecksum ? "Yes" : "No");
- add_string_to_grid(table, row, "Validation supported", string_buff);
-
- g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
- tic->V4Receive.TcpOptionsSupported ? "Yes" : "No",
- tic->V4Receive.IpOptionsSupported ? "Yes" : "No");
- add_string_to_grid(table, row, "Options fields supported", string_buff);
-
- g_snprintf(string_buff, DETAILS_STR_MAX, "");
- add_string_to_grid(table, row, "V6 transmit checksum", "");
-
- g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s",
- tic->V6Transmit.TcpChecksum ? "Yes" : "No",
- tic->V6Transmit.UdpChecksum ? "Yes" : "No");
- add_string_to_grid(table, row, "Calculation supported", string_buff);
-
- g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
- tic->V6Transmit.TcpOptionsSupported ? "Yes" : "No",
- tic->V6Transmit.IpOptionsSupported ? "Yes" : "No");
- add_string_to_grid(table, row, "Options fields supported", string_buff);
-
- g_snprintf(string_buff, DETAILS_STR_MAX, "");
- add_string_to_grid(table, row, "V6 receive checksum", "");
-
- g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s",
- tic->V6Receive.TcpChecksum ? "Yes" : "No",
- tic->V6Receive.UdpChecksum ? "Yes" : "No");
- add_string_to_grid(table, row, "Validation supported", string_buff);
-
- g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
- tic->V6Receive.TcpOptionsSupported ? "Yes" : "No",
- tic->V6Receive.IpOptionsSupported ? "Yes" : "No");
- add_string_to_grid(table, row, "Options fields supported", string_buff);
- }
- break;
- case IpSecNdisTask:
- entries++;
- IpSecSupported++;
-
- add_string_to_grid(table, row, "IPSEC", "");
- g_snprintf(string_buff, DETAILS_STR_MAX, "IPSEC (TaskID 1) not decoded yet");
- add_string_to_grid(table, row, "Task", string_buff);
- break;
- case TcpLargeSendNdisTask:
- {
- NDIS_TASK_TCP_LARGE_SEND *tls = (NDIS_TASK_TCP_LARGE_SEND *) (of->TaskBuffer);
-
- entries++;
- TcpLargeSendSupported++;
-
- add_string_to_grid(table, row, "TCP large send", "");
- /* XXX - while MSDN tells about version 0, we see version 1?!? */
- if (tls->Version == 1) {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%u", tls->MaxOffLoadSize);
- add_string_to_grid(table, row, "Max Offload Size", string_buff);
- g_snprintf(string_buff, DETAILS_STR_MAX, "%u", tls->MinSegmentCount);
- add_string_to_grid(table, row, "Min Segment Count", string_buff);
- g_snprintf(string_buff, DETAILS_STR_MAX, "%s", tls->TcpOptions ? "Yes" : "No");
- add_string_to_grid(table, row, "TCP option fields", string_buff);
- g_snprintf(string_buff, DETAILS_STR_MAX, "%s", tls->IpOptions ? "Yes" : "No");
- add_string_to_grid(table, row, "IP option fields", string_buff);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%u (unknown)", tls->Version);
- add_string_to_grid(table, row, "Version", string_buff);
- }
- }
- break;
- default:
- g_snprintf(string_buff, DETAILS_STR_MAX, "Unknown task %u", of->Task);
- add_string_to_grid(table, row, "Task", string_buff);
-
- }
-
- add_string_to_grid(table, row, "", "");
-
- valuep += of->OffsetNextTask;
- length -= of->OffsetNextTask;
- } while (of->OffsetNextTask != 0);
- }
-
- if (TcpIpChecksumSupported == 0) {
- add_string_to_grid(table, row, "TCP/IP Checksum", "");
- add_string_to_grid(table, row, "Offload not supported", "-");
- }
-
- if (IpSecSupported == 0) {
- add_string_to_grid(table, row, "IpSec", "");
- add_string_to_grid(table, row, "Offload not supported", "-");
- }
-
- if (TcpLargeSendSupported == 0) {
- add_string_to_grid(table, row, "TCP Large Send", "");
- add_string_to_grid(table, row, "Offload not supported", "-");
- }
-
- return entries;
-}
-
-static int
-capture_if_details_general(GtkWidget *grid, GtkWidget *main_vb, guint *row, LPADAPTER adapter, gchar *iface) {
- gchar *interface_friendly_name;
- gchar string_buff[DETAILS_STR_MAX];
- const gchar *manuf_name;
- unsigned int uint_value;
- unsigned int uint_array[50];
- int uint_array_size;
- unsigned int physical_medium;
- int i;
- unsigned char values[100];
- guint16 wvalues[100];
- char *utf8value;
- int length;
- unsigned short ushort_value;
- int entries = 0;
- gchar *size_str, *tmp_str;
-
-
- /* general */
- add_string_to_grid(grid, row, "Characteristics", "");
-
- /* OS friendly name - look it up from iface ("\Device\NPF_{11111111-2222-3333-4444-555555555555}") */
- interface_friendly_name = get_windows_interface_friendly_name(/* IN */ iface);
- if (interface_friendly_name != NULL){
- add_string_to_grid(grid, row, "OS Friendly name", interface_friendly_name);
- g_free(interface_friendly_name);
- }
-
- /* Vendor description */
- length = sizeof(values);
- if (wpcap_packet_request(adapter, OID_GEN_VENDOR_DESCRIPTION, FALSE /* !set */, values, &length)) {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%s", values);
- entries++;
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "Vendor description", string_buff);
-
- /* NDIS's "Friendly name" */
- length = sizeof(wvalues);
- if (wpcap_packet_request(adapter, OID_GEN_FRIENDLY_NAME, FALSE /* !set */, (char *)wvalues, &length)) {
- utf8value = g_utf16_to_utf8(wvalues, -1, NULL, NULL, NULL);
- g_snprintf(string_buff, DETAILS_STR_MAX, "%s", utf8value);
- g_free(utf8value);
- entries++;
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "NDIS Friendly name", string_buff);
-
- /* Interface */
- add_string_to_grid(grid, row, "Interface", iface);
-
- /* link status (connected/disconnected) */
- if (wpcap_packet_request_uint(adapter, OID_GEN_MEDIA_CONNECT_STATUS, &uint_value)) {
- entries++;
- if (uint_value == 0) {
- add_string_to_grid(grid, row, "Link status", "Connected");
- } else {
- add_string_to_grid(grid, row, "Link status", "Disconnected");
- }
- } else {
- add_string_to_grid(grid, row, "Link status", "-");
- }
-
- /* link speed */
- if (wpcap_packet_request_uint(adapter, OID_GEN_LINK_SPEED, &uint_value)) {
- entries++;
- uint_value *= 100;
- size_str = format_size(uint_value, format_size_unit_bits_s|format_size_prefix_si);
- g_strlcpy(string_buff, size_str, DETAILS_STR_MAX);
- g_free(size_str);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "Link speed", string_buff);
-
- uint_array_size = sizeof(uint_array);
- if (wpcap_packet_request(adapter, OID_GEN_MEDIA_SUPPORTED, FALSE /* !set */, (char *) uint_array, &uint_array_size)) {
- entries++;
- uint_array_size /= sizeof(unsigned int);
- i = 0;
- while (uint_array_size--) {
- tmp_str = val_to_str_wmem(NULL, uint_array[i], win32_802_3_medium_vals, "(0x%x)");
- add_string_to_grid(grid, row, "Media supported", tmp_str);
- wmem_free(NULL, tmp_str);
- i++;
- }
- } else {
- add_string_to_grid(grid, row, "Media supported", "-");
- }
-
- uint_array_size = sizeof(uint_array);
- if (wpcap_packet_request(adapter, OID_GEN_MEDIA_IN_USE, FALSE /* !set */, (char *) uint_array, &uint_array_size)) {
- entries++;
- uint_array_size /= sizeof(unsigned int);
- i = 0;
- while (uint_array_size--) {
- tmp_str = val_to_str_wmem(NULL, uint_array[i], win32_802_3_medium_vals, "(0x%x)");
- add_string_to_grid(grid, row, "Media in use", tmp_str);
- wmem_free(NULL, tmp_str);
- i++;
- }
- } else {
- add_string_to_grid(grid, row, "Media in use", "-");
- }
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_PHYSICAL_MEDIUM, &physical_medium)) {
- entries++;
- tmp_str = val_to_str_wmem(NULL, physical_medium, win32_802_3_physical_medium_vals, "(0x%x)");
- add_string_to_grid(grid, row, "Physical medium", tmp_str);
- wmem_free(NULL, tmp_str);
- } else {
- add_string_to_grid(grid, row, "Physical medium", "-");
- }
-
- length = sizeof(ushort_value);
- if (wpcap_packet_request(adapter, OID_GEN_DRIVER_VERSION, FALSE /* !set */, (char *) &ushort_value, &length)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%u.%u", ushort_value / 0x100, ushort_value % 0x100);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "NDIS Driver Version", string_buff);
-
- length = sizeof(uint_value);
- if (wpcap_packet_request(adapter, OID_GEN_VENDOR_DRIVER_VERSION, FALSE /* !set */, (char *) &uint_value, &length)) {
- entries++;
- /* XXX - what's the correct output format? */
- g_snprintf(string_buff, DETAILS_STR_MAX, "%u.%u (Hex: %X.%X)",
- (uint_value / 0x10000 ) % 0x10000,
- uint_value % 0x10000,
- (uint_value / 0x10000 ) % 0x10000,
- uint_value % 0x10000);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "Vendor Driver Version", string_buff);
-
- length = sizeof(values);
- if (wpcap_packet_request(adapter, OID_GEN_VENDOR_ID, FALSE /* !set */, values, &length)) {
- entries++;
- manuf_name = get_manuf_name_if_known(values);
- if (manuf_name != NULL) {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X (%s) NIC: %02X",
- values[0], values[1], values[2], manuf_name, values[3]);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X NIC: %02X",
- values[0], values[1], values[2], values[3]);
- }
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "Vendor ID", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_MAC_OPTIONS, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX,
- "802.1P Priority: %s, 802.1Q VLAN: %s",
- (uint_value & NDIS_MAC_OPTION_8021P_PRIORITY) ? "Supported" : "Unsupported",
- (uint_value & NDIS_MAC_OPTION_8021Q_VLAN) ? "Supported" : "Unsupported" );
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "MAC Options", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_VLAN_ID, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%u", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "VLAN ID", string_buff);
-
-#if 0
- /* value seems to be constant */
- if (wpcap_packet_request_uint(adapter, OID_GEN_CURRENT_PACKET_FILTER, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "Packet filter", string_buff);
-#endif
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_TRANSMIT_BUFFER_SPACE, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "Transmit Buffer Space", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_RECEIVE_BUFFER_SPACE, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "Receive Buffer Space", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_TRANSMIT_BLOCK_SIZE , &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "Transmit Block Size", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_RECEIVE_BLOCK_SIZE, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "Receive Block Size", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_MAXIMUM_TOTAL_SIZE, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(grid, row, "Maximum Packet Size", string_buff);
-
- return entries;
-}
-
-
-static int
-capture_if_details_stats(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
- gchar string_buff[DETAILS_STR_MAX];
- unsigned int uint_value;
- int entries = 0;
-
-
- add_string_to_grid(table, row, "Statistics", "");
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_XMIT_OK, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(table, row, "Transmit OK", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_XMIT_ERROR, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(table, row, "Transmit Error", string_buff);
-
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_OK, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(table, row, "Receive OK", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_ERROR, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(table, row, "Receive Error", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_NO_BUFFER, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(table, row, "Receive but no Buffer", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_BYTES_XMIT, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(table, row, "Directed bytes transmitted w/o errors", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_FRAMES_XMIT, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(table, row, "Directed packets transmitted w/o errors", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_BYTES_XMIT, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(table, row, "Multicast bytes transmitted w/o errors", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_FRAMES_XMIT, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(table, row, "Multicast packets transmitted w/o errors", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_BYTES_XMIT, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(table, row, "Broadcast bytes transmitted w/o errors", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_FRAMES_XMIT, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(table, row, "Broadcast packets transmitted w/o errors", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_BYTES_RCV, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(table, row, "Directed bytes received w/o errors", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_FRAMES_RCV, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(table, row, "Directed packets received w/o errors", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_BYTES_RCV, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(table, row, "Multicast bytes received w/o errors", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_FRAMES_RCV, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(table, row, "Multicast packets received w/o errors", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_BYTES_RCV, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(table, row, "Broadcast bytes received w/o errors", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_FRAMES_RCV, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(table, row, "Broadcast packets received w/o errors", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_CRC_ERROR, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(table, row, "Packets received with CRC or FCS errors", string_buff);
-
- if (wpcap_packet_request_uint(adapter, OID_GEN_TRANSMIT_QUEUE_LENGTH, &uint_value)) {
- entries++;
- g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_grid(table, row, "Packets queued for transmission", string_buff);
-
- return entries;
-}
-
-
-static GtkWidget *
-capture_if_details_page_new(GtkWidget **grid)
-{
- GtkWidget *main_vb;
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 12);
-
- /* grid */
- *grid = ws_gtk_grid_new();
- ws_gtk_grid_set_column_spacing(GTK_GRID(*grid), 6);
- ws_gtk_grid_set_row_spacing(GTK_GRID(*grid), 3);
- gtk_box_pack_start(GTK_BOX (main_vb), *grid, TRUE, TRUE, 0);
- return main_vb;
-}
-
-
-static void
-capture_if_details_open_win(char *iface)
-{
- GtkWidget *details_open_w,
- *main_vb, *bbox, *close_bt, *help_bt;
- GtkWidget *page_general, *page_stats, *page_802_3, *page_802_11, *page_task_offload;
- GtkWidget *page_lb;
- GtkWidget *grid, *notebook, *label;
- guint row;
- LPADAPTER adapter;
- int entries;
-
-
- /* open the network adapter */
- adapter = wpcap_packet_open(iface);
- if (adapter == NULL) {
- /*
- * We have an adapter that is not exposed through normal APIs (e.g. TurboCap)
- * or an adapter that isn't plugged in.
- *
- * XXX - We should use the TurboCap API to get info about TurboCap adapters.
- */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "%sCould not open adapter %s.%s"
- "\n\nHas it been unplugged?",
- simple_dialog_primary_start(), iface, simple_dialog_primary_end());
- return;
- }
-
- /* open a new window */
- details_open_w = dlg_window_new("Wireshark: Interface Details"); /* transient_for top_level */
- gtk_window_set_destroy_with_parent (GTK_WINDOW(details_open_w), TRUE);
-
- /* Container for the window contents */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 12, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 12);
- gtk_container_add(GTK_CONTAINER(details_open_w), main_vb);
-
- /* notebook */
- notebook = gtk_notebook_new();
- gtk_box_pack_start(GTK_BOX(main_vb), notebook, TRUE /*expand*/, TRUE /*fill*/, 0 /*padding*/);
-
- /* General page */
- page_general = capture_if_details_page_new(&grid);
- page_lb = gtk_label_new("Characteristics");
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_general, page_lb);
- row = 0;
- entries = capture_if_details_general(grid, page_general, &row, adapter, iface);
- if (entries == 0) {
- gtk_widget_set_sensitive(page_lb, FALSE);
- }
-
- /* Statistics page */
- page_stats = capture_if_details_page_new(&grid);
- page_lb = gtk_label_new("Statistics");
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_stats, page_lb);
- row = 0;
- entries = capture_if_details_stats(grid, page_stats, &row, adapter);
- if (entries == 0) {
- gtk_widget_set_sensitive(page_lb, FALSE);
- }
-
- /* 802.3 (Ethernet) page */
- page_802_3 = capture_if_details_page_new(&grid);
- page_lb = gtk_label_new("802.3 (Ethernet)");
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_802_3, page_lb);
- row = 0;
- entries = capture_if_details_802_3(grid, page_802_3, &row, adapter);
- if (entries == 0) {
- gtk_widget_set_sensitive(page_lb, FALSE);
- }
-
- /* 802_11 (WI-FI) page */
- page_802_11 = capture_if_details_page_new(&grid);
- page_lb = gtk_label_new("802.11 (WLAN)");
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_802_11, page_lb);
- row = 0;
- entries = capture_if_details_802_11(grid, page_802_11, &row, adapter);
- if (entries == 0) {
- gtk_widget_set_sensitive(page_lb, FALSE);
- }
-
- /* Task offload page */
- page_task_offload = capture_if_details_page_new(&grid);
- page_lb = gtk_label_new("Task Offload");
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_task_offload, page_lb);
- row = 0;
- entries = capture_if_details_task_offload(grid, page_task_offload, &row, adapter);
- if (entries == 0) {
- gtk_widget_set_sensitive(page_lb, FALSE);
- }
-
- wpcap_packet_close(adapter);
-
- label = gtk_label_new("Some drivers may not provide accurate values.");
- gtk_box_pack_start(GTK_BOX(main_vb), label, FALSE /*expand*/, FALSE /*fill*/, 0 /*padding*/);
-
- /* Button row. */
- bbox = dlg_button_row_new(GTK_STOCK_CLOSE, GTK_STOCK_HELP, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE /*expand*/, FALSE /*fill*/, 0 /*padding*/);
-
- close_bt = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(details_open_w, close_bt, window_cancel_button_cb);
-
- help_bt = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer) (HELP_CAPTURE_INTERFACES_DETAILS_DIALOG));
-
- gtk_widget_grab_focus(close_bt);
-
- g_signal_connect(details_open_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
-
- gtk_widget_show_all(details_open_w);
- window_present(details_open_w);
-}
-
-
-static void
-capture_if_details_open_answered_cb(gpointer dialog _U_, gint btn, gpointer data)
-{
- switch (btn) {
- case(ESD_BTN_OK):
- capture_if_details_open_win(data);
- break;
- case(ESD_BTN_CANCEL):
- break;
- default:
- g_assert_not_reached();
- }
-}
-
-
-void
-capture_if_details_open(char *iface)
-{
- char *version;
-
- /* check packet.dll version */
- version = wpcap_packet_get_version();
-
- if (version == NULL) {
- /* couldn't even get the packet.dll version, must be a very old one or just not existing -> give up */
- /* (this seems to be the case for 2.3 beta and all previous releases) */
- simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK,
- "%sCouldn't obtain WinPcap packet.dll version.%s"
- "\n\nThe WinPcap packet.dll is not installed or the version you use seems to be very old."
- "\n\nPlease update or install WinPcap.",
- simple_dialog_primary_start(), simple_dialog_primary_end());
- return;
- }
-
- capture_if_details_open_win(iface);
-}
-
-gboolean
-capture_if_has_details(char *iface) {
- LPADAPTER adapter;
-
- if (!iface) {
- return FALSE;
- }
-
- adapter = wpcap_packet_open(iface);
- if (adapter) {
- wpcap_packet_close(adapter);
- return TRUE;
- }
-
- return FALSE;
-}
-
-#endif /* HAVE_LIBPCAP && _WIN32 */
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/capture_if_details_dlg_win32.h b/ui/gtk/capture_if_details_dlg_win32.h
deleted file mode 100644
index e79e84d6b5..0000000000
--- a/ui/gtk/capture_if_details_dlg_win32.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* capture_if_details_dlg.h
- * Definitions for capture interface details window (only Win32!)
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __CAPTURE_IF_DETAILS_DLG_H__
-#define __CAPTURE_IF_DETAILS_DLG_H__
-
-/** @file
- * Capture "Interface Details" dialog box
- * @ingroup dialog_group
- */
-
-/** Open the dialog box.
- *
- * @param iface the interface name to show
- */
-extern void capture_if_details_open(char *iface);
-
-/** See if we have a detail-able interface.
- *
- * @param iface the interface name to test
- */
-extern gboolean capture_if_has_details(char *iface);
-
-#endif /* __CAPTURE_IF_DETAILS_DLG_H__ */
diff --git a/ui/gtk/capture_if_dlg.c b/ui/gtk/capture_if_dlg.c
deleted file mode 100644
index b894e99d3d..0000000000
--- a/ui/gtk/capture_if_dlg.c
+++ /dev/null
@@ -1,978 +0,0 @@
-/* capture_if_dlg.c
- * Routines for the capture interface dialog
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include "ws_attributes.h"
-
-#include <glib.h>
-
-#ifdef HAVE_LIBPCAP
-
-#include <string.h>
-
-#include <epan/prefs.h>
-#include <epan/to_str.h>
-
-#include "../../capture_opts.h"
-#include <capchild/capture_session.h>
-#include "caputils/capture_ifinfo.h"
-#include "ui/capture.h"
-#include "caputils/capture-pcap-util.h"
-#include "wsutil/file_util.h"
-#include <wiretap/wtap.h>
-
-#include "ui/capture_ui_utils.h"
-#include "ui/capture_globals.h"
-#include "ui/recent.h"
-#include "ui/simple_dialog.h"
-
-#ifdef _WIN32
-#include "ui/gtk/capture_if_details_dlg_win32.h"
-#include "caputils/capture-wpcap.h"
-#endif
-
-#include "ui/gtk/stock_icons.h"
-#ifndef HAVE_GDK_GRESOURCE
-#include "ui/gtk/pixbuf-csource.h"
-#endif
-#include "ui/gtk/capture_dlg.h"
-#include "ui/gtk/capture_if_dlg.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/main_toolbar.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/keys.h"
-#include "ui/gtk/webbrowser.h"
-#include "ui/gtk/main_welcome.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-#ifdef HAVE_AIRPCAP
-#include "../../image/toolbar/capture_airpcap_16.xpm"
-#endif
-
-#include "../../image/toolbar/modem_16.xpm"
-
-#include "../../image/toolbar/network_virtual_16.xpm"
-
-/* new buttons to be used instead of labels for 'Capture','Prepare',' */
-/*#include "../../image/toolbar/capture_capture_16.xpm"*/
-/*#include "../../image/toolbar/capture_prepare_16.xpm"*/
-/*#include "../../image/toolbar/capture_details_16.xpm"*/
-
-
-#ifdef HAVE_AIRPCAP
-#include <caputils/airpcap.h>
-#include <caputils/airpcap_loader.h>
-#include "airpcap_gui_utils.h"
-#include "airpcap_dlg.h"
-#endif
-
-#define CAPTURE_IF_IP_ADDR_LABEL "capture_if_ip_addr_label"
-#define CAPTURE_IF_SELECTED_IP_ADDR "capture_if_selected_ip_addr"
-#define SOFT_LABEL_LEN 50
-
-/*
- * Keep a static pointer to the current "Capture Interfaces" window, if
- * any, so that if somebody tries to do "Capture:Start" while there's
- * already a "Capture Interfaces" window up, we just pop up the existing
- * one, rather than creating a new one.
- */
-static GtkWidget *cap_if_w;
-
-static guint timer_id;
-
-static GtkWidget *close_bt, *stop_bt, *capture_bt, *options_bt;
-
-static GArray *if_array;
-
-static if_stat_cache_t *sc;
-static GtkWidget *cap_if_top_vb, *cap_if_sw;
-
-/* the "runtime" data of one interface */
-typedef struct if_dlg_data_s {
- gchar *device;
- GtkWidget *device_lb;
- GtkWidget *descr_lb;
- GtkWidget *ip_lb;
- GtkWidget *curr_lb;
- GtkWidget *last_lb;
- GtkWidget *choose_bt;
-#ifdef _WIN32
- GtkWidget *details_bt;
-#endif
- gboolean hidden;
-} if_dlg_data_t;
-
-static gboolean gbl_capture_in_progress = FALSE;
-
-#if 0
-void
-add_interface(void)
-{
- if_dlg_data_t data;
-
- data.device_lb = NULL;
- data.descr_lb = NULL;
- data.ip_lb = NULL;
- data.curr_lb = NULL;
- data.last_lb = NULL;
- data.choose_bt = NULL;
-#ifdef _WIN32
- data.details_bt = NULL;
-#endif
- data.hidden = FALSE;
- g_array_append_val(if_array, data);
- refresh_if_window();
-}
-#endif
-
-void
-update_selected_interface(gchar *name)
-{
- guint i;
- interface_t device;
- if_dlg_data_t data;
-
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- data = g_array_index(if_array, if_dlg_data_t, i);
- if (strcmp(name, device.name) == 0) {
- gtk_toggle_button_set_active((GtkToggleButton *)data.choose_bt, device.selected);
- break;
- }
- }
-}
-
-static void
-store_selected(GtkWidget *choose_bt, gpointer name)
-{
- interface_t device;
- guint i;
-
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- if (strcmp((char *)name, device.if_info.name) == 0) {
- device.selected ^= 1;
- if (device.selected) {
- global_capture_opts.num_selected++;
- } else {
- global_capture_opts.num_selected--;
- }
- global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, i);
- g_array_insert_val(global_capture_opts.all_ifaces, i, device);
- if (gtk_widget_is_focus(choose_bt) && get_welcome_window()) {
- change_interface_selection(device.name, device.selected);
- }
- if (gtk_widget_is_focus(choose_bt) && capture_dlg_window_present()) {
- enable_selected_interface(device.name, device.selected);
- }
- break;
- }
- }
- if (cap_if_w) {
- gtk_widget_set_sensitive(capture_bt, !gbl_capture_in_progress && (global_capture_opts.num_selected > 0));
- }
-}
-
-/* start capture button was pressed */
-static void
-capture_do_cb(GtkWidget *capture_bt_arg _U_, gpointer if_data _U_)
-{
- if_dlg_data_t data;
- guint ifs;
-
- for (ifs = 0; ifs < if_array->len; ifs++) {
- data = g_array_index(if_array, if_dlg_data_t, ifs);
- if (data.hidden) {
- continue;
- }
- gtk_widget_set_sensitive(data.choose_bt, FALSE);
- if_array = g_array_remove_index(if_array, ifs);
- g_array_insert_val(if_array, ifs, data);
-#ifdef HAVE_AIRPCAP
- airpcap_if_active = get_airpcap_if_from_name(g_airpcap_if_list, gtk_label_get_text(GTK_LABEL(data.device_lb)));
- airpcap_if_selected = airpcap_if_active;
-#endif
- }
-
- /* XXX - remove this? */
- if (global_capture_opts.save_file) {
- g_free(global_capture_opts.save_file);
- global_capture_opts.save_file = NULL;
- }
-
- if (global_capture_opts.ifaces->len > 1) {
- global_capture_opts.use_pcapng = TRUE;
- }
- /* stop capturing from all interfaces, we are going to do real work now ... */
- window_destroy(cap_if_w);
-
- capture_start_cb(NULL, NULL);
-}
-
-
-/* prepare capture button was pressed */
-static void
-capture_prepare_cb(GtkWidget *prepare_bt _U_, gpointer if_data _U_)
-{
- /* stop capturing from all interfaces, we are going to do real work now ... */
- window_destroy(cap_if_w);
- if (global_capture_opts.ifaces->len > 1) {
- global_capture_opts.use_pcapng = TRUE;
- }
- capture_prep_cb(NULL, NULL);
-}
-
-
-#ifdef _WIN32
-/* capture details button was pressed */
-static void
-capture_details_cb(GtkWidget *details_bt _U_, gpointer name)
-{
- capture_if_details_open(name);
-}
-#endif
-
-/* update a single interface */
-static void
-update_if(gchar *name, if_stat_cache_t *sc_p)
-{
- struct pcap_stat stats;
- gchar *str;
- guint diff, ifs, data_ifs;
- interface_t device;
- if_dlg_data_t data;
- gboolean found = FALSE;
-
-
- /*
- * Note that some versions of libpcap, on some versions of UN*X,
- * pcap_stats() returns the number of packets since the last
- * pcap_stats call.
- *
- * That's a bug, and should be fixed; "pcap_stats()" is supposed
- * to work the same way on all platforms.
- */
- device.last_packets = 0;
- data.curr_lb = NULL;
- data.last_lb = NULL;
- if (sc_p) {
- for (ifs = 0, data_ifs = 0; ifs < global_capture_opts.all_ifaces->len; ifs++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, ifs);
- if (device.type != IF_PIPE) {
- data = g_array_index(if_array, if_dlg_data_t, data_ifs++);
- if (!device.hidden && strcmp(name, device.name) == 0) {
- found = TRUE;
- break;
- }
- }
- }
- if (found) {
- if (capture_stats(sc_p, name, &stats)) {
- if ((int)(stats.ps_recv - device.last_packets) < 0) {
- diff = 0;
- } else {
- diff = stats.ps_recv - device.last_packets;
- }
- device.last_packets = stats.ps_recv;
-
- str = g_strdup_printf("%u", device.last_packets);
- gtk_label_set_text(GTK_LABEL(data.curr_lb), str);
- g_free(str);
- str = g_strdup_printf("%u", diff);
- gtk_label_set_text(GTK_LABEL(data.last_lb), str);
- g_free(str);
-
- gtk_widget_set_sensitive(data.curr_lb, diff);
- gtk_widget_set_sensitive(data.last_lb, diff);
- } else {
- gtk_label_set_text(GTK_LABEL(data.curr_lb), "error");
- gtk_label_set_text(GTK_LABEL(data.last_lb), "error");
- }
- global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, ifs);
- g_array_insert_val(global_capture_opts.all_ifaces, ifs, device);
- if_array = g_array_remove_index(if_array, ifs);
- g_array_insert_val(if_array, ifs, data);
- }
- }
-}
-
-/* update all interfaces */
-static gboolean
-update_all(gpointer data)
-{
- interface_t device;
- guint ifs;
- if_stat_cache_t *sc_p = (if_stat_cache_t *)data;
-
- if (!cap_if_w) {
- return FALSE;
- }
-
- for (ifs = 0; ifs < global_capture_opts.all_ifaces->len; ifs++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, ifs);
- update_if(device.name, sc_p);
- }
-
- return TRUE;
-}
-
-/* a live capture has started or stopped */
-void
-set_capture_if_dialog_for_capture_in_progress(gboolean capture_in_progress)
-{
- gbl_capture_in_progress = capture_in_progress;
- if (cap_if_w) {
- gtk_widget_set_sensitive(stop_bt, capture_in_progress);
- gtk_widget_set_sensitive(capture_bt, !capture_in_progress && (global_capture_opts.num_selected > 0));
- }
-}
-
-/* a live capture is being stopped */
-void
-set_capture_if_dialog_for_capture_stopping(void)
-{
- if (cap_if_w) {
- gtk_widget_set_sensitive(stop_bt, FALSE);
- }
-}
-
-
-/* the window was closed, cleanup things */
-static void
-capture_if_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
-{
- g_source_remove(timer_id);
-
- if (sc) {
- capture_stat_stop(sc);
- sc = NULL;
- }
- window_destroy(GTK_WIDGET(cap_if_w));
- /* Note that we no longer have a "Capture Options" dialog box. */
- cap_if_w = NULL;
- cap_if_top_vb = NULL;
- cap_if_sw = NULL;
-#ifdef HAVE_AIRPCAP
- if (airpcap_if_active)
- airpcap_set_toolbar_stop_capture(airpcap_if_active);
-#endif
-}
-
-
-/*
- * Used to retrieve the interface icon.
- */
-GtkWidget * capture_get_if_icon(interface_t *device)
-{
-#ifdef HAVE_PCAP_REMOTE
- if (!device->local) {
- return PIXBUF_TO_WIDGET(remote_sat_pb_data, "/org/wireshark/image/toolbar/remote_sat_16.png");
- }
-#endif
- if (device->display_name && strstr(device->display_name,"Wi-Fi") != NULL) {
- return PIXBUF_TO_WIDGET(network_wireless_pb_data, "/org/wireshark/image/toolbar/network_wireless_16.png");
- }
- switch (device->type) {
- case IF_DIALUP:
- return xpm_to_widget(modem_16_xpm);
- case IF_WIRELESS:
- return PIXBUF_TO_WIDGET(network_wireless_pb_data, "/org/wireshark/image/toolbar/network_wireless_16.png");
-#ifdef HAVE_AIRPCAP
- case IF_AIRPCAP:
- return xpm_to_widget(capture_airpcap_16_xpm);
-#endif
- case IF_BLUETOOTH:
- return PIXBUF_TO_WIDGET(network_bluetooth_pb_data, "/org/wireshark/image/toolbar/network_bluetooth_16.png");
- case IF_USB:
- return PIXBUF_TO_WIDGET(network_usb_pb_data, "/org/wireshark/image/toolbar/network_usb_16.png");
- case IF_VIRTUAL:
- return xpm_to_widget(network_virtual_16_xpm);
- case IF_WIRED:
- return PIXBUF_TO_WIDGET(network_wired_pb_data, "/org/wireshark/image/toolbar/network_wired_16.png");
- case IF_EXTCAP:
-#ifdef _WIN32
- if (strncmp(device->friendly_name, "USBPcap", 7) == 0) {
- return PIXBUF_TO_WIDGET(network_usb_pb_data, "/org/wireshark/image/toolbar/network_usb_16.png");
- }
-#endif
- case IF_PIPE:
- case IF_STDIN:
- return PIXBUF_TO_WIDGET(pipe_pb_data, "/org/wireshark/image/toolbar/pipe_16.png");
- default:
- printf("unknown device type\n");
- }
- return PIXBUF_TO_WIDGET(network_wired_pb_data, "/org/wireshark/image/toolbar/network_wired_16.png");
-}
-
-
-static int
-get_ip_addr_count(GSList *addr_list)
-{
- GSList *curr_addr;
- if_addr_t *addr;
- int count;
-
- count = 0;
- for (curr_addr = addr_list; curr_addr != NULL;
- curr_addr = g_slist_next(curr_addr)) {
- addr = (if_addr_t *)curr_addr->data;
- switch (addr->ifat_type) {
-
- case IF_AT_IPv4:
- case IF_AT_IPv6:
- count++;
- break;
-
- default:
- /* In case we add non-IP addresses */
- break;
- }
- }
- return count;
-}
-
-static const gchar *
-set_ip_addr_label(GSList *addr_list, GtkWidget *ip_lb, guint selected_ip_addr)
-{
- GSList *curr_addr;
- if_addr_t *addr;
- address addr_address;
- char *addr_str = NULL;
-
- curr_addr = g_slist_nth(addr_list, selected_ip_addr);
- if (curr_addr) {
- addr = (if_addr_t *)curr_addr->data;
- switch (addr->ifat_type) {
-
- case IF_AT_IPv4:
- set_address(&addr_address, AT_IPv4, 4, &addr->addr.ip4_addr);
- addr_str = (char*)address_to_str(NULL, &addr_address);
- break;
-
- case IF_AT_IPv6:
- set_address(&addr_address, AT_IPv6, 16, addr->addr.ip6_addr);
- addr_str = (char*)address_to_str(NULL, &addr_address);
- break;
-
- default:
- /* Ignore non-IP addresses, in case we ever support them */
- break;
- }
- }
-
- if (addr_str) {
- gtk_label_set_text(GTK_LABEL(ip_lb), addr_str);
- } else {
- gtk_label_set_text(GTK_LABEL(ip_lb), "none");
- }
- wmem_free(NULL, addr_str);
- g_object_set_data(G_OBJECT(ip_lb), CAPTURE_IF_SELECTED_IP_ADDR, GINT_TO_POINTER(selected_ip_addr));
-
- return addr_str;
-}
-
-
-static gboolean
-ip_label_enter_cb(GtkWidget *eb, GdkEventCrossing *event _U_, gpointer user_data _U_)
-{
- gtk_widget_set_state(eb, GTK_STATE_PRELIGHT);
-
- return FALSE;
-}
-
-
-static gboolean
-ip_label_leave_cb(GtkWidget *eb, GdkEvent *event _U_, gpointer user_data _U_)
-{
- gtk_widget_set_state(eb, GTK_STATE_NORMAL);
-
- return FALSE;
-}
-
-
-static gboolean
-ip_label_press_cb(GtkWidget *widget, GdkEvent *event _U_, gpointer data)
-{
- GtkWidget *ip_lb = (GtkWidget *)g_object_get_data(G_OBJECT(widget), CAPTURE_IF_IP_ADDR_LABEL);
- GSList *addr_list = (GSList *)data;
- GSList *curr_addr, *start_addr;
- if_addr_t *addr;
- guint selected_ip_addr = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(ip_lb), CAPTURE_IF_SELECTED_IP_ADDR));
-
- /* Select next IP address */
- start_addr = g_slist_nth(addr_list, selected_ip_addr);
- for (;;) {
- selected_ip_addr++;
- if (g_slist_length(addr_list) <= selected_ip_addr) {
- /* Wrap around */
- selected_ip_addr = 0;
- }
- curr_addr = g_slist_nth(addr_list, selected_ip_addr);
- if (curr_addr == start_addr) {
- /* We wrapped all the way around */
- break;
- }
-
- addr = (if_addr_t *)curr_addr->data;
- switch (addr->ifat_type) {
-
- case IF_AT_IPv4:
- case IF_AT_IPv6:
- goto found;
-
- default:
- /* In case we add non-IP addresses */
- break;
- }
- }
-
-found:
- set_ip_addr_label(addr_list, ip_lb, selected_ip_addr);
-
- return FALSE;
-}
-
-static void
-capture_if_stop_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- guint ifs;
- if_dlg_data_t data;
-
- for (ifs = 0; ifs < if_array->len; ifs++) {
- data = g_array_index(if_array, if_dlg_data_t, ifs);
- if (data.hidden) {
- continue;
- }
- gtk_widget_set_sensitive(data.choose_bt, TRUE);
- if_array = g_array_remove_index(if_array, ifs);
- g_array_insert_val(if_array, ifs, data);
- }
- capture_stop_cb(NULL, NULL);
-}
-
-static void
-make_if_array(void)
-{
- if_dlg_data_t data;
- guint i;
-
- if_array = g_array_new(FALSE, FALSE, sizeof(if_dlg_data_t));
-
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- data.device_lb = NULL;
- data.descr_lb = NULL;
- data.ip_lb = NULL;
- data.curr_lb = NULL;
- data.last_lb = NULL;
- data.choose_bt = NULL;
-#ifdef _WIN32
- data.details_bt = NULL;
-#endif
- data.hidden = FALSE;
- g_array_append_val(if_array, data);
- }
-}
-
-/*
- * If this is Windows, is WinPcap loaded? If not, pop up a dialog noting
- * that fact and return FALSE, as we can't capture traffic.
- *
- * Otherwise (not Windows or WinPcap loaded), are there any interfaces?
- * If not, pop up a dialog noting that fact and return FALSE, as there
- * are no interfaces on which to capture traffic.
- *
- * Otherwise, return TRUE, as we can capture.
- */
-static gboolean
-can_capture(void)
-{
-#ifdef _WIN32
- /* Is WPcap loaded? */
- if (!has_wpcap) {
- char *detailed_err;
-
- detailed_err = cant_load_winpcap_err("Wireshark");
- simple_error_message_box("%s", detailed_err);
- g_free(detailed_err);
- return FALSE;
- }
-#endif
-
- if (global_capture_opts.all_ifaces->len == 0) {
- simple_error_message_box("There are no interfaces on which a capture can be done.");
- return FALSE;
- }
-
- return TRUE;
-}
-
-static void
-capture_if_refresh_if_list(void)
-{
- GtkWidget *if_vb, *if_grid, *icon, *if_lb, *eb;
- GtkRequisition requisition;
- int row = 0, height = 0;
- guint ifs;
- interface_t device;
- const gchar *addr_str;
- gchar *user_descr;
- if_dlg_data_t data;
-
- if (!can_capture()) {
- /* No interfaces or, on Windows, no WinPcap; we've already popped
- up a message, so just get rid of the interface dialog. */
- destroy_if_window();
- return;
- }
-
- if (cap_if_sw) {
- /* First, get rid of the old interface list, and stop updating
- the statistics on it. */
- gtk_container_remove(GTK_CONTAINER(cap_if_top_vb), cap_if_sw);
- capture_stat_stop(sc);
- g_source_remove(timer_id);
- }
-
- /* Now construct the new interface list, and start updating the
- statistics on it. */
-
- make_if_array();
-
- cap_if_sw = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(cap_if_sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- gtk_box_pack_start(GTK_BOX(cap_if_top_vb), cap_if_sw, TRUE, TRUE, 0);
-
- if_vb = gtk_alignment_new(0.0F, 0.0F, 1.0F, 0.0F);
- gtk_container_set_border_width(GTK_CONTAINER(if_vb), 5);
-#if ! GTK_CHECK_VERSION(3,8,0)
- gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(cap_if_sw), if_vb);
-#else
- gtk_container_add(GTK_CONTAINER(cap_if_sw), if_vb);
-#endif
-
- if_grid = ws_gtk_grid_new();
- ws_gtk_grid_set_row_spacing(GTK_GRID(if_grid), 3);
- ws_gtk_grid_set_column_spacing(GTK_GRID(if_grid), 3);
- gtk_container_add(GTK_CONTAINER(if_vb), if_grid);
-
- /* This is the icon column, used to display which kind of interface we have */
- if_lb = gtk_label_new("");
- ws_gtk_grid_attach_extended(GTK_GRID(if_grid), if_lb, 0, row, 1, 1,
- (GtkAttachOptions)0, (GtkAttachOptions)0, 0, 0);
-
- if_lb = gtk_label_new("Device");
- ws_gtk_grid_attach_defaults(GTK_GRID(if_grid), if_lb, 1, row, 3, 1);
-
- if_lb = gtk_label_new("Description");
- ws_gtk_grid_attach_defaults(GTK_GRID(if_grid), if_lb, 4, row, 1, 1);
-
- if_lb = gtk_label_new(" IP ");
- ws_gtk_grid_attach_extended(GTK_GRID(if_grid), if_lb, 5, row, 1, 1,
- (GtkAttachOptions)0, (GtkAttachOptions)0, 0, 0);
-
- if_lb = gtk_label_new("Packets");
- ws_gtk_grid_attach_extended(GTK_GRID(if_grid), if_lb, 6, row, 1, 1,
- (GtkAttachOptions)0, (GtkAttachOptions)0, 0, 0);
-
- if_lb = gtk_label_new(" Packets/s ");
- ws_gtk_grid_attach_extended(GTK_GRID(if_grid), if_lb, 7, row, 1, 1,
- (GtkAttachOptions)0, (GtkAttachOptions)0, 0, 0);
- row++;
-
- height += 30;
- /* Start gathering statistics (using dumpcap) */
- sc = capture_stat_start(&global_capture_opts);
-
- /* List the interfaces */
- for (ifs = 0; ifs < global_capture_opts.all_ifaces->len; ifs++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, ifs);
- data = g_array_index(if_array, if_dlg_data_t, ifs);
- /* Continue if capture device is hidden */
- if (device.hidden) {
- data.hidden = TRUE;
- if_array = g_array_remove_index(if_array, ifs);
- g_array_insert_val(if_array, ifs, data);
- continue;
- }
- data.choose_bt = gtk_check_button_new();
- ws_gtk_grid_attach_extended(GTK_GRID(if_grid), data.choose_bt, 0, row, 1, 1,
- (GtkAttachOptions)0, (GtkAttachOptions)0, 0, 0);
- if (gbl_capture_in_progress) {
- gtk_widget_set_sensitive(data.choose_bt, FALSE);
- } else {
- gtk_widget_set_sensitive(data.choose_bt, TRUE);
- }
- gtk_toggle_button_set_active((GtkToggleButton *)data.choose_bt, device.selected);
- g_signal_connect(data.choose_bt, "toggled", G_CALLBACK(store_selected), device.name);
- /* Kind of adaptor (icon) */
- icon = capture_get_if_icon(&(device));
- ws_gtk_grid_attach_extended(GTK_GRID(if_grid), icon, 1, row, 1, 1,
- (GtkAttachOptions)0, (GtkAttachOptions)0, 0, 0);
-
- /* device name */
-#ifdef _WIN32
- /*
- * On Windows, device names are generally not meaningful - NT 5
- * uses long blobs with GUIDs in them, for example - so instead we use
- * the display name which should match that shown in ncpa.cpl
- */
- data.device_lb = gtk_label_new(device.display_name);
-#else
- data.device_lb = gtk_label_new(device.name);
-#endif
- gtk_misc_set_alignment(GTK_MISC(data.device_lb), 0.0f, 0.5f);
- if (strlen(gtk_label_get_text(GTK_LABEL(data.device_lb))) > SOFT_LABEL_LEN) {
- gtk_label_set_ellipsize(GTK_LABEL(data.device_lb), PANGO_ELLIPSIZE_MIDDLE);
- gtk_label_set_width_chars(GTK_LABEL(data.device_lb), SOFT_LABEL_LEN);
- }
- ws_gtk_grid_attach_defaults(GTK_GRID(if_grid), data.device_lb, 2, row, 2, 1);
-
- /* description */
- user_descr = capture_dev_user_descr_find(device.name);
- if (user_descr) {
- data.descr_lb = gtk_label_new(user_descr);
- g_free (user_descr);
- } else {
- if (device.if_info.vendor_description)
- data.descr_lb = gtk_label_new(device.if_info.vendor_description);
- else
- data.descr_lb = gtk_label_new("");
- }
- gtk_misc_set_alignment(GTK_MISC(data.descr_lb), 0.0f, 0.5f);
- if (strlen(gtk_label_get_text(GTK_LABEL(data.descr_lb))) > SOFT_LABEL_LEN) {
- gtk_label_set_ellipsize(GTK_LABEL(data.descr_lb), PANGO_ELLIPSIZE_MIDDLE);
- gtk_label_set_width_chars(GTK_LABEL(data.descr_lb), SOFT_LABEL_LEN);
- }
- ws_gtk_grid_attach_defaults(GTK_GRID(if_grid), data.descr_lb, 4, row, 1, 1);
-
- /* IP address */
- /* Only one IP address will be shown, start with the first */
- data.ip_lb = gtk_label_new("");
- addr_str = set_ip_addr_label (device.if_info.addrs, data.ip_lb, 0);
- if (addr_str) {
- gtk_widget_set_sensitive(data.ip_lb, TRUE);
- } else {
- gtk_widget_set_sensitive(data.ip_lb, FALSE);
- }
- eb = gtk_event_box_new ();
- gtk_container_add(GTK_CONTAINER(eb), data.ip_lb);
- ws_gtk_grid_attach_extended(GTK_GRID(if_grid), eb, 5, row, 1, 1,
- (GtkAttachOptions)0, (GtkAttachOptions)0, 0, 0);
- if (get_ip_addr_count(device.if_info.addrs) > 1) {
- /* More than one IP address, make it possible to toggle */
- g_object_set_data(G_OBJECT(eb), CAPTURE_IF_IP_ADDR_LABEL, data.ip_lb);
- gtk_widget_set_tooltip_text(eb, "Click to see additional IP addresses");
- g_signal_connect(eb, "enter-notify-event", G_CALLBACK(ip_label_enter_cb), NULL);
- g_signal_connect(eb, "leave-notify-event", G_CALLBACK(ip_label_leave_cb), NULL);
- g_signal_connect(eb, "button-press-event", G_CALLBACK(ip_label_press_cb), device.if_info.addrs);
- }
-
- /* packets */
- data.curr_lb = gtk_label_new("-");
- ws_gtk_grid_attach_extended(GTK_GRID(if_grid), data.curr_lb, 6, row, 1, 1,
- (GtkAttachOptions)0, (GtkAttachOptions)0, 0, 0);
-
- /* packets/s */
- data.last_lb = gtk_label_new("-");
- ws_gtk_grid_attach_extended(GTK_GRID(if_grid), data.last_lb, 7, row, 1, 1,
- (GtkAttachOptions)0, (GtkAttachOptions)0, 0, 0);
-
- /* details button */
-#ifdef _WIN32
- data.details_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_CAPTURE_DETAILS);
- gtk_widget_set_tooltip_text(data.details_bt, "Open the capture details dialog of this interface.");
- ws_gtk_grid_attach_extended(GTK_GRID(if_grid), data.details_bt, 8, row, 1, 1, 0, 0, 0, 0);
- if (capture_if_has_details(device.name)) {
- g_signal_connect(data.details_bt, "clicked", G_CALLBACK(capture_details_cb), device.name);
- } else {
- gtk_widget_set_sensitive(data.details_bt, FALSE);
- }
-#endif
- if_array = g_array_remove_index(if_array, ifs);
- g_array_insert_val(if_array, ifs, data);
-
- row++;
- if (row <= 20) {
- /* Add up to 20 rows of interfaces, otherwise the window may become too high */
-#ifdef _WIN32
- gtk_widget_get_preferred_size(GTK_WIDGET(data.details_bt), &requisition, NULL);
-#else
- gtk_widget_get_preferred_size(GTK_WIDGET(data.choose_bt), &requisition, NULL);
-#endif
- height += requisition.height;
- }
- }
-
- gtk_widget_get_preferred_size(GTK_WIDGET(close_bt), &requisition, NULL);
- /* height + static offset + grid spacing */
- height += requisition.height + 40 + (row * 3);
-
- gtk_window_set_default_size(GTK_WINDOW(cap_if_w), -1, height);
-
- gtk_widget_show_all(cap_if_w);
-
- /* update the interface list every 1000ms */
- timer_id = g_timeout_add(1000, update_all, sc);
-}
-
-/* start getting capture stats from all interfaces */
-void
-capture_if_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- GtkWidget *bbox,
- *help_bt;
-#ifdef HAVE_AIRPCAP
- GtkWidget *decryption_cb;
-#endif
-
- if (cap_if_w != NULL) {
- /* There's already a "Capture Interfaces" dialog box; reactivate it. */
- reactivate_window(cap_if_w);
- return;
- }
-
- if (!can_capture()) {
- /* No interfaces or, on Windows, no WinPcap; just give up. */
- return;
- }
-
-#ifdef HAVE_AIRPCAP
- /* LOAD AIRPCAP INTERFACES */
-
- /* If no airpcap interface is present, gray everything */
- if (airpcap_if_active == NULL) {
- if (g_airpcap_if_list == NULL) {
- /*No airpcap device found */
- airpcap_enable_toolbar_widgets(wireless_tb,FALSE);
- } else {
- /* default adapter is not airpcap... or is airpcap but is not found*/
- if (airpcap_if_active){
- /* XXX can never happen? */
- airpcap_set_toolbar_stop_capture(airpcap_if_active);
- }
- airpcap_enable_toolbar_widgets(wireless_tb,FALSE);
- }
- }
- if (airpcap_if_active){
- decryption_cb = (GtkWidget *)g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_DECRYPTION_KEY);
- /* XXXX update_decryption_mode_list() trigers a rescan, should only be done if the mode is changed */
- update_decryption_mode_list(decryption_cb);
- airpcap_set_toolbar_start_capture(airpcap_if_active);
- }
-#endif
-
- cap_if_w = dlg_window_new("Wireshark: Capture Interfaces"); /* transient_for top_level */
- /* XXX: Note that on Windows the following is effectively a no-op; See dlg_window_new(). */
- /* This means, on Windows, if the top_level Wireshark window is destroyed when */
- /* the capture_interfaces dialog window is open, that the dumpcap process will not */
- /* be stopped since the destroy callback for the capture_interfaces dialog window */
- /* will not be called. */
- /* ToDo: Fix this ! */
- gtk_window_set_destroy_with_parent (GTK_WINDOW(cap_if_w), TRUE);
-
- cap_if_top_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
- gtk_container_add(GTK_CONTAINER(cap_if_w), cap_if_top_vb);
- gtk_container_set_border_width(GTK_CONTAINER(cap_if_top_vb), DLG_OUTER_MARGIN);
-
- /* Button row: close, help, stop, start, and options button */
- bbox = dlg_button_row_new(GTK_STOCK_HELP, WIRESHARK_STOCK_CAPTURE_START, WIRESHARK_STOCK_CAPTURE_OPTIONS, WIRESHARK_STOCK_CAPTURE_STOP, GTK_STOCK_CLOSE, NULL);
-
- gtk_box_pack_end(GTK_BOX(cap_if_top_vb), bbox, FALSE, FALSE, 0);
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)(HELP_CAPTURE_INTERFACES_DIALOG));
-
- stop_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_CAPTURE_STOP);
- g_signal_connect(stop_bt, "clicked", G_CALLBACK(capture_if_stop_cb), NULL);
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(cap_if_w, close_bt, window_cancel_button_cb);
- gtk_widget_set_tooltip_text(close_bt, "Close this window.");
- options_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_CAPTURE_OPTIONS);
- g_signal_connect(options_bt, "clicked", G_CALLBACK(capture_prepare_cb), NULL);
- capture_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_CAPTURE_START);
- g_signal_connect(capture_bt, "clicked", G_CALLBACK(capture_do_cb), NULL);
-
- gtk_widget_grab_default(close_bt);
-
- g_signal_connect(cap_if_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(cap_if_w, "destroy", G_CALLBACK(capture_if_destroy_cb), sc);
-
- capture_if_refresh_if_list();
-
- window_present(cap_if_w);
-
- set_capture_if_dialog_for_capture_in_progress(gbl_capture_in_progress);
-}
-
-gboolean interfaces_dialog_window_present(void)
-{
- return (cap_if_w?TRUE:FALSE);
-}
-
-void refresh_if_window(void)
-{
- if (cap_if_w) {
- capture_if_refresh_if_list();
- }
-}
-
-void select_all_interfaces(gboolean enable _U_)
-{
- guint ifs;
- interface_t device;
-
- for (ifs = 0; ifs < global_capture_opts.all_ifaces->len; ifs++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, ifs);
- update_selected_interface(device.if_info.name);
- }
-}
-
-void destroy_if_window(void)
-{
- if (cap_if_w) {
- window_destroy(cap_if_w);
- }
-}
-#else /* HAVE_LIBPCAP */
-
-void
-set_capture_if_dialog_for_capture_in_progress(gboolean capture_in_progress _U_)
-{
-}
-
-#endif /* HAVE_LIBPCAP */
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/capture_if_dlg.h b/ui/gtk/capture_if_dlg.h
deleted file mode 100644
index ca790e7211..0000000000
--- a/ui/gtk/capture_if_dlg.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/* capture_if_dlg.h
- * Definitions for packet capture interface windows
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __CAPTURE_IF_DLG_H__
-#define __CAPTURE_IF_DLG_H__
-
-/** A live capture has started or stopped.
- *
- * @param capture_in_progress capture is in progress
- */
-void
-set_capture_if_dialog_for_capture_in_progress(gboolean capture_in_progress);
-
-/** A live capture is being stopped.
- */
-void set_capture_if_dialog_for_capture_stopping(void);
-
-/** User requested the "Capture Interfaces" dialog box by menu or toolbar.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-void
-capture_if_cb(GtkWidget *widget, gpointer data);
-
-#ifdef HAVE_LIBPCAP
-
-#include "caputils/capture_ifinfo.h" /* for if_info_t */
-
-/*
- * Used to retrieve the interface icon
- */
-GtkWidget *
-capture_get_if_icon(interface_t *device);
-
-void
-update_selected_interface(gchar *name);
-
-gboolean
-interfaces_dialog_window_present(void);
-
-void
-add_interface(void);
-
-void
-refresh_if_window(void);
-
-void
-select_all_interfaces(gboolean enable);
-
-void
-destroy_if_window(void);
-
-#endif /* HAVE_LIBPCAP */
-
-#endif /* capture_if_dlg.h */
-
-
diff --git a/ui/gtk/capture_info_dlg.c b/ui/gtk/capture_info_dlg.c
deleted file mode 100644
index 403a1e900b..0000000000
--- a/ui/gtk/capture_info_dlg.c
+++ /dev/null
@@ -1,389 +0,0 @@
-/* capture_info_dlg.c
- * Routines for packet capture info dialog
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#ifdef HAVE_LIBPCAP
-
-#include <time.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/packet.h>
-#include <epan/capture_dissectors.h>
-
-#include "ui/capture.h"
-#include "../../capture_info.h"
-
-#include "ui/capture_ui_utils.h"
-
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/stock_icons.h"
-
-#ifdef HAVE_AIRPCAP
-#include <caputils/airpcap.h>
-#include <caputils/airpcap_loader.h>
-#include "airpcap_gui_utils.h"
-#include "airpcap_dlg.h"
-#endif
-
-
-/* a single capture counter value (with title, pointer to value and GtkWidgets) */
-/* as the packet_counts is a struct, not an array, keep a pointer to the */
-/* corresponding value packet_counts, to speed up (and simplify) output of values */
-typedef struct {
- const gchar *title;
- int proto;
- GtkWidget *label, *value_lb, *percent_pb, *percent_lb;
-} capture_info_counts_t;
-
-/** Number of packet counts. */
-#define PACKET_COUNTS_SIZE 12
-
-/* all data we need to know of this dialog, after creation finished */
-typedef struct {
- GtkWidget *cap_w;
- GtkWidget *running_time_lb;
- capture_info_counts_t total_count;
- capture_info_counts_t other_count;
- capture_info_counts_t counts[PACKET_COUNTS_SIZE];
- guint timer_id;
- time_t start_time;
-} capture_info_ui_t;
-
-
-/* Workhorse for stopping capture */
-static void
-capture_info_stop(capture_session *cap_session)
-{
-#ifdef HAVE_AIRPCAP
- airpcap_set_toolbar_stop_capture(airpcap_if_active);
-#endif
- capture_stop(cap_session);
-}
-
-/* "delete-event" signal callback. Note different signature than "clicked" signal callback */
-static gboolean
-capture_info_delete_cb(GtkWidget *w _U_, GdkEvent *event _U_, gpointer data) {
- capture_info_stop((capture_session *)data);
- return TRUE;
-}
-
-/* "clicked" signal callback */
-static void
-capture_info_stop_clicked_cb(GtkButton *w _U_, gpointer data) {
- capture_info_stop((capture_session *)data);
-}
-
-static gboolean
-capture_info_ui_update_cb(gpointer data)
-{
- capture_info *cinfo = (capture_info *)data;
- capture_info_ui_t *info = (capture_info_ui_t *)cinfo->ui;
-
- if (!info) /* ...which might happen on slow displays? */
- return TRUE;
-
- cinfo->running_time = time(NULL) - info->start_time;
- capture_info_ui_update(cinfo);
- return TRUE; /* call the timer again */
-}
-
-static void
-capture_info_count_init(capture_info_counts_t* count, int idx, GtkWidget *percent_pb, gboolean show, GtkWidget *counts_grid)
-{
- count->label = gtk_label_new(count->title);
- gtk_misc_set_alignment(GTK_MISC(count->label), 0.0f, 0.5f);
-
- count->value_lb = gtk_label_new("0");
- gtk_misc_set_alignment(GTK_MISC(count->value_lb), 0.5f, 0.5f);
-
- count->percent_pb = percent_pb;
-
- if (!show) /* Do for all but "total" */
- {
- /* downsize the default size of this progress bar in x direction (def:150), */
- /* otherwise it will become too large and the dialog will look ugly */
- /* XXX: use a TreeView instead of a grid in order to fix this */
- gtk_widget_set_size_request(count->percent_pb, 70, -1);
- }
-
- count->percent_lb = gtk_label_new("0.0%");
- gtk_misc_set_alignment(GTK_MISC(count->percent_lb), 1.0f, 0.5f);
-
- ws_gtk_grid_attach_extended(GTK_GRID(counts_grid), count->label,
- 0, idx, 1, 1, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
- ws_gtk_grid_attach_extended(GTK_GRID(counts_grid), count->value_lb,
- 1, idx, 1, 1, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
- ws_gtk_grid_attach_extended(GTK_GRID(counts_grid), count->percent_pb,
- 2, idx, 1, 1, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
- ws_gtk_grid_attach_extended(GTK_GRID(counts_grid), count->percent_lb,
- 3, idx, 1, 1, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
-
- gtk_widget_show(count->label);
- gtk_widget_show(count->value_lb);
- gtk_widget_show(count->percent_pb);
- /* don't show percentages for the "total" row */
- if (show) {
- gtk_widget_show(count->percent_lb);
- }
-}
-
-/* create the capture info dialog */
-/* will keep pointers to the fields in the counts parameter */
-void
-capture_info_ui_create(capture_info *cinfo, capture_session *cap_session)
-{
- capture_options *capture_opts = cap_session->capture_opts;
- unsigned int i;
- GtkWidget *main_vb, *stop_bt, *counts_grid;
- GtkWidget *counts_fr, *running_grid, *running_label, *lb, *bbox, *ci_help;
- capture_info_ui_t *info;
- gchar *cap_w_title;
- gchar *title_iface;
- GString *str;
-
- info = g_new0(capture_info_ui_t,1);
- info->total_count.title = "Total";
- info->other_count.title = "Other";
-
- info->counts[0].title = "SCTP";
- info->counts[0].proto = proto_get_id_by_short_name(info->counts[0].title);
- info->counts[1].title = "TCP";
- info->counts[1].proto = proto_get_id_by_short_name(info->counts[1].title);
- info->counts[2].title = "UDP";
- info->counts[2].proto = proto_get_id_by_short_name(info->counts[2].title);
- info->counts[3].title = "ICMP";
- info->counts[3].proto = proto_get_id_by_short_name(info->counts[3].title);
- info->counts[4].title = "ARP";
- info->counts[4].proto = proto_get_id_by_short_name(info->counts[4].title);
- info->counts[5].title = "OSPF";
- info->counts[5].proto = proto_get_id_by_short_name(info->counts[5].title);
- info->counts[6].title = "GRE";
- info->counts[6].proto = proto_get_id_by_short_name(info->counts[6].title);
- info->counts[7].title = "NetBIOS";
- info->counts[7].proto = proto_get_id_by_short_name(info->counts[7].title);
- info->counts[8].title = "IPX";
- info->counts[8].proto = proto_get_id_by_short_name(info->counts[8].title);
- info->counts[9].title = "VINES";
- info->counts[9].proto = proto_get_id_by_short_name(info->counts[9].title);
- info->counts[10].title = "I2C Events";
- info->counts[10].proto = proto_get_id_by_short_name(info->counts[10].title);
- info->counts[11].title = "I2C Data";
- info->counts[11].proto = proto_get_id_by_short_name(info->counts[11].title);
-
- /*
- * Create the dialog window, with a title that includes the interfaces
- * on which we're capturing.
- */
- str = get_iface_list_string(capture_opts, 0);
- title_iface = g_strdup_printf("Wireshark: Capture from %s", str->str);
- g_string_free(str, TRUE);
- cap_w_title = create_user_window_title(title_iface);
- g_free(title_iface);
- info->cap_w = dlg_window_new(cap_w_title);
- g_free(cap_w_title);
-
- /* Container for capture display widgets */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 1, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_container_add(GTK_CONTAINER(info->cap_w), main_vb);
- gtk_widget_show(main_vb);
-
- counts_fr = gtk_frame_new("Captured Packets");
- gtk_box_pack_start(GTK_BOX(main_vb), counts_fr, FALSE, FALSE, 3);
- gtk_widget_show(counts_fr);
-
- /* Individual statistic elements */
- counts_grid = ws_gtk_grid_new();
- ws_gtk_grid_set_homogeneous(GTK_GRID(counts_grid), TRUE);
- gtk_container_add(GTK_CONTAINER(counts_fr), counts_grid);
- gtk_container_set_border_width(GTK_CONTAINER(counts_grid), 5);
- gtk_widget_show(counts_grid);
-
- ws_gtk_grid_set_row_spacing(GTK_GRID(counts_grid), 0);
- ws_gtk_grid_set_column_spacing(GTK_GRID(counts_grid), 5);
-
- capture_info_count_init(&info->total_count, 0, gtk_label_new("% of total"), FALSE, counts_grid);
-
- for (i = 0; i < PACKET_COUNTS_SIZE; i++) {
- capture_info_count_init(&info->counts[i], i+1, gtk_progress_bar_new(), TRUE, counts_grid);
- }
-
- capture_info_count_init(&info->other_count, i+1, gtk_progress_bar_new(), TRUE, counts_grid);
-
- /* Running time */
- running_grid = ws_gtk_grid_new();
- ws_gtk_grid_set_homogeneous(GTK_GRID(running_grid), TRUE);
-
- running_label = gtk_label_new("Running");
- gtk_misc_set_alignment(GTK_MISC(running_label), 0.0f, 0.0f);
- gtk_widget_show(running_label);
- ws_gtk_grid_attach_extended(GTK_GRID(running_grid), running_label,
- 0, 0, 1, 1, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
-
- info->running_time_lb = gtk_label_new("00:00:00");
- gtk_misc_set_alignment(GTK_MISC(info->running_time_lb), 0.5f, 0.0f);
- gtk_widget_show(info->running_time_lb);
- ws_gtk_grid_attach_extended(GTK_GRID(running_grid), info->running_time_lb,
- 1, 0, 1, 1, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 5, 0); /* effect: pads *all* the columns ?? */
-
- /* two dummy cols to match the 4 cols above */
- lb = gtk_label_new("");
- gtk_widget_show(lb);
- ws_gtk_grid_attach_extended(GTK_GRID(running_grid), lb,
- 2, 0, 1, 1, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
- lb = gtk_label_new("");
- gtk_widget_show(lb);
- ws_gtk_grid_attach_extended(GTK_GRID(running_grid), lb,
- 3, 0, 1, 1, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
-
- gtk_box_pack_start(GTK_BOX(main_vb), running_grid, FALSE, FALSE, 3);
- gtk_widget_show(running_grid);
-
- /* allow user to either click a stop button, or the close button on
- the window to stop a capture in progress. */
- bbox = dlg_button_row_new(WIRESHARK_STOCK_CAPTURE_STOP, GTK_STOCK_HELP, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 3);
- gtk_widget_show(bbox);
-
- stop_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_CAPTURE_STOP);
- window_set_cancel_button(info->cap_w, stop_bt, NULL);
- g_signal_connect(stop_bt, "clicked", G_CALLBACK(capture_info_stop_clicked_cb), cap_session);
- g_signal_connect(info->cap_w, "delete_event", G_CALLBACK(capture_info_delete_cb), cap_session);
-
- ci_help = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- gtk_widget_set_tooltip_text(ci_help, "Get help about this dialog");
- g_signal_connect(ci_help, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_CAPTURE_INFO_DIALOG);
-
- gtk_widget_show(info->cap_w);
- window_present(info->cap_w);
-
- info->start_time = time(NULL);
-
- cinfo->ui = info;
-
- /* update the dialog once a second, even if no packets rushing in */
- info->timer_id = g_timeout_add(1000, capture_info_ui_update_cb,cinfo);
-}
-
-static void
-capture_info_count_update(capture_info_counts_t* count, capture_info *cinfo)
-{
- gchar label_str[64];
- float pb_frac;
- guint32 proto_count;
-
- proto_count = capture_dissector_get_count(cinfo->counts, count->proto);
-
- g_snprintf(label_str, sizeof(label_str), "%d", proto_count);
- gtk_label_set_text(GTK_LABEL(count->value_lb), label_str);
-
- pb_frac = (cinfo->counts->total != 0) ?
- ((float)proto_count / cinfo->counts->total) : 0.0f;
-
- /* don't try to update the "total" row progress bar */
- gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(count->percent_pb), pb_frac);
- g_snprintf(label_str, sizeof(label_str), "%.1f%%", pb_frac * 100.0);
- gtk_label_set_text(GTK_LABEL(count->percent_lb), label_str);
-}
-
-/* update the capture info dialog */
-/* As this function is a bit time critical while capturing, */
-/* prepare everything possible in the capture_info_ui_create() function above! */
-void capture_info_ui_update(
-capture_info *cinfo)
-{
- unsigned int i;
- gchar label_str[64];
- capture_info_ui_t *info = (capture_info_ui_t *)cinfo->ui;
-
- if (!info) /* ...which might happen on slow displays? */
- return;
-
- /* display running time */
- g_snprintf(label_str, sizeof(label_str), "%02ld:%02ld:%02ld",
- (long)(cinfo->running_time/3600), (long)((cinfo->running_time%3600)/60),
- (long)(cinfo->running_time%60));
- gtk_label_set_text(GTK_LABEL(info->running_time_lb), label_str);
-
- /* if we have new packets, update all rows */
- if (cinfo->new_packets) {
- float pb_frac;
-
- /* First setup total */
- g_snprintf(label_str, sizeof(label_str), "%d", cinfo->counts->total);
- gtk_label_set_text(GTK_LABEL(info->total_count.value_lb), label_str);
-
- for (i = 0; i < PACKET_COUNTS_SIZE; i++) {
- capture_info_count_update(&info->counts[i], cinfo);
- }
-
- /* Now handle "other" packets */
- g_snprintf(label_str, sizeof(label_str), "%d", cinfo->counts->other);
- gtk_label_set_text(GTK_LABEL(info->other_count.value_lb), label_str);
-
- pb_frac = (cinfo->counts->total != 0) ?
- ((float)cinfo->counts->other / cinfo->counts->total) : 0.0f;
-
- gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(info->other_count.percent_pb), pb_frac);
- g_snprintf(label_str, sizeof(label_str), "%.1f%%", pb_frac * 100.0);
- gtk_label_set_text(GTK_LABEL(info->other_count.percent_lb), label_str);
- }
-}
-
-/* destroy the capture info dialog again */
-void capture_info_ui_destroy(
-capture_info *cinfo)
-{
- capture_info_ui_t *info = (capture_info_ui_t *)cinfo->ui;
-
- if (!info) /* ...which probably shouldn't happen */
- return;
-
- g_source_remove(info->timer_id);
-
- /* called from capture engine, so it's ok to destroy the dialog here */
- gtk_grab_remove(GTK_WIDGET(info->cap_w));
- window_destroy(GTK_WIDGET(info->cap_w));
- g_free(info);
- cinfo->ui = NULL;
-}
-
-
-#endif /* HAVE_LIBPCAP */
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local Variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/cfilter_combo_utils.h b/ui/gtk/cfilter_combo_utils.h
deleted file mode 100644
index 7fb2501c94..0000000000
--- a/ui/gtk/cfilter_combo_utils.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* cfilter_combo_utils.h
- * Capture filter combo box routines
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __CFILTER_COMBO_UTILS_H__
-#define __CFILTER_COMBO_UTILS_H__
-
-/** @file
- * Capture filter combo box routines
- */
-
-#define E_CFILTER_CM_KEY "capture_filter_combo"
-#define E_ALL_CFILTER_CM_KEY "capture_all_filter_combo"
-
-#endif /* __CFILTER_COMBO_UTILS_H__ */
diff --git a/ui/gtk/color_dlg.c b/ui/gtk/color_dlg.c
deleted file mode 100644
index 4ac1f555cb..0000000000
--- a/ui/gtk/color_dlg.c
+++ /dev/null
@@ -1,1124 +0,0 @@
-/* color_dlg.c
- * Definitions for dialog boxes for color filters
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/packet.h>
-#include <epan/prefs.h>
-#include <epan/color_filters.h>
-
-#include "simple_dialog.h"
-
-#include "ui/gtk/main.h"
-#include "ui/gtk/color_utils.h"
-#include "ui/gtk/color_dlg.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/capture_file_dlg.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/color_edit_dlg.h"
-#include "ui/gtk/packet_list.h"
-
-
-#define BUTTON_SIZE_X -1
-#define BUTTON_SIZE_Y -1
-
-
-static GtkWidget* colorize_dialog_new(char *filter);
-static void add_filter_to_list(gpointer filter_arg, gpointer list_arg, gboolean prepend);
-static void color_filter_up_cb(GtkButton *button, gpointer user_data);
-static void color_filter_down_cb(GtkButton *button, gpointer user_data);
-static void remember_selected_row(GtkTreeSelection *sel, gpointer list);
-static void color_destroy_cb(GtkButton *button, gpointer user_data);
-static void destroy_edit_dialog_cb(gpointer filter_arg, gpointer dummy);
-static void create_new_color_filter(GtkButton *button, const char *filter);
-static void color_new_cb(GtkButton *button, gpointer user_data);
-static void color_edit_cb(GtkButton *button, gpointer user_data);
-static gboolean color_filters_button_cb(GtkWidget *, GdkEventButton *, gpointer);
-static void color_disable_cb(GtkWidget *widget, gboolean user_data);
-static void color_delete_cb(GtkWidget *widget, gpointer user_data);
-static void color_save_cb(GtkButton *button, gpointer user_data);
-static void color_ok_cb(GtkButton *button, gpointer user_data);
-static void color_cancel_cb(GtkWidget *widget, gpointer user_data);
-static void color_apply_cb(GtkButton *button, gpointer user_data);
-static void color_clear_cb(GtkWidget *button, gpointer user_data);
-static void color_import_cb(GtkButton *button, gpointer user_data );
-static void color_export_cb(GtkButton *button, gpointer user_data );
-
-
-static GtkWidget *colorize_win;
-gint color_dlg_num_of_filters; /* number of filters being displayed */
-gint color_dlg_row_selected; /* row in color_filters that is selected */
-
-static gboolean row_is_moving = FALSE;
-
-/* This is a list of all current color filters in the dialog
- * (copied from color_filters.c and edited with the dialog).
- * The color filter items are not identical to the ones used for the
- * packet list display, so they can be safely edited.
- *
- * Keep the temporary filters in a separate list so that they are
- * not shown in the edit-dialog
- *
- * XXX - use the existing GTK list for this purpose and build temporary copies
- * e.g. for the save/export functions.
- * Problem: Don't know when able to safely throw away, e.g. while exporting.
- */
-static GSList *color_filter_edit_list = NULL;
-static GSList *color_filter_tmp_list = NULL;
-
-
-#define COLOR_UP_LB "color_up_lb"
-#define COLOR_DOWN_LB "color_down_lb"
-#define COLOR_EDIT_LB "color_edit_lb"
-#define COLOR_ENABLE_LB "color_enable_lb"
-#define COLOR_DISABLE_LB "color_disable_lb"
-#define COLOR_DELETE_LB "color_delete_lb"
-#define COLOR_FILTERS_CL "color_filters_cl"
-#define COLOR_FILTER_LIST "color_filter_list"
-
-
-/* Callback for the "Display:Coloring Rules" menu item. */
-void
-color_display_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- if (colorize_win != NULL) {
- /* There's already a color dialog box active; reactivate it. */
- reactivate_window(colorize_win);
- } else {
- /* Create a new "Colorize Display" dialog. */
- colorize_win = colorize_dialog_new(NULL);
- }
-}
-
-/* this opens the color dialog and presets the filter string */
-void
-color_display_with_filter(char *filter)
-{
- if (colorize_win != NULL) {
- /* There's already a color dialog box active; reactivate it. */
- reactivate_window(colorize_win);
- } else {
- /* Create a new "Colorize Display" dialog. */
- colorize_win = colorize_dialog_new(filter);
- }
-}
-
-/* if this filter is selected - count it in the given int* */
-static void
-count_this_select(gpointer filter_arg, gpointer counter_arg)
-{
- color_filter_t *colorf = (color_filter_t *)filter_arg;
- int * cnt = (int *)counter_arg;
-
- if (colorf->selected)
- (*cnt)++;
-}
-
-/* TODO: implement count of selected filters. Plug in to file_dlg update of "export selected" checkbox. */
-int color_selected_count(void)
-{
- int count = 0;
-
- g_slist_foreach(color_filter_edit_list, count_this_select, &count);
-
- return count;
-}
-
-
-/* a new color filter was read in from a filter file */
-void
-color_filter_add_cb(color_filter_t *colorf, gpointer user_data)
-{
- GtkWidget *color_filters = (GtkWidget*)user_data;
-
- add_filter_to_list(colorf, color_filters, FALSE);
-
- gtk_widget_grab_focus(color_filters);
-}
-/* Create the "Coloring Rules" dialog. */
-static GtkWidget*
-colorize_dialog_new (char *filter)
-{
- GtkWidget *color_win;
- GtkWidget *dlg_vbox;
- GtkWidget *main_hbox;
- GtkWidget *ctrl_vbox;
- GtkWidget *order_fr;
- GtkWidget *order_vbox;
- GtkWidget *color_filter_up;
- GtkWidget *order_move_label;
- GtkWidget *color_filter_down;
-
- GtkWidget *list_fr;
- GtkWidget *list_vbox;
- GtkWidget *scrolledwindow1;
- GtkWidget *color_filters;
- GtkWidget *list_label;
-
- GtkWidget *edit_fr;
- GtkWidget *edit_vbox;
- GtkWidget *color_new;
- GtkWidget *color_edit;
- GtkWidget *color_enable;
- GtkWidget *color_disable;
- GtkWidget *color_delete;
-
- GtkWidget *manage_fr;
- GtkWidget *manage_vbox;
- GtkWidget *color_import;
- GtkWidget *color_export;
- GtkWidget *color_clear;
-
- GtkWidget *button_ok_hbox;
- GtkWidget *color_ok;
- GtkWidget *color_apply;
- GtkWidget *color_save;
- GtkWidget *color_cancel;
- GtkWidget *color_help;
-
- GtkListStore *store;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
- GtkTreeSelection *selection;
- static const gchar *titles[] = { "Name", "String" };
-
-
-
- color_dlg_num_of_filters = 0;
- color_dlg_row_selected = -1; /* no row selected */
- /* Resizing of the dialog window is now reasonably done.
- * Default size is set so that it should fit into every usual screen resolution.
- * All other widgets are always packed depending on the current window size. */
- color_win = dlg_conf_window_new ("Wireshark: Coloring Rules");
- g_object_set_data(G_OBJECT(color_win), "color_win", color_win);
- gtk_window_set_default_size(GTK_WINDOW(color_win), DEF_WIDTH, DEF_HEIGHT * 2/3);
- dlg_vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width (GTK_CONTAINER (dlg_vbox), 5);
- gtk_container_add (GTK_CONTAINER (color_win), dlg_vbox);
-
- main_hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start (GTK_BOX (dlg_vbox), main_hbox, TRUE, TRUE, 0);
-
- ctrl_vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_box_pack_start (GTK_BOX (main_hbox), ctrl_vbox, FALSE, FALSE, 0);
-
- /* edit buttons frame */
- edit_fr = gtk_frame_new("Edit");
- gtk_box_pack_start (GTK_BOX (ctrl_vbox), edit_fr, TRUE, TRUE, 0);
-
- /* edit_vbox is first button column (containing: new, edit and such) */
- edit_vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, TRUE);
- gtk_container_set_border_width (GTK_CONTAINER (edit_vbox), 5);
- gtk_container_add(GTK_CONTAINER(edit_fr), edit_vbox);
-
- color_new = ws_gtk_button_new_from_stock(GTK_STOCK_NEW);
- gtk_box_pack_start (GTK_BOX (edit_vbox), color_new, FALSE, FALSE, 5);
- gtk_widget_set_tooltip_text(color_new, "Create a new filter at the top of the list");
-
- color_edit = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_EDIT);
- gtk_box_pack_start (GTK_BOX (edit_vbox), color_edit, FALSE, FALSE, 5);
- gtk_widget_set_tooltip_text(color_edit, " If more than one filter is selected, edit the first selected one");
- gtk_widget_set_sensitive (color_edit, FALSE);
-
- color_enable = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_ENABLE);
- gtk_box_pack_start (GTK_BOX (edit_vbox), color_enable, FALSE, FALSE, 5);
- gtk_widget_set_tooltip_text(color_enable, "Enable the selected filter(s)");
- gtk_widget_set_sensitive (color_enable, FALSE);
-
- color_disable = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_DISABLE);
- gtk_box_pack_start (GTK_BOX (edit_vbox), color_disable, FALSE, FALSE, 5);
- gtk_widget_set_tooltip_text(color_disable, "Disable the selected filter(s)");
- gtk_widget_set_sensitive (color_disable, FALSE);
-
- color_delete = ws_gtk_button_new_from_stock(GTK_STOCK_DELETE);
- gtk_box_pack_start (GTK_BOX (edit_vbox), color_delete, FALSE, FALSE, 5);
- gtk_widget_set_tooltip_text(color_delete, "Delete the selected filter(s)");
- gtk_widget_set_sensitive (color_delete, FALSE);
- /* End edit buttons frame */
-
-
- /* manage buttons frame */
- manage_fr = gtk_frame_new("Manage");
- gtk_box_pack_start (GTK_BOX (ctrl_vbox), manage_fr, TRUE, TRUE, 0);
-
- manage_vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, TRUE);
- gtk_container_set_border_width (GTK_CONTAINER (manage_vbox), 5);
- gtk_container_add(GTK_CONTAINER(manage_fr), manage_vbox);
-
- color_import = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_IMPORT);
- gtk_box_pack_start (GTK_BOX (manage_vbox), color_import, FALSE, FALSE, 5);
- gtk_widget_set_tooltip_text(color_import, "Load filters from a file and append them to the list");
- color_export = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_EXPORT);
- gtk_box_pack_start (GTK_BOX (manage_vbox), color_export, FALSE, FALSE, 5);
- gtk_widget_set_tooltip_text(color_export, "Save all/selected filters to a file");
- color_clear = ws_gtk_button_new_from_stock(GTK_STOCK_CLEAR);
- gtk_box_pack_start(GTK_BOX (manage_vbox), color_clear, FALSE, FALSE, 5);
- gtk_widget_set_tooltip_text(color_clear, "Clear the filter list and revert to system-wide default filter set");
-
- /* filter list frame */
- list_fr = gtk_frame_new("Filter");
- gtk_box_pack_start (GTK_BOX (main_hbox), list_fr, TRUE, TRUE, 0);
-
- list_vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width (GTK_CONTAINER (list_vbox), 5);
- gtk_container_add(GTK_CONTAINER(list_fr), list_vbox);
-
- list_label = gtk_label_new (("List is processed in order until match is found"));
- gtk_box_pack_start (GTK_BOX (list_vbox), list_label, FALSE, FALSE, 0);
-
- /* create the list of filters */
- scrolledwindow1 = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow1),
- GTK_SHADOW_IN);
- gtk_box_pack_start (GTK_BOX (list_vbox), scrolledwindow1, TRUE, TRUE, 0);
-
- /* the list store contains : filter name, filter string, foreground
- * color, background color, pointer to color filter */
- store = gtk_list_store_new(6,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_BOOLEAN,
- G_TYPE_POINTER);
- color_filters = tree_view_new(GTK_TREE_MODEL(store));
- g_object_unref(store);
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes(titles[0], renderer,
- "text", 0,
- "foreground", 2,
- "background", 3,
- "strikethrough", 4,
- NULL);
- gtk_tree_view_column_set_fixed_width(column, 80);
- gtk_tree_view_append_column(GTK_TREE_VIEW(color_filters), column);
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes(titles[1], renderer,
- "text", 1,
- "foreground", 2,
- "background", 3,
- "strikethrough", 4,
- NULL);
- gtk_tree_view_column_set_fixed_width(column, 300);
- gtk_tree_view_append_column(GTK_TREE_VIEW(color_filters), column);
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(color_filters), TRUE);
- gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(color_filters), FALSE);
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(color_filters));
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
-
- gtk_container_add (GTK_CONTAINER (scrolledwindow1), color_filters);
-
-
- /* order frame */
- order_fr = gtk_frame_new("Order");
- gtk_box_pack_start (GTK_BOX (main_hbox), order_fr, FALSE, FALSE, 0);
-
- order_vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, TRUE);
- gtk_container_set_border_width (GTK_CONTAINER (order_vbox), 5);
- gtk_container_add(GTK_CONTAINER(order_fr), order_vbox);
-
- color_filter_up = ws_gtk_button_new_from_stock(GTK_STOCK_GO_UP);
- gtk_box_pack_start (GTK_BOX (order_vbox), color_filter_up, FALSE, FALSE, 0);
- gtk_widget_set_tooltip_text(color_filter_up, "Move filter higher in list");
- gtk_widget_set_sensitive (color_filter_up, FALSE);
-
- order_move_label = gtk_label_new (("Move\nselected filter\nup or down"));
- gtk_box_pack_start (GTK_BOX (order_vbox), order_move_label, FALSE, FALSE, 0);
-
- color_filter_down = ws_gtk_button_new_from_stock(GTK_STOCK_GO_DOWN);
- gtk_box_pack_start (GTK_BOX (order_vbox), color_filter_down, FALSE, FALSE, 0);
- gtk_widget_set_tooltip_text(color_filter_down, "Move filter lower in list");
- gtk_widget_set_sensitive (color_filter_down, FALSE);
-
-
- /* Button row: OK, cancel and help buttons */
- button_ok_hbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_APPLY, GTK_STOCK_SAVE, GTK_STOCK_CANCEL, GTK_STOCK_HELP, NULL);
- gtk_box_pack_start (GTK_BOX (dlg_vbox), button_ok_hbox, FALSE, FALSE, 5);
-
- color_ok = (GtkWidget *)g_object_get_data(G_OBJECT(button_ok_hbox), GTK_STOCK_OK);
- gtk_widget_set_tooltip_text(color_ok, "Apply the color filters to the display and close this dialog");
- color_apply = (GtkWidget *)g_object_get_data(G_OBJECT(button_ok_hbox), GTK_STOCK_APPLY);
- gtk_widget_set_tooltip_text(color_apply, "Apply the color filters to the display and keep this dialog open");
-
- color_save = (GtkWidget *)g_object_get_data(G_OBJECT(button_ok_hbox), GTK_STOCK_SAVE);
- gtk_widget_set_tooltip_text(color_save, "Save the color filters permanently and keep this dialog open");
- color_cancel = (GtkWidget *)g_object_get_data(G_OBJECT(button_ok_hbox), GTK_STOCK_CANCEL);
- window_set_cancel_button(color_win, color_cancel, color_cancel_cb);
- gtk_widget_set_tooltip_text(color_cancel, "Cancel changes done (since last \"Apply\") and close this dialog");
-
- color_help = (GtkWidget *)g_object_get_data(G_OBJECT(button_ok_hbox), GTK_STOCK_HELP);
- gtk_widget_set_tooltip_text(color_help, "Get help about this dialog");
- g_signal_connect(color_help, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_COLORING_RULES_DIALOG);
-
- gtk_widget_grab_default(color_ok);
-
- /* signals and such */
- g_signal_connect(color_win, "destroy", G_CALLBACK(color_destroy_cb), NULL);
- g_object_set_data(G_OBJECT(color_filter_up), COLOR_FILTERS_CL, color_filters);
- g_signal_connect(color_filter_up, "clicked", G_CALLBACK(color_filter_up_cb), NULL);
- g_object_set_data(G_OBJECT(color_filter_down), COLOR_FILTERS_CL, color_filters);
- g_signal_connect(color_filter_down, "clicked", G_CALLBACK(color_filter_down_cb), NULL);
- g_signal_connect(selection, "changed", G_CALLBACK(remember_selected_row), color_filters);
- g_signal_connect(color_filters, "button_press_event", G_CALLBACK(color_filters_button_cb), NULL);
- g_object_set_data(G_OBJECT(color_filters), COLOR_UP_LB, color_filter_up);
- g_object_set_data(G_OBJECT(color_filters), COLOR_DOWN_LB, color_filter_down);
- g_object_set_data(G_OBJECT(color_filters), COLOR_EDIT_LB, color_edit);
- g_object_set_data(G_OBJECT(color_filters), COLOR_ENABLE_LB, color_enable);
- g_object_set_data(G_OBJECT(color_filters), COLOR_DISABLE_LB, color_disable);
- g_object_set_data(G_OBJECT(color_filters), COLOR_DELETE_LB, color_delete);
- g_object_set_data(G_OBJECT(color_new), COLOR_FILTERS_CL, color_filters);
- g_signal_connect(color_new, "clicked", G_CALLBACK(color_new_cb), NULL);
- g_object_set_data(G_OBJECT(color_edit), COLOR_FILTERS_CL, color_filters);
- g_signal_connect(color_edit, "clicked", G_CALLBACK(color_edit_cb), NULL);
- g_object_set_data(G_OBJECT(color_enable), COLOR_FILTERS_CL, color_filters);
- g_signal_connect(color_enable, "clicked", G_CALLBACK(color_disable_cb), FALSE);
- g_object_set_data(G_OBJECT(color_disable), COLOR_FILTERS_CL, color_filters);
- g_signal_connect(color_disable, "clicked", G_CALLBACK(color_disable_cb), (gpointer)TRUE);
- g_object_set_data(G_OBJECT(color_delete), COLOR_EDIT_LB, color_edit);
- g_object_set_data(G_OBJECT(color_delete), COLOR_FILTERS_CL, color_filters);
- g_signal_connect(color_delete, "clicked", G_CALLBACK(color_delete_cb), NULL);
- g_object_set_data(G_OBJECT(color_import), COLOR_FILTERS_CL, color_filters);
- g_signal_connect(color_import, "clicked", G_CALLBACK(color_import_cb), NULL);
- g_signal_connect(color_export, "clicked", G_CALLBACK(color_export_cb), NULL);
- g_object_set_data(G_OBJECT(color_clear), COLOR_FILTERS_CL, color_filters);
- g_signal_connect(color_clear, "clicked", G_CALLBACK(color_clear_cb), NULL);
- g_signal_connect(color_ok, "clicked", G_CALLBACK(color_ok_cb), NULL);
- g_signal_connect(color_apply, "clicked", G_CALLBACK(color_apply_cb), NULL);
- g_signal_connect(color_save, "clicked", G_CALLBACK(color_save_cb), NULL);
-
- g_signal_connect(color_win, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
-
- gtk_widget_grab_focus(color_filters);
-
- /* prepare filter list content */
- color_filters_clone(color_filters, color_filter_add_cb);
- g_object_set_data(G_OBJECT(color_win), COLOR_FILTER_LIST, &color_filter_edit_list);
-
- gtk_widget_show_all(color_win);
-
- /* hide the Save button if the user uses implicit save */
- if(!prefs.gui_use_pref_save) {
- gtk_widget_hide(color_save);
- }
-
- window_present(color_win);
-
- if(filter){
- /* if we specified a preset filter string, open the new dialog and
- set the filter */
- create_new_color_filter(GTK_BUTTON(color_new), filter);
- }
-
- return color_win;
-}
-
-/* move a row in the list +/- one position up/down */
-static void move_this_row (GtkWidget *color_filters,
- gint filter_number,
- gint amount) /* only tested with +1(down) and -1(up) */
-{
- color_filter_t *colorf;
- GtkTreeModel *model;
- GtkTreeIter iter1, iter2;
- gchar *name, *string, *fg_str, *bg_str;
- gboolean disabled;
-
- g_assert(amount == +1 || amount == -1);
- g_assert(amount == +1 || filter_number > 0);
- g_assert(amount == -1 || filter_number < color_dlg_num_of_filters - 1);
-
- row_is_moving = TRUE;
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(color_filters));
- gtk_tree_model_iter_nth_child(model, &iter1, NULL, filter_number);
- gtk_tree_model_iter_nth_child(model, &iter2, NULL, filter_number + amount);
-
- gtk_tree_model_get(model, &iter1, 0, &name, 1, &string,
- 2, &fg_str, 3, &bg_str, 4, &disabled, 5, &colorf, -1);
- gtk_list_store_remove(GTK_LIST_STORE(model), &iter1);
- if (amount < 0)
- gtk_list_store_insert_before(GTK_LIST_STORE(model), &iter1, &iter2);
- else
- gtk_list_store_insert_after(GTK_LIST_STORE(model), &iter1, &iter2);
-
- gtk_list_store_set(GTK_LIST_STORE(model), &iter1,
- 0, name,
- 1, string,
- 2, fg_str,
- 3, bg_str,
- 4, disabled,
- 5, colorf, -1);
-
- g_free(name);
- g_free(string);
- g_free(fg_str);
- g_free(bg_str);
- row_is_moving = FALSE;
-
- /*
- * re-select the initial row
- */
- gtk_widget_grab_focus(color_filters);
- gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(color_filters)), &iter1);
-
- color_filter_edit_list = g_slist_remove(color_filter_edit_list, colorf);
- color_filter_edit_list = g_slist_insert(color_filter_edit_list, colorf, filter_number + amount);
-}
-
-/* User pressed the "Up" button: Move the selected filters up in the list */
-static void
-color_filter_up_cb(GtkButton *button, gpointer user_data _U_)
-{
- gint amount;
- gint filter_number;
- GtkWidget * color_filters;
- color_filter_t *colorf;
- GtkTreeIter iter;
- GtkTreeModel *model;
- GtkTreeSelection *sel;
-
- amount = -1;
- color_filters = (GtkWidget *)g_object_get_data(G_OBJECT(button), COLOR_FILTERS_CL);
-
- for (filter_number = 0; filter_number < color_dlg_num_of_filters; filter_number++)
- {
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(color_filters));
- gtk_tree_model_iter_nth_child(model, &iter, NULL, filter_number);
- gtk_tree_model_get(model, &iter, 5, &colorf, -1);
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(color_filters));
- if (gtk_tree_selection_iter_is_selected(sel, &iter))
- move_this_row (color_filters, filter_number, amount);
- }
-}
-
-/* User pressed the "Down" button: Move the selected filters down in the list */
-static void
-color_filter_down_cb(GtkButton *button, gpointer user_data _U_)
-{
- gint amount;
- gint filter_number;
- GtkWidget * color_filters;
- color_filter_t *colorf;
- GtkTreeIter iter;
- GtkTreeModel *model;
-
- amount = +1;
- color_filters = (GtkWidget *)g_object_get_data(G_OBJECT(button), COLOR_FILTERS_CL);
-
- for (filter_number = color_dlg_num_of_filters - 1; filter_number >= 0; filter_number--)
- {
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(color_filters));
- gtk_tree_model_iter_nth_child(model, &iter, NULL, filter_number);
- gtk_tree_model_get(model, &iter, 5, &colorf, -1);
- if (colorf->selected)
- move_this_row (color_filters, filter_number, amount);
- }
-}
-
-
-struct remember_data
-{
- gint count; /* count of selected filters */
- gboolean first_selected; /* true if the first filter in the list is selected */
- gboolean last_selected; /* true if the last filter in the list is selected */
- gboolean all_enabled; /* true if all selected coloring rules are enabled */
- gboolean all_disabled; /* true if all selected coloring rules are disabled */
- gpointer color_filters;
-};
-/* called for each selected row in the tree.
- */
-static void remember_this_row (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer arg)
-{
- gint *path_index;
- color_filter_t *colorf;
- struct remember_data *data = (struct remember_data *)arg;
-
- gtk_tree_model_get(model, iter, 5, &colorf, -1);
- colorf->selected = TRUE;
-
- data->all_enabled &= (!colorf->disabled);
- data->all_disabled &= colorf->disabled;
-
- path_index = gtk_tree_path_get_indices(path); /* not to be freed */
- if (path_index == NULL) /* can return NULL according to API doc.*/
- {
- return;
- }
- color_dlg_row_selected = path_index[0];
-
- if (color_dlg_row_selected == 0)
- data->first_selected = TRUE;
- if (color_dlg_row_selected == color_dlg_num_of_filters - 1)
- data->last_selected = TRUE;
-
- data->count++;
-
- gtk_tree_view_scroll_to_cell((GtkTreeView *)data->color_filters, path, NULL, FALSE, 0.0f, 0.0f);
-}
-
-/* clear the selection flag of this filter */
-static void
-clear_select_flag(gpointer filter_arg, gpointer arg _U_)
-{
- color_filter_t *colorf = (color_filter_t *)filter_arg;
-
- colorf->selected = FALSE;
-}
-
-/* The gtk+2.0 version gets called for, (maybe multiple,) changes in the selection. */
-static void
-remember_selected_row(GtkTreeSelection *sel, gpointer color_filters)
-{
- GtkWidget *button;
- struct remember_data data;
-
- data.first_selected = data.last_selected = FALSE;
- data.all_enabled = data.all_disabled = TRUE;
- data.count = 0;
- data.color_filters = color_filters;
-
- g_slist_foreach(color_filter_edit_list, clear_select_flag, NULL);
- gtk_tree_selection_selected_foreach(sel,remember_this_row, &data);
-
- if (data.count > 0)
- {
- /*
- * One or more rows are selected, so we can operate on them.
- */
-
- /* We can only edit if there is exactly one filter selected */
- button = (GtkWidget *)g_object_get_data(G_OBJECT(color_filters), COLOR_EDIT_LB);
- gtk_widget_set_sensitive (button, data.count == 1);
-
- /* We can enable any number of filters */
- button = (GtkWidget *)g_object_get_data(G_OBJECT(color_filters), COLOR_ENABLE_LB);
- gtk_widget_set_sensitive (button, !data.all_enabled);
-
- /* We can disable any number of filters */
- button = (GtkWidget *)g_object_get_data(G_OBJECT(color_filters), COLOR_DISABLE_LB);
- gtk_widget_set_sensitive (button, !data.all_disabled);
-
- /* We can delete any number of filters */
- button = (GtkWidget *)g_object_get_data(G_OBJECT(color_filters), COLOR_DELETE_LB);
- gtk_widget_set_sensitive (button, TRUE);
-
- /*
- * We can move them up *if* one of them isn't the top row,
- * and move them down *if* one of them isn't the bottom row.
- */
- button = (GtkWidget *)g_object_get_data(G_OBJECT(color_filters), COLOR_UP_LB);
- gtk_widget_set_sensitive(button, !data.first_selected);
- button = (GtkWidget *)g_object_get_data(G_OBJECT(color_filters), COLOR_DOWN_LB);
- gtk_widget_set_sensitive(button, !data.last_selected);
- }
- else
- {
- color_dlg_row_selected = -1;
-
- /*
- * No row is selected, so we can't do operations that affect the
- * selected row.
- */
- if (!row_is_moving) {
- button = (GtkWidget *)g_object_get_data(G_OBJECT(color_filters), COLOR_UP_LB);
- gtk_widget_set_sensitive (button, FALSE);
- button = (GtkWidget *)g_object_get_data(G_OBJECT(color_filters), COLOR_DOWN_LB);
- gtk_widget_set_sensitive (button, FALSE);
- }
- button = (GtkWidget *)g_object_get_data(G_OBJECT(color_filters), COLOR_EDIT_LB);
- gtk_widget_set_sensitive (button, FALSE);
- button = (GtkWidget *)g_object_get_data(G_OBJECT(color_filters), COLOR_ENABLE_LB);
- gtk_widget_set_sensitive (button, FALSE);
- button = (GtkWidget *)g_object_get_data(G_OBJECT(color_filters), COLOR_DISABLE_LB);
- gtk_widget_set_sensitive (button, FALSE);
- button = (GtkWidget *)g_object_get_data(G_OBJECT(color_filters), COLOR_DELETE_LB);
- gtk_widget_set_sensitive (button, FALSE);
- }
-}
-
-
-
-/* destroy a single color edit dialog */
-static void
-destroy_edit_dialog_cb(gpointer filter_arg, gpointer dummy _U_)
-{
- color_filter_t *colorf = (color_filter_t *)filter_arg;
-
- color_edit_dlg_destroy((color_edit_dlg_info_t *)colorf->color_edit_dlg_info);
-}
-
-/* Called when the dialog box is being destroyed; destroy any edit
- * dialogs opened from this dialog.
- */
-static void
-color_destroy_cb (GtkButton *button _U_,
- gpointer user_data _U_)
-{
- /* Destroy any edit dialogs we have open. */
- g_slist_foreach(color_filter_edit_list, destroy_edit_dialog_cb, NULL);
-
- /* destroy the filter list itself */
- color_filter_list_delete(&color_filter_edit_list);
- color_filter_list_delete(&color_filter_tmp_list);
-
- colorize_win = NULL;
-}
-
-
-static void
-select_row(GtkWidget *color_filters, int row)
-{
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkTreeSelection *sel;
-
- /* select the new row */
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(color_filters));
- gtk_tree_model_iter_nth_child(model, &iter, NULL, row);
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(color_filters));
- gtk_tree_selection_select_iter(sel, &iter);
-}
-
-
-/* add a single color filter to the list */
-static void
-add_filter_to_list(gpointer filter_arg, gpointer list_arg, gboolean prepend)
-{
- color_filter_t *colorf = (color_filter_t *)filter_arg;
- gchar fg_str[14], bg_str[14];
- GtkListStore *store;
- GtkTreeIter iter;
-
- if( strstr(colorf->filter_name,CONVERSATION_COLOR_PREFIX)==NULL) {
- store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(list_arg)));
- if (prepend) {
- gtk_list_store_prepend(store, &iter);
- } else {
- gtk_list_store_append(store, &iter);
- }
- g_snprintf(fg_str, sizeof(fg_str), "#%04X%04X%04X",
- colorf->fg_color.red, colorf->fg_color.green, colorf->fg_color.blue);
- g_snprintf(bg_str, sizeof(bg_str), "#%04X%04X%04X",
- colorf->bg_color.red, colorf->bg_color.green, colorf->bg_color.blue);
- gtk_list_store_set(store, &iter,
- 0, colorf->filter_name,
- 1, colorf->filter_text,
- 2, fg_str,
- 3, bg_str,
- 4, colorf->disabled,
- 5, colorf, -1);
- if (prepend) {
- color_filter_edit_list = g_slist_prepend(color_filter_edit_list, colorf);
- } else {
- color_filter_edit_list = g_slist_append(color_filter_edit_list, colorf);
- }
- color_dlg_num_of_filters++;
- } else {
- /* But keep the temporary ones too, so they can be added again
- * when the user is done editing */
- color_filter_tmp_list = g_slist_append(color_filter_tmp_list, colorf);
- }
-}
-
-/* Create a new filter, add it to the list, and pop up an
- "Edit color filter" dialog box to edit it. */
-static void
-create_new_color_filter(GtkButton *button, const char *filter)
-{
-#if GTK_CHECK_VERSION(3,0,0)
- GtkStyleContext *context;
- GdkRGBA *rgba_bg_color;
- GdkRGBA *rgba_fg_color;
-#else
- GtkStyle *style;
-#endif
- color_filter_t *colorf;
- color_t bg_color, fg_color;
- GtkWidget *color_filters;
- GtkTreeSelection *sel;
-
- color_filters = (GtkWidget *)g_object_get_data(G_OBJECT(button), COLOR_FILTERS_CL);
-
- /* unselect all filters */
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(color_filters));
- gtk_tree_selection_unselect_all (sel);
-
- /* Use the default background and foreground colors as the colors. */
-#if GTK_CHECK_VERSION(3,0,0)
- context = gtk_widget_get_style_context (packet_list_get_widget());
- gtk_style_context_get (context, GTK_STATE_FLAG_NORMAL,
- "background-color", &rgba_bg_color,
- NULL);
- gtk_style_context_get (context, GTK_STATE_FLAG_NORMAL,
- "color", &rgba_fg_color,
- NULL);
- gdkRGBAcolor_to_color_t(&bg_color, rgba_bg_color);
- gdkRGBAcolor_to_color_t(&fg_color, rgba_fg_color);
- gdk_rgba_free (rgba_bg_color);
- gdk_rgba_free (rgba_fg_color);
-
-#else
- style = gtk_widget_get_style(packet_list_get_widget());
- gdkcolor_to_color_t(&bg_color, &style->base[GTK_STATE_NORMAL]);
- gdkcolor_to_color_t(&fg_color, &style->text[GTK_STATE_NORMAL]);
-#endif
- colorf = color_filter_new("name", filter, &bg_color, &fg_color, FALSE);
- add_filter_to_list(colorf, color_filters, TRUE);
- select_row(color_filters, 0);
-
- /* open the edit dialog */
- color_edit_dlg_new(color_filters, TRUE /* is a new filter */);
-
- gtk_widget_grab_focus(color_filters);
-}
-
-/* User pressed the "New" button: Create a new filter in the list,
- and pop up an "Edit color filter" dialog box to edit it. */
-static void
-color_new_cb(GtkButton *button, gpointer user_data _U_)
-{
- create_new_color_filter(button, "filter");
-}
-
-/* User pressed the "Edit" button: Pop up an "Edit color filter" dialog box
- * to edit an existing filter. */
-static void
-color_edit_cb(GtkButton *button, gpointer user_data _U_)
-{
- GtkWidget *color_filters;
-
- color_filters = (GtkWidget *)g_object_get_data(G_OBJECT(button), COLOR_FILTERS_CL);
- g_assert(color_dlg_row_selected != -1);
- color_edit_dlg_new(color_filters, FALSE /* is not a new filter */);
-}
-
-/* User double-clicked on the coloring rule */
-static gboolean
-color_filters_button_cb(GtkWidget *list, GdkEventButton *event,
- gpointer data _U_)
-{
- if (event->type == GDK_2BUTTON_PRESS) {
- color_edit_dlg_new(list, FALSE);
- }
-
- return FALSE;
-}
-
-/* action_disable==TRUE ==> User pressed the "Disable" button:
- * Disable the selected filters in the list.
- * action_disable==FALSE ==> User pressed the "Enable" button:
- * Enable the selected filters in the list.
- */
-static void
-color_disable_cb(GtkWidget *widget, gboolean action_disable)
-{
- gint filter_number;
- GtkWidget *button;
- GtkWidget * color_filters;
- color_filter_t *colorf;
- GtkTreeIter iter;
- GtkTreeModel *model;
- GtkTreeSelection *sel;
-
- color_filters = (GtkWidget *)g_object_get_data(G_OBJECT(widget), COLOR_FILTERS_CL);
-
- for (filter_number = 0; filter_number < color_dlg_num_of_filters; filter_number++)
- {
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(color_filters));
- gtk_tree_model_iter_nth_child(model, &iter, NULL, filter_number);
- gtk_tree_model_get(model, &iter, 5, &colorf, -1);
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(color_filters));
- if (gtk_tree_selection_iter_is_selected(sel, &iter)) {
- colorf->disabled = action_disable;
- gtk_list_store_set(GTK_LIST_STORE(model), &iter,
- 4, action_disable, -1);
- }
- }
- button = (GtkWidget *)g_object_get_data(G_OBJECT(color_filters), COLOR_ENABLE_LB);
- gtk_widget_set_sensitive(button, action_disable);
- button = (GtkWidget *)g_object_get_data(G_OBJECT(color_filters), COLOR_DISABLE_LB);
- gtk_widget_set_sensitive(button, !action_disable);
-}
-
-/* Delete a single color filter from the list and elsewhere. */
-void
-color_delete_single(gint row, GtkWidget *color_filters)
-{
- color_filter_t *colorf;
-
- GtkTreeModel *model;
- GtkTreeIter iter;
-
-
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(color_filters));
- gtk_tree_model_iter_nth_child(model, &iter, NULL, row);
- gtk_tree_model_get(model, &iter, 5, &colorf, -1);
-
- /* Remove this color filter from the CList displaying the
- color filters. */
- gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
- color_dlg_num_of_filters--;
-
- /* Destroy any "Edit color filter" dialog boxes editing it. */
- color_edit_dlg_destroy((color_edit_dlg_info_t *)colorf->color_edit_dlg_info);
-
- /* Delete the color filter from the list of color filters. */
- color_filter_edit_list = g_slist_remove(color_filter_edit_list, colorf);
- color_filter_delete(colorf);
-
- /* If we grab the focus after updating the selection, the first
- * row is always selected, so we do it before */
- gtk_widget_grab_focus(color_filters);
-}
-
-/* User pressed the "Delete" button: Delete the selected filters from the list.*/
-static void
-color_delete_cb(GtkWidget *widget, gpointer user_data _U_)
-{
- GtkWidget *color_filters;
- gint row, num_filters;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkTreeSelection *sel;
-
- color_filters = (GtkWidget *)g_object_get_data(G_OBJECT(widget), COLOR_FILTERS_CL);
-
- /* get the number of filters in the list */
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(color_filters));
- num_filters = gtk_tree_model_iter_n_children(model, NULL);
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(color_filters));
-
- /* iterate through the list and delete the selected ones */
- for (row = num_filters - 1; row >= 0; row--)
- {
- gtk_tree_model_iter_nth_child(model, &iter, NULL, row);
- if (gtk_tree_selection_iter_is_selected(sel, &iter))
- color_delete_single (row, color_filters);
- }
-}
-
-/* User pressed "Import": Pop up an "Import color filter" dialog box. */
-static void
-color_import_cb(GtkButton *button, gpointer data _U_)
-{
- GtkWidget *color_filters;
- GtkTreeSelection *sel;
-
- color_filters = (GtkWidget *)g_object_get_data(G_OBJECT(button), COLOR_FILTERS_CL);
-
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(color_filters));
- gtk_tree_selection_unselect_all (sel);
-
- file_color_import_cmd_cb(color_filters, &color_filter_edit_list);
-}
-
-/* User pressed "Export": Pop up an "Export color filter" dialog box. */
-static void
-color_export_cb(GtkButton *button, gpointer data _U_)
-{
- GtkWidget *color_filters;
-
- color_filters = (GtkWidget *)g_object_get_data(G_OBJECT(button), COLOR_FILTERS_CL);
-
- file_color_export_cmd_cb(color_filters, color_filter_edit_list);
-}
-
-/* User confirmed the clear operation: Remove all user defined color filters and
- revert to the global file. */
-static void
-color_clear_cmd(GtkWidget *widget)
-{
- GtkWidget * color_filters;
- gchar* err_msg = NULL;
-
- color_filters = (GtkWidget *)g_object_get_data(G_OBJECT(widget), COLOR_FILTERS_CL);
-
- while (color_dlg_num_of_filters > 0)
- {
- color_delete_single (color_dlg_num_of_filters-1, color_filters);
- }
-
- /* try to read the global filters */
- if (!color_filters_read_globals(color_filters, &err_msg, color_filter_add_cb))
- {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg);
- g_free(err_msg);
- }
-}
-
-/* User pressed "clear" button: ask user before really doing it */
-void
-color_clear_cb(GtkWidget *widget, gpointer data _U_) {
- GtkWidget *msg_dialog;
- gint response;
-
- /* ask user, if he/she is really sure */
- msg_dialog = gtk_message_dialog_new(GTK_WINDOW(gtk_widget_get_toplevel(widget)),
- (GtkDialogFlags)(GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT),
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_NONE,
- "Do you want to remove all your personal color settings?");
- gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(msg_dialog),
- "This will revert the color settings to global defaults.\n\n"
- "Are you really sure?");
- gtk_dialog_add_button(GTK_DIALOG(msg_dialog),
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
- gtk_dialog_add_button(GTK_DIALOG(msg_dialog),
- GTK_STOCK_CLEAR, GTK_RESPONSE_ACCEPT);
- gtk_dialog_set_alternative_button_order(GTK_DIALOG(msg_dialog),
- GTK_RESPONSE_ACCEPT,
- GTK_RESPONSE_CANCEL,
- -1);
- gtk_dialog_set_default_response(GTK_DIALOG(msg_dialog), GTK_RESPONSE_CANCEL);
-
- response = gtk_dialog_run(GTK_DIALOG(msg_dialog));
- gtk_widget_destroy(msg_dialog);
-
- switch (response) {
-
- case GTK_RESPONSE_ACCEPT:
- color_clear_cmd(widget);
- break;
-
- case GTK_RESPONSE_CANCEL:
- case GTK_RESPONSE_NONE:
- case GTK_RESPONSE_DELETE_EVENT:
- default:
- break;
- }
-}
-
-
-static void
-overwrite_existing_colorfilters_cb(gpointer dialog _U_, gint btn, gpointer data _U_)
-{
- gchar* err_msg = NULL;
-
- switch (btn) {
- case(ESD_BTN_SAVE):
- /* overwrite the file*/
- if (!color_filters_write(color_filter_edit_list, &err_msg))
- {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Could not open colorfilter file: %s", err_msg);
- g_free(err_msg);
- }
- else
- prefs.unknown_colorfilters = FALSE;
- break;
- case(ESD_BTN_DONT_SAVE):
- break;
- default:
- g_assert_not_reached();
- }
-}
-
-static void
-colorfilters_main_save(void)
-{
- gchar* err_msg = NULL;
- if (prefs.unknown_colorfilters) {
- gpointer dialog = simple_dialog(ESD_TYPE_CONFIRMATION, ESD_BTNS_SAVE_DONTSAVE,
- "Obsolete or unrecognized color filters have been detected. "
- "If this profile will be used with an older or nonstandard Wireshark version "
- "or one that includes a proprietary dissector plugin, click 'Continue "
- "without Saving' and save this profile under a different name.\n\n");
-
- simple_dialog_set_cb(dialog, overwrite_existing_colorfilters_cb, NULL);
- } else {
- if (!color_filters_write(color_filter_edit_list, &err_msg)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Could not open filter file: %s", err_msg);
- g_free(err_msg);
- }
- }
-}
-
-
-/* User pressed "Ok" button: Exit dialog and apply new list of
- color filters to the capture. */
-static void
-color_ok_cb(GtkButton *button _U_, gpointer user_data _U_)
-{
- /* Apply the new coloring rules... */
- color_apply_cb(button,user_data);
-
- /* ... and destroy the dialog box. */
- window_destroy(colorize_win);
-}
-
-/* User pressed "Apply" button: apply the new list of color filters
- to the capture. */
-static void
-color_apply_cb(GtkButton *button _U_, gpointer user_data _U_)
-{
- gchar* err_msg = NULL;
-
- /* if we don't have a Save button, just save the settings now */
- if (!prefs.gui_use_pref_save)
- colorfilters_main_save();
-
- /* Apply the coloring rules, both the temporary ones in
- * color_filter_tmp_list as the permanent ones in color_filter_edit_list
- * */
- if (!color_filters_apply(color_filter_tmp_list, color_filter_edit_list, &err_msg)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg);
- g_free(err_msg);
- }
-
- /* colorize list */
- packet_list_colorize_packets();
-}
-
-/* User pressed the "Save" button: save the color filters to the
- color filter file. */
-static void
-color_save_cb(GtkButton *button _U_, gpointer user_data _U_)
-{
- colorfilters_main_save();
-}
-
-/* User pressed "Cancel" button (or "ESC" or the 'X'):
- Exit dialog without colorizing packets with the new list. */
-static void
-color_cancel_cb(GtkWidget *widget _U_, gpointer user_data _U_)
-{
- /* Destroy the dialog box. */
- window_destroy(colorize_win);
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/color_dlg.h b/ui/gtk/color_dlg.h
deleted file mode 100644
index 38f6fbe275..0000000000
--- a/ui/gtk/color_dlg.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* color_dlg.h
- * Definitions for dialog boxes for color filters
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __COLOR_DLG_H__
-#define __COLOR_DLG_H__
-
-/** @file
- * "Colorize Display" dialog box.
- * @ingroup dialog_group
- */
-
-extern gint color_dlg_num_of_filters; /* number of filters being displayed */
-extern gint color_dlg_row_selected; /* row in color_filters that is selected */
-
-/** User requested the "Colorize Display" dialog box by menu or toolbar.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-void color_display_cb(GtkWidget *widget, gpointer data);
-
-/** Open the colorize dialogue and presets the filter string.
- *
- * @param filter the preset filter string
- */
-void color_display_with_filter(char *filter);
-
-/** Count the number of selected color filters.
- *
- * @return the number of selected color filters
- */
-int color_selected_count(void);
-
-#endif /* color_dlg.h */
diff --git a/ui/gtk/color_edit_dlg.c b/ui/gtk/color_edit_dlg.c
deleted file mode 100644
index 8713af5aad..0000000000
--- a/ui/gtk/color_edit_dlg.c
+++ /dev/null
@@ -1,663 +0,0 @@
-/* color_edit_dlg.c
- * Definitions for single color filter edit dialog boxes
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#include "config.h"
-
-#include <gtk/gtk.h>
-
-#include <epan/dfilter/dfilter.h>
-
-#include <epan/color_filters.h>
-
-#include "ui/simple_dialog.h"
-
-#include "ui/gtk/color_dlg.h"
-#include "ui/gtk/color_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/filter_dlg.h"
-#include "ui/gtk/dfilter_expr_dlg.h"
-#include "ui/gtk/color_edit_dlg.h"
-#include "ui/gtk/filter_autocomplete.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-
-/* Essentially:
- *
- * There are two dialog windows:
- * - color_edit_dlg
- *
- * - color_selection_dlg (Gtk2) aka color_chooser_dlg (gtk 3.4 and newer).
- * The color_selection_dlg window can be instantiated (serially or in parallel)
- * to select the foreground and/or the background color for the filter.
- * The color_selection_dlg windows are 'transient_for' and 'destroyed_with'
- * the color_edit_dlg window.
- *
- *
- * The information needed by the various dlg callback functions is passed via
- * the callback 'user_data' parameter.
- *
- * There are two different structs passed via a pointer in 'user_data':
- * - (color_edit_dlg_info_t *)user_data
- * supplied to the color_edit_dlg Ok and Cancel button "clicked"
- * callbacks and to the color_edit_dlg "destroy" callback.
- *
- * - (color_selection_dlg_info_t *)user_data
- * supplied to the color_edit_dlg FG/BG button "clicked" and "destroy"
- * callbacks and to the color_selection_dlg "response" and "destroy" callbacks.
- *
- * Note that there are two separate instances of this struct:
- * - "foreground" info associated with the color_edit_dlg Foreground button;
- * - "background" info associated with the color_edit_dlg Background button.
- */
-
-static void color_edit_dlg_ok_cb(GtkWidget *w, gpointer user_data);
-static void color_edit_dlg_cancel_cb(GtkWidget *w, gpointer user_data);
-static void color_edit_dlg_destroy_cb(GObject *object, gpointer user_data);
-static void color_edit_dlg_fg_bg_btn_cb(GtkWidget *button, gpointer user_data);
-static void color_edit_dlg_fg_bg_btn_destroy_cb(GObject *object, gpointer user_data);
-
-static void color_selection_dlg_response_cb(GtkWidget *color_selection_dlg, gint response, gpointer data);
-static void color_selection_dlg_destroy_cb(GObject *object, gpointer user_data);
-
-typedef enum {
- COLOR_SELECTION_TYPE_FG = 1,
- COLOR_SELECTION_TYPE_BG = 2
-} color_selection_type_t;
-
-/* info sent to color_edit_dlg Ok, cancel & destroy callbacks;
- * pointed to by colof->color_edit_dlg_info and by user_data for the callbacks
- */
-struct _color_edit_dlg_info_t {
- GtkWidget *color_edit_dlg;
- GtkWidget *color_filters; /* Treeview */
- color_filter_t *colorf;
- /* color_edit_dlg widgets */
- GtkWidget *filt_name_entry;
- GtkWidget *filt_text_entry;
- GtkWidget *disabled_cb;
-};
-
-/* info sent to color_edit_dlg FG/BG button callbacks and also to color_selection_dlg callbacks;
- * pointed by user data for the callbacks
- */
-struct _color_selection_dlg_info_t {
- GtkWidget *color_selection_dlg;
- color_selection_type_t color_selection_type; /* FG/BG */
- color_filter_t *colorf;
- color_t *color; /* ptr to FG or BG color struct in colorf */
- const gchar *color_selection_type_text;
- GtkWidget *filt_name_entry;
-};
-typedef struct _color_selection_dlg_info_t color_selection_dlg_info_t;
-
-
-static void
-filter_expr_cb(GtkWidget *w _U_, gpointer filter_te)
-{
- dfilter_expr_dlg_new(GTK_WIDGET(filter_te));
-}
-
-
-/* Create "colorize filter" button for the "color edit" dialog, add it to hbox and connect callbacka */
-static void
-colorize_filter_new(GtkWidget *colorize_hbox,
- color_selection_type_t color_selection_type,
- const gchar *t1, /* "Foreground" */
- const gchar *t2, /* "Foreground Color..." */
- const gchar *t3, /* "Select foreground color for data display" */
- color_filter_t *colorf,
- color_t *color,
- GtkWidget *filt_name_entry)
-{
- GtkWidget *colorize_filter;
- color_selection_dlg_info_t *csdi;
-
- colorize_filter = gtk_button_new_with_label(t2);
- gtk_box_pack_start (GTK_BOX (colorize_hbox), colorize_filter, TRUE, FALSE, 0);
- gtk_widget_set_tooltip_text(colorize_filter, t3);
-
- csdi = g_new(color_selection_dlg_info_t, 1);
- csdi->color_selection_dlg = NULL;
- csdi->color_selection_type = color_selection_type;
- csdi->colorf = colorf;
- csdi->color = color;
- csdi->color_selection_type_text = t1;
- csdi->filt_name_entry = filt_name_entry;
-
- g_signal_connect(colorize_filter, "clicked", G_CALLBACK(color_edit_dlg_fg_bg_btn_cb), csdi);
- g_signal_connect(colorize_filter, "destroy", G_CALLBACK(color_edit_dlg_fg_bg_btn_destroy_cb), csdi);
-}
-
-
-/* Create a "color edit dialog" for a given color filter, and
- associate it with that color filter. */
-void
-color_edit_dlg_new(GtkWidget *color_filters,
- gboolean is_new_filter)
-{
- color_edit_dlg_info_t *cedi;
- color_filter_t *colorf;
-
- GtkWidget *color_edit_dlg;
- GtkWidget *dialog_vbox;
- GtkWidget *filter_fr;
- GtkWidget *filter_fr_vbox;
- GtkWidget *filter_name_hbox;
- GtkWidget *filt_name_entry;
- GtkWidget *filt_text_entry;
- GtkWidget *color_filter_name;
- GtkWidget *filter_string_hbox;
- GtkWidget *add_expression_bt;
- GtkWidget *color_filter_text;
-
- GtkWidget *settings_hbox;
-
- GtkWidget *colorize_fr;
- GtkWidget *colorize_hbox;
-
- GtkWidget *status_fr;
- GtkWidget *status_vbox;
-
- GtkWidget *disabled_cb;
-
- GtkWidget *bbox;
- GtkWidget *edit_color_filter_ok;
- GtkWidget *edit_color_filter_cancel;
-
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(color_filters));
-
- gtk_tree_model_iter_nth_child(model, &iter, NULL, color_dlg_row_selected);
- gtk_tree_model_get(model, &iter, 5, &colorf, -1);
-
- if (colorf->color_edit_dlg_info != NULL) {
- cedi = (color_edit_dlg_info_t *)colorf->color_edit_dlg_info;
- g_assert(cedi->color_edit_dlg != NULL);
- /* There's already an edit box open for this filter; reactivate it. */
- reactivate_window(cedi->color_edit_dlg);
- return;
- }
-
- /* dialog window */
- color_edit_dlg = dlg_conf_window_new ("Wireshark: Edit Color Filter");
- gtk_window_set_default_size(GTK_WINDOW(color_edit_dlg), 500, -1);
- /* XXX: set color_edit_dlg as 'modal' to prevent simultaneously opening
- * dialog windows for different filters ? is 'transient for' also needed ?
- */
-
- dialog_vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width (GTK_CONTAINER (dialog_vbox), 5);
- gtk_container_add (GTK_CONTAINER (color_edit_dlg), dialog_vbox);
-
- /* Filter frame */
- filter_fr = gtk_frame_new("Filter");
- gtk_box_pack_start (GTK_BOX (dialog_vbox), filter_fr, FALSE, FALSE, 0);
-
- filter_fr_vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width (GTK_CONTAINER (filter_fr_vbox), 5);
- gtk_container_add(GTK_CONTAINER(filter_fr), filter_fr_vbox);
-
- /* filter name hbox */
- filter_name_hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start (GTK_BOX (filter_fr_vbox), filter_name_hbox, TRUE, FALSE, 3);
-
- color_filter_name = gtk_label_new (("Name: "));
- gtk_box_pack_start (GTK_BOX (filter_name_hbox), color_filter_name, FALSE, FALSE, 0);
-
- filt_name_entry = gtk_entry_new ();
- gtk_entry_set_text(GTK_ENTRY(filt_name_entry), colorf->filter_name);
-
-#if GTK_CHECK_VERSION(3,0,0)
- {
- GdkRGBA bg_rgba_color, fg_rgba_color;
- color_t_to_gdkRGBAcolor(&bg_rgba_color, &colorf->bg_color);
- color_t_to_gdkRGBAcolor(&fg_rgba_color, &colorf->fg_color);
- gtk_widget_override_background_color(filt_name_entry, GTK_STATE_FLAG_NORMAL, &bg_rgba_color);
- gtk_widget_override_color(filt_name_entry, GTK_STATE_FLAG_NORMAL, &fg_rgba_color);
- }
-#else
- {
- GdkColor bg_color, fg_color;
- color_t_to_gdkcolor(&bg_color, &colorf->bg_color);
- color_t_to_gdkcolor(&fg_color, &colorf->fg_color);
-
- gtk_widget_modify_base(filt_name_entry, GTK_STATE_NORMAL, &bg_color);
- gtk_widget_modify_text(filt_name_entry, GTK_STATE_NORMAL, &fg_color);
- }
-#endif
- gtk_box_pack_start (GTK_BOX (filter_name_hbox), filt_name_entry, TRUE, TRUE, 0);
- gtk_widget_set_tooltip_text(filt_name_entry, "This is the editable name of the filter. (No @ characters allowed.)");
-
- /* filter string hbox */
- filter_string_hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start (GTK_BOX (filter_fr_vbox), filter_string_hbox, TRUE, FALSE, 3);
-
- color_filter_text = gtk_label_new (("String: "));
- gtk_box_pack_start (GTK_BOX (filter_string_hbox), color_filter_text, FALSE, FALSE, 0);
-
- filt_text_entry = gtk_entry_new ();
- g_signal_connect(filt_text_entry, "changed", G_CALLBACK(filter_te_syntax_check_cb), NULL);
- g_object_set_data(G_OBJECT(filter_string_hbox), E_FILT_AUTOCOMP_PTR_KEY, NULL);
- g_signal_connect(filt_text_entry, "key-press-event", G_CALLBACK (filter_string_te_key_pressed_cb), NULL);
- g_signal_connect(color_edit_dlg, "key-press-event", G_CALLBACK (filter_parent_dlg_key_pressed_cb), NULL);
- gtk_entry_set_text(GTK_ENTRY(filt_text_entry), colorf->filter_text);
-
- gtk_box_pack_start (GTK_BOX (filter_string_hbox), filt_text_entry, TRUE, TRUE, 0);
- gtk_widget_set_tooltip_text(filt_text_entry, "This is the editable text of the filter");
-
- /* Create the "Add Expression..." button, to pop up a dialog
- for constructing filter comparison expressions. */
- add_expression_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_ADD_EXPRESSION);
- g_signal_connect(add_expression_bt, "clicked", G_CALLBACK(filter_expr_cb), filt_text_entry);
- gtk_box_pack_start (GTK_BOX(filter_string_hbox), add_expression_bt, FALSE, FALSE, 3);
- gtk_widget_set_tooltip_text(add_expression_bt, "Add an expression to the filter string");
-
- /* Show the (in)validity of the default filter string */
- filter_te_syntax_check_cb(filt_text_entry, NULL);
-
- /* settings_hbox for "choose color frame" and "status frame" */
- settings_hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start (GTK_BOX (dialog_vbox), settings_hbox, FALSE, FALSE, 0);
-
- /* choose color frame */
- colorize_fr = gtk_frame_new("Display Colors");
- gtk_box_pack_start (GTK_BOX (settings_hbox), colorize_fr, TRUE, TRUE, 0);
-
- colorize_hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_container_set_border_width (GTK_CONTAINER (colorize_hbox), 5);
- gtk_container_add(GTK_CONTAINER(colorize_fr), colorize_hbox);
-
- colorize_filter_new(colorize_hbox,
- COLOR_SELECTION_TYPE_FG,
- "Foreground", "Foreground Color...", "Select foreground color for data display",
- colorf, &colorf->fg_color,
- filt_name_entry);
-
- colorize_filter_new(colorize_hbox,
- COLOR_SELECTION_TYPE_BG,
- "Background", "Background Color...", "Select background color for data display",
- colorf, &colorf->bg_color,
- filt_name_entry);
-
- /* status frame */
- status_fr = gtk_frame_new("Status");
- gtk_box_pack_start (GTK_BOX (settings_hbox), status_fr, TRUE, TRUE, 0);
-
- status_vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width (GTK_CONTAINER (status_vbox), 5);
- gtk_container_add(GTK_CONTAINER(status_fr), status_vbox);
-
- /** "Disabled" check box */
- disabled_cb = gtk_check_button_new_with_label("Disabled");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(disabled_cb), colorf->disabled);
- gtk_box_pack_start (GTK_BOX (status_vbox), disabled_cb, TRUE, FALSE, 0);
- gtk_widget_set_tooltip_text(disabled_cb, "Color rule won't be checked if this box is selected");
-
- /* button box */
- bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CANCEL, NULL);
- gtk_box_pack_start(GTK_BOX(dialog_vbox), bbox, FALSE, FALSE, 0);
- gtk_container_set_border_width (GTK_CONTAINER (bbox), 0);
-
- /** Cancel **/
- edit_color_filter_cancel = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- gtk_widget_set_tooltip_text(edit_color_filter_cancel, "Reject filter color change");
- /* escape will select cancel */
- window_set_cancel_button(color_edit_dlg, edit_color_filter_cancel, window_cancel_button_cb);
-
- /** Ok **/
- edit_color_filter_ok = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- gtk_widget_set_tooltip_text(edit_color_filter_ok, "Accept filter color change");
- gtk_widget_grab_default(edit_color_filter_ok);
-
- cedi = g_new(color_edit_dlg_info_t, 1);
- colorf->color_edit_dlg_info = cedi;
-
- cedi->color_filters = color_filters;
- cedi->colorf = colorf;
- cedi->color_edit_dlg = color_edit_dlg;
- cedi->filt_name_entry = filt_name_entry;
- cedi->filt_text_entry = filt_text_entry;
- cedi->disabled_cb = disabled_cb;
-
- g_signal_connect(color_edit_dlg, "destroy", G_CALLBACK(color_edit_dlg_destroy_cb), cedi);
-
- g_signal_connect(edit_color_filter_ok, "clicked", G_CALLBACK(color_edit_dlg_ok_cb), cedi);
-
- if (is_new_filter) {
- g_signal_connect(edit_color_filter_cancel, "clicked",
- G_CALLBACK(color_edit_dlg_cancel_cb), cedi);
- }
-
- g_signal_connect(color_edit_dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
-
- gtk_widget_show_all(color_edit_dlg);
- window_present(color_edit_dlg);
-}
-
-
-/* accept color (and potential content) change */
-static void
-color_edit_dlg_ok_cb(GtkWidget *w _U_, gpointer user_data)
-{
- color_edit_dlg_info_t *cedi = (color_edit_dlg_info_t *)user_data;
-
- gchar *filter_name;
- gchar *filter_text;
- gboolean filter_disabled;
- color_filter_t *colorf;
- dfilter_t *compiled_filter;
- gchar *err_msg;
- GtkTreeModel *model;
- GtkTreeIter iter;
- gchar fg_str[14], bg_str[14];
-
- filter_name = g_strdup(gtk_entry_get_text(GTK_ENTRY(cedi->filt_name_entry)));
- filter_text = g_strdup(gtk_entry_get_text(GTK_ENTRY(cedi->filt_text_entry)));
- filter_disabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cedi->disabled_cb));
-
- if (strchr(filter_name,'@') || strchr(filter_text,'@')) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Filter names and strings must not"
- " use the '@' character. Filter unchanged.");
- g_free(filter_name);
- g_free(filter_text);
- return;
- }
-
- if (!dfilter_compile(filter_text, &compiled_filter, &err_msg)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Filter \"%s\" didn't compile correctly.\n"
- " Please try again. Filter unchanged.\n%s\n", filter_name,
- err_msg);
- g_free(err_msg);
- g_free(filter_name);
- g_free(filter_text);
- return;
- }
-
- colorf = cedi->colorf;
-
- g_free(colorf->filter_name);
- g_free(colorf->filter_text);
-
- colorf->filter_name = filter_name;
- colorf->filter_text = filter_text;
-
- colorf->disabled = filter_disabled;
-
-#if GTK_CHECK_VERSION(3,0,0)
- { /* GTK3 */
- GtkStyleContext *context;
- GdkRGBA new_rgba_fg_color;
- GdkRGBA new_rgba_bg_color;
-
- context = gtk_widget_get_style_context (cedi->filt_name_entry);
-
- gtk_style_context_get_color(context, (GtkStateFlags)GTK_STATE_NORMAL, &new_rgba_fg_color); /* aka foreground color */
- gtk_style_context_get_background_color(context, (GtkStateFlags)GTK_STATE_NORMAL, &new_rgba_bg_color);
-
- gdkRGBAcolor_to_color_t(&colorf->fg_color, &new_rgba_fg_color);
- gdkRGBAcolor_to_color_t(&colorf->bg_color, &new_rgba_bg_color);
- }
-#else
- { /* GTK2 */
- GtkStyle *style;
- GdkColor new_fg_color;
- GdkColor new_bg_color;
-
- style = gtk_widget_get_style(cedi->filt_name_entry);
- new_bg_color = style->base[GTK_STATE_NORMAL];
- new_fg_color = style->text[GTK_STATE_NORMAL];
-
- gdkcolor_to_color_t(&colorf->fg_color, &new_fg_color);
- gdkcolor_to_color_t(&colorf->bg_color, &new_bg_color);
- }
-#endif
-
- g_snprintf(fg_str, sizeof(fg_str), "#%04X%04X%04X",
- colorf->fg_color.red, colorf->fg_color.green, colorf->fg_color.blue);
- g_snprintf(bg_str, sizeof(bg_str), "#%04X%04X%04X",
- colorf->bg_color.red, colorf->bg_color.green, colorf->bg_color.blue);
-
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(cedi->color_filters));
- gtk_tree_model_iter_nth_child(model, &iter, NULL, color_dlg_row_selected);
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, filter_name,
- 1, filter_text, 2, fg_str, 3, bg_str,
- 4, filter_disabled, -1);
-
- dfilter_free(colorf->c_colorfilter);
- colorf->c_colorfilter = compiled_filter;
-
- /* Destroy the dialog box. */
- window_destroy(cedi->color_edit_dlg);
-}
-
-
-/* reject new color filter addition */
-static void
-color_edit_dlg_cancel_cb(GtkWidget *w _U_, gpointer user_data)
-{
- color_edit_dlg_info_t *cedi = (color_edit_dlg_info_t *)user_data;
-
- /* Delete the entry. As a side effect this destroys the edit_dialog window.
- Before the edit dialogue was launched, the color filter list was
- prepended with a default entry. This is the entry at position 0 that we
- want to delete now. */
- color_delete_single(0, cedi->color_filters); /* calls color_edit_dlg_destroy() */
-}
-
-
-void
-color_edit_dlg_destroy(color_edit_dlg_info_t *cedi)
-{
- if (cedi == NULL) {
- return;
- }
- g_assert(cedi->color_edit_dlg != NULL);
- window_destroy(cedi->color_edit_dlg); /* invokes color_edit_dlg_destroy_cb */
-}
-
-
-/* Called when the color_edit_dlg is being destroyed;
- * null out the pointer to this dialog.
- * Note: any color_selection_dlg windows associated with
- * this color_edit_dlg window will automatically be destroyed.
- * (this is because the color_selection_dlg windows
- * have done 'set_transient_for() & destroy_with_parent()
- * ToDo: worry about 'order'
- */
-static void
-color_edit_dlg_destroy_cb(GObject *object _U_, gpointer user_data)
-{
- color_edit_dlg_info_t *cedi = (color_edit_dlg_info_t *)user_data;
-
- g_assert(cedi->color_edit_dlg);
-
- cedi->colorf->color_edit_dlg_info = NULL;
- g_free(cedi);
-
-}
-
-
-/* Pop up a color selection (GTK3: color chooser) dialog to choose the foreground or background color. */
-static void
-color_edit_dlg_fg_bg_btn_cb(GtkWidget *button, gpointer user_data)
-{
- color_selection_dlg_info_t *csdi = (color_selection_dlg_info_t *)user_data;
-
- GtkWidget *color_selection_dlg;
-
- gchar *title;
-
- /* Do we already have one open for this dialog? */
- if (csdi->color_selection_dlg != NULL) {
- /* Yes. Just reactivate it. */
- reactivate_window(csdi->color_selection_dlg);
- return;
- }
-
- title = g_strdup_printf("Wireshark: Choose %s color for \"%s\"",
- csdi->color_selection_type_text,
- csdi->colorf->filter_name);
-
-#if GTK_CHECK_VERSION(3,4,0)
- { /* GTK >= GTK 3.4: Use GtkColorChooser */
- GdkRGBA rgba_color;
- color_selection_dlg = gtk_color_chooser_dialog_new(title, GTK_WINDOW(gtk_widget_get_toplevel(button)));
- csdi->color_selection_dlg = color_selection_dlg;
-
- color_t_to_gdkRGBAcolor(&rgba_color, csdi->color);
- gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(color_selection_dlg), &rgba_color);
- }
-#else
- { /* GTK < GTK 3.4: Use GtkColorSelection */
- GdkColor gcolor;
- GtkWidget *color_selection;
- GtkWidget *color_selection_dlg_help_btn;
-
- color_selection_dlg = gtk_color_selection_dialog_new(title);
- gtk_container_set_border_width (GTK_CONTAINER (color_selection_dlg), 10);
- gtk_window_set_transient_for(GTK_WINDOW(color_selection_dlg), GTK_WINDOW(gtk_widget_get_toplevel(button)));
- gtk_window_set_destroy_with_parent(GTK_WINDOW(color_selection_dlg), TRUE);
-
- /* suppress the "help" button (brutally) */
- g_object_get(color_selection_dlg, "help-button", &color_selection_dlg_help_btn, NULL);
- gtk_widget_destroy(color_selection_dlg_help_btn);
-
- color_selection =
- gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(color_selection_dlg));
-
- color_t_to_gdkcolor(&gcolor, csdi->color);
- gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(color_selection), &gcolor);
-
- csdi->color_selection_dlg = color_selection_dlg;
- }
-#endif /* GTK_CHECK(3,4,0) */
-
- g_free(title);
-
- g_signal_connect(G_OBJECT(color_selection_dlg), "response", G_CALLBACK(color_selection_dlg_response_cb), csdi);
- g_signal_connect(G_OBJECT(color_selection_dlg), "destroy", G_CALLBACK(color_selection_dlg_destroy_cb), csdi);
-
- gtk_widget_show_all(color_selection_dlg);
-}
-
-
-/* here when color_edit_dlg FG/BG button destroyed */
-static void
-color_edit_dlg_fg_bg_btn_destroy_cb(GObject *object _U_, gpointer user_data)
-{
- color_selection_dlg_info_t *csdi = (color_selection_dlg_info_t *)user_data;
-
- g_free(csdi);
-}
-
-
-static void
-color_selection_dlg_response_cb(GtkWidget *color_selection_dlg, gint response, gpointer user_data)
-{
- color_selection_dlg_info_t *csdi = (color_selection_dlg_info_t *)user_data;
-
- if (response != GTK_RESPONSE_OK) {
- window_destroy(color_selection_dlg);
- return;
- }
-
- /* Handle GTK_RESPONSE_OK */
-
-#if GTK_CHECK_VERSION(3,4,0)
- { /* GTK >= GTK 3.4: Using GtkColorChooser */
- GdkRGBA new_rgba_color;
-
- gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(color_selection_dlg), &new_rgba_color);
-
- /* now apply the change to the fore/background */
- if (csdi->color_selection_type == COLOR_SELECTION_TYPE_FG)
- gtk_widget_override_color(csdi->filt_name_entry, GTK_STATE_FLAG_NORMAL, &new_rgba_color);
- else
- gtk_widget_override_background_color(csdi->filt_name_entry, GTK_STATE_FLAG_NORMAL, &new_rgba_color);
- }
-
-#elif GTK_CHECK_VERSION(3,0,0)
- { /* (GTK >= GTK 3.0) && (GTK < GTK 3.4): Using GtkColorSelection (RGBA Color) */
- GtkWidget *color_selection;
- GdkRGBA new_rgba_color;
-
- color_selection =
- gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(color_selection_dlg));
-
- gtk_color_selection_get_current_rgba(GTK_COLOR_SELECTION(color_selection), &new_rgba_color);
-
- /* now apply the change to the fore/background */
- if (csdi->color_selection_type == COLOR_SELECTION_TYPE_FG)
- gtk_widget_override_color(csdi->filt_name_entry, GTK_STATE_FLAG_NORMAL, &new_rgba_color);
- else
- gtk_widget_override_background_color(csdi->filt_name_entry, GTK_STATE_FLAG_NORMAL, &new_rgba_color);
- }
-#else
- { /* GTK2: Using GtkColorSelection (GDK Color) */
- GtkWidget *color_selection;
- GdkColor new_color;
-
- color_selection =
- gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(color_selection_dlg));
-
- gtk_color_selection_get_current_color(GTK_COLOR_SELECTION(color_selection), &new_color);
-
- /* now apply the change to the fore/background */
- if (csdi->color_selection_type == COLOR_SELECTION_TYPE_FG)
- gtk_widget_modify_text(csdi->filt_name_entry, GTK_STATE_NORMAL, &new_color);
- else
- gtk_widget_modify_base(csdi->filt_name_entry, GTK_STATE_NORMAL, &new_color);
- }
-#endif /* GTK_CHECK_VERSION(3,4,0) */
-
- window_destroy(color_selection_dlg);
-}
-
-
-static void
-color_selection_dlg_destroy_cb(GObject *object _U_, gpointer user_data)
-{
- color_selection_dlg_info_t *csdi = (color_selection_dlg_info_t *)user_data;
-
- g_assert(csdi->color_selection_dlg);
-
- csdi->color_selection_dlg = NULL;
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/color_edit_dlg.h b/ui/gtk/color_edit_dlg.h
deleted file mode 100644
index 6e61b971a4..0000000000
--- a/ui/gtk/color_edit_dlg.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* color_edit_dlg.h
- * Definitions for dialog boxes for color filters
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __COLOR_EDIT_DLG_H__
-#define __COLOR_EDIT_DLG_H__
-
-/** @file
- * "Colorize Edit Display" dialog box.
- * @ingroup dialog_group
- */
-
-struct _color_edit_dlg_info_t;
-
-typedef struct _color_edit_dlg_info_t color_edit_dlg_info_t;
-
-/* new color filter edit dialog */
-extern void
-color_edit_dlg_new(GtkWidget *color_filters,
- gboolean is_new_filter);
-
-#if 1 /* doesn't really belong here */
-/* edit dialog wants to destroy itself */
-extern void
-color_delete_single(gint row, GtkWidget *color_filters);
-#endif
-
-extern void
-color_edit_dlg_destroy(color_edit_dlg_info_t *cedi);
-
-#endif /* color_edit_dlg.h */
diff --git a/ui/gtk/color_utils.c b/ui/gtk/color_utils.c
deleted file mode 100644
index de34afc395..0000000000
--- a/ui/gtk/color_utils.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/* color_utils.c
- * GTK+ color conversion routines.
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include "ui/gtk/color_utils.h"
-
-void
-color_t_to_gdkcolor(GdkColor *target, const color_t *source)
-{
- target->pixel = 0;
- target->red = source->red;
- target->green = source->green;
- target->blue = source->blue;
-}
-
-void
-color_t_to_gdkRGBAcolor(GdkRGBA *target, const color_t *source)
-{
- target->alpha = 1;
- target->red = source->red / 65535.0;
- target->green = source->green / 65535.0;
- target->blue = source->blue / 65535.0;
-}
-
-void
-gdkcolor_to_color_t(color_t *target, const GdkColor *source)
-{
- target->red = source->red;
- target->green = source->green;
- target->blue = source->blue;
-}
-
-void
-gdkRGBAcolor_to_color_t(color_t *target, const GdkRGBA *source)
-{
- target->red = (guint16)(source->red*65535);
- target->green = (guint16)(source->green*65535);
- target->blue = (guint16)(source->blue*65535);
-}
-
-
-void
-GdkColor_to_GdkRGBA(GdkRGBA *target, const GdkColor *source)
-{
- target->alpha = 1;
- target->red = (double)source->red / 65535.0;
- target->green = (double)source->green / 65535.0;
- target->blue = (double)source->blue / 65535.0;
-}
-
-void
-gdkRGBAcolor_to_GdkColor(GdkColor *target, const GdkRGBA *source)
-{
- target->pixel = 0;
- target->red = (guint16)(source->red*65535);
- target->green = (guint16)(source->green*65535);
- target->blue = (guint16)(source->blue*65535);
-}
-
-/*
- * Editor modelines - http://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/gtk/color_utils.h b/ui/gtk/color_utils.h
deleted file mode 100644
index 988c0bfaa1..0000000000
--- a/ui/gtk/color_utils.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* color_utils.h
- * Definitions for GTK+ color conversion routines.
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __COLOR_UTILS_H__
-#define __COLOR_UTILS_H__
-
-#include "ui/gtk/gui_utils.h"
-#include <wsutil/color.h>
-
-/** @file
- * Definitions for color structures and routines
- */
-
-/** Convert color_t to GdkColor.
- *
- * @param target the GdkColor to be filled
- * @param source the source color_t
- */
-void color_t_to_gdkcolor(GdkColor *target, const color_t *source);
-
-/** Convert color_t to GdkRGBA.
- *
- * @param target the GdkRGBA to be filled
- * @param source the source color_t
- */
-void color_t_to_gdkRGBAcolor(GdkRGBA *target, const color_t *source);
-
-/** Convert GdkColor to color_t.
- *
- * @param target the source color_t
- * @param source the GdkColor to be filled
- */
-void gdkcolor_to_color_t(color_t *target, const GdkColor *source);
-
-/** Convert GdkRGBA to color_t.
- *
- * @param target the source color_t
- * @param source the GdkRGBA to be filled
- */
-void gdkRGBAcolor_to_color_t(color_t *target, const GdkRGBA *source);
-
-/** Convert GdkColor to GdkRGBA.
- *
- * @param target the source GdkColor
- * @param source the GdkRGBA to be filled
- */
-void GdkColor_to_GdkRGBA(GdkRGBA *target, const GdkColor *source);
-
-/** Convert GdkRGBA to GdkColor.
- *
- * @param target the source GdkColor
- * @param source the GdkRGBA to be filled
- */
-void gdkRGBAcolor_to_GdkColor(GdkColor *target, const GdkRGBA *source);
-#endif /* __COLOR_UTILS_H__ */
diff --git a/ui/gtk/compare_stat.c b/ui/gtk/compare_stat.c
deleted file mode 100644
index 4622286ca0..0000000000
--- a/ui/gtk/compare_stat.c
+++ /dev/null
@@ -1,1078 +0,0 @@
-/* compare_stat.c
- * Compare two capture files
- * Copyright 2008 Vincenzo Condoleo, Christophe Dirac, Reto Ruoss
- * supported by HSR (Hochschule Rapperswil)
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/* This module provides statistics about two merged capture files, to find packet loss,
- * time delay, ip header checksum errors and order check.
- * It's also detecting the matching regions of the different files.
- * After the coloring is set Info column can be sorted to create zebra effect.
- *
- * The packets are compared by the ip id. MAC or TTL is used to distinct the different files.
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-
-#include <gtk/gtk.h>
-
-#include <wsutil/report_message.h>
-
-#include <epan/stat_tap_ui.h>
-#include <epan/to_str.h>
-#include <epan/tap.h>
-#include <epan/packet.h>
-#include <epan/dissectors/packet-ip.h>
-#include <epan/in_cksum.h>
-
-
-#include "ui/simple_dialog.h"
-
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/filter_autocomplete.h"
-
-
-#include "ui/gtk/gui_stat_menu.h"
-#include "gui_utils.h"
-#include "dlg_utils.h"
-#include "filter_dlg.h"
-#include "service_response_time_table.h"
-#include "gtkglobals.h"
-#include "globals.h"
-
-/* Color settings */
-#include <epan/color_filters.h>
-#include "packet_list.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-void register_tap_listener_gtkcomparestat(void);
-
-/* From colorize conversion */
-#define COLOR_N 1
-
-/* For checksum */
-#define BYTES 14
-#define WRONG_CHKSUM 0
-
-#define MERGED_FILES 2
-
-#define TTL_SEARCH 5
-
-
-
-/* information which are needed for the display */
-typedef struct _for_gui {
- guint count;
- guint16 cksum;
- nstime_t predecessor_time;
- struct _frame_info *partner;
-} for_gui;
-
-/* each tracked packet */
-typedef struct _frame_info {
- for_gui *fg;
- column_info *cinfo;
- guint32 num;
- guint16 id;
- guint8 ip_ttl;
- address dl_dst;
- nstime_t abs_ts, zebra_time, delta;
-} frame_info;
-
-/* used to keep track of the statistics for an entire program interface */
-typedef struct _compstat_t {
- GtkWidget *win, *treeview, *scrolled_win, *statis_label;
- GtkTreeStore *simple_list;
- GtkTreeIter iter, child;
- GHashTable *packet_set, *ip_id_set, *nr_set;
- address eth_dst, eth_src;
- nstime_t zebra_time, current_time;
- timestat_t stats;
- GArray *ip_ttl_list;
- gboolean last_hit;
- guint32 start_ongoing_hits, stop_ongoing_hits, start_packet_nr_first, start_packet_nr_second, stop_packet_nr_first, stop_packet_nr_second;
- guint32 first_file_amount, second_file_amount;
-} compstat_t;
-
-/* column numbers */
-enum
-{
- IP_ID=0,
- PROBLEM,
- COUNT,
- DELTA,
- COLUMNS
-};
-
-/* only one compare window should be open */
-static gboolean first_window=TRUE;
-
-/* allowed variace */
-static GtkWidget *spin_var_int=NULL;
-
-/* start/stop compare */
-static GtkWidget *spin_start_int, *spin_stop_int;
-
-/* to call directly _init */
-static gdouble compare_variance=0.0;
-static guint8 compare_start, compare_stop;
-static gboolean TTL_method=TRUE, ON_method=TRUE;
-static GtkWidget *radio_TTL, *radio_ON;
-
-static void
-comparestat_set_title(compstat_t *cs)
-{
- set_window_title(cs->win, "Compare two capture files");
-}
-
-/* called when new capture starts, when it rescans the packetlist after some prefs have
- * changed
- */
-static void
-comparestat_reset(void *arg)
-{
- compstat_t *cs=(compstat_t *)arg;
-
- set_address(&cs->eth_src, AT_ETHER, 0, NULL);
- set_address(&cs->eth_dst, AT_ETHER, 0, NULL);
-
- gtk_tree_store_clear(cs->simple_list);
- comparestat_set_title(cs);
-}
-
-/* This callback is invoked whenever the tap system has seen a packet
- * we might be interested in.
- * function returns :
- * 0: no updates, no need to call (*draw) later
- * !0: state has changed, call (*draw) sometime later
- */
-static int
-comparestat_packet(void *arg, packet_info *pinfo, epan_dissect_t *edt _U_, const void *arg2)
-{
- compstat_t *cs=(compstat_t *)arg;
- const ws_ip4 *ci=(const ws_ip4 *)arg2;
- frame_info *fInfo, *fInfoTemp;
- vec_t cksum_vec[3];
- guint16 computed_cksum=0;
-
- /* so this get filled, usually with the first frame */
- if(cs->eth_dst.len==0) {
- copy_address_shallow(&cs->eth_dst, &pinfo->dl_dst);
- copy_address_shallow(&cs->eth_src, &pinfo->dl_src);
- }
-
- /* Set up the fields of the pseudo-header and create checksum */
- cksum_vec[0].ptr=(const guint8 *)&ci;
- cksum_vec[0].len=BYTES;
- /* skip TTL */
- cksum_vec[1].ptr=&ci->ip_proto;
- cksum_vec[1].len=1;
- /* skip header checksum and ip's (because of NAT)*/
- cksum_vec[2].ptr=(const guint8 *)ci->ip_dst.data;
- cksum_vec[2].ptr=cksum_vec[2].ptr+ci->ip_dst.len;
- /* dynamic computation */
- cksum_vec[2].len=ci->ip_len-20;
- computed_cksum=in_cksum(&cksum_vec[0], 3);
-
- /* Set up the new order to create the zebra effect */
- fInfoTemp=(frame_info *)g_hash_table_lookup(cs->packet_set, GINT_TO_POINTER(pinfo->num));
- if((fInfoTemp!=NULL)){
- col_set_time(pinfo->cinfo, COL_INFO, &fInfoTemp->zebra_time, "ZebraTime");
- }
-
- /* collect all packet infos */
- fInfo=(frame_info*)g_malloc(sizeof(frame_info));
- fInfo->fg=(for_gui*)g_malloc(sizeof(for_gui));
- fInfo->fg->partner=NULL;
- fInfo->fg->count=1;
- fInfo->fg->cksum=computed_cksum;
- fInfo->num=pinfo->num;
- fInfo->id=ci->ip_id;
- fInfo->ip_ttl=ci->ip_ttl;
- copy_address_shallow(&fInfo->dl_dst, &pinfo->dl_dst);
- fInfo->abs_ts=pinfo->abs_ts;
- /* clean memory */
- nstime_set_zero(&fInfo->zebra_time);
- nstime_set_zero(&fInfo->fg->predecessor_time);
- g_hash_table_insert(cs->packet_set, GINT_TO_POINTER(pinfo->num), fInfo);
-
- if((guint32)cf_get_packet_count(&cfile)==fInfo->num){
- nstime_set_unset(&cs->current_time);
- return 1;
- } else {
- return 0;
- }
-}
-
-static void
-frame_info_free(gpointer data)
-{
- frame_info *fInfo = (frame_info *)data;
-
- g_free(fInfo->fg);
- g_free(fInfo);
-}
-
-/* Find equal packets, same IP-Id, count them and make time statistics */
-static void
-call_foreach_count_ip_id(gpointer key _U_, gpointer value, gpointer arg)
-{
- compstat_t *cs=(compstat_t*)arg;
- frame_info *fInfo=(frame_info*)value, *fInfoTemp;
- nstime_t delta;
- guint i;
-
- /* we only need one value out of pinfo we use a temp one */
- packet_info *pinfo=(packet_info*)g_malloc(sizeof(packet_info));
- pinfo->fd=(frame_data*)g_malloc(sizeof(frame_data));
- pinfo->num = fInfo->num;
-
- fInfoTemp=(frame_info *)g_hash_table_lookup(cs->ip_id_set, GINT_TO_POINTER((gint)fInfo->id));
- if(fInfoTemp==NULL){
- /* Detect ongoing package loss */
- if((cs->last_hit==FALSE)&&(cs->start_ongoing_hits>compare_start)&&(cs->stop_ongoing_hits<compare_stop)){
- cs->stop_ongoing_hits++;
- cs->stop_packet_nr_first=fInfo->num;
- } else if(cs->stop_ongoing_hits<compare_stop){
- cs->stop_ongoing_hits=0;
- cs->stop_packet_nr_first=G_MAXINT32;
- }
- cs->last_hit=FALSE;
-
- fInfo->fg->count=1;
- g_hash_table_insert(cs->ip_id_set, GINT_TO_POINTER((gint)fInfo->id), fInfo);
- } else {
- /* Detect ongoing package hits, special behavior if start is set to 0 */
- if((cs->last_hit||(compare_start==0))&&(cs->start_ongoing_hits<compare_start||(compare_start==0))){
- if((compare_start==0)&&(cs->start_ongoing_hits!=0)){
- /* start from the first packet so already set */
- } else {
- cs->start_ongoing_hits++;
- /* Take the lower number */
- cs->start_packet_nr_first=fInfoTemp->num;
- cs->start_packet_nr_second=fInfo->num;
- }
- } else if(cs->start_ongoing_hits<compare_start){
- cs->start_ongoing_hits=0;
- cs->start_packet_nr_first=G_MAXINT32;
- }
- cs->last_hit=TRUE;
-
- fInfo->fg->count=fInfoTemp->fg->count + 1;
- if(fInfoTemp->fg->cksum!=fInfo->fg->cksum){
- fInfo->fg->cksum=WRONG_CHKSUM;
- fInfoTemp->fg->cksum=WRONG_CHKSUM;
- }
- /* Add partner */
- fInfo->fg->partner=fInfoTemp;
- /* Create time statistic */
- if(fInfo->fg->count==MERGED_FILES){
- nstime_delta(&delta, &fInfo->abs_ts, &fInfoTemp->abs_ts);
- /* Set delta in both packets */
- nstime_set_zero(&fInfoTemp->delta);
- nstime_add(&fInfoTemp->delta, &delta);
- nstime_set_zero(&fInfo->delta);
- nstime_add(&fInfo->delta, &delta);
- time_stat_update(&cs->stats, &delta, pinfo);
- }
- g_hash_table_insert(cs->ip_id_set, GINT_TO_POINTER((gint)fInfo->id), fInfo);
- }
-
- /* collect TTL's */
- if(TTL_method && (fInfo->num<TTL_SEARCH)){
- for(i=0; i < cs->ip_ttl_list->len; i++){
- if(g_array_index(cs->ip_ttl_list, guint8, i) == fInfo->ip_ttl){
- return;
- }
- }
- g_array_append_val(cs->ip_ttl_list, fInfo->ip_ttl);
- }
-
- g_free(pinfo->fd);
- g_free(pinfo);
-}
-
-/*Create new numbering in the Info column, to create a zebra effect */
-static void
-call_foreach_new_order(gpointer key _U_, gpointer value, gpointer arg)
-{
- compstat_t *cs=(compstat_t*)arg;
- frame_info *fInfo=(frame_info*)value, *fInfoTemp;
-
- /* overwrite Info column for new ordering */
- fInfoTemp=(frame_info *)g_hash_table_lookup(cs->nr_set, GINT_TO_POINTER((gint)fInfo->id));
- if(fInfoTemp==NULL){
- if(TTL_method==FALSE){
- if((addresses_equal(&cs->eth_dst, &fInfo->dl_dst)) || (addresses_equal(&cs->eth_src, &fInfo->dl_dst))){
- g_hash_table_insert(cs->nr_set, GINT_TO_POINTER((gint)fInfo->id), fInfo);
- fInfo->zebra_time=cs->zebra_time;
- cs->zebra_time.nsecs=cs->zebra_time.nsecs + MERGED_FILES;
- } else {
- cs->zebra_time.nsecs++;
- g_hash_table_insert(cs->nr_set, GINT_TO_POINTER((gint)fInfo->id), fInfo);
- fInfo->zebra_time=cs->zebra_time;
- cs->zebra_time.nsecs++;
- }
- } else {
- if((g_array_index(cs->ip_ttl_list, guint8, 0)==fInfo->ip_ttl) || (g_array_index(cs->ip_ttl_list, guint8, 1)==fInfo->ip_ttl)){
- g_hash_table_insert(cs->nr_set, GINT_TO_POINTER((gint)fInfo->id), fInfo);
- fInfo->zebra_time=cs->zebra_time;
- cs->zebra_time.nsecs=cs->zebra_time.nsecs + MERGED_FILES;
- } else {
- cs->zebra_time.nsecs++;
- g_hash_table_insert(cs->nr_set, GINT_TO_POINTER((gint)fInfo->id), fInfo);
- fInfo->zebra_time=cs->zebra_time;
- cs->zebra_time.nsecs++;
- }
-
- }
- } else {
- if(TTL_method==FALSE){
- if(((addresses_equal(&cs->eth_dst, &fInfo->dl_dst)) || (addresses_equal(&cs->eth_src, &fInfo->dl_dst)))&&(!fmod(fInfoTemp->zebra_time.nsecs,MERGED_FILES))){
- fInfo->zebra_time.nsecs=fInfoTemp->zebra_time.nsecs;
- } else {
- fInfo->zebra_time.nsecs=fInfoTemp->zebra_time.nsecs+1;
- }
- } else {
- if(((g_array_index(cs->ip_ttl_list, guint8, 0)==fInfo->ip_ttl) || (g_array_index(cs->ip_ttl_list, guint8, 1)==fInfo->ip_ttl))&&(!fmod(fInfoTemp->zebra_time.nsecs,MERGED_FILES))){
- fInfo->zebra_time.nsecs=fInfoTemp->zebra_time.nsecs;
- } else {
- fInfo->zebra_time.nsecs=fInfoTemp->zebra_time.nsecs+1;
- }
- }
- }
-
- /* count packets of file */
- if(fmod(fInfo->zebra_time.nsecs, MERGED_FILES)){
- cs->first_file_amount++;
- } else {
- cs->second_file_amount++;
- }
-
- /* ordering */
- if(!nstime_is_unset(&cs->current_time)){
- fInfo->fg->predecessor_time.nsecs=cs->current_time.nsecs;
- }
-
- cs->current_time.nsecs=fInfo->zebra_time.nsecs;
-}
-
-/* calculate scopes if not set yet */
-static void
-call_foreach_merge_settings(gpointer key _U_, gpointer value, gpointer arg)
-{
- compstat_t *cs=(compstat_t*)arg;
- frame_info *fInfo=(frame_info*)value, *fInfoTemp=NULL;
- guint32 tot_packet_amount=cs->first_file_amount+cs->second_file_amount, swap;
-
- if((fInfo->num==tot_packet_amount)&&(cs->stop_packet_nr_first!=G_MAXINT32)){
- /* calculate missing stop number */
- swap=cs->stop_packet_nr_first;
- cs->stop_packet_nr_first=tot_packet_amount-cs->second_file_amount;
- cs->stop_packet_nr_second=swap;
- }
-
- if((fInfo->num==tot_packet_amount)&&(cs->stop_packet_nr_first==G_MAXINT32)&&(cs->start_packet_nr_first!=G_MAXINT32)){
- fInfoTemp=(frame_info *)g_hash_table_lookup(cs->packet_set, GINT_TO_POINTER(cs->start_packet_nr_first));
- if(fInfoTemp==NULL){
- fprintf(stderr,"ERROR: Incorrect start number\n");
- }
- if(fInfoTemp && fmod(fInfoTemp->zebra_time.nsecs, 2)){
- /*first file*/
- cs->stop_packet_nr_first=cs->start_packet_nr_first+(cs->second_file_amount-(cs->start_packet_nr_second-cs->first_file_amount));
- if(cs->stop_packet_nr_first>(tot_packet_amount-cs->second_file_amount)){
- cs->stop_packet_nr_first=tot_packet_amount-cs->second_file_amount;
- }
- /*this only happens if we have too many MAC's or TTL*/
- if(cs->stop_packet_nr_first>cs->start_packet_nr_second){
- cs->stop_packet_nr_first=cs->start_packet_nr_second-1;
- }
- fInfoTemp=(frame_info *)g_hash_table_lookup(cs->packet_set, GINT_TO_POINTER(cs->stop_packet_nr_first));
- while((fInfoTemp!=NULL)?fmod(!fInfoTemp->zebra_time.nsecs, 2):TRUE){
- cs->stop_packet_nr_first--;
- fInfoTemp=(frame_info *)g_hash_table_lookup(cs->packet_set, GINT_TO_POINTER(cs->stop_packet_nr_first));
- }
- } else {
- /*this only happens if we have too many MAC's or TTL*/
- cs->stop_packet_nr_first=cs->first_file_amount+cs->start_packet_nr_first;
- if(cs->stop_packet_nr_first>tot_packet_amount-cs->first_file_amount){
- cs->stop_packet_nr_first=tot_packet_amount-cs->first_file_amount;
- }
- fInfoTemp=(frame_info *)g_hash_table_lookup(cs->packet_set, GINT_TO_POINTER(cs->stop_packet_nr_first));
- while((fInfoTemp!=NULL)?fmod(fInfoTemp->zebra_time.nsecs, 2):TRUE){
- cs->stop_packet_nr_first--;
- fInfoTemp=(frame_info *)g_hash_table_lookup(cs->packet_set, GINT_TO_POINTER(cs->stop_packet_nr_first));
- }
- }
- /* set second stop location */
- cs->stop_packet_nr_second=cs->start_packet_nr_second+(cs->stop_packet_nr_first-cs->start_packet_nr_first);
- if(cs->stop_packet_nr_second>tot_packet_amount){
- cs->stop_packet_nr_second=tot_packet_amount;
- }
- }
-
- /* no start found */
- if(fInfo->num==tot_packet_amount&&compare_start!=0&&compare_stop!=0){
- if(cs->start_packet_nr_first==G_MAXINT32){
- report_failure("Start point couldn't be set. Please choose a lower start number.");
- }
- }
-}
-
-
-/* build gtk-tree of lost, delayed, checksum error and wrong order Packets*/
-static void
-call_foreach_print_ip_tree(gpointer key _U_, gpointer value, gpointer user_data)
-{
- frame_info *fInfo=(frame_info*)value;
- compstat_t *cs=(compstat_t*)user_data;
- gdouble delta, average;
- gboolean show_it=FALSE;
-
- delta=fabs(get_average(&fInfo->delta,1));
- average=fabs(get_average(&cs->stats.tot, cs->stats.num));
-
- /* special case if both are set to zero ignore start and stop numbering */
- if(compare_start!=0&&compare_stop!=0){
- /* check out if packet is in searched scope */
- if((cs->start_packet_nr_first<fInfo->num)&&(cs->stop_packet_nr_first>fInfo->num)){
- show_it=TRUE;
- } else {
- /* so we won't miss the other file */
- if((fInfo->num>cs->start_packet_nr_second)&&(fInfo->num<cs->stop_packet_nr_second)){
- show_it=TRUE;
- }
- }
- } else {
- show_it=TRUE;
- }
-
- /* Create the gtk tree */
- if(show_it){
- if((fInfo->fg->count<MERGED_FILES)){
- gtk_tree_store_append(GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(cs->treeview))), &cs->iter, NULL);
- gtk_tree_store_set(GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(cs->treeview))), &cs->iter, IP_ID, fInfo->id, PROBLEM, "Lost packet", COUNT, fInfo->fg->count, DELTA, 0.0, -1);
- }
-
- if(fInfo->fg->count > MERGED_FILES){
- gtk_tree_store_append(GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(cs->treeview))), &cs->iter, NULL);
- gtk_tree_store_set(GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(cs->treeview))), &cs->iter, IP_ID, fInfo->id, PROBLEM, "More than two packets", COUNT, fInfo->fg->count, DELTA, 0.0, -1);
- if(fInfo->fg->cksum == WRONG_CHKSUM) {
- gtk_tree_store_append(GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(cs->treeview))), &cs->child, &cs->iter);
- gtk_tree_store_set(GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(cs->treeview))), &cs->child, IP_ID, fInfo->id, PROBLEM, "IP header checksum incorrect", COUNT, fInfo->fg->count, DELTA, 0.0, -1);
- }
- }
- if(fInfo->fg->count == MERGED_FILES){
- if(fInfo->fg->cksum == WRONG_CHKSUM) {
- gtk_tree_store_append(GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(cs->treeview))), &cs->iter, NULL);
- gtk_tree_store_set(GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(cs->treeview))), &cs->iter, IP_ID, fInfo->id, PROBLEM, "IP header checksum incorrect", COUNT, fInfo->fg->count, DELTA, delta, -1);
- if(((delta < (average-cs->stats.variance)) || (delta > (average+cs->stats.variance))) && (delta > 0.0) && (cs->stats.variance!=0)){
- gtk_tree_store_append(GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(cs->treeview))), &cs->child, &cs->iter);
- gtk_tree_store_set(GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(cs->treeview))), &cs->child, IP_ID, fInfo->id, PROBLEM, "Late arrival", COUNT, fInfo->fg->count, DELTA, delta, -1);
- }
- if((nstime_cmp(&fInfo->fg->predecessor_time, &fInfo->zebra_time)>0||nstime_cmp(&fInfo->fg->partner->fg->predecessor_time, &fInfo->fg->partner->zebra_time)>0) && (fInfo->zebra_time.nsecs!=MERGED_FILES) && ON_method){
- gtk_tree_store_append(GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(cs->treeview))), &cs->child, &cs->iter);
- gtk_tree_store_set(GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(cs->treeview))), &cs->child, IP_ID, fInfo->id, PROBLEM, "Out of order", COUNT, fInfo->fg->count, DELTA, delta, -1);
- }
- } else if(((delta < (average-cs->stats.variance)) || (delta > (average+cs->stats.variance))) && (delta > 0.0) && (cs->stats.variance!=0)) {
- gtk_tree_store_append(GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(cs->treeview))), &cs->iter, NULL);
- gtk_tree_store_set(GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(cs->treeview))), &cs->iter, IP_ID, fInfo->id, PROBLEM, "Late arrival", COUNT, fInfo->fg->count, DELTA, delta, -1);
- if((nstime_cmp(&fInfo->fg->predecessor_time, &fInfo->zebra_time)>0||nstime_cmp(&fInfo->fg->partner->fg->predecessor_time, &fInfo->fg->partner->zebra_time)>0) && fInfo->zebra_time.nsecs != MERGED_FILES && ON_method){
- gtk_tree_store_append(GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(cs->treeview))), &cs->child, &cs->iter);
- gtk_tree_store_set(GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(cs->treeview))), &cs->child, IP_ID, fInfo->id, PROBLEM, "Out of order", COUNT, fInfo->fg->count, DELTA, delta, -1);
- }
- } else if((nstime_cmp(&fInfo->fg->predecessor_time, &fInfo->zebra_time)>0||nstime_cmp(&fInfo->fg->partner->fg->predecessor_time, &fInfo->fg->partner->zebra_time)>0) && fInfo->zebra_time.nsecs != MERGED_FILES && ON_method){
- gtk_tree_store_append(GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(cs->treeview))), &cs->iter, NULL);
- gtk_tree_store_set(GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(cs->treeview))), &cs->iter, IP_ID, fInfo->id, PROBLEM, "Out of order", COUNT, fInfo->fg->count, DELTA, delta, -1);
- }
- }
- }
-}
-
-static void
-win_destroy_cb(GtkWindow *win _U_, gpointer data)
-{
- compstat_t *cs=(compstat_t *)data;
-
- remove_tap_listener(cs);
-
- first_window=TRUE;
- gtk_tree_store_clear(cs->simple_list);
- g_hash_table_destroy(cs->packet_set);
- g_hash_table_destroy(cs->nr_set);
- g_hash_table_destroy(cs->ip_id_set);
- g_free(cs);
-}
-
-/* this may be called any time, perhaps once every 3 seconds or so.
- */
-static void
-comparestat_draw(void *arg)
-{
- compstat_t *cs = (compstat_t *)arg;
- GString *filter_str = g_string_new("");
- const gchar *statis_string;
- frame_info *fInfo;
- guint32 first_file_amount, second_file_amount;
- char* addr_str;
- gchar *err_msg = NULL;
-
- /* initial steps, clear all data before start*/
- cs->zebra_time.secs=0;
- cs->zebra_time.nsecs=1;
- nstime_set_unset(&cs->current_time);
- cs->ip_ttl_list=g_array_new(FALSE, FALSE, sizeof(guint8));
- cs->last_hit=FALSE;
- cs->start_ongoing_hits=0;
- cs->stop_ongoing_hits=0;
- cs->start_packet_nr_first=G_MAXINT32;
- cs->start_packet_nr_second=G_MAXINT32;
- cs->stop_packet_nr_first=G_MAXINT32;
- cs->stop_packet_nr_second=G_MAXINT32;
- cs->first_file_amount=0;
- cs->second_file_amount=0;
-
- time_stat_init(&cs->stats);
-
- /* no need to do anything no file is open*/
- if(cf_get_packet_count(&cfile)==0){
- /* add statistic string */
- statis_string=g_strdup_printf("No file open");
- gtk_label_set_text((GtkLabel *) cs->statis_label, statis_string);
- return;
- }
-
- g_hash_table_foreach(cs->packet_set, call_foreach_count_ip_id, cs);
-
- /* set up TTL choice if only one number found */
- if(TTL_method&&cs->ip_ttl_list->len==1){
- g_array_append_val(cs->ip_ttl_list, g_array_index(cs->ip_ttl_list, guint8, 1));
- }
-
- g_hash_table_foreach(cs->packet_set, call_foreach_new_order,cs);
- g_hash_table_foreach(cs->packet_set, call_foreach_merge_settings, cs);
-
- /* remembering file amounts */
- first_file_amount=cs->first_file_amount;
- second_file_amount=cs->second_file_amount;
- /* reset after numbering */
- g_hash_table_remove_all(cs->nr_set);
- /* reset ordering */
- nstime_set_unset(&cs->current_time);
-
- /* set color filter, in Routing environment */
- if(TTL_method&&cs->ip_ttl_list->len!=0){
- g_string_printf(filter_str, "%s %i %s %i", "ip.ttl ==", g_array_index(cs->ip_ttl_list, guint8, 0), "|| ip.ttl ==", g_array_index(cs->ip_ttl_list, guint8, 1));
- } else if(cs->eth_dst.len!=0&&cs->eth_src.len!=0){
- addr_str = (char*)address_to_str(NULL, &cs->eth_dst);
- g_string_printf(filter_str, "%s %s %s %s", "eth.dst==", addr_str, "|| eth.dst==", addr_str);
- wmem_free(NULL, addr_str);
- }
- if (!color_filters_set_tmp(COLOR_N, filter_str->str, FALSE, &err_msg)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg);
- g_free(err_msg);
- }
- packet_list_colorize_packets();
- /* Variance */
- cs->stats.variance=compare_variance;
-
- /* add statistic string */
- statis_string=g_strdup_printf("Compare Statistics: \nNumber of packets total:%i 1st file:%i, 2nd file:%i\nScopes:\t start:%i stop:%i\nand:\t start:%i stop:%i\nEqual packets: %i \nAllowed variation: %f \nAverage time difference: %f", cf_get_packet_count(&cfile), first_file_amount, second_file_amount, cs->start_packet_nr_first, cs->stop_packet_nr_first, cs->start_packet_nr_second, cs->stop_packet_nr_second, cs->stats.num, cs->stats.variance, fabs(get_average(&cs->stats.tot, cs->stats.num)));
- gtk_label_set_text((GtkLabel *) cs->statis_label, statis_string);
-
- /* add start and stop of scanning */
- if(cs->start_packet_nr_first!=G_MAXINT32&&compare_start!=0&&compare_stop!=0){
- fInfo=(frame_info *)g_hash_table_lookup(cs->packet_set, GINT_TO_POINTER(cs->start_packet_nr_first));
- if(fInfo){
- gtk_tree_store_append(GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(cs->treeview))), &cs->iter, NULL);
- gtk_tree_store_set(GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(cs->treeview))), &cs->iter, IP_ID, fInfo->id, PROBLEM, "Start scanning", COUNT, 0, DELTA, 0.0, -1);
- }
- }
- if(cs->stop_packet_nr_first!=G_MAXINT32&&compare_start!=0&&compare_stop!=0){
- fInfo=(frame_info *)g_hash_table_lookup(cs->packet_set, GINT_TO_POINTER(cs->stop_packet_nr_first));
- if(fInfo){
- gtk_tree_store_append(GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(cs->treeview))), &cs->iter, NULL);
- gtk_tree_store_set(GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(cs->treeview))), &cs->iter, IP_ID, fInfo->id, PROBLEM, "Stop scanning", COUNT, 0, DELTA, 0.0, -1);
- }
- }
-
- g_hash_table_foreach(cs->ip_id_set, call_foreach_print_ip_tree, cs);
- g_string_free(filter_str, TRUE);
- g_array_free(cs->ip_ttl_list, TRUE);
-}
-
-/* called when a tree row is (un)selected in the popup window */
-static void
-new_tree_view_selection_changed(GtkTreeSelection *sel, gpointer user_data)
-{
- gchar *problem;
- GtkTreeModel *model;
- GtkTreeIter iter;
- frame_info *fInfo;
- /* Because it could be zero */
- gint id=-1;
-
- compstat_t *cs=(compstat_t*)user_data;
-
- /* if something is selected */
- if(gtk_tree_selection_get_selected(sel, &model, &iter)){
- gtk_tree_model_get(model, &iter, 0, &id, 1, &problem, -1);
- if (id<0) return;
- /* The id is not enough to find the start or the end packet */
- if(strcmp("Start scanning",problem)==0){
- cf_goto_frame(&cfile, cs->start_packet_nr_first);
- return;
- }
- if(strcmp("Stop scanning",problem)==0){
- cf_goto_frame(&cfile, cs->stop_packet_nr_first);
- return;
- }
- fInfo=(frame_info *)g_hash_table_lookup(cs->ip_id_set, GINT_TO_POINTER(id));
- if(fInfo != NULL){
- cf_goto_frame(&cfile, fInfo->num);
- }
- }
-
-}
-
-/* add three columns to the GtkTreeView. All three of the columns will be
- * displayed as text*/
-static void
-setup_tree_view(GtkWidget *treeview)
-{
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
- /* Create a new GtkCellRendererText, add it to the tree view column and
- * append the column to the tree view. */
- renderer=gtk_cell_renderer_text_new ();
- column=gtk_tree_view_column_new_with_attributes("IP ID", renderer, "text", IP_ID, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW (treeview), column);
- renderer=gtk_cell_renderer_text_new ();
- column=gtk_tree_view_column_new_with_attributes("Problem", renderer, "text", PROBLEM, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW (treeview), column);
- renderer=gtk_cell_renderer_text_new ();
- column=gtk_tree_view_column_new_with_attributes("Count", renderer, "text", COUNT, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW (treeview), column);
- renderer=gtk_cell_renderer_text_new ();
- column=gtk_tree_view_column_new_with_attributes("Delta", renderer, "text", DELTA, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW (treeview), column);
-}
-
-/* when called, this function will create a new instance of gtk2-comparestat.
- */
-static void
-gtk_comparestat_init(const char *opt_arg, void* userdata _U_)
-{
- compstat_t *cs;
- char *display_name;
- char *title_string;
- char *filter_string;
- GtkWidget *stat_label;
- GtkWidget *filter_label;
- GtkWidget *bbox;
- GtkWidget *close_bt;
- GtkWidget *help_bt;
- GtkWidget *vbox;
- gdouble variance;
- gint start, stop,ttl, order, pos=0;
- const char *filter=NULL;
- GString *error_string;
-
- if(sscanf(opt_arg,"compare,%d,%d,%d,%d,%lf%n",&start, &stop, &ttl, &order, &variance, &pos)==5){
- if(*(opt_arg+pos)==',')
- filter=opt_arg+pos+1;
- } else {
- fprintf(stderr, "wireshark: invalid \"-z compare,<start>,<stop>,<ttl[0|1]>,<order[0|1]>,<variance>[,<filter>]\" argument\n");
- exit(1);
- }
-
- compare_variance=variance;
- compare_start=start;
- compare_stop=stop;
- TTL_method=ttl;
- ON_method=order;
-
- cs=(compstat_t *)g_malloc(sizeof(compstat_t));
- nstime_set_unset(&cs->current_time);
- cs->ip_ttl_list=g_array_new(FALSE, FALSE, sizeof(guint8));
- cs->last_hit=FALSE;
- cs->start_ongoing_hits=0;
- cs->stop_ongoing_hits=0;
- cs->start_packet_nr_first=G_MAXINT32;
- cs->start_packet_nr_second=G_MAXINT32;
- cs->stop_packet_nr_first=G_MAXINT32;
- cs->stop_packet_nr_second=G_MAXINT32;
- cs->first_file_amount=0;
- cs->second_file_amount=0;
-
- cs->zebra_time.secs=0;
- cs->zebra_time.nsecs=1;
- cs->nr_set=g_hash_table_new(NULL, NULL);
-
- /* transient_for top_level */
- cs->win=dlg_window_new("compare-stat");
- gtk_window_set_destroy_with_parent (GTK_WINDOW(cs->win), TRUE);
- gtk_window_set_default_size(GTK_WINDOW(cs->win), SRT_PREFERRED_WIDTH, SRT_PREFERRED_HEIGHT);
- comparestat_set_title(cs);
-
- vbox=ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_add(GTK_CONTAINER(cs->win), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 12);
-
- display_name = cf_get_display_name(&cfile);
- title_string = g_strdup_printf("Compare two capture files: %s", display_name);
- g_free(display_name);
- stat_label=gtk_label_new(title_string);
- g_free(title_string);
- gtk_box_pack_start(GTK_BOX(vbox), stat_label, FALSE, FALSE, 0);
-
- filter_string = g_strdup_printf("Filter: %s", filter ? filter : "");
- filter_label=gtk_label_new(filter_string);
- g_free(filter_string);
- gtk_label_set_line_wrap(GTK_LABEL(filter_label), TRUE);
- gtk_box_pack_start(GTK_BOX(vbox), filter_label, FALSE, FALSE, 0);
-
- /* add statistik info to Window */
- cs->statis_label=gtk_label_new("Statistics:");
- gtk_label_set_line_wrap(GTK_LABEL(cs->statis_label), TRUE);
- gtk_box_pack_start(GTK_BOX(vbox), cs->statis_label, FALSE, FALSE, 0);
-
- /* we must display TOP LEVEL Widget before calling simple_list_new */
- gtk_widget_show_all(cs->win);
-
- cs->treeview=gtk_tree_view_new();
- setup_tree_view(cs->treeview);
-
- /* create a newtree model with four columns */
- cs->simple_list=gtk_tree_store_new(COLUMNS, G_TYPE_INT, G_TYPE_STRING, G_TYPE_INT, G_TYPE_DOUBLE);
-
- /* add the tree model to the tree view and unreference it so that the model will
- * be destroyed along with the tree view. */
- gtk_tree_view_set_model(GTK_TREE_VIEW (cs->treeview), GTK_TREE_MODEL (cs->simple_list));
- g_object_unref(cs->simple_list);
-
- /* call this method when row is chosen*/
- gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(cs->treeview)),GTK_SELECTION_SINGLE);
- g_signal_connect(gtk_tree_view_get_selection(GTK_TREE_VIEW(cs->treeview)), "changed", G_CALLBACK(new_tree_view_selection_changed), cs);
-
- /* list with scrollbar's */
- cs->scrolled_win=gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(cs->scrolled_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_container_add(GTK_CONTAINER(cs->scrolled_win), cs->treeview);
- gtk_box_pack_start(GTK_BOX(vbox), cs->scrolled_win, TRUE, TRUE, 0);
-
- /* create a Hash to count the packets with the same ip.id */
- cs->packet_set=g_hash_table_new_full(NULL, NULL, NULL, frame_info_free);
-
- cs->ip_id_set=g_hash_table_new(NULL, NULL);
-
- error_string=register_tap_listener("ip", cs, filter, 0, comparestat_reset, comparestat_packet, comparestat_draw);
- if(error_string){
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
- g_string_free(error_string, TRUE);
- gtk_tree_store_clear(cs->simple_list);
- g_hash_table_destroy(cs->packet_set);
- g_hash_table_destroy(cs->ip_id_set);
- g_free(cs);
- return;
- }
-
- /* button row. */
- bbox = dlg_button_row_new(GTK_STOCK_CLOSE, GTK_STOCK_HELP, NULL);
- gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(cs->win, close_bt, window_cancel_button_cb);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_STATS_COMPARE_FILES_DIALOG);
-
- g_signal_connect(cs->win, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(cs->win, "destroy", G_CALLBACK(win_destroy_cb), cs);
-
- gtk_widget_show_all(cs->win);
- window_present(cs->win);
-
- cf_retap_packets(&cfile);
-}
-
-static GtkWidget *dlg=NULL;
-static GtkWidget *filter_entry;
-
-static void
-comparestat_start_button_clicked(GtkWidget *item _U_, gpointer data _U_)
-{
- GString *str;
- const char *filter;
-
- compare_start=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin_start_int));
- compare_stop=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin_stop_int));
- compare_variance=gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin_var_int));
- if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio_TTL))){
- TTL_method=TRUE;
- } else {
- TTL_method=FALSE;
- }
- if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio_ON))){
- ON_method=TRUE;
- } else {
- ON_method=FALSE;
- }
-
- str = g_string_new("compare");
- g_string_append_printf(str, ",%d,%d,%d,%d,%lf",compare_start, compare_stop, TTL_method, ON_method, compare_variance);
- filter=gtk_entry_get_text(GTK_ENTRY(filter_entry));
- if(filter[0]!=0){
- g_string_append_printf(str, ",%s", filter);
- }
-
- if(first_window){
- first_window = FALSE;
- gtk_comparestat_init(str->str,NULL);
- } else {
- report_failure("cannot open more than one compare of the same type at once");
- }
-
- g_string_free(str, TRUE);
-}
-
-static void
-dlg_destroy_cb(GtkWidget *w _U_, gpointer user_data _U_)
-{
- dlg=NULL;
-}
-
-/* create and show first view of this module
- */
-void
-gtk_comparestat_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- GtkAdjustment *start_integer, *stop_integer, *var_integer;
- GtkWidget *dlg_box;
- GtkWidget *spin_start_label, *spin_stop_label, *spin_start_box, *spin_stop_box;
- GtkWidget *spin_var_box, *spin_var_label;
- GtkWidget *order_box, *radio_MAC, *order_label;
- GtkWidget *differ_box, *radio_OFF, *differ_label;
- GtkWidget *filter_box, *filter_bt;
- GtkWidget *bbox, *start_button, *cancel_button;
- const char *filter;
- static construct_args_t args = {
- "Compare statistics",
- TRUE,
- FALSE,
- FALSE
- };
-
- /* if the window is already open, bring it to front */
- if(dlg){
- gdk_window_raise(gtk_widget_get_window(dlg));
- return;
- }
-
- dlg=dlg_window_new("Wireshark: Compare two capture files");
- gtk_window_set_default_size(GTK_WINDOW(dlg), 300, -1);
-
- dlg_box=ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 10, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(dlg_box), 10);
- gtk_container_add(GTK_CONTAINER(dlg), dlg_box);
- gtk_widget_show(dlg_box);
-
- /* spin Box */
- spin_start_box=ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10, FALSE);
- spin_stop_box=ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10, FALSE);
-
- /* spin label */
- gtk_container_set_border_width(GTK_CONTAINER(spin_start_box), 1);
- spin_start_label=gtk_label_new("Start compare:");
- gtk_box_pack_start(GTK_BOX(spin_start_box), spin_start_label, FALSE, FALSE, 0);
- gtk_widget_show(spin_start_label);
- gtk_container_set_border_width(GTK_CONTAINER(spin_stop_box), 1);
- spin_stop_label=gtk_label_new("Stop compare: ");
- gtk_box_pack_start(GTK_BOX(spin_stop_box), spin_stop_label, FALSE, FALSE, 0);
- gtk_widget_show(spin_stop_label);
-
- /* create adjustments. Spans between 0 and 100, starting at 0 and
- * moves in increments of 1 */
- start_integer=GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 100.0, 1.0, 5.0, 0.0));
- stop_integer=GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 100.0, 1.0, 5.0, 0.0));
-
- /* create spin button. Not displaying decimal */
- spin_start_int=gtk_spin_button_new(start_integer, 1.0, 0);
- spin_stop_int=gtk_spin_button_new(stop_integer, 1.0, 0);
-
- /* pack it up */
- gtk_box_pack_start(GTK_BOX(spin_start_box), spin_start_int, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(spin_stop_box), spin_stop_int, TRUE, TRUE, 0);
-
- gtk_box_pack_start(GTK_BOX(dlg_box), spin_start_box, FALSE, FALSE, 0);
- gtk_widget_show(spin_start_box);
- gtk_box_pack_start(GTK_BOX(dlg_box), spin_stop_box, FALSE, FALSE, 0);
- gtk_widget_show(spin_stop_box);
-
- /* differ Box */
- differ_box=ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10, FALSE);
-
- /* radio label */
- gtk_container_set_border_width(GTK_CONTAINER(differ_box), 1);
- differ_label=gtk_label_new("Endpoint distinction:");
- gtk_box_pack_start(GTK_BOX(differ_box), differ_label, FALSE, FALSE, 0);
- gtk_widget_show(differ_label);
-
- /* create radio buttons */
- radio_MAC=gtk_radio_button_new_with_label (NULL, "MAC");
- radio_TTL=gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(radio_MAC), "TTL");
- gtk_box_pack_start(GTK_BOX(differ_box), radio_MAC, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(differ_box), radio_TTL, TRUE, TRUE, 0);
- gtk_widget_show(radio_MAC);
- gtk_widget_show(radio_TTL);
-
- gtk_box_pack_start(GTK_BOX(dlg_box), differ_box, FALSE, FALSE, 0);
- gtk_widget_show(differ_box);
-
- /* order Box */
- order_box=ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10, FALSE);
-
- /* order label */
- gtk_container_set_border_width(GTK_CONTAINER(order_box), 1);
- order_label=gtk_label_new("Check order: ");
- gtk_box_pack_start(GTK_BOX(order_box), order_label, FALSE, FALSE, 0);
- gtk_widget_show(order_label);
-
- /* create radio buttons */
- radio_ON=gtk_radio_button_new_with_label (NULL, "On");
- radio_OFF=gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(radio_ON), "Off");
- gtk_box_pack_start(GTK_BOX(order_box), radio_ON, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(order_box), radio_OFF, TRUE, TRUE, 0);
- gtk_widget_show(radio_ON);
- gtk_widget_show(radio_OFF);
-
- gtk_box_pack_start(GTK_BOX(dlg_box), order_box, FALSE, FALSE, 0);
- gtk_widget_show(order_box);
-
- /* spin box */
- spin_var_box=ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10, FALSE);
-
- /* spin label */
- gtk_container_set_border_width(GTK_CONTAINER(spin_var_box), 1);
- spin_var_label=gtk_label_new("Time variance (sec +/-):");
- gtk_box_pack_start(GTK_BOX(spin_var_box), spin_var_label, FALSE, FALSE, 0);
- gtk_widget_show(spin_var_label);
-
- /* create adjustments. Spans between 0 and 100, starting at 0 and
- * moves in increments of 1 */
- var_integer=GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 100.0, 1.0, 5.0, 0.0));
-
- /* create spin button. Not displaying decimal */
- spin_var_int=gtk_spin_button_new(var_integer, 0.0, 2);
-
- /* pack it up */
- gtk_box_pack_start(GTK_BOX(spin_var_box), spin_var_int, TRUE, TRUE, 0);
- gtk_widget_show(spin_var_int);
-
- gtk_box_pack_start(GTK_BOX(dlg_box), spin_var_box, FALSE, FALSE, 0);
- gtk_widget_show(spin_var_box);
-
- /* filter box */
- filter_box=ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
-
- /* filter label */
- filter_bt=ws_gtk_button_new_from_stock(WIRESHARK_STOCK_DISPLAY_FILTER_ENTRY);
- g_signal_connect(filter_bt, "clicked", G_CALLBACK(display_filter_construct_cb), &args);
- gtk_box_pack_start(GTK_BOX(filter_box), filter_bt, FALSE, TRUE, 0);
- gtk_widget_show(filter_bt);
-
- /* filter entry */
- filter_entry=gtk_entry_new();
- g_signal_connect(filter_entry, "changed", G_CALLBACK(filter_te_syntax_check_cb), NULL);
- g_object_set_data(G_OBJECT(filter_box), E_FILT_AUTOCOMP_PTR_KEY, NULL);
- g_signal_connect(filter_entry, "key-press-event", G_CALLBACK (filter_string_te_key_pressed_cb), NULL);
- g_signal_connect(dlg, "key-press-event", G_CALLBACK (filter_parent_dlg_key_pressed_cb), NULL);
-
- /* filter prefs dialog */
- g_object_set_data(G_OBJECT(filter_bt), E_FILT_TE_PTR_KEY, filter_entry);
- /* filter prefs dialog */
-
- gtk_box_pack_start(GTK_BOX(filter_box), filter_entry, TRUE, TRUE, 0);
- filter=gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget));
- if(filter){
- gtk_entry_set_text(GTK_ENTRY(filter_entry), filter);
- }
- gtk_widget_show(filter_entry);
-
- gtk_box_pack_start(GTK_BOX(dlg_box), filter_box, TRUE, TRUE, 0);
- gtk_widget_show(filter_box);
-
- /* button box */
- bbox = dlg_button_row_new(WIRESHARK_STOCK_CREATE_STAT, GTK_STOCK_CANCEL, NULL);
- gtk_box_pack_start(GTK_BOX(dlg_box), bbox, FALSE, FALSE, 0);
- gtk_widget_show(bbox);
-
- start_button = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_CREATE_STAT);
- g_signal_connect_swapped(start_button, "clicked", G_CALLBACK(comparestat_start_button_clicked), NULL);
-
- cancel_button = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- window_set_cancel_button(dlg, cancel_button, window_cancel_button_cb);
-
- /* give the initial focus to the "filter" entry box. */
- gtk_widget_grab_focus(filter_entry);
-
- gtk_widget_grab_default(start_button );
-
- g_signal_connect(dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(dlg, "destroy", G_CALLBACK(dlg_destroy_cb), NULL);
-
- gtk_widget_show_all(dlg);
- window_present(dlg);
-}
-
-static stat_tap_ui compare_stat_ui = {
- REGISTER_STAT_GROUP_GENERIC,
- NULL,
- "compare",
- gtk_comparestat_init,
- 0,
- NULL
-};
-
-void
-register_tap_listener_gtkcomparestat(void)
-{
- register_stat_tap_ui(&compare_stat_ui, NULL);
-}
-
-/*
- * Editor modelines - http://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/gtk/conversation_hastables_dlg.c b/ui/gtk/conversation_hastables_dlg.c
deleted file mode 100644
index be01abd2e5..0000000000
--- a/ui/gtk/conversation_hastables_dlg.c
+++ /dev/null
@@ -1,176 +0,0 @@
-/* conversation_hastables_dlg.c
- * Show conversation hastable info
- *
- * Copyright 2013 Anders Broman <anders.broman@ericsson.com>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/conversation.h>
-
-
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/font_utils.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/conversation_hastables_dlg.h"
-
-static GtkWidget *conversation_hastables_dlg_w = NULL;
-
-#define CONV_STR_BUF_MAX 1024
-
-static void
-conversation_hashtable_exact_to_texbuff(gpointer key, gpointer value _U_, gpointer user_data)
-{
- gchar string_buff[CONV_STR_BUF_MAX];
- GtkTextBuffer *buffer = (GtkTextBuffer*)user_data;
-
- g_snprintf(string_buff, CONV_STR_BUF_MAX, "Key:0x%x\n",conversation_hash_exact(key));
-
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
-}
-
-static void
-conversation_info_to_texbuff(GtkTextBuffer *buffer)
-{
- gchar string_buff[CONV_STR_BUF_MAX];
- wmem_map_t *conversation_hashtable_exact;
- wmem_map_t *conversation_hashtable_no_addr2;
- wmem_map_t *conversation_hashtable_no_port2;
- wmem_map_t *conversation_hashtable_no_addr2_or_port2;
-
- g_snprintf(string_buff, CONV_STR_BUF_MAX, "Conversation hastables info:\n");
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- conversation_hashtable_exact = get_conversation_hashtable_exact();
- if(conversation_hashtable_exact){
- g_snprintf(string_buff, CONV_STR_BUF_MAX, "conversation_hashtable_exact %i entries\n#\n",
- wmem_map_size(conversation_hashtable_exact));
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
- wmem_map_foreach( conversation_hashtable_exact, conversation_hashtable_exact_to_texbuff, buffer);
- }
-
- conversation_hashtable_no_addr2 = get_conversation_hashtable_no_addr2();
- if(conversation_hashtable_no_addr2){
- g_snprintf(string_buff, CONV_STR_BUF_MAX, "conversation_hashtable_no_addr2 %i entries\n#\n",
- wmem_map_size(conversation_hashtable_no_addr2));
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- }
-
- conversation_hashtable_no_port2 = get_conversation_hashtable_no_port2();
- if(conversation_hashtable_no_port2){
- g_snprintf(string_buff, CONV_STR_BUF_MAX, "conversation_hashtable_no_port2 %i entries\n#\n",
- wmem_map_size(conversation_hashtable_no_port2));
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- }
-
- conversation_hashtable_no_addr2_or_port2 = get_conversation_hashtable_no_addr2_or_port2();
- if(conversation_hashtable_no_addr2_or_port2){
- g_snprintf(string_buff, CONV_STR_BUF_MAX, "conversation_hashtable_no_addr2_or_port2 %i entries\n#\n",
- wmem_map_size(conversation_hashtable_no_addr2_or_port2));
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- }
-
-}
-
-void
-conversation_hastables_dlg (GtkAction *action _U_, gpointer data _U_)
-{
-
- GtkWidget *vbox;
- GtkWidget *view;
- GtkWidget *scroll;
- GtkWidget *bbox;
- GtkWidget *ok_bt, *cancel_bt, *help_bt;
- GtkTextBuffer *buffer;
-
- conversation_hastables_dlg_w = dlg_window_new ("Conversation hastables");
- gtk_widget_set_size_request (conversation_hastables_dlg_w, 750, 350);
- gtk_window_set_resizable (GTK_WINDOW (conversation_hastables_dlg_w), TRUE);
- gtk_container_set_border_width (GTK_CONTAINER (conversation_hastables_dlg_w), DLG_OUTER_MARGIN);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
- gtk_container_add (GTK_CONTAINER (conversation_hastables_dlg_w), vbox);
- gtk_widget_show (vbox);
-
- view = gtk_text_view_new ();
- gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view), GTK_WRAP_WORD);
- buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
-#if GTK_CHECK_VERSION(3, 0, 0)
- gtk_widget_override_font(view, user_font_get_regular());
-#else
- gtk_widget_modify_font(view, user_font_get_regular());
-#endif
- gtk_widget_show (view);
-
- scroll = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll),
- GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- gtk_container_add(GTK_CONTAINER(scroll), view);
- gtk_widget_show(scroll);
- gtk_box_pack_start(GTK_BOX (vbox), scroll, TRUE, TRUE, 0);
-
- /* Get the address list */
- conversation_info_to_texbuff(buffer);
-
- /* Button row. */
- bbox = dlg_button_row_new (GTK_STOCK_OK, GTK_STOCK_CANCEL, GTK_STOCK_HELP, NULL);
- gtk_box_pack_end (GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
-
- ok_bt = (GtkWidget *)g_object_get_data (G_OBJECT(bbox), GTK_STOCK_OK);
- /*g_signal_connect (ok_bt, "clicked", G_CALLBACK(pkt_comment_text_buff_ok_cb), view);*/
- gtk_widget_set_sensitive (ok_bt, TRUE);
-
- cancel_bt = (GtkWidget *)g_object_get_data (G_OBJECT(bbox), GTK_STOCK_CANCEL);
- window_set_cancel_button (conversation_hastables_dlg_w, cancel_bt, window_cancel_button_cb);
-
- help_bt = (GtkWidget *)g_object_get_data (G_OBJECT(bbox), GTK_STOCK_HELP);
-#if 0
- g_signal_connect (help_bt, "clicked",/* G_CALLBACK(topic_cb)*/NULL, /*(gpointer)HELP_MANUAL_ADDR_RESOLVE_DIALOG*/NULL);
-#endif
- gtk_widget_set_sensitive (help_bt, FALSE);
-
- gtk_widget_grab_default (ok_bt);
- /*g_signal_connect (conversation_hastables_dlg_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);*/
-
-
- gtk_widget_show (conversation_hastables_dlg_w);
-}
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/conversation_hastables_dlg.h b/ui/gtk/conversation_hastables_dlg.h
deleted file mode 100644
index 69fc4b0ade..0000000000
--- a/ui/gtk/conversation_hastables_dlg.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* conversation_hastables_dlg.h
- * Show current addres resolution as a hosts file
- *
- * Copyright 2013 Anders Broman <anders.broman@ericsson.com>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __CONVERSATION_HASTABLES_DLG_H__
-#define __CONVERSATION_HASTABLES_DLG_H__
-
-void conversation_hastables_dlg (GtkAction *action, gpointer data);
-
-#endif /* __conversation_hastables_dlg_H__ */
diff --git a/ui/gtk/conversations_table.c b/ui/gtk/conversations_table.c
deleted file mode 100644
index 790a132130..0000000000
--- a/ui/gtk/conversations_table.c
+++ /dev/null
@@ -1,2608 +0,0 @@
-/* conversations_table.c
- * conversations_table 2003 Ronnie Sahlberg
- * Helper routines common to all endpoint conversations tap.
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/addr_resolv.h>
-
-#include <epan/stat_groups.h>
-
-#include "ui/simple_dialog.h"
-#include <wsutil/utf8_entities.h>
-
-#include "ui/gtk/conversations_table.h"
-#include "ui/gtk/filter_utils.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/gui_stat_menu.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/follow_stream.h"
-#include "ui/gtk/keys.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-#include "globals.h"
-
-#define COL_STR_LEN 16
-#define CONV_PTR_KEY "conversations-pointer"
-#define NB_PAGES_KEY "notebook-pages"
-#define FOLLOW_STREAM_BT_KEY "follow-stream-button"
-#define GRAPH_A_B_BT_KEY "graph-a-b-button"
-#define GRAPH_B_A_BT_KEY "graph-b-a-button"
-#define NO_BPS_STR "N/A"
-#define CONV_DLG_HEIGHT 550
-
-#define CMP_NUM(n1, n2) \
- if ((n1) > (n2)) \
- return 1; \
- else if ((n1) < (n2)) \
- return -1; \
- else \
- return 0;
-
-static void
-reset_ct_table_data(conversations_table *ct)
-{
- char *display_name;
- char title[256];
- GString *error_string;
- const char *filter;
- GtkListStore *store;
-
- if (ct->use_dfilter) {
- filter = gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget));
- } else {
- filter = ct->filter;
- }
-
- error_string = set_tap_dfilter (&ct->hash, filter);
- if (error_string) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
- g_string_free(error_string, TRUE);
- return;
- }
-
- if(ct->page_lb) {
- display_name = cf_get_display_name(&cfile);
- g_snprintf(title, sizeof(title), "Conversations: %s", display_name);
- g_free(display_name);
- gtk_window_set_title(GTK_WINDOW(ct->win), title);
- g_snprintf(title, sizeof(title), "%s", ct->name);
- gtk_label_set_text(GTK_LABEL(ct->page_lb), title);
- gtk_widget_set_sensitive(ct->page_lb, FALSE);
-
- if (ct->use_dfilter) {
- if (filter && strlen(filter)) {
- g_snprintf(title, sizeof(title), "%s Conversations - Filter: %s", ct->name, filter);
- } else {
- g_snprintf(title, sizeof(title), "%s Conversations - No Filter", ct->name);
- }
- } else {
- g_snprintf(title, sizeof(title), "%s Conversations", ct->name);
- }
- gtk_label_set_text(GTK_LABEL(ct->name_lb), title);
- } else {
- display_name = cf_get_display_name(&cfile);
- g_snprintf(title, sizeof(title), "%s Conversations: %s", ct->name, display_name);
- g_free(display_name);
- gtk_window_set_title(GTK_WINDOW(ct->win), title);
- }
-
- /* remove all entries from the list */
- store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(ct->table)));
- gtk_list_store_clear(store);
-
- /* delete all conversations */
- reset_conversation_table_data(&ct->hash);
-}
-
-static void
-reset_ct_table_data_cb(void *arg)
-{
- conv_hash_t *hash = (conv_hash_t*)arg;
-
- reset_ct_table_data((conversations_table *)hash->user_data);
-}
-
-static void
-ct_win_destroy_cb(GtkWindow *win _U_, gpointer data)
-{
- conversations_table *conversations=(conversations_table *)data;
-
- remove_tap_listener(&conversations->hash);
-
- reset_ct_table_data(conversations);
- g_free(conversations);
-}
-
-static gint
-ct_sort_func(GtkTreeModel *model,
- GtkTreeIter *a,
- GtkTreeIter *b,
- gpointer user_data)
-{
- guint32 idx1, idx2;
- /* The col to get data from is in userdata */
- gint data_column = GPOINTER_TO_INT(user_data);
-
- conversations_table *ct = (conversations_table *)g_object_get_data(G_OBJECT(model), CONV_PTR_KEY);
- conv_item_t *conv1 = NULL;
- conv_item_t *conv2 = NULL;
- double duration1, duration2;
-
- gtk_tree_model_get(model, a, CONV_INDEX_COLUMN, &idx1, -1);
- gtk_tree_model_get(model, b, CONV_INDEX_COLUMN, &idx2, -1);
-
- if (!ct || idx1 >= ct->hash.conv_array->len || idx2 >= ct->hash.conv_array->len)
- return 0;
-
- conv1 = &g_array_index(ct->hash.conv_array, conv_item_t, idx1);
- conv2 = &g_array_index(ct->hash.conv_array, conv_item_t, idx2);
-
-
- switch(data_column){
- case CONV_COLUMN_SRC_ADDR: /* Source address */
- return(cmp_address(&conv1->src_address, &conv2->src_address));
- case CONV_COLUMN_DST_ADDR: /* Destination address */
- return(cmp_address(&conv1->dst_address, &conv2->dst_address));
- case CONV_COLUMN_SRC_PORT: /* Source port */
- CMP_NUM(conv1->src_port, conv2->src_port);
- case CONV_COLUMN_DST_PORT: /* Destination port */
- CMP_NUM(conv1->dst_port, conv2->dst_port);
- case CONV_COLUMN_START: /* Start time */
- return nstime_cmp(&conv1->start_time, &conv2->start_time);
- }
-
- duration1 = nstime_to_sec(&conv1->stop_time) - nstime_to_sec(&conv1->start_time);
- duration2 = nstime_to_sec(&conv2->stop_time) - nstime_to_sec(&conv2->start_time);
-
- switch(data_column){
- case CONV_COLUMN_DURATION: /* Duration */
- CMP_NUM(duration1, duration2);
- case CONV_COLUMN_BPS_AB: /* bps A->B */
- if (duration1 > 0 && conv1->tx_frames > 1 && duration2 > 0 && conv2->tx_frames > 1) {
- CMP_NUM((gint64) conv1->tx_bytes / duration1, (gint64) conv2->tx_bytes / duration2);
- } else {
- CMP_NUM(conv1->tx_bytes, conv2->tx_bytes);
- }
- case CONV_COLUMN_BPS_BA: /* bps A<-B */
- if (duration1 > 0 && conv1->rx_frames > 1 && duration2 > 0 && conv2->rx_frames > 1) {
- CMP_NUM((gint64) conv1->rx_bytes / duration1, (gint64) conv2->rx_bytes / duration2);
- } else {
- CMP_NUM(conv1->rx_bytes, conv2->rx_bytes);
- }
- default:
- g_assert_not_reached();
- }
-
- return 0;
-}
-
-static void
-ct_select_filter_cb(GtkWidget *widget _U_, gpointer callback_data, guint callback_action)
-{
- conv_direction_e direction;
- guint32 idx = 0;
- conversations_table *ct = (conversations_table *)callback_data;
- GtkTreeIter iter;
- GtkTreeModel *model;
- GtkTreeSelection *sel;
- const char *str;
- conv_item_t *conv;
-
- direction = (conv_direction_e) FILTER_EXTRA(callback_action);
-
- sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(ct->table));
- if (!gtk_tree_selection_get_selected(sel, &model, &iter))
- return;
-
- gtk_tree_model_get (model, &iter,
- CONV_INDEX_COLUMN, &idx,
- -1);
-
- if(idx >= ct->hash.conv_array->len){
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "No conversation selected");
- return;
- }
- conv = &g_array_index(ct->hash.conv_array, conv_item_t, idx);
-
- str = get_conversation_filter(conv, direction);
-
- apply_selected_filter(callback_action, str);
- g_free((char*)str);
-}
-
-static gboolean
-ct_show_popup_menu_cb(void *widg _U_, GdkEvent *event, conversations_table *ct)
-{
- GdkEventButton *bevent = (GdkEventButton *)event;
-
- if(event->type==GDK_BUTTON_PRESS && bevent->button==3){
- gtk_menu_popup(GTK_MENU(ct->menu), NULL, NULL, NULL, NULL,
- bevent->button, bevent->time);
- }
-
- return FALSE;
-}
-
-
-/* As Selected */
-static void
-conv_apply_as_selected_AtofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_SELECTED, CONV_DIR_A_TO_FROM_B));
-}
-
-static void
-conv_apply_as_selected_AtoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_SELECTED, CONV_DIR_A_TO_B));
-}
-
-static void
-conv_apply_as_selected_AfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_SELECTED, CONV_DIR_A_FROM_B));
-}
-
-static void
-conv_apply_as_selected_AtofromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_SELECTED, CONV_DIR_A_TO_FROM_ANY));
-}
-
-static void
-conv_apply_as_selected_AtoAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_SELECTED, CONV_DIR_A_TO_ANY));
-}
-
-static void
-conv_apply_as_selected_AfromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_SELECTED, CONV_DIR_A_FROM_ANY));
-}
-
-static void
-conv_apply_as_selected_AnytofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_SELECTED, CONV_DIR_ANY_TO_FROM_B));
-}
-
-
-static void
-conv_apply_as_selected_AnyfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_SELECTED, CONV_DIR_ANY_FROM_B));
-}
-
-static void
-conv_apply_as_selected_AnytoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_SELECTED, CONV_DIR_ANY_TO_B));
-}
-
-/* As Not Selected */
-static void
-conv_apply_as_not_selected_AtofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_NOT_SELECTED, CONV_DIR_A_TO_FROM_B));
-}
-
-static void
-conv_apply_as_not_selected_AtoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_NOT_SELECTED, CONV_DIR_A_TO_B));
-}
-
-static void
-conv_apply_as_not_selected_AfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_NOT_SELECTED, CONV_DIR_A_FROM_B));
-}
-
-static void
-conv_apply_as_not_selected_AtofromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_NOT_SELECTED, CONV_DIR_A_TO_FROM_ANY));
-}
-
-static void
-conv_apply_as_not_selected_AtoAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_NOT_SELECTED, CONV_DIR_A_TO_ANY));
-}
-
-static void
-conv_apply_as_not_selected_AfromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_NOT_SELECTED, CONV_DIR_A_FROM_ANY));
-}
-
-static void
-conv_apply_as_not_selected_AnytofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_NOT_SELECTED, CONV_DIR_ANY_TO_FROM_B));
-}
-
-static void
-conv_apply_as_not_selected_AnyfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_NOT_SELECTED, CONV_DIR_ANY_FROM_B));
-}
-
-static void
-conv_apply_as_not_selected_AnytoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_NOT_SELECTED, CONV_DIR_ANY_TO_B));
-}
-
-/* And Selected */
-static void
-conv_apply_and_selected_AtofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_AND_SELECTED, CONV_DIR_A_TO_FROM_B));
-}
-
-static void
-conv_apply_and_selected_AtoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_AND_SELECTED, CONV_DIR_A_TO_B));
-}
-
-static void
-conv_apply_and_selected_AfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_AND_SELECTED, CONV_DIR_A_FROM_B));
-}
-
-static void
-conv_apply_and_selected_AtofromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_AND_SELECTED, CONV_DIR_A_TO_FROM_ANY));
-}
-
-static void
-conv_apply_and_selected_AtoAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_AND_SELECTED, CONV_DIR_A_TO_ANY));
-}
-
-static void
-conv_apply_and_selected_AfromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_AND_SELECTED, CONV_DIR_A_FROM_ANY));
-}
-
-static void
-conv_apply_and_selected_AnytofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_AND_SELECTED, CONV_DIR_ANY_TO_FROM_B));
-}
-
-static void
-conv_apply_and_selected_AnyfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_AND_SELECTED, CONV_DIR_ANY_FROM_B));
-}
-
-static void
-conv_apply_and_selected_AnytoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_AND_SELECTED, CONV_DIR_ANY_TO_B));
-}
-
-/* Or Selected */
-static void
-conv_apply_or_selected_AtofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_OR_SELECTED, CONV_DIR_A_TO_FROM_B));
-}
-
-static void
-conv_apply_or_selected_AtoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_OR_SELECTED, CONV_DIR_A_TO_B));
-}
-
-static void
-conv_apply_or_selected_AfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_OR_SELECTED, CONV_DIR_A_FROM_B));
-}
-
-static void
-conv_apply_or_selected_AtofromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_OR_SELECTED, CONV_DIR_A_TO_FROM_ANY));
-}
-
-static void
-conv_apply_or_selected_AtoAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_OR_SELECTED, CONV_DIR_A_TO_ANY));
-}
-
-static void
-conv_apply_or_selected_AfromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_OR_SELECTED, CONV_DIR_A_FROM_ANY));
-}
-
-static void
-conv_apply_or_selected_AnytofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_OR_SELECTED, CONV_DIR_ANY_TO_FROM_B));
-}
-
-static void
-conv_apply_or_selected_AnyfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_OR_SELECTED, CONV_DIR_ANY_FROM_B));
-}
-
-static void
-conv_apply_or_selected_AnytoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_OR_SELECTED, CONV_DIR_ANY_TO_B));
-}
-
-/* And Not Selected */
-static void
-conv_apply_and_not_selected_AtofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_AND_NOT_SELECTED, CONV_DIR_A_TO_FROM_B));
-}
-
-static void
-conv_apply_and_not_selected_AtoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_AND_NOT_SELECTED, CONV_DIR_A_TO_B));
-}
-
-static void
-conv_apply_and_not_selected_AfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_AND_NOT_SELECTED, CONV_DIR_A_FROM_B));
-}
-
-static void
-conv_apply_and_not_selected_AtofromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_AND_NOT_SELECTED, CONV_DIR_A_TO_FROM_ANY));
-}
-
-static void
-conv_apply_and_not_selected_AtoAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_AND_NOT_SELECTED, CONV_DIR_A_TO_ANY));
-}
-
-static void
-conv_apply_and_not_selected_AfromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_AND_NOT_SELECTED, CONV_DIR_A_FROM_ANY));
-}
-
-static void
-conv_apply_and_not_selected_AnytofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_AND_NOT_SELECTED, CONV_DIR_ANY_TO_FROM_B));
-}
-
-static void
-conv_apply_and_not_selected_AnyfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_AND_NOT_SELECTED, CONV_DIR_ANY_FROM_B));
-}
-
-static void
-conv_apply_and_not_selected_AnytoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_AND_NOT_SELECTED, CONV_DIR_ANY_TO_B));
-}
-
-/* Or Not Selected */
-static void
-conv_apply_or_not_selected_AtofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_OR_NOT_SELECTED, CONV_DIR_A_TO_FROM_B));
-}
-
-static void
-conv_apply_or_not_selected_AtoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_AND_NOT_SELECTED, CONV_DIR_A_TO_B));
-}
-
-static void
-conv_apply_or_not_selected_AfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_OR_NOT_SELECTED, CONV_DIR_A_FROM_B));
-}
-
-static void
-conv_apply_or_not_selected_AtofromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_OR_NOT_SELECTED, CONV_DIR_A_TO_FROM_ANY));
-}
-
-static void
-conv_apply_or_not_selected_AtoAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_OR_NOT_SELECTED, CONV_DIR_A_TO_ANY));
-}
-
-static void
-conv_apply_or_not_selected_AfromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_OR_NOT_SELECTED, CONV_DIR_A_FROM_ANY));
-}
-
-static void
-conv_apply_or_not_selected_AnytofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_OR_NOT_SELECTED, CONV_DIR_ANY_TO_FROM_B));
-}
-
-static void
-conv_apply_or_not_selected_AnyfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_OR_NOT_SELECTED, CONV_DIR_ANY_FROM_B));
-}
-
-static void
-conv_apply_or_not_selected_AnytoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_MATCH(ACTYPE_OR_NOT_SELECTED, CONV_DIR_ANY_TO_B));
-}
-
-
-/* Prepare As Selected*/
-static void
-conv_prepare_as_selected_AtofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_SELECTED, CONV_DIR_A_TO_FROM_B));
-}
-
-static void
-conv_prepare_as_selected_AtoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_SELECTED, CONV_DIR_A_TO_B));
-}
-
-static void
-conv_prepare_as_selected_AfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_SELECTED, CONV_DIR_A_FROM_B));
-}
-
-static void
-conv_prepare_as_selected_AtofromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_SELECTED, CONV_DIR_A_TO_FROM_ANY));
-}
-
-static void
-conv_prepare_as_selected_AtoAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_SELECTED, CONV_DIR_A_TO_ANY));
-}
-
-static void
-conv_prepare_as_selected_AfromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_SELECTED, CONV_DIR_A_FROM_ANY));
-}
-
-static void
-conv_prepare_as_selected_AnytofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_SELECTED, CONV_DIR_ANY_TO_FROM_B));
-}
-
-static void
-conv_prepare_as_selected_AnyfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_SELECTED, CONV_DIR_ANY_FROM_B));
-}
-
-static void
-conv_prepare_as_selected_AnytoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_SELECTED, CONV_DIR_ANY_TO_B));
-}
-
-/* Prepare As Not Selected */
-static void
-conv_prepare_as_not_selected_AtofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_NOT_SELECTED, CONV_DIR_A_TO_FROM_B));
-}
-
-static void
-conv_prepare_as_not_selected_AtoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_NOT_SELECTED, CONV_DIR_A_TO_B));
-}
-
-static void
-conv_prepare_as_not_selected_AfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_NOT_SELECTED, CONV_DIR_A_FROM_B));
-}
-
-static void
-conv_prepare_as_not_selected_AtofromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_NOT_SELECTED, CONV_DIR_A_TO_FROM_ANY));
-}
-
-static void
-conv_prepare_as_not_selected_AtoAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_NOT_SELECTED, CONV_DIR_A_TO_ANY));
-}
-
-static void
-conv_prepare_as_not_selected_AfromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_NOT_SELECTED, CONV_DIR_A_FROM_ANY));
-}
-
-static void
-conv_prepare_as_not_selected_AnytofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_NOT_SELECTED, CONV_DIR_ANY_TO_FROM_B));
-}
-
-static void
-conv_prepare_as_not_selected_AnyfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_NOT_SELECTED, CONV_DIR_ANY_FROM_B));
-}
-
-static void
-conv_prepare_as_not_selected_AnytoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_NOT_SELECTED, CONV_DIR_ANY_TO_B));
-}
-
-/* Prepare And Selected */
-static void
-conv_prepare_and_selected_AtofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_AND_SELECTED, CONV_DIR_A_TO_FROM_B));
-}
-
-static void
-conv_prepare_and_selected_AtoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_AND_SELECTED, CONV_DIR_A_TO_B));
-}
-
-static void
-conv_prepare_and_selected_AfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_AND_SELECTED, CONV_DIR_A_FROM_B));
-}
-
-static void
-conv_prepare_and_selected_AtofromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_AND_SELECTED, CONV_DIR_A_TO_FROM_ANY));
-}
-
-static void
-conv_prepare_and_selected_AtoAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_AND_SELECTED, CONV_DIR_A_TO_ANY));
-}
-
-static void
-conv_prepare_and_selected_AfromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_AND_SELECTED, CONV_DIR_A_FROM_ANY));
-}
-
-static void
-conv_prepare_and_selected_AnytofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_AND_SELECTED, CONV_DIR_ANY_TO_FROM_B));
-}
-
-static void
-conv_prepare_and_selected_AnyfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_AND_SELECTED, CONV_DIR_ANY_FROM_B));
-}
-
-static void
-conv_prepare_and_selected_AnytoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_AND_SELECTED, CONV_DIR_ANY_TO_B));
-}
-
-/* Prepare Or Selected */
-static void
-conv_prepare_or_selected_AtofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_OR_SELECTED, CONV_DIR_A_TO_FROM_B));
-}
-
-static void
-conv_prepare_or_selected_AtoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_OR_SELECTED, CONV_DIR_A_TO_B));
-}
-
-static void
-conv_prepare_or_selected_AfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_OR_SELECTED, CONV_DIR_A_FROM_B));
-}
-
-static void
-conv_prepare_or_selected_AtofromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_OR_SELECTED, CONV_DIR_A_TO_FROM_ANY));
-}
-
-static void
-conv_prepare_or_selected_AtoAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_OR_SELECTED, CONV_DIR_A_TO_ANY));
-}
-
-static void
-conv_prepare_or_selected_AfromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_OR_SELECTED, CONV_DIR_A_FROM_ANY));
-}
-
-static void
-conv_prepare_or_selected_AnytofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_OR_SELECTED, CONV_DIR_ANY_TO_FROM_B));
-}
-
-static void
-conv_prepare_or_selected_AnyfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_OR_SELECTED, CONV_DIR_ANY_FROM_B));
-}
-
-static void
-conv_prepare_or_selected_AnytoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_OR_SELECTED, CONV_DIR_ANY_TO_B));
-}
-
-/* Prepare And Not Selected */
-static void
-conv_prepare_and_not_selected_AtofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_AND_NOT_SELECTED, CONV_DIR_A_TO_FROM_B));
-}
-
-static void
-conv_prepare_and_not_selected_AtoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_AND_NOT_SELECTED, CONV_DIR_A_TO_B));
-}
-
-static void
-conv_prepare_and_not_selected_AfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_AND_NOT_SELECTED, CONV_DIR_A_FROM_B));
-}
-
-static void
-conv_prepare_and_not_selected_AtofromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_AND_NOT_SELECTED, CONV_DIR_A_TO_FROM_ANY));
-}
-
-static void
-conv_prepare_and_not_selected_AtoAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_AND_NOT_SELECTED, CONV_DIR_A_TO_ANY));
-}
-
-static void
-conv_prepare_and_not_selected_AfromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_AND_NOT_SELECTED, CONV_DIR_A_FROM_ANY));
-}
-
-static void
-conv_prepare_and_not_selected_AnytofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_AND_NOT_SELECTED, CONV_DIR_ANY_TO_FROM_B));
-}
-
-static void
-conv_prepare_and_not_selected_AnyfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_AND_NOT_SELECTED, CONV_DIR_ANY_FROM_B));
-}
-
-static void
-conv_prepare_and_not_selected_AnytoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_AND_NOT_SELECTED, CONV_DIR_ANY_TO_B));
-}
-
-/* Prepare Or Not Selected */
-static void
-conv_prepare_or_not_selected_AtofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_OR_NOT_SELECTED, CONV_DIR_A_TO_FROM_B));
-}
-
-static void
-conv_prepare_or_not_selected_AtoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_AND_NOT_SELECTED, CONV_DIR_A_TO_B));
-}
-
-static void
-conv_prepare_or_not_selected_AfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_OR_NOT_SELECTED, CONV_DIR_A_FROM_B));
-}
-
-static void
-conv_prepare_or_not_selected_AtofromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_OR_NOT_SELECTED, CONV_DIR_A_TO_FROM_ANY));
-}
-
-static void
-conv_prepare_or_not_selected_AtoAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_OR_NOT_SELECTED, CONV_DIR_A_TO_ANY));
-}
-
-static void
-conv_prepare_or_not_selected_AfromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_OR_NOT_SELECTED, CONV_DIR_A_FROM_ANY));
-}
-
-static void
-conv_prepare_or_not_selected_AnytofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_OR_NOT_SELECTED, CONV_DIR_ANY_TO_FROM_B));
-}
-
-static void
-conv_prepare_or_not_selected_AnyfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_OR_NOT_SELECTED, CONV_DIR_ANY_FROM_B));
-}
-
-static void
-conv_prepare_or_not_selected_AnytoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_PREPARE(ACTYPE_OR_NOT_SELECTED, CONV_DIR_ANY_TO_B));
-}
-
-/* Find packet */
-static void
-conv_find_AtofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_FRAME(ACTYPE_SELECTED, CONV_DIR_A_TO_FROM_B));
-}
-
-static void
-conv_find_AtoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_FRAME(ACTYPE_SELECTED, CONV_DIR_A_TO_B));
-}
-
-static void
-conv_find_AfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_FRAME(ACTYPE_SELECTED, CONV_DIR_A_FROM_B));
-}
-
-static void
-conv_find_AtofromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_FRAME(ACTYPE_SELECTED, CONV_DIR_A_TO_FROM_ANY));
-}
-
-static void
-conv_find_AtoAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_FRAME(ACTYPE_SELECTED, CONV_DIR_A_TO_ANY));
-}
-
-static void
-conv_find_AfromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_FRAME(ACTYPE_SELECTED, CONV_DIR_A_FROM_ANY));
-}
-
-static void
-conv_find_AnytofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_FRAME(ACTYPE_SELECTED, CONV_DIR_ANY_TO_FROM_B));
-}
-
-static void
-conv_find_AnyfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_FRAME(ACTYPE_SELECTED, CONV_DIR_ANY_FROM_B));
-}
-
-static void
-conv_find_AnytoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_FRAME(ACTYPE_SELECTED, CONV_DIR_ANY_TO_B));
-}
-
-/* Find next */
-static void
-conv_find_next_AtofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_NEXT(ACTYPE_NOT_SELECTED, CONV_DIR_A_TO_FROM_B));
-}
-
-static void
-conv_find_next_AtoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_NEXT(ACTYPE_NOT_SELECTED, CONV_DIR_A_TO_B));
-}
-
-static void
-conv_find_next_AfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_NEXT(ACTYPE_NOT_SELECTED, CONV_DIR_A_FROM_B));
-}
-
-static void
-conv_find_next_AtofromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_NEXT(ACTYPE_NOT_SELECTED, CONV_DIR_A_TO_FROM_ANY));
-}
-
-static void
-conv_find_next_AtoAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_NEXT(ACTYPE_NOT_SELECTED, CONV_DIR_A_TO_ANY));
-}
-
-static void
-conv_find_next_AfromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_NEXT(ACTYPE_NOT_SELECTED, CONV_DIR_A_FROM_ANY));
-}
-
-static void
-conv_find_next_AnytofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_NEXT(ACTYPE_NOT_SELECTED, CONV_DIR_ANY_TO_FROM_B));
-}
-
-static void
-conv_find_next_AnyfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_NEXT(ACTYPE_NOT_SELECTED, CONV_DIR_ANY_FROM_B));
-}
-
-static void
-conv_find_next_AnytoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_NEXT(ACTYPE_NOT_SELECTED, CONV_DIR_ANY_TO_B));
-}
-
-/* Find Previous */
-static void
-conv_find_previous_AtofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_PREVIOUS(ACTYPE_AND_SELECTED, CONV_DIR_A_TO_FROM_B));
-}
-
-static void
-conv_find_previous_AtoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_PREVIOUS(ACTYPE_AND_SELECTED, CONV_DIR_A_TO_B));
-}
-
-static void
-conv_find_previous_AfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_PREVIOUS(ACTYPE_AND_SELECTED, CONV_DIR_A_FROM_B));
-}
-
-static void
-conv_find_previous_AtofromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_PREVIOUS(ACTYPE_AND_SELECTED, CONV_DIR_A_TO_FROM_ANY));
-}
-
-static void
-conv_find_previous_AtoAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_PREVIOUS(ACTYPE_AND_SELECTED, CONV_DIR_A_TO_ANY));
-}
-
-static void
-conv_find_previous_AfromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_PREVIOUS(ACTYPE_AND_SELECTED, CONV_DIR_A_FROM_ANY));
-}
-
-static void
-conv_find_previous_AnytofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_PREVIOUS(ACTYPE_AND_SELECTED, CONV_DIR_ANY_TO_FROM_B));
-}
-
-static void
-conv_find_previous_AnyfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_PREVIOUS(ACTYPE_AND_SELECTED, CONV_DIR_ANY_FROM_B));
-}
-
-static void
-conv_find_previous_AnytoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_FIND_PREVIOUS(ACTYPE_AND_SELECTED, CONV_DIR_ANY_TO_B));
-}
-
-/* Colorize Conversation */
-
-static void
-conv_color_AtofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_COLORIZE(ACTYPE_SELECTED, CONV_DIR_A_TO_FROM_B));
-}
-
-static void
-conv_color_AtoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_COLORIZE(ACTYPE_SELECTED, CONV_DIR_A_TO_B));
-}
-
-static void
-conv_color_AfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_COLORIZE(ACTYPE_SELECTED, CONV_DIR_A_FROM_B));
-}
-
-static void
-conv_color_AtofromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_COLORIZE(ACTYPE_SELECTED, CONV_DIR_A_TO_FROM_ANY));
-}
-
-static void
-conv_color_AtoAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_COLORIZE(ACTYPE_SELECTED, CONV_DIR_A_TO_ANY));
-}
-
-static void
-conv_color_AfromAny_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_COLORIZE(ACTYPE_SELECTED, CONV_DIR_A_FROM_ANY));
-}
-
-static void
-conv_color_AnytofromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_COLORIZE(ACTYPE_SELECTED, CONV_DIR_ANY_TO_FROM_B));
-}
-
-static void
-conv_color_AnyfromB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_COLORIZE(ACTYPE_SELECTED, CONV_DIR_ANY_FROM_B));
-}
-
-static void
-conv_color_AnytoB_cb(GtkAction *action _U_, gpointer user_data)
-{
- ct_select_filter_cb( NULL, user_data, CALLBACK_COLORIZE(ACTYPE_SELECTED, CONV_DIR_ANY_TO_B));
-}
-static const char *ui_desc_conv_filter_popup =
-"<ui>\n"
-" <popup name='ConversationFilterPopup' action='PopupAction'>\n"
-" <menu name= 'ApplyAsFilter' action='/Apply as Filter'>\n"
-" <menu name= 'ApplyAsFilterSelected' action='/Apply as Filter/Selected'>\n"
-" <menuitem action='/Apply as Filter/Selected/A_to_from_B'/>\n"
-" <menuitem action='/Apply as Filter/Selected/A_to_B'/>\n"
-" <menuitem action='/Apply as Filter/Selected/A_from_B'/>\n"
-" <menuitem action='/Apply as Filter/Selected/A_to_from_Any'/>\n"
-" <menuitem action='/Apply as Filter/Selected/A_to_Any'/>\n"
-" <menuitem action='/Apply as Filter/Selected/A_from_Any'/>\n"
-" <menuitem action='/Apply as Filter/Selected/Any_tofrom_B'/>\n"
-" <menuitem action='/Apply as Filter/Selected/Any_from_B'/>\n"
-" <menuitem action='/Apply as Filter/Selected/Any_to_B'/>\n"
-" </menu>\n"
-" <menu name= 'ApplyAsFilterNotSelected' action='/Apply as Filter/Not Selected'>\n"
-" <menuitem action='/Apply as Filter/Not Selected/A_to_from_B'/>\n"
-" <menuitem action='/Apply as Filter/Not Selected/A_to_B'/>\n"
-" <menuitem action='/Apply as Filter/Not Selected/A_from_B'/>\n"
-" <menuitem action='/Apply as Filter/Not Selected/A_to_from_Any'/>\n"
-" <menuitem action='/Apply as Filter/Not Selected/A_to_Any'/>\n"
-" <menuitem action='/Apply as Filter/Not Selected/A_from_Any'/>\n"
-" <menuitem action='/Apply as Filter/Not Selected/Any_tofrom_B'/>\n"
-" <menuitem action='/Apply as Filter/Not Selected/Any_from_B'/>\n"
-" <menuitem action='/Apply as Filter/Not Selected/Any_to_B'/>\n"
-" </menu>\n"
-" <menu name= 'ApplyAsFilterAndSelected' action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected'>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/A_to_from_B'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/A_to_B'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/A_from_B'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/A_to_from_Any'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/A_to_Any'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/A_from_Any'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/Any_tofrom_B'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/Any_from_B'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/Any_to_B'/>\n"
-" </menu>\n"
-" <menu name= 'ApplyAsFilterOrSelected' action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected'>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/A_to_from_B'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/A_to_B'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/A_from_B'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/A_to_from_Any'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/A_to_Any'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/A_from_Any'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/Any_tofrom_B'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/Any_from_B'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/Any_to_B'/>\n"
-" </menu>\n"
-" <menu name= 'ApplyAsFilterAndNotSelected' action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected'>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/A_to_from_B'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/A_to_B'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/A_from_B'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/A_to_from_Any'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/A_to_Any'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/A_from_Any'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/Any_tofrom_B'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/Any_from_B'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/Any_to_B'/>\n"
-" </menu>\n"
-" <menu name= 'ApplyAsFilterOrNotSelected' action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected'>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/A_to_from_B'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/A_to_B'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/A_from_B'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/A_to_from_Any'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/A_to_Any'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/A_from_Any'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/Any_tofrom_B'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/Any_from_B'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/Any_to_B'/>\n"
-" </menu>\n"
-" </menu>\n"
-" <menu name= 'PrepareAFilter' action='/Prepare a Filter'>\n"
-" <menu name= 'PrepareAFilterSelected' action='/Prepare a Filter/Selected'>\n"
-" <menuitem action='/Prepare a Filter/Selected/A_to_from_B'/>\n"
-" <menuitem action='/Prepare a Filter/Selected/A_to_B'/>\n"
-" <menuitem action='/Prepare a Filter/Selected/A_from_B'/>\n"
-" <menuitem action='/Prepare a Filter/Selected/A_to_from_Any'/>\n"
-" <menuitem action='/Prepare a Filter/Selected/A_to_Any'/>\n"
-" <menuitem action='/Prepare a Filter/Selected/A_from_Any'/>\n"
-" <menuitem action='/Prepare a Filter/Selected/Any_tofrom_B'/>\n"
-" <menuitem action='/Prepare a Filter/Selected/Any_from_B'/>\n"
-" <menuitem action='/Prepare a Filter/Selected/Any_to_B'/>\n"
-" </menu>\n"
-" <menu name= 'PrepareAFilterNotSelected' action='/Prepare a Filter/Not Selected'>\n"
-" <menuitem action='/Prepare a Filter/Not Selected/A_to_from_B'/>\n"
-" <menuitem action='/Prepare a Filter/Not Selected/A_to_B'/>\n"
-" <menuitem action='/Prepare a Filter/Not Selected/A_from_B'/>\n"
-" <menuitem action='/Prepare a Filter/Not Selected/A_to_from_Any'/>\n"
-" <menuitem action='/Prepare a Filter/Not Selected/A_to_Any'/>\n"
-" <menuitem action='/Prepare a Filter/Not Selected/A_from_Any'/>\n"
-" <menuitem action='/Prepare a Filter/Not Selected/Any_tofrom_B'/>\n"
-" <menuitem action='/Prepare a Filter/Not Selected/Any_from_B'/>\n"
-" <menuitem action='/Prepare a Filter/Not Selected/Any_to_B'/>\n"
-" </menu>\n"
-" <menu name= 'PrepareAFilterAndSelected' action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected'>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/A_to_from_B'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/A_to_B'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/A_from_B'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/A_to_from_Any'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/A_to_Any'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/A_from_Any'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/Any_tofrom_B'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/Any_from_B'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/Any_to_B'/>\n"
-" </menu>\n"
-" <menu name= 'PrepareAFilterOrSelected' action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected'>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/A_to_from_B'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/A_to_B'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/A_from_B'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/A_to_from_Any'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/A_to_Any'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/A_from_Any'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/Any_tofrom_B'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/Any_from_B'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/Any_to_B'/>\n"
-" </menu>\n"
-" <menu name= 'PrepareAFilterAndNotSelected' action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected'>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/A_to_from_B'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/A_to_B'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/A_from_B'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/A_to_from_Any'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/A_to_Any'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/A_from_Any'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/Any_tofrom_B'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/Any_from_B'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/Any_to_B'/>\n"
-" </menu>\n"
-" <menu name= 'PrepareAFilterOrNotSelected' action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected'>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/A_to_from_B'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/A_to_B'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/A_from_B'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/A_to_from_Any'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/A_to_Any'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/A_from_Any'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/Any_tofrom_B'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/Any_from_B'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/Any_to_B'/>\n"
-" </menu>\n"
-" </menu>\n"
-" <menu name= 'FindPacket' action='/Find Packet'>\n"
-" <menu name= 'FindPacketFindPacket' action='/Find Packet/Find Packet'>\n"
-" <menuitem action='/Find Packet/Find Packet/A_to_from_B'/>\n"
-" <menuitem action='/Find Packet/Find Packet/A_to_B'/>\n"
-" <menuitem action='/Find Packet/Find Packet/A_from_B'/>\n"
-" <menuitem action='/Find Packet/Find Packet/A_to_from_Any'/>\n"
-" <menuitem action='/Find Packet/Find Packet/A_to_Any'/>\n"
-" <menuitem action='/Find Packet/Find Packet/A_from_Any'/>\n"
-" <menuitem action='/Find Packet/Find Packet/Any_tofrom_B'/>\n"
-" <menuitem action='/Find Packet/Find Packet/Any_from_B'/>\n"
-" <menuitem action='/Find Packet/Find Packet/Any_to_B'/>\n"
-" </menu>\n"
-" <menu name= 'FindPacketFindNext' action='/Find Packet/Find Next'>\n"
-" <menuitem action='/Find Packet/Find Next/A_to_from_B'/>\n"
-" <menuitem action='/Find Packet/Find Next/A_to_B'/>\n"
-" <menuitem action='/Find Packet/Find Next/A_from_B'/>\n"
-" <menuitem action='/Find Packet/Find Next/A_to_from_Any'/>\n"
-" <menuitem action='/Find Packet/Find Next/A_to_Any'/>\n"
-" <menuitem action='/Find Packet/Find Next/A_from_Any'/>\n"
-" <menuitem action='/Find Packet/Find Next/Any_tofrom_B'/>\n"
-" <menuitem action='/Find Packet/Find Next/Any_from_B'/>\n"
-" <menuitem action='/Find Packet/Find Next/Any_to_B'/>\n"
-" </menu>\n"
-" <menu name= 'FindPacketFindPrevious' action='/Find Packet/Find Previous'>\n"
-" <menuitem action='/Find Packet/Find Previous/A_to_from_B'/>\n"
-" <menuitem action='/Find Packet/Find Previous/A_to_B'/>\n"
-" <menuitem action='/Find Packet/Find Previous/A_from_B'/>\n"
-" <menuitem action='/Find Packet/Find Previous/A_to_from_Any'/>\n"
-" <menuitem action='/Find Packet/Find Previous/A_to_Any'/>\n"
-" <menuitem action='/Find Packet/Find Previous/A_from_Any'/>\n"
-" <menuitem action='/Find Packet/Find Previous/Any_tofrom_B'/>\n"
-" <menuitem action='/Find Packet/Find Previous/Any_from_B'/>\n"
-" <menuitem action='/Find Packet/Find Previous/Any_to_B'/>\n"
-" </menu>\n"
-" </menu>\n"
-" <menu name= 'ColorizeConversation' action='/Colorize Conversation'>\n"
-" <menuitem action='/Colorize Conversation/A_to_from_B'/>\n"
-" <menuitem action='/Colorize Conversation/A_to_B'/>\n"
-" <menuitem action='/Colorize Conversation/A_from_B'/>\n"
-" <menuitem action='/Colorize Conversation/A_to_from_Any'/>\n"
-" <menuitem action='/Colorize Conversation/A_to_Any'/>\n"
-" <menuitem action='/Colorize Conversation/A_from_Any'/>\n"
-" <menuitem action='/Colorize Conversation/Any_tofrom_B'/>\n"
-" <menuitem action='/Colorize Conversation/Any_from_B'/>\n"
-" <menuitem action='/Colorize Conversation/Any_to_B'/>\n"
-" </menu>\n"
-" </popup>\n"
-"</ui>\n";
-
-/*
- * GtkActionEntry
- * typedef struct {
- * const gchar *name;
- * const gchar *stock_id;
- * const gchar *label;
- * const gchar *accelerator;
- * const gchar *tooltip;
- * GCallback callback;
- * } GtkActionEntry;
- * const gchar *name; The name of the action.
- * const gchar *stock_id; The stock id for the action, or the name of an icon from the icon theme.
- * const gchar *label; The label for the action. This field should typically be marked for translation,
- * see gtk_action_group_set_translation_domain().
- * If label is NULL, the label of the stock item with id stock_id is used.
- * const gchar *accelerator; The accelerator for the action, in the format understood by gtk_accelerator_parse().
- * const gchar *tooltip; The tooltip for the action. This field should typically be marked for translation,
- * see gtk_action_group_set_translation_domain().
- * GCallback callback; The function to call when the action is activated.
- *
- */
-static const GtkActionEntry conv_filter_menu_entries[] = {
- /* Top level */
- { "/Apply as Filter", NULL, "Apply as Filter", NULL, NULL, NULL },
- { "/Prepare a Filter", NULL, "Prepare a Filter", NULL, NULL, NULL },
- { "/Find Packet", NULL, "Find Packet", NULL, NULL, NULL },
- { "/Colorize Conversation", NULL, "Colorize Conversation", NULL, NULL, NULL },
-
- /* Apply as */
- { "/Apply as Filter/Selected", NULL, "Selected" , NULL, NULL, NULL },
- { "/Apply as Filter/Not Selected", NULL, "Not Selected", NULL, NULL, NULL },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, NULL, NULL },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, NULL, NULL },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, NULL, NULL },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, NULL, NULL },
-
- /* Apply as Selected */
- { "/Apply as Filter/Selected/A_to_from_B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_apply_as_selected_AtofromB_cb)},
- { "/Apply as Filter/Selected/A_to_B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_apply_as_selected_AtoB_cb)},
- { "/Apply as Filter/Selected/A_from_B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_apply_as_selected_AfromB_cb)},
- { "/Apply as Filter/Selected/A_to_from_Any", NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any",NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any", G_CALLBACK(conv_apply_as_selected_AtofromAny_cb)},
- { "/Apply as Filter/Selected/A_to_Any", NULL, "A " UTF8_RIGHTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_apply_as_selected_AtoAny_cb)},
- { "/Apply as Filter/Selected/A_from_Any", NULL, "A " UTF8_LEFTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_apply_as_selected_AfromAny_cb)},
- { "/Apply as Filter/Selected/Any_tofrom_B", NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B",NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_apply_as_selected_AnytofromB_cb)},
- { "/Apply as Filter/Selected/Any_to_B", NULL, "Any " UTF8_RIGHTWARDS_ARROW " B",NULL, "Any " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_apply_as_selected_AnytoB_cb)},
- { "/Apply as Filter/Selected/Any_from_B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_apply_as_selected_AnyfromB_cb)},
-
- /* Apply as Not Selected */
- { "/Apply as Filter/Not Selected/A_to_from_B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_apply_as_not_selected_AtofromB_cb)},
- { "/Apply as Filter/Not Selected/A_to_B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_apply_as_not_selected_AtoB_cb)},
- { "/Apply as Filter/Not Selected/A_from_B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_apply_as_not_selected_AfromB_cb)},
- { "/Apply as Filter/Not Selected/A_to_from_Any", NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any",NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any", G_CALLBACK(conv_apply_as_not_selected_AtofromAny_cb)},
- { "/Apply as Filter/Not Selected/A_to_Any", NULL, "A " UTF8_RIGHTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_apply_as_not_selected_AtoAny_cb)},
- { "/Apply as Filter/Not Selected/A_from_Any", NULL, "A " UTF8_LEFTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_apply_as_not_selected_AfromAny_cb)},
- { "/Apply as Filter/Not Selected/Any_tofrom_B", NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B",NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_apply_as_not_selected_AnytofromB_cb)},
- { "/Apply as Filter/Not Selected/Any_to_B", NULL, "Any " UTF8_RIGHTWARDS_ARROW " B",NULL, "Any " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_apply_as_not_selected_AnytoB_cb)},
- { "/Apply as Filter/Not Selected/Any_from_B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_apply_as_not_selected_AnyfromB_cb)},
-
- /* Apply as ... and Selected */
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/A_to_from_B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_apply_and_selected_AtofromB_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/A_to_B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_apply_and_selected_AtoB_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/A_from_B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_apply_and_selected_AfromB_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/A_to_from_Any", NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any",NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any",G_CALLBACK(conv_apply_and_selected_AtofromAny_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/A_to_Any", NULL, "A " UTF8_RIGHTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_apply_and_selected_AtoAny_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/A_from_Any", NULL, "A " UTF8_LEFTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_apply_and_selected_AfromAny_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/Any_tofrom_B", NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B",NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_apply_and_selected_AnytofromB_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/Any_to_B", NULL, "Any " UTF8_RIGHTWARDS_ARROW " B",NULL, "Any " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_apply_and_selected_AnytoB_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/Any_from_B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_apply_and_selected_AnyfromB_cb)},
-
- /* Apply as ... or Selected */
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/A_to_from_B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_apply_or_selected_AtofromB_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/A_to_B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_apply_or_selected_AtoB_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/A_from_B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_apply_or_selected_AfromB_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/A_to_from_Any", NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any",NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any",G_CALLBACK(conv_apply_or_selected_AtofromAny_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/A_to_Any", NULL, "A " UTF8_RIGHTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_apply_or_selected_AtoAny_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/A_from_Any", NULL, "A " UTF8_LEFTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_apply_or_selected_AfromAny_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/Any_tofrom_B", NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B",NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_apply_or_selected_AnytofromB_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/Any_to_B", NULL, "Any " UTF8_RIGHTWARDS_ARROW " B",NULL, "Any " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_apply_or_selected_AnytoB_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/Any_from_B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_apply_or_selected_AnyfromB_cb)},
-
- /* Apply as ... and not Selected */
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/A_to_from_B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_apply_and_not_selected_AtofromB_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/A_to_B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_apply_and_not_selected_AtoB_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/A_from_B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_apply_and_not_selected_AfromB_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/A_to_from_Any", NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any",NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any",G_CALLBACK(conv_apply_and_not_selected_AtofromAny_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/A_to_Any", NULL, "A " UTF8_RIGHTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_apply_and_not_selected_AtoAny_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/A_from_Any", NULL, "A " UTF8_LEFTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_apply_and_not_selected_AfromAny_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/Any_tofrom_B", NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B",NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_apply_and_not_selected_AnytofromB_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/Any_to_B", NULL, "Any " UTF8_RIGHTWARDS_ARROW " B",NULL, "Any " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_apply_and_not_selected_AnytoB_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/Any_from_B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_apply_and_not_selected_AnyfromB_cb)},
-
- /* Apply as ... or not Selected */
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/A_to_from_B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_apply_or_not_selected_AtofromB_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/A_to_B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_apply_or_not_selected_AtoB_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/A_from_B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_apply_or_not_selected_AfromB_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/A_to_from_Any", NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any",NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any", G_CALLBACK(conv_apply_or_not_selected_AtofromAny_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/A_to_Any", NULL, "A " UTF8_RIGHTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_apply_or_not_selected_AtoAny_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/A_from_Any", NULL, "A " UTF8_LEFTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_apply_or_not_selected_AfromAny_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/Any_tofrom_B", NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B",NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_apply_or_not_selected_AnytofromB_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/Any_to_B", NULL, "Any " UTF8_RIGHTWARDS_ARROW " B",NULL, "Any " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_apply_or_not_selected_AnytoB_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/Any_from_B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_apply_or_not_selected_AnyfromB_cb)},
-
- /* Prepare a */
- { "/Prepare a Filter/Selected", NULL, "Selected", NULL, NULL, NULL },
- { "/Prepare a Filter/Not Selected", NULL, "Not Selected", NULL, NULL, NULL },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, NULL, NULL },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, NULL, NULL },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, NULL, NULL },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, NULL, NULL },
-
- /* Prepare as Selected */
- { "/Prepare a Filter/Selected/A_to_from_B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_prepare_as_selected_AtofromB_cb)},
- { "/Prepare a Filter/Selected/A_to_B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_prepare_as_selected_AtoB_cb)},
- { "/Prepare a Filter/Selected/A_from_B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_prepare_as_selected_AfromB_cb)},
- { "/Prepare a Filter/Selected/A_to_from_Any", NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any",NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any", G_CALLBACK(conv_prepare_as_selected_AtofromAny_cb)},
- { "/Prepare a Filter/Selected/A_to_Any", NULL, "A " UTF8_RIGHTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_prepare_as_selected_AtoAny_cb)},
- { "/Prepare a Filter/Selected/A_from_Any", NULL, "A " UTF8_LEFTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_prepare_as_selected_AfromAny_cb)},
- { "/Prepare a Filter/Selected/Any_tofrom_B", NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B",NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_prepare_as_selected_AnytofromB_cb)},
- { "/Prepare a Filter/Selected/Any_to_B", NULL, "Any " UTF8_RIGHTWARDS_ARROW " B",NULL, "Any " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_prepare_as_selected_AnytoB_cb)},
- { "/Prepare a Filter/Selected/Any_from_B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_prepare_as_selected_AnyfromB_cb)},
-
- /* Prepare a Not Selected */
- { "/Prepare a Filter/Not Selected/A_to_from_B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_prepare_as_not_selected_AtofromB_cb)},
- { "/Prepare a Filter/Not Selected/A_to_B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_prepare_as_not_selected_AtoB_cb)},
- { "/Prepare a Filter/Not Selected/A_from_B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_prepare_as_not_selected_AfromB_cb)},
- { "/Prepare a Filter/Not Selected/A_to_from_Any", NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any",NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any", G_CALLBACK(conv_prepare_as_not_selected_AtofromAny_cb)},
- { "/Prepare a Filter/Not Selected/A_to_Any", NULL, "A " UTF8_RIGHTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_prepare_as_not_selected_AtoAny_cb)},
- { "/Prepare a Filter/Not Selected/A_from_Any", NULL, "A " UTF8_LEFTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_prepare_as_not_selected_AfromAny_cb)},
- { "/Prepare a Filter/Not Selected/Any_tofrom_B", NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B",NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_prepare_as_not_selected_AnytofromB_cb)},
- { "/Prepare a Filter/Not Selected/Any_to_B", NULL, "Any " UTF8_RIGHTWARDS_ARROW " B",NULL, "Any " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_prepare_as_not_selected_AnytoB_cb)},
- { "/Prepare a Filter/Not Selected/Any_from_B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_prepare_as_not_selected_AnyfromB_cb)},
-
- /* Prepare a ... and Selected */
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/A_to_from_B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_prepare_and_selected_AtofromB_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/A_to_B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_prepare_and_selected_AtoB_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/A_from_B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_prepare_and_selected_AfromB_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/A_to_from_Any", NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any",NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any", G_CALLBACK(conv_prepare_and_selected_AtofromAny_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/A_to_Any", NULL, "A " UTF8_RIGHTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_prepare_and_selected_AtoAny_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/A_from_Any", NULL, "A " UTF8_LEFTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_prepare_and_selected_AfromAny_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/Any_tofrom_B", NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B",NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_prepare_and_selected_AnytofromB_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/Any_to_B", NULL, "Any " UTF8_RIGHTWARDS_ARROW " B",NULL, "Any " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_prepare_and_selected_AnytoB_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/Any_from_B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_prepare_and_selected_AnyfromB_cb)},
-
- /* Prepare a ... or Selected */
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/A_to_from_B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_prepare_or_selected_AtofromB_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/A_to_B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_prepare_or_selected_AtoB_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/A_from_B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_prepare_or_selected_AfromB_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/A_to_from_Any", NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any",NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any", G_CALLBACK(conv_prepare_or_selected_AtofromAny_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/A_to_Any", NULL, "A " UTF8_RIGHTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_prepare_or_selected_AtoAny_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/A_from_Any", NULL, "A " UTF8_LEFTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_prepare_or_selected_AfromAny_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/Any_tofrom_B", NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B",NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_prepare_or_selected_AnytofromB_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/Any_to_B", NULL, "Any " UTF8_RIGHTWARDS_ARROW " B",NULL, "Any " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_prepare_or_selected_AnytoB_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/Any_from_B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_prepare_or_selected_AnyfromB_cb)},
-
- /* Prepare a ... and not Selected */
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/A_to_from_B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_prepare_and_not_selected_AtofromB_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/A_to_B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_prepare_and_not_selected_AtoB_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/A_from_B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_prepare_and_not_selected_AfromB_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/A_to_from_Any",NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any",NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any", G_CALLBACK(conv_prepare_and_not_selected_AtofromAny_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/A_to_Any", NULL, "A " UTF8_RIGHTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_prepare_and_not_selected_AtoAny_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/A_from_Any", NULL, "A " UTF8_LEFTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_prepare_and_not_selected_AfromAny_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/Any_tofrom_B", NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B",NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_prepare_and_not_selected_AnytofromB_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/Any_to_B", NULL, "Any " UTF8_RIGHTWARDS_ARROW " B",NULL, "Any " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_prepare_and_not_selected_AnytoB_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/Any_from_B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_prepare_and_not_selected_AnyfromB_cb)},
-
- /* Prepare a ... or not Selected */
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/A_to_from_B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_prepare_or_not_selected_AtofromB_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/A_to_B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_prepare_or_not_selected_AtoB_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/A_from_B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_prepare_or_not_selected_AfromB_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/A_to_from_Any", NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any",NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any", G_CALLBACK(conv_prepare_or_not_selected_AtofromAny_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/A_to_Any", NULL, "A " UTF8_RIGHTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_prepare_or_not_selected_AtoAny_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/A_from_Any", NULL, "A " UTF8_LEFTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_prepare_or_not_selected_AfromAny_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/Any_tofrom_B", NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B",NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_prepare_or_not_selected_AnytofromB_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/Any_to_B", NULL, "Any " UTF8_RIGHTWARDS_ARROW " B",NULL, "Any " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_prepare_or_not_selected_AnytoB_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/Any_from_B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_prepare_or_not_selected_AnyfromB_cb)},
-
- /* Find packet*/
- { "/Find Packet/Find Packet", NULL, "Find Packet", NULL, NULL, NULL },
- { "/Find Packet/Find Next", NULL, "Find Next", NULL, NULL, NULL },
- { "/Find Packet/Find Previous", NULL, "Find Previous", NULL, NULL, NULL },
-
- /* Find packet*/
- { "/Find Packet/Find Packet/A_to_from_B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_find_AtofromB_cb)},
- { "/Find Packet/Find Packet/A_to_B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_find_AtoB_cb)},
- { "/Find Packet/Find Packet/A_from_B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_find_AfromB_cb)},
- { "/Find Packet/Find Packet/A_to_from_Any", NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any",NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any",G_CALLBACK(conv_find_AtofromAny_cb)},
- { "/Find Packet/Find Packet/A_to_Any", NULL, "A " UTF8_RIGHTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_find_AtoAny_cb)},
- { "/Find Packet/Find Packet/A_from_Any", NULL, "A " UTF8_LEFTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_find_AfromAny_cb)},
- { "/Find Packet/Find Packet/Any_tofrom_B", NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B",NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_find_AnytofromB_cb)},
- { "/Find Packet/Find Packet/Any_to_B", NULL, "Any " UTF8_RIGHTWARDS_ARROW " B",NULL, "Any " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_find_AnytoB_cb)},
- { "/Find Packet/Find Packet/Any_from_B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_find_AnyfromB_cb)},
-
- /* Find Next*/
- { "/Find Packet/Find Next/A_to_from_B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_find_next_AtofromB_cb)},
- { "/Find Packet/Find Next/A_to_B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_find_next_AtoB_cb)},
- { "/Find Packet/Find Next/A_from_B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_find_next_AfromB_cb)},
- { "/Find Packet/Find Next/A_to_from_Any", NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any",NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any",G_CALLBACK(conv_find_next_AtofromAny_cb)},
- { "/Find Packet/Find Next/A_to_Any", NULL, "A " UTF8_RIGHTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_find_next_AtoAny_cb)},
- { "/Find Packet/Find Next/A_from_Any", NULL, "A " UTF8_LEFTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_find_next_AfromAny_cb)},
- { "/Find Packet/Find Next/Any_tofrom_B", NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B",NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_find_next_AnytofromB_cb)},
- { "/Find Packet/Find Next/Any_to_B", NULL, "Any " UTF8_RIGHTWARDS_ARROW " B",NULL, "Any " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_find_next_AnytoB_cb)},
- { "/Find Packet/Find Next/Any_from_B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_find_next_AnyfromB_cb)},
-
- /* Find packet*/
- { "/Find Packet/Find Previous/A_to_from_B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_find_previous_AtofromB_cb)},
- { "/Find Packet/Find Previous/A_to_B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_find_previous_AtoB_cb)},
- { "/Find Packet/Find Previous/A_from_B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_find_previous_AfromB_cb)},
- { "/Find Packet/Find Previous/A_to_from_Any", NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any",NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any",G_CALLBACK(conv_find_previous_AtofromAny_cb)},
- { "/Find Packet/Find Previous/A_to_Any", NULL, "A " UTF8_RIGHTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_find_previous_AtoAny_cb)},
- { "/Find Packet/Find Previous/A_from_Any", NULL, "A " UTF8_LEFTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_find_previous_AfromAny_cb)},
- { "/Find Packet/Find Previous/Any_tofrom_B", NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B",NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_find_previous_AnytofromB_cb)},
- { "/Find Packet/Find Previous/Any_to_B", NULL, "Any " UTF8_RIGHTWARDS_ARROW " B",NULL, "Any " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_find_previous_AnytoB_cb)},
- { "/Find Packet/Find Previous/Any_from_B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_find_previous_AnyfromB_cb)},
-
- /* Colorize Conversation */
- { "/Colorize Conversation/A_to_from_B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", NULL, "A " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_color_AtofromB_cb)},
- { "/Colorize Conversation/A_to_B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", NULL, "A " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_color_AtoB_cb)},
- { "/Colorize Conversation/A_from_B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", NULL, "A " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_color_AfromB_cb)},
- { "/Colorize Conversation/A_to_from_Any", NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any",NULL, "A " UTF8_LEFT_RIGHT_ARROW " Any",G_CALLBACK(conv_color_AtofromAny_cb)},
- { "/Colorize Conversation/A_to_Any", NULL, "A " UTF8_RIGHTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_color_AtoAny_cb)},
- { "/Colorize Conversation/A_from_Any", NULL, "A " UTF8_LEFTWARDS_ARROW " Any",NULL, "A " UTF8_LEFTWARDS_ARROW " Any", G_CALLBACK(conv_color_AfromAny_cb)},
- { "/Colorize Conversation/Any_tofrom_B", NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B",NULL, "Any " UTF8_LEFT_RIGHT_ARROW " B", G_CALLBACK(conv_color_AnytofromB_cb)},
- { "/Colorize Conversation/Any_to_B", NULL, "Any " UTF8_RIGHTWARDS_ARROW " B",NULL, "Any " UTF8_RIGHTWARDS_ARROW " B", G_CALLBACK(conv_color_AnytoB_cb)},
- { "/Colorize Conversation/Any_from_B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", NULL, "Any " UTF8_LEFTWARDS_ARROW " B", G_CALLBACK(conv_color_AnyfromB_cb)},
-
-};
-
-static void
-ct_create_popup_menu(conversations_table *ct)
-{
- GtkUIManager *ui_manager;
- GtkActionGroup *action_group;
- GError *error = NULL;
-
- action_group = gtk_action_group_new ("ConvActionGroup");
- gtk_action_group_add_actions (action_group, /* the action group */
- (GtkActionEntry *)conv_filter_menu_entries, /* an array of action descriptions */
- G_N_ELEMENTS(conv_filter_menu_entries), /* the number of entries */
- (gpointer)ct); /* data to pass to the action callbacks */
-
- ui_manager = gtk_ui_manager_new ();
- gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);
- gtk_ui_manager_add_ui_from_string (ui_manager,ui_desc_conv_filter_popup, -1, &error);
- if (error != NULL)
- {
- fprintf (stderr, "Warning: building conversation filter popup failed: %s\n",
- error->message);
- g_error_free (error);
- error = NULL;
- }
- ct->menu = gtk_ui_manager_get_widget(ui_manager, "/ConversationFilterPopup");
-
- g_signal_connect(ct->table, "button_press_event", G_CALLBACK(ct_show_popup_menu_cb), ct);
-
-}
-
-/* Refresh the address fields of all entries in the list */
-static void
-draw_ct_table_addresses(conversations_table *ct)
-{
- guint idx;
- GtkListStore *store;
- GtkTreeIter iter;
- gboolean iter_valid;
-
- store = GTK_LIST_STORE(gtk_tree_view_get_model(ct->table));
- g_object_ref(store);
- gtk_tree_view_set_model(GTK_TREE_VIEW(ct->table), NULL);
- iter_valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter);
-
- while (iter_valid) {
- conv_item_t *conv_item;
- char *src_addr, *dst_addr, *src_port, *dst_port;
-
- gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, CONV_INDEX_COLUMN, &idx, -1);
- conv_item = &g_array_index(ct->hash.conv_array, conv_item_t, idx);
- src_addr = get_conversation_address(NULL, &conv_item->src_address, ct->resolve_names);
- dst_addr = get_conversation_address(NULL, &conv_item->dst_address, ct->resolve_names);
- src_port = get_conversation_port(NULL, conv_item->src_port, conv_item->etype, ct->resolve_names);
- dst_port = get_conversation_port(NULL, conv_item->dst_port, conv_item->etype, ct->resolve_names);
- gtk_list_store_set (store, &iter,
- CONV_COLUMN_SRC_ADDR, src_addr,
- CONV_COLUMN_SRC_PORT, src_port,
- CONV_COLUMN_DST_ADDR, dst_addr,
- CONV_COLUMN_DST_PORT, dst_port,
- -1);
- iter_valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
- wmem_free(NULL, src_addr);
- wmem_free(NULL, dst_addr);
- wmem_free(NULL, src_port);
- wmem_free(NULL, dst_port);
- }
-
- gtk_tree_view_set_model(GTK_TREE_VIEW(ct->table), GTK_TREE_MODEL(store));
- g_object_unref(store);
-}
-
-static void
-draw_ct_table_data(conversations_table *ct)
-{
- guint idx, new_idx;
- char title[256];
- GtkListStore *store;
- GtkTreeIter iter, reselect_iter;
- gboolean iter_valid;
- gboolean first = TRUE;
-
- if (ct->page_lb) {
- if(ct->hash.conv_array && ct->hash.conv_array->len) {
- g_snprintf(title, sizeof(title), "%s: %u", ct->name, ct->hash.conv_array->len);
- } else {
- g_snprintf(title, sizeof(title), "%s", ct->name);
- }
- gtk_label_set_text(GTK_LABEL(ct->page_lb), title);
- gtk_widget_set_sensitive(ct->page_lb, ct->hash.conv_array && ct->hash.conv_array->len);
- } else {
- if(ct->hash.conv_array && ct->hash.conv_array->len) {
- g_snprintf(title, sizeof(title), "%s Conversations: %u", ct->name, ct->hash.conv_array->len);
- } else {
- g_snprintf(title, sizeof(title), "%s Conversations", ct->name);
- }
- gtk_label_set_text(GTK_LABEL(ct->name_lb), title);
- }
-
- store = GTK_LIST_STORE(gtk_tree_view_get_model(ct->table));
- iter_valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter);
- new_idx = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store), NULL);
-
- /* Update list items (which may not be in "idx" order), then add new items */
- while (iter_valid || (ct->hash.conv_array && new_idx < ct->hash.conv_array->len)) {
- char start_time[COL_STR_LEN], duration[COL_STR_LEN],
- txbps[COL_STR_LEN], rxbps[COL_STR_LEN];
- const char *tx_ptr, *rx_ptr;
- double duration_s;
- conv_item_t *conv_item;
-
- if (!ct->hash.conv_array) {
- continue;
- }
- if (iter_valid) {
- gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, CONV_INDEX_COLUMN, &idx, -1);
- } else {
- idx = new_idx;
- new_idx++;
- }
- conv_item = &g_array_index(ct->hash.conv_array, conv_item_t, idx);
-
- if (!conv_item->modified) {
- iter_valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
- continue;
- }
-
- if (iter_valid && (int)idx == ct->reselection_idx) {
- reselect_iter = iter;
- }
-
- if (first) {
- g_object_ref(store);
- gtk_tree_view_set_model(GTK_TREE_VIEW(ct->table), NULL);
-
- first = FALSE;
- }
- duration_s = nstime_to_sec(&conv_item->stop_time) - nstime_to_sec(&conv_item->start_time);
- g_snprintf(start_time, COL_STR_LEN, "%.9f", nstime_to_sec(&conv_item->start_time));
- g_snprintf(duration, COL_STR_LEN, "%.4f", duration_s);
-
- if (duration_s > 0 && conv_item->tx_frames > 1) {
- g_snprintf(txbps, COL_STR_LEN, "%.2f", (gint64) conv_item->tx_bytes * 8 / duration_s);
- tx_ptr = txbps;
- } else {
- tx_ptr = NO_BPS_STR;
- }
- if (duration_s > 0 && conv_item->rx_frames > 1) {
- g_snprintf(rxbps, COL_STR_LEN, "%.2f", (gint64) conv_item->rx_bytes * 8 / duration_s);
- rx_ptr = rxbps;
- } else {
- rx_ptr = NO_BPS_STR;
- }
- conv_item->modified = FALSE;
-
- if (iter_valid) {
- /* Existing row. Only changeable entries */
- gtk_list_store_set(store, &iter,
- CONV_COLUMN_PACKETS, conv_item->tx_frames+conv_item->rx_frames,
- CONV_COLUMN_BYTES, conv_item->tx_bytes+conv_item->rx_bytes,
- CONV_COLUMN_PKT_AB, conv_item->tx_frames,
- CONV_COLUMN_BYTES_AB, conv_item->tx_bytes,
- CONV_COLUMN_PKT_BA, conv_item->rx_frames,
- CONV_COLUMN_BYTES_BA, conv_item->rx_bytes,
- CONV_COLUMN_START, start_time,
- CONV_COLUMN_DURATION, duration,
- CONV_COLUMN_BPS_AB, tx_ptr,
- CONV_COLUMN_BPS_BA, rx_ptr,
- -1);
- } else {
- char *src_addr, *dst_addr, *src_port, *dst_port;
-
- src_addr = get_conversation_address(NULL, &conv_item->src_address, ct->resolve_names);
- dst_addr = get_conversation_address(NULL, &conv_item->dst_address, ct->resolve_names);
- src_port = get_conversation_port(NULL, conv_item->src_port, conv_item->etype, ct->resolve_names);
- dst_port = get_conversation_port(NULL, conv_item->dst_port, conv_item->etype, ct->resolve_names);
- /* New row. All entries, including fixed ones */
- gtk_list_store_insert_with_values(store, &iter, G_MAXINT,
- CONV_COLUMN_SRC_ADDR, src_addr,
- CONV_COLUMN_SRC_PORT, src_port,
- CONV_COLUMN_DST_ADDR, dst_addr,
- CONV_COLUMN_DST_PORT, dst_port,
- CONV_COLUMN_PACKETS, conv_item->tx_frames+conv_item->rx_frames,
- CONV_COLUMN_BYTES, conv_item->tx_bytes+conv_item->rx_bytes,
- CONV_COLUMN_PKT_AB, conv_item->tx_frames,
- CONV_COLUMN_BYTES_AB, conv_item->tx_bytes,
- CONV_COLUMN_PKT_BA, conv_item->rx_frames,
- CONV_COLUMN_BYTES_BA, conv_item->rx_bytes,
- CONV_COLUMN_START, start_time,
- CONV_COLUMN_DURATION, duration,
- CONV_COLUMN_BPS_AB, tx_ptr,
- CONV_COLUMN_BPS_BA, rx_ptr,
- CONV_INDEX_COLUMN, idx,
- -1);
- wmem_free(NULL, src_addr);
- wmem_free(NULL, dst_addr);
- wmem_free(NULL, src_port);
- wmem_free(NULL, dst_port);
- }
-
- iter_valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
- }
-
- if (!first) {
- if (!ct->fixed_col && ct->hash.conv_array && ct->hash.conv_array->len >= 1000) {
- /* finding the right size for a column isn't easy
- * let it run in autosize a little (1000 is arbitrary)
- * and then switch to fixed width.
- */
- ct->fixed_col = TRUE;
-
- switch_to_fixed_col(ct->table);
- }
-
- gtk_tree_view_set_model(GTK_TREE_VIEW(ct->table), GTK_TREE_MODEL(store));
- g_object_unref(store);
- }
-
- /* Restore conversation selection */
- if (ct->hash.conv_array && ct->reselection_idx != -1) {
- /* XXX This generates Gtk-CRITICAL **: GtkTreePath *gtk_list_store_get_path ... */
- gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(ct->table)),
- &reselect_iter);
- }
-}
-
-static void
-draw_ct_table_data_cb(void *arg)
-{
- conv_hash_t *hash = (conv_hash_t*)arg;
-
- draw_ct_table_data((conversations_table *)hash->user_data);
-}
-
-typedef struct {
- int nb_cols;
- gint columns_order[CONV_NUM_COLUMNS];
- GString *CSV_str;
- conversations_table *talkers;
-} csv_t;
-
-/* output in C locale */
-static gboolean
-csv_handle(GtkTreeModel *model, GtkTreePath *path _U_, GtkTreeIter *iter,
- gpointer data)
-{
- csv_t *csv = (csv_t *)data;
- gchar *table_text;
- int i;
- guint idx;
- conv_item_t *conv;
- double duration_s;
- guint64 value;
-
- gtk_tree_model_get(model, iter, CONV_INDEX_COLUMN, &idx, -1);
- conv=&g_array_index(csv->talkers->hash.conv_array, conv_item_t, idx);
- duration_s = nstime_to_sec(&conv->stop_time) - nstime_to_sec(&conv->start_time);
-
- for (i=0; i< csv->nb_cols; i++) {
- if (i)
- g_string_append(csv->CSV_str, ",");
-
- switch(csv->columns_order[i]) {
- case CONV_COLUMN_SRC_ADDR:
- case CONV_COLUMN_SRC_PORT:
- case CONV_COLUMN_DST_ADDR:
- case CONV_COLUMN_DST_PORT:
- gtk_tree_model_get(model, iter, csv->columns_order[i], &table_text, -1);
- if (table_text) {
- g_string_append_printf(csv->CSV_str, "\"%s\"", table_text);
- g_free(table_text);
- }
- break;
- case CONV_COLUMN_PACKETS:
- case CONV_COLUMN_BYTES:
- case CONV_COLUMN_PKT_AB:
- case CONV_COLUMN_BYTES_AB:
- case CONV_COLUMN_PKT_BA:
- case CONV_COLUMN_BYTES_BA:
- gtk_tree_model_get(model, iter, csv->columns_order[i], &value, -1);
- g_string_append_printf(csv->CSV_str, "\"%" G_GINT64_MODIFIER "u\"", value);
- break;
- case CONV_COLUMN_START:
- g_string_append_printf(csv->CSV_str, "\"%.9f\"", nstime_to_sec(&conv->start_time));
- break;
- case CONV_COLUMN_DURATION:
- g_string_append_printf(csv->CSV_str, "\"%.4f\"", duration_s);
- break;
- case CONV_COLUMN_BPS_AB:
- if (duration_s > 0 && conv->tx_frames > 1) {
- g_string_append_printf(csv->CSV_str, "\"%.2f\"", (gint64) conv->tx_bytes * 8 / duration_s);
- } else {
- g_string_append(csv->CSV_str, "\"" NO_BPS_STR "\"");
- }
- break;
- case CONV_COLUMN_BPS_BA:
- if (duration_s > 0 && conv->rx_frames > 1) {
- g_string_append_printf(csv->CSV_str, "\"%.2f\"", (gint64) conv->rx_bytes * 8 / duration_s);
- } else {
- g_string_append(csv->CSV_str, "\"" NO_BPS_STR "\"");
- }
- break;
- default:
- break;
- }
- }
- g_string_append(csv->CSV_str,"\n");
-
- return FALSE;
-}
-
-
-static void
-copy_as_csv_cb(GtkWindow *copy_bt, gpointer data _U_)
-{
- GtkClipboard *cb;
- GList *columns, *list;
- GtkTreeViewColumn *column;
- GtkListStore *store;
- csv_t csv;
-
- csv.talkers=(conversations_table *)g_object_get_data(G_OBJECT(copy_bt), CONV_PTR_KEY);
- if (!csv.talkers)
- return;
-
- csv.CSV_str = g_string_new("");
-
- columns = gtk_tree_view_get_columns(GTK_TREE_VIEW(csv.talkers->table));
- csv.nb_cols = 0;
- list = columns;
- while(columns) {
- column = (GtkTreeViewColumn *)columns->data;
- if (gtk_tree_view_column_get_visible(column)) {
- csv.columns_order[csv.nb_cols] = gtk_tree_view_column_get_sort_column_id(column);
- if (csv.nb_cols)
- g_string_append(csv.CSV_str, ",");
- g_string_append_printf(csv.CSV_str, "\"%s\"", gtk_tree_view_column_get_title(column));
- csv.nb_cols++;
- }
- columns = g_list_next(columns);
- }
- g_list_free(list);
-
- g_string_append(csv.CSV_str,"\n");
- store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(csv.talkers->table)));
- gtk_tree_model_foreach(GTK_TREE_MODEL(store), csv_handle, &csv);
-
- /* Now that we have the CSV data, copy it into the default clipboard */
- cb = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); /* Get the default clipboard */
- gtk_clipboard_set_text(cb, csv.CSV_str->str, -1); /* Copy the CSV data into the clipboard */
- g_string_free(csv.CSV_str, TRUE); /* Free the memory */
-}
-
-static gint default_col_size[CONV_NUM_COLUMNS];
-
-static void
-init_default_col_size(GtkWidget *view)
-{
- default_col_size[CONV_COLUMN_SRC_ADDR] = get_default_col_size(view, "00000000.000000000000");
- default_col_size[CONV_COLUMN_DST_ADDR] = default_col_size[CONV_COLUMN_SRC_ADDR];
- default_col_size[CONV_COLUMN_SRC_PORT] = get_default_col_size(view, "000000");
- default_col_size[CONV_COLUMN_DST_PORT] = default_col_size[CONV_COLUMN_SRC_PORT];
- default_col_size[CONV_COLUMN_PACKETS] = get_default_col_size(view, "00 000 000");
- default_col_size[CONV_COLUMN_BYTES] = get_default_col_size(view, "0 000 000 000");
- default_col_size[CONV_COLUMN_PKT_AB] = default_col_size[CONV_COLUMN_PACKETS];
- default_col_size[CONV_COLUMN_PKT_BA] = default_col_size[CONV_COLUMN_PACKETS];
- default_col_size[CONV_COLUMN_BYTES_AB] = default_col_size[CONV_COLUMN_BYTES];
- default_col_size[CONV_COLUMN_BYTES_BA] = default_col_size[CONV_COLUMN_BYTES];
- default_col_size[CONV_COLUMN_START] = get_default_col_size(view, "000000.000000000");
- default_col_size[CONV_COLUMN_DURATION] = get_default_col_size(view, "000000.0000");
- default_col_size[CONV_COLUMN_BPS_AB] = get_default_col_size(view, "000000000.00");
- default_col_size[CONV_COLUMN_BPS_BA] = default_col_size[CONV_COLUMN_BPS_AB];
-}
-
-static gboolean
-init_ct_table_page(conversations_table *conversations, GtkWidget *vbox, gboolean hide_ports, const char *table_name, const char *tap_name, const char *filter,
- tap_packet_cb packet_func)
-{
- int i;
- GString *error_string;
- char title[256];
-
- GtkListStore *store;
- GtkWidget *tree;
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
- GtkTreeSortable *sortable;
- GtkTreeSelection *sel;
- static gboolean col_size = FALSE;
-
- conversations->page_lb=NULL;
- conversations->resolve_names=TRUE;
- conversations->has_ports=!hide_ports;
- conversations->fixed_col = FALSE;
-
- for (i = 0; i < CONV_NUM_COLUMNS; i++) {
- conversations->default_titles[i] = conv_column_titles[i];
- }
-
- if (strcmp(table_name, "NCP")==0) {
- conversations->default_titles[CONV_COLUMN_SRC_PORT] = conv_conn_a_title;
- conversations->default_titles[CONV_COLUMN_DST_PORT] = conv_conn_b_title;
- }
-
- g_snprintf(title, sizeof(title), "%s Conversations", table_name);
- conversations->name_lb=gtk_label_new(title);
-
-
- /* Create the store */
- store = gtk_list_store_new (CONV_NUM_COLUMNS + 1, /* Total number of columns */
- G_TYPE_STRING, /* Address A */
- G_TYPE_STRING, /* Port A */
- G_TYPE_STRING, /* Address B */
- G_TYPE_STRING, /* Port B */
- G_TYPE_UINT64, /* Packets */
- G_TYPE_UINT64, /* Bytes */
- G_TYPE_UINT64, /* Packets A->B */
- G_TYPE_UINT64, /* Bytes A->B */
- G_TYPE_UINT64, /* Packets A<-B */
- G_TYPE_UINT64, /* Bytes A<-B */
- G_TYPE_STRING, /* Start */
- G_TYPE_STRING, /* Duration */
- G_TYPE_STRING, /* bps A->B */
- G_TYPE_STRING, /* bps A<-B */
- G_TYPE_UINT); /* Index */
-
- gtk_box_pack_start(GTK_BOX(vbox), conversations->name_lb, FALSE, FALSE, 0);
-
- conversations->scrolled_window=scrolled_window_new(NULL, NULL);
- gtk_box_pack_start(GTK_BOX(vbox), conversations->scrolled_window, TRUE, TRUE, 0);
-
- tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
- conversations->table = GTK_TREE_VIEW(tree);
- sortable = GTK_TREE_SORTABLE(store);
-
- if (!col_size) {
- col_size = TRUE;
- init_default_col_size(GTK_WIDGET(conversations->table));
- }
-
- /* The view now holds a reference. We can get rid of our own reference */
- g_object_unref (G_OBJECT (store));
-
- g_object_set_data(G_OBJECT(store), CONV_PTR_KEY, conversations);
- g_object_set_data(G_OBJECT(conversations->table), CONV_PTR_KEY, conversations);
-
- for (i = 0; i < CONV_NUM_COLUMNS; i++) {
- renderer = gtk_cell_renderer_text_new ();
- g_object_set(renderer, "ypad", 0, NULL);
- switch(i) {
- case CONV_COLUMN_SRC_ADDR: /* addresses and ports */
- case CONV_COLUMN_SRC_PORT:
- case CONV_COLUMN_DST_ADDR:
- case CONV_COLUMN_DST_PORT:
- column = gtk_tree_view_column_new_with_attributes (conversations->default_titles[i], renderer, "text",
- i, NULL);
- if(hide_ports && (i == 1 || i == 3)){
- /* hide srcport and dstport if we don't use ports */
- gtk_tree_view_column_set_visible(column, FALSE);
- }
- gtk_tree_sortable_set_sort_func(sortable, i, ct_sort_func, GINT_TO_POINTER(i), NULL);
- break;
- case CONV_COLUMN_PACKETS: /* counts */
- case CONV_COLUMN_BYTES:
- case CONV_COLUMN_PKT_AB:
- case CONV_COLUMN_BYTES_AB:
- case CONV_COLUMN_PKT_BA:
- case CONV_COLUMN_BYTES_BA:
- g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
- column = gtk_tree_view_column_new_with_attributes (conversations->default_titles[i], renderer, NULL);
- gtk_tree_view_column_set_cell_data_func(column, renderer, u64_data_func, GINT_TO_POINTER(i), NULL);
- break;
- default: /* times and bps */
- g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
- column = gtk_tree_view_column_new_with_attributes (conversations->default_titles[i], renderer, "text",
- i, NULL);
-
- gtk_tree_sortable_set_sort_func(sortable, i, ct_sort_func, GINT_TO_POINTER(i), NULL);
- break;
- }
- gtk_tree_view_column_set_sort_column_id(column, i);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_reorderable(column, TRUE);
- gtk_tree_view_column_set_min_width(column, 40);
- gtk_tree_view_column_set_fixed_width(column, default_col_size[i]);
- gtk_tree_view_append_column (conversations->table, column);
-#if 0
- /* for capture with ten thousands conversations it's too slow */
- if (i == PACKETS_COLUMN) {
- gtk_tree_view_column_clicked(column);
- gtk_tree_view_column_clicked(column);
- }
-#endif
- }
- gtk_container_add(GTK_CONTAINER(conversations->scrolled_window), (GtkWidget *)conversations->table);
- gtk_tree_view_set_rules_hint(conversations->table, TRUE);
- gtk_tree_view_set_headers_clickable(conversations->table, TRUE);
- gtk_tree_view_set_reorderable (conversations->table, TRUE);
-
- conversations->hash.conv_array = NULL;
- conversations->hash.hashtable = NULL;
- conversations->hash.user_data = conversations;
-
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(conversations->table));
- gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
-
- /* create popup menu for this table */
- ct_create_popup_menu(conversations);
-
- /* register the tap and rerun the taps on the packet list */
- error_string=register_tap_listener(tap_name, &conversations->hash, filter, 0, reset_ct_table_data_cb, packet_func,
- draw_ct_table_data_cb);
- if(error_string){
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
- g_string_free(error_string, TRUE);
- return FALSE;
- }
-
- return TRUE;
-}
-
-
-static void
-graph_cb(GtkWidget *follow_stream_bt, gboolean reverse_direction)
-{
- conversations_table *ct = (conversations_table *)g_object_get_data (G_OBJECT(follow_stream_bt), CONV_PTR_KEY);
- GtkTreeIter iter;
- GtkTreeModel *model;
- GtkTreeSelection *sel;
- guint32 idx = 0;
- conv_item_t *conv;
-
- if (!ct || !ct->hash.conv_array)
- return;
-
- /* Check for a current selection and that index has associated data */
- sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(ct->table));
- if (!gtk_tree_selection_get_selected(sel, &model, &iter)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "No conversation selected");
- return;
- }
-
- gtk_tree_model_get (model, &iter, CONV_INDEX_COLUMN, &idx, -1);
- if (idx >= ct->hash.conv_array->len) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "No conversation selected");
- return;
- }
-
- /* Look up the conversation for this index */
- conv = &g_array_index(ct->hash.conv_array, conv_item_t, idx);
-
- if (strcmp(ct->name, "TCP") == 0) {
- /* Invoke the graph */
- if (!reverse_direction) {
- tcp_graph_known_stream_launch(&conv->src_address, conv->src_port,
- &conv->dst_address, conv->dst_port,
- conv->conv_id);
- }
- else {
- tcp_graph_known_stream_launch(&conv->dst_address, conv->dst_port,
- &conv->src_address, conv->src_port,
- conv->conv_id);
- }
- }
- else {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Unknown stream: %s", ct->name);
- }
-
- /* Remember index of selected conversation you can try to restore after next redrawing */
- ct->reselection_idx = idx;
-}
-
-
-static void
-follow_stream_cb(GtkWidget *follow_stream_bt, gpointer data _U_)
-{
- conversations_table *ct = (conversations_table *)g_object_get_data (G_OBJECT(follow_stream_bt), CONV_PTR_KEY);
- GtkTreeIter iter;
- GtkTreeModel *model;
- GtkTreeSelection *sel;
- guint32 idx = 0;
- gchar *filter = NULL;
- conv_item_t *conv;
-
- if (!ct || !ct->hash.conv_array)
- return;
-
- sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(ct->table));
- if (!gtk_tree_selection_get_selected(sel, &model, &iter)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "No conversation selected");
- return;
- }
-
- gtk_tree_model_get (model, &iter, CONV_INDEX_COLUMN, &idx, -1);
- if (idx >= ct->hash.conv_array->len) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "No conversation selected");
- return;
- }
-
- conv = &g_array_index(ct->hash.conv_array, conv_item_t, idx);
-
- /* Generate and apply a display filter to isolate the conversation.
- */
- switch (conv->etype) {
- case ENDPOINT_TCP:
- filter = g_strdup_printf("tcp.stream eq %d", conv->conv_id);
- break;
- case ENDPOINT_UDP:
- filter = g_strdup_printf("udp.stream eq %d", conv->conv_id);
- break;
- default:
- filter = g_strdup("INVALID");
- }
-
- apply_selected_filter(ACTYPE_SELECTED|ACTION_MATCH, filter);
- g_free(filter);
- filter = NULL;
-
- /* For TCP or UDP conversations, take things one step further and present
- * the Follow Stream dialog. Other conversation types? Not so much.
- */
- if (strcmp(ct->name, "TCP") == 0)
- follow_tcp_stream_cb(follow_stream_bt, data);
- else if (strcmp(ct->name, "UDP") == 0)
- follow_udp_stream_cb(follow_stream_bt, data);
- else
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Unknown stream: %s", ct->name);
-
- /* Remember index of selected conversation you can try to restore after next redrawing */
- ct->reselection_idx = idx;
-}
-
-
-void
-init_conversation_table(struct register_ct* ct, const char *filter)
-{
- conversations_table *conversations;
- char *display_name;
- char title[256];
- const char *table_name = proto_get_protocol_short_name(find_protocol_by_id(get_conversation_proto_id(ct)));
- GtkWidget *vbox;
- GtkWidget *bbox;
- GtkWidget *close_bt, *help_bt;
- gboolean ret;
- GtkWidget *copy_bt, *follow_stream_bt;
- GtkWidget *graph_a_b_bt;
- GtkWidget *graph_b_a_bt;
- gboolean add_follow_stream_button = FALSE;
- gboolean add_graph_buttons = FALSE;
- window_geometry_t tl_geom;
-
- conversations=g_new0(conversations_table,1);
-
- conversations->name=table_name;
- conversations->filter=filter;
- conversations->use_dfilter=FALSE;
- display_name = cf_get_display_name(&cfile);
- g_snprintf(title, sizeof(title), "%s Conversations: %s", table_name, display_name);
- g_free(display_name);
- conversations->win = dlg_window_new(title); /* transient_for top_level */
- gtk_window_set_destroy_with_parent (GTK_WINDOW(conversations->win), TRUE);
-
- window_get_geometry(top_level, &tl_geom);
- gtk_window_set_default_size(GTK_WINDOW(conversations->win), tl_geom.width * 8 / 10, CONV_DLG_HEIGHT);
-
- vbox=ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_LABEL_SPACING, FALSE);
- gtk_container_add(GTK_CONTAINER(conversations->win), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), DLG_OUTER_MARGIN);
-
- ret = init_ct_table_page(conversations, vbox,
- get_conversation_hide_ports(ct),
- table_name, proto_get_protocol_filter_name(get_conversation_proto_id(ct)),
- filter, get_conversation_packet_func(ct));
- if(ret == FALSE) {
- g_free(conversations);
- return;
- }
-
- /* Button row. */
- /* XXX - maybe we want to have a "Copy as CSV" stock button here? */
- /*copy_bt = gtk_button_new_with_label ("Copy content to clipboard as CSV");*/
-
- if (strcmp(table_name, "TCP") == 0) {
- add_graph_buttons = TRUE;
- add_follow_stream_button = TRUE;
- bbox = dlg_button_row_new(
- GTK_STOCK_CLOSE,
- GTK_STOCK_COPY,
- WIRESHARK_STOCK_FOLLOW_STREAM,
- WIRESHARK_STOCK_GRAPH_A_B,
- WIRESHARK_STOCK_GRAPH_B_A,
- GTK_STOCK_HELP, NULL);
- }
- else if (strcmp(table_name, "UDP") == 0) {
- add_follow_stream_button = TRUE;
- bbox = dlg_button_row_new(
- GTK_STOCK_CLOSE,
- GTK_STOCK_COPY,
- WIRESHARK_STOCK_FOLLOW_STREAM,
- GTK_STOCK_HELP, NULL);
- }
- else {
- bbox = dlg_button_row_new(
- GTK_STOCK_CLOSE,
- GTK_STOCK_COPY,
- GTK_STOCK_HELP, NULL);
- }
-
- gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(conversations->win, close_bt, window_cancel_button_cb);
-
- copy_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_COPY);
- gtk_widget_set_tooltip_text(copy_bt, "Copy all statistical values of this page to the clipboard in CSV (Comma Separated Values) format.");
- g_object_set_data(G_OBJECT(copy_bt), CONV_PTR_KEY, conversations);
- g_signal_connect(copy_bt, "clicked", G_CALLBACK(copy_as_csv_cb), NULL);
-
- if (add_follow_stream_button) {
- follow_stream_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_FOLLOW_STREAM);
- g_object_set_data(G_OBJECT(follow_stream_bt), E_DFILTER_TE_KEY, main_display_filter_widget);
- g_object_set_data(G_OBJECT(follow_stream_bt), CONV_PTR_KEY, conversations);
- g_signal_connect(follow_stream_bt, "clicked", G_CALLBACK(follow_stream_cb), NULL);
- }
-
- if (add_graph_buttons) {
- /* Graph A->B */
- graph_a_b_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_GRAPH_A_B);
- gtk_widget_set_tooltip_text(graph_a_b_bt, "Graph traffic from address A to address B.");
- g_object_set_data(G_OBJECT(graph_a_b_bt), E_DFILTER_TE_KEY, main_display_filter_widget);
- g_object_set_data(G_OBJECT(graph_a_b_bt), CONV_PTR_KEY, conversations);
- g_signal_connect(graph_a_b_bt, "clicked", G_CALLBACK(graph_cb), (gpointer)FALSE);
-
- /* Graph A<-B */
- graph_b_a_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_GRAPH_B_A);
- gtk_widget_set_tooltip_text(graph_b_a_bt, "Graph traffic from address B to address A.");
- g_object_set_data(G_OBJECT(graph_b_a_bt), E_DFILTER_TE_KEY, main_display_filter_widget);
- g_object_set_data(G_OBJECT(graph_b_a_bt), CONV_PTR_KEY, conversations);
- g_signal_connect(graph_b_a_bt, "clicked", G_CALLBACK(graph_cb), (gpointer)TRUE);
- }
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_STATS_CONVERSATIONS_DIALOG);
-
- g_signal_connect(conversations->win, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(conversations->win, "destroy", G_CALLBACK(ct_win_destroy_cb), conversations);
-
- /* Initially there is no conversation selection to reselect */
- conversations->reselection_idx = -1;
-
- gtk_widget_show_all(conversations->win);
- window_present(conversations->win);
-
- cf_retap_packets(&cfile);
- gdk_window_raise(gtk_widget_get_window(conversations->win));
-}
-
-
-
-static void
-ct_nb_switch_page_cb(GtkNotebook *nb, gpointer *pg _U_, guint page, gpointer data)
-{
- GtkWidget *copy_bt = (GtkWidget *) data;
- GtkWidget *graph_a_b_bt = (GtkWidget *)g_object_get_data(G_OBJECT(nb), GRAPH_A_B_BT_KEY);
- GtkWidget *graph_b_a_bt = (GtkWidget *)g_object_get_data(G_OBJECT(nb), GRAPH_B_A_BT_KEY);
- GtkWidget *follow_stream_bt = (GtkWidget *)g_object_get_data(G_OBJECT(nb), FOLLOW_STREAM_BT_KEY);
- void **pages = (void**)g_object_get_data(G_OBJECT(nb), NB_PAGES_KEY);
-
- page++;
-
- /* XXX: is the 'if' test really needed ?? */
- if (pages && (page > 0) && ((int) page <= GPOINTER_TO_INT(pages[0]))) {
- g_object_set_data(G_OBJECT(copy_bt), CONV_PTR_KEY, pages[page]);
- g_object_set_data(G_OBJECT(follow_stream_bt), CONV_PTR_KEY, pages[page]);
- g_object_set_data(G_OBJECT(graph_a_b_bt), CONV_PTR_KEY, pages[page]);
- g_object_set_data(G_OBJECT(graph_b_a_bt), CONV_PTR_KEY, pages[page]);
-
- /* Filter Stream only available for TCP and UDP */
- if (strcmp(((conversations_table *)pages[page])->name, "TCP") == 0) {
- gtk_widget_set_tooltip_text(follow_stream_bt, "Follow TCP Stream.");
- gtk_widget_set_sensitive(follow_stream_bt, TRUE);
- gtk_widget_set_tooltip_text(follow_stream_bt, "Graph traffic from address A to address B.");
- gtk_widget_set_sensitive(graph_a_b_bt, TRUE);
- gtk_widget_set_sensitive(graph_b_a_bt, TRUE);
- } else if (strcmp(((conversations_table *)pages[page])->name, "UDP") == 0) {
- gtk_widget_set_tooltip_text(follow_stream_bt, "Follow UDP Stream.");
- gtk_widget_set_sensitive(graph_a_b_bt, FALSE);
- gtk_widget_set_sensitive(graph_b_a_bt, FALSE);
- gtk_widget_set_sensitive(follow_stream_bt, TRUE);
- } else {
- gtk_widget_set_tooltip_text(follow_stream_bt, "Follow TCP or UDP Stream.");
- gtk_widget_set_sensitive(graph_a_b_bt, FALSE);
- gtk_widget_set_sensitive(graph_b_a_bt, FALSE);
- gtk_widget_set_sensitive(follow_stream_bt, FALSE);
- }
- }
-}
-
-static void
-ct_win_destroy_notebook_cb(GtkWindow *win _U_, gpointer data)
-{
- void ** pages = (void **)data;
- int page;
-
- /* first "page" contains the number of pages */
- for (page=1; page<=GPOINTER_TO_INT(pages[0]); page++) {
- ct_win_destroy_cb(NULL, pages[page]);
- }
- g_free(pages);
-}
-
-static conversations_table *
-init_ct_notebook_page_cb(register_ct_t *table, const char *filter)
-{
- gboolean ret;
- GtkWidget *page_vbox;
- conversations_table *conversations;
-
- conversations=g_new0(conversations_table,1);
- conversations->name=proto_get_protocol_short_name(find_protocol_by_id(get_conversation_proto_id(table)));
- conversations->filter=filter;
- conversations->resolve_names=TRUE;
- conversations->use_dfilter=FALSE;
-
- page_vbox=ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- conversations->win = page_vbox;
- gtk_container_set_border_width(GTK_CONTAINER(page_vbox), 6);
-
- ret = init_ct_table_page(conversations, page_vbox, get_conversation_hide_ports(table), conversations->name,
- proto_get_protocol_filter_name(get_conversation_proto_id(table)), filter, get_conversation_packet_func(table));
- if(ret == FALSE) {
- g_free(conversations);
- return NULL;
- }
-
- return conversations;
-}
-
-static void
-ct_resolve_toggle_dest(GtkWidget *widget, gpointer data)
-{
- int page;
- void ** pages = (void **)data;
- gboolean resolve_names;
- conversations_table *conversations;
-
-
- resolve_names = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget));
-
- for (page=1; page<=GPOINTER_TO_INT(pages[0]); page++) {
- conversations = (conversations_table *)pages[page];
- conversations->resolve_names = resolve_names;
-
- draw_ct_table_addresses(conversations);
-
- }
-}
-
-
-static void
-ct_filter_toggle_dest(GtkWidget *widget, gpointer data)
-{
- int page;
- void ** pages = (void **)data;
- gboolean use_filter;
- conversations_table *conversations = NULL;
-
- use_filter = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget));
-
- for (page=1; page<=GPOINTER_TO_INT(pages[0]); page++) {
- conversations = (conversations_table *)pages[page];
- conversations->use_dfilter = use_filter;
- reset_ct_table_data(conversations);
- }
-
- cf_retap_packets(&cfile);
- if (conversations) {
- gdk_window_raise(gtk_widget_get_window(conversations->win));
- }
-}
-
-typedef struct _init_ct_page_data {
- int page;
- void ** pages;
- GtkWidget *nb;
- GtkWidget *win;
-} init_ct_page_data;
-
-static gboolean
-init_ct_page(const void *key _U_, void *value, void *userdata)
-{
- register_ct_t *table = (register_ct_t*)value;
- init_ct_page_data* ct_page_data = (init_ct_page_data*)userdata;
-
- conversations_table *conversations;
- GtkWidget *page_lb;
-
- conversations = init_ct_notebook_page_cb(table, NULL /*filter*/);
- if (conversations) {
-
- g_object_set_data(G_OBJECT(conversations->win), CONV_PTR_KEY, conversations);
- page_lb = gtk_label_new("");
- gtk_notebook_append_page(GTK_NOTEBOOK(ct_page_data->nb), conversations->win, page_lb);
- conversations->win = ct_page_data->win;
- conversations->page_lb = page_lb;
- ct_page_data->pages[++ct_page_data->page] = conversations;
- }
- return FALSE;
-}
-
-void
-init_conversation_notebook_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- char *display_name;
- char title[256];
- GtkWidget *vbox;
- GtkWidget *hbox;
- GtkWidget *bbox;
- GtkWidget *close_bt, *help_bt;
- GtkWidget *win;
- GtkWidget *resolv_cb;
- GtkWidget *filter_cb;
- void ** pages;
- GtkWidget *nb;
- GtkWidget *copy_bt;
- GtkWidget *follow_stream_bt;
- GtkWidget *graph_a_b_bt;
- GtkWidget *graph_b_a_bt;
- window_geometry_t tl_geom;
- init_ct_page_data ct_page_iter_data;
-
- pages = (void **)g_malloc(sizeof(void *) * (conversation_table_get_num() + 1));
-
- display_name = cf_get_display_name(&cfile);
- g_snprintf(title, sizeof(title), "Conversations: %s", display_name);
- g_free(display_name);
- win = dlg_window_new(title); /* transient_for top_level */
- gtk_window_set_destroy_with_parent (GTK_WINDOW(win), TRUE);
-
- window_get_geometry(top_level, &tl_geom);
- gtk_window_set_default_size(GTK_WINDOW(win), tl_geom.width * 8 / 10, CONV_DLG_HEIGHT);
-
- vbox=ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_LABEL_SPACING, FALSE);
- gtk_container_add(GTK_CONTAINER(win), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), DLG_OUTER_MARGIN);
-
- nb = gtk_notebook_new();
- gtk_box_pack_start(GTK_BOX (vbox), nb, TRUE, TRUE, 0);
- g_object_set_data(G_OBJECT(nb), NB_PAGES_KEY, pages);
-
- ct_page_iter_data.page = 0;
- ct_page_iter_data.pages = pages;
- ct_page_iter_data.nb = nb;
- ct_page_iter_data.win = win;
-
- conversation_table_iterate_tables(init_ct_page, &ct_page_iter_data);
-
- pages[0] = GINT_TO_POINTER(ct_page_iter_data.page);
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_UNRELATED_SPACING, FALSE);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-
- resolv_cb = gtk_check_button_new_with_mnemonic("Name resolution");
- gtk_box_pack_start(GTK_BOX (hbox), resolv_cb, FALSE, FALSE, 0);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(resolv_cb), TRUE);
- gtk_widget_set_tooltip_text(resolv_cb, "Show results of name resolutions rather than the \"raw\" values. "
- "Please note: The corresponding name resolution must be enabled.");
- g_signal_connect(resolv_cb, "toggled", G_CALLBACK(ct_resolve_toggle_dest), pages);
-
- filter_cb = gtk_check_button_new_with_mnemonic("Limit to display filter");
- gtk_box_pack_start(GTK_BOX (hbox), filter_cb, FALSE, FALSE, 0);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(filter_cb), FALSE);
- gtk_widget_set_tooltip_text(filter_cb, "Limit the list to conversations matching the current display filter.");
- g_signal_connect(filter_cb, "toggled", G_CALLBACK(ct_filter_toggle_dest), pages);
-
- /* Button row. */
- /* XXX - maybe we want to have a "Copy as CSV" stock button here? */
- /*copy_bt = gtk_button_new_with_label ("Copy content to clipboard as CSV");*/
- bbox = dlg_button_row_new(GTK_STOCK_CLOSE, GTK_STOCK_COPY,
- WIRESHARK_STOCK_FOLLOW_STREAM,
- WIRESHARK_STOCK_GRAPH_A_B,
- WIRESHARK_STOCK_GRAPH_B_A,
- GTK_STOCK_HELP, NULL);
-
- gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
-
- /* Close */
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(win, close_bt, window_cancel_button_cb);
-
- /* Copy */
- copy_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_COPY);
- gtk_widget_set_tooltip_text(copy_bt, "Copy all statistical values of this page to the clipboard in CSV (Comma Separated Values) format.");
- g_signal_connect(copy_bt, "clicked", G_CALLBACK(copy_as_csv_cb), NULL);
- g_object_set_data(G_OBJECT(copy_bt), CONV_PTR_KEY, pages[ct_page_iter_data.page]);
-
- /* Graph A->B */
- graph_a_b_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_GRAPH_A_B);
- gtk_widget_set_tooltip_text(graph_a_b_bt, "Graph traffic from address A to address B.");
- g_object_set_data(G_OBJECT(graph_a_b_bt), E_DFILTER_TE_KEY, main_display_filter_widget);
- g_object_set_data(G_OBJECT(graph_a_b_bt), CONV_PTR_KEY, pages[ct_page_iter_data.page]);
- g_signal_connect(graph_a_b_bt, "clicked", G_CALLBACK(graph_cb), (gpointer)FALSE);
- g_object_set_data(G_OBJECT(nb), GRAPH_A_B_BT_KEY, graph_a_b_bt);
-
- /* Graph B->A */
- graph_b_a_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_GRAPH_B_A);
- gtk_widget_set_tooltip_text(graph_b_a_bt, "Graph traffic from address B to address A.");
- g_object_set_data(G_OBJECT(graph_b_a_bt), E_DFILTER_TE_KEY, main_display_filter_widget);
- g_object_set_data(G_OBJECT(graph_b_a_bt), CONV_PTR_KEY, pages[ct_page_iter_data.page]);
- g_signal_connect(graph_b_a_bt, "clicked", G_CALLBACK(graph_cb), (gpointer)TRUE);
- g_object_set_data(G_OBJECT(nb), GRAPH_B_A_BT_KEY, graph_b_a_bt);
-
- /* Follow stream */
- follow_stream_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_FOLLOW_STREAM);
- gtk_widget_set_tooltip_text(follow_stream_bt, "Follow Stream.");
- g_object_set_data(G_OBJECT(follow_stream_bt), E_DFILTER_TE_KEY, main_display_filter_widget);
- g_object_set_data(G_OBJECT(follow_stream_bt), CONV_PTR_KEY, pages[ct_page_iter_data.page]);
- g_signal_connect(follow_stream_bt, "clicked", G_CALLBACK(follow_stream_cb), NULL);
-
- g_object_set_data(G_OBJECT(nb), FOLLOW_STREAM_BT_KEY, follow_stream_bt);
-
- g_signal_connect(nb, "switch-page", G_CALLBACK(ct_nb_switch_page_cb), copy_bt);
-
- /* Help */
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_STATS_CONVERSATIONS_DIALOG);
-
- g_signal_connect(win, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(win, "destroy", G_CALLBACK(ct_win_destroy_notebook_cb), pages);
-
- gtk_widget_show_all(win);
- window_present(win);
-
- cf_retap_packets(&cfile);
- gdk_window_raise(gtk_widget_get_window(win));
-}
-
-void conversation_endpoint_cb(register_ct_t* table)
-{
- char cmd_str[50];
-
- g_snprintf(cmd_str, 50, "conv,%s", proto_get_protocol_filter_name(get_conversation_proto_id(table)));
-
- dissector_conversation_init(cmd_str, table);
-}
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/conversations_table.h b/ui/gtk/conversations_table.h
deleted file mode 100644
index 28dbd60a9b..0000000000
--- a/ui/gtk/conversations_table.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* conversations_table.h
- * conversations_table 2003 Ronnie Sahlberg
- * Helper routines common to all conversations taps.
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __CONVERSATIONS_TABLE_H__
-#define __CONVERSATIONS_TABLE_H__
-
-#include <epan/conv_id.h>
-#include <epan/conversation_table.h>
-#include <ui/traffic_table_ui.h>
-
-/** @file
- * Conversation definitions.
- */
-
-/** Conversation widget */
-typedef struct _conversations_table {
- const char *name; /**< the name of the table */
- const char *filter; /**< the filter used */
- gboolean use_dfilter; /**< use display filter */
- GtkWidget *win; /**< GTK window */
- GtkWidget *page_lb; /**< page label */
- GtkWidget *name_lb; /**< name label */
- GtkWidget *scrolled_window; /**< the scrolled window */
- GtkTreeView *table; /**< the GTK table */
- const char *default_titles[14]; /**< Column headers */
- GtkWidget *menu; /**< context menu */
- gboolean has_ports; /**< table has ports */
- conv_hash_t hash; /**< conversations hash table */
-
- gboolean fixed_col; /**< if switched to fixed column */
- gboolean resolve_names; /**< resolve address names? */
-
- int reselection_idx; /**< conversation index to reselect */
-} conversations_table;
-
-/** Init the conversation table for the single conversation window.
- *
- * @param ct the registered conversation
- * @param filter the optional filter name or NULL
- */
-extern void init_conversation_table(struct register_ct* ct, const char *filter);
-
-/** Callback for "Conversations" statistics item.
- *
- * @param widget unused
- * @param data unused
- */
-extern void init_conversation_notebook_cb(GtkWidget *widget, gpointer data);
-
-/** Function called to instantiate the "GTK conversation table display"
- *
- * @param table conversation table to be created
- */
-extern void conversation_endpoint_cb(register_ct_t* table);
-
-#endif /* __CONVERSATIONS_TABLE_H__ */
diff --git a/ui/gtk/dcerpc_stat.c b/ui/gtk/dcerpc_stat.c
deleted file mode 100644
index bf5006d39d..0000000000
--- a/ui/gtk/dcerpc_stat.c
+++ /dev/null
@@ -1,689 +0,0 @@
-/* dcerpc_stat.c
- * dcerpc_stat 2002 Ronnie Sahlberg
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/* This module provides rpc call/reply SRT statistics to Wireshark,
- * and displays them graphically.
- * It is only used by Wireshark and not tshark
- *
- * It serves as an example on how to use the tap api.
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/packet_info.h>
-#include <epan/stat_tap_ui.h>
-#include <epan/tap.h>
-#include <epan/dissectors/packet-dcerpc.h>
-
-#include "ui/simple_dialog.h"
-
-#include "ui/gtk/gui_stat_menu.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/filter_dlg.h"
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/service_response_time_table.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/filter_autocomplete.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-#include "globals.h"
-
-void register_tap_listener_gtkdcerpcstat(void);
-
-/* used to keep track of the statistics for an entire program interface */
-typedef struct _dcerpcstat_t {
- const char *prog;
- guint16 ver;
- gtk_srt_t gtk_data;
- register_srt_t* srt;
- srt_data_t data;
-} dcerpcstat_t;
-
-
-static char *
-dcerpcstat_gen_title(dcerpcstat_t *rs)
-{
- char *title;
- char *display_name;
-
- display_name = cf_get_display_name(&cfile);
- title = g_strdup_printf("DCE-RPC Service Response Time statistics for %s major version %u: %s", rs->prog, rs->ver, display_name);
- g_free(display_name);
- return title;
-}
-
-static void
-dcerpcstat_set_title(dcerpcstat_t *rs)
-{
- char *title;
-
- title = dcerpcstat_gen_title(rs);
- gtk_window_set_title(GTK_WINDOW(rs->gtk_data.win), title);
- g_free(title);
-}
-
-static void
-dcerpcstat_reset(void *rs_arg)
-{
- srt_data_t *srt = (srt_data_t*)rs_arg;
- dcerpcstat_t *rs = (dcerpcstat_t *)srt->user_data;
-
- reset_srt_table(rs->data.srt_array, reset_table_data, &rs->gtk_data);
-
- dcerpcstat_set_title(rs);
-}
-
-static void
-dcerpcstat_draw(void *rs_arg)
-{
- guint i = 0;
- srt_stat_table *srt_table;
- srt_data_t *srt = (srt_data_t*)rs_arg;
- dcerpcstat_t *rs = (dcerpcstat_t *)srt->user_data;
-
- for (i = 0; i < srt->srt_array->len; i++)
- {
- srt_table = g_array_index(srt->srt_array, srt_stat_table*, i);
- draw_srt_table_data(srt_table, &rs->gtk_data);
- }
-
-}
-
-static void
-win_destroy_cb(GtkWindow *win _U_, gpointer data)
-{
- dcerpcstat_t *rs = (dcerpcstat_t *)data;
-
- remove_tap_listener(&rs->data);
-
- free_srt_table(rs->srt, rs->data.srt_array, free_table_data, &rs->gtk_data);
- g_free(rs);
-}
-
-/* When called, this function will create a new instance of gtk-dcerpcstat.
- */
-static void
-gtk_dcerpcstat_init(const char *opt_arg, void* userdata _U_)
-{
- dcerpcstat_t *rs;
- guint32 i, max_procs;
- char *title_string;
- char *filter_string;
- GtkWidget *stat_label;
- GtkWidget *filter_label;
- GtkWidget *bbox;
- GtkWidget *close_bt;
- dcerpc_sub_dissector *procs;
- e_guid_t uuid;
- guint d1,d2,d3,d40,d41,d42,d43,d44,d45,d46,d47;
- int major, minor;
- guint16 ver;
- int pos = 0;
- const char *filter = NULL;
- dcerpcstat_tap_data_t* tap_data;
- GString *error_string;
-
- /*
- * XXX - DCE RPC statistics are maintained only by major version,
- * not by major and minor version, so the minor version number is
- * ignored.
- *
- * Should we just stop supporting minor version numbers here?
- * Or should we allow it to be omitted? Or should we keep
- * separate statistics for different minor version numbers,
- * and allow the minor version number to be omitted, and
- * report aggregate statistics for all minor version numbers
- * if it's omitted?
- */
- if(sscanf(
- opt_arg,
- "dcerpc,srt,%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x,%d.%d,%n",
- &d1,&d2,&d3,&d40,&d41,&d42,&d43,&d44,&d45,&d46,&d47,&major,&minor,&pos)
- == 13) {
- uuid.data1 = d1;
- uuid.data2 = d2;
- uuid.data3 = d3;
- uuid.data4[0] = d40;
- uuid.data4[1] = d41;
- uuid.data4[2] = d42;
- uuid.data4[3] = d43;
- uuid.data4[4] = d44;
- uuid.data4[5] = d45;
- uuid.data4[6] = d46;
- uuid.data4[7] = d47;
- if(pos) {
- filter = opt_arg+pos;
- } else {
- filter = NULL;
- }
- } else {
- fprintf(stderr, "wireshark: invalid \"-z dcerpc,srt,<uuid>,<major version>.<minor version>[,<filter>]\" argument\n");
- exit(1);
- }
- if ((major < 0) || (major > 65535)) {
- fprintf(stderr,"wireshark: dcerpcstat_init() Major version number %d is invalid - must be positive and <= 65535\n", major);
- exit(1);
- }
- if ((minor < 0) || (minor > 65535)) {
- fprintf(stderr,"wireshark: dcerpcstat_init() Minor version number %d is invalid - must be positive and <= 65535\n", minor);
- exit(1);
- }
- ver = major;
-
- rs = (dcerpcstat_t *)g_malloc0(sizeof(dcerpcstat_t));
- rs->prog = dcerpc_get_proto_name(&uuid, ver);
- if(!rs->prog){
- g_free(rs);
- fprintf(stderr,
- "wireshark: dcerpcstat_init() Protocol with uuid:%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x v%u not supported\n",
- uuid.data1,uuid.data2,uuid.data3,uuid.data4[0],uuid.data4[1],uuid.data4[2],uuid.data4[3],uuid.data4[4],uuid.data4[5],uuid.data4[6],uuid.data4[7],ver);
- exit(1);
- }
-
- procs = dcerpc_get_proto_sub_dissector(&uuid, ver);
- rs->ver = ver;
-
- rs->gtk_data.win = dlg_window_new("dcerpc-stat"); /* transient_for top_level */
- gtk_window_set_destroy_with_parent(GTK_WINDOW(rs->gtk_data.win), TRUE);
-
- dcerpcstat_set_title(rs);
- gtk_window_set_default_size(GTK_WINDOW(rs->gtk_data.win), SRT_PREFERRED_WIDTH, SRT_PREFERRED_HEIGHT);
-
- rs->gtk_data.vbox =ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_add(GTK_CONTAINER(rs->gtk_data.win), rs->gtk_data.vbox);
- gtk_container_set_border_width(GTK_CONTAINER(rs->gtk_data.vbox), 12);
-
- title_string = dcerpcstat_gen_title(rs);
- stat_label = gtk_label_new(title_string);
- g_free(title_string);
- gtk_box_pack_start(GTK_BOX(rs->gtk_data.vbox), stat_label, FALSE, FALSE, 0);
-
- filter_string = g_strdup_printf("Filter: %s",filter ? filter : "");
- filter_label = gtk_label_new(filter_string);
- g_free(filter_string);
- gtk_label_set_line_wrap(GTK_LABEL(filter_label), TRUE);
- gtk_box_pack_start(GTK_BOX(rs->gtk_data.vbox), filter_label, FALSE, FALSE, 0);
-
- /* We must display TOP LEVEL Widget before calling init_gtk_srt_table() */
- gtk_widget_show_all(rs->gtk_data.win);
-
- rs->srt = get_srt_table_by_name("dcerpc");
-
-
- for(i=0,max_procs=0;procs[i].name;i++){
- if(procs[i].num>max_procs){
- max_procs = procs[i].num;
- }
- }
-
- /* Setup the tap data */
- tap_data = g_new0(dcerpcstat_tap_data_t, 1);
-
- tap_data->uuid = uuid;
- tap_data->prog = dcerpc_get_proto_name(&tap_data->uuid, ver);
- tap_data->ver = ver;
- tap_data->num_procedures = max_procs+1;
-
- set_srt_table_param_data(rs->srt, tap_data);
-
- rs->gtk_data.gtk_srt_array = g_array_new(FALSE, TRUE, sizeof(gtk_srt_table_t*));
- rs->data.srt_array = g_array_new(FALSE, TRUE, sizeof(srt_stat_table*));
- rs->data.user_data = rs;
-
- srt_table_dissector_init(rs->srt, rs->data.srt_array, init_gtk_srt_table, &rs->gtk_data);
-
- error_string = register_tap_listener("dcerpc", &rs->data, filter, 0, dcerpcstat_reset, get_srt_packet_func(rs->srt), dcerpcstat_draw);
- if(error_string){
- /* error, we failed to attach to the tap. clean up */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
- g_string_free(error_string, TRUE);
- free_srt_table(rs->srt, rs->data.srt_array, NULL, NULL);
- g_free(rs);
- return;
- }
-
- /* Button row. */
- bbox = dlg_button_row_new(GTK_STOCK_CLOSE, NULL);
- gtk_box_pack_end(GTK_BOX(rs->gtk_data.vbox), bbox, FALSE, FALSE, 0);
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(rs->gtk_data.win, close_bt, window_cancel_button_cb);
-
- g_signal_connect(rs->gtk_data.win, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(rs->gtk_data.win, "destroy", G_CALLBACK(win_destroy_cb), rs);
-
- gtk_widget_show_all(rs->gtk_data.win);
- window_present(rs->gtk_data.win);
-
- cf_retap_packets(&cfile);
- gdk_window_raise(gtk_widget_get_window(rs->gtk_data.win));
-}
-
-
-
-static e_guid_t *dcerpc_uuid_program;
-static guint16 dcerpc_version;
-static GtkWidget *dlg = NULL;
-static GtkWidget *filter_entry;
-static guid_key *current_uuid_key;
-static dcerpc_uuid_value *current_uuid_value;
-static guid_key *new_uuid_key;
-static dcerpc_uuid_value *new_uuid_value;
-
-static void
-dcerpcstat_start_button_clicked(GtkWidget *item _U_, gpointer data _U_)
-{
- GString *str;
- const char *filter;
-
- if (dcerpc_uuid_program == NULL) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Please select a program");
- return;
- }
- str = g_string_new("dcerpc,srt");
- g_string_append_printf(str,
- ",%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x,%u.%u",
- dcerpc_uuid_program->data1, dcerpc_uuid_program->data2,
- dcerpc_uuid_program->data3,
- dcerpc_uuid_program->data4[0], dcerpc_uuid_program->data4[1],
- dcerpc_uuid_program->data4[2], dcerpc_uuid_program->data4[3],
- dcerpc_uuid_program->data4[4], dcerpc_uuid_program->data4[5],
- dcerpc_uuid_program->data4[6], dcerpc_uuid_program->data4[7],
- dcerpc_version, 0);
- filter = gtk_entry_get_text(GTK_ENTRY(filter_entry));
- if(filter[0] != 0){
- g_string_append_printf(str, ",%s", filter);
- }
-
- gtk_dcerpcstat_init(str->str,NULL);
- g_string_free(str, TRUE);
-}
-
-
-static void
-dcerpcstat_version_select(GtkWidget *vers_combo_box, gpointer user_data _U_)
-{
- guid_key *k;
-
- if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(vers_combo_box), (gpointer *)&k)) {
- g_assert_not_reached(); /* Programming error: somehow no active item */
- }
-
- dcerpc_version = k->ver;
-}
-
-static void
-dcerpcstat_find_vers(gpointer *key, gpointer *value _U_, gpointer user_data)
-{
- guid_key *k = (guid_key *)key;
- GtkWidget *vers_combo_box = (GtkWidget *)user_data;
- char vs[5];
-
- if(guid_cmp(&(k->guid), dcerpc_uuid_program)){
- return;
- }
- g_snprintf(vs, sizeof(vs), "%u", k->ver);
- ws_combo_box_append_text_and_pointer(GTK_COMBO_BOX(vers_combo_box), vs, k);
-}
-
-static void
-dcerpcstat_program_select(GtkWidget *prog_combo_box, gpointer user_data)
-{
- guid_key *k;
- GtkWidget *vers_combo_box;
-
- vers_combo_box = (GtkWidget *)user_data;
-
- if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(prog_combo_box), (gpointer *)&k)) {
- g_assert_not_reached(); /* Programming error: somehow no active item */
- }
-
- g_signal_handlers_disconnect_by_func(vers_combo_box, G_CALLBACK(dcerpcstat_version_select), NULL );
- ws_combo_box_clear_text_and_pointer(GTK_COMBO_BOX(vers_combo_box));
-
- /* dcerpc_stat: invalid selection... somehow selected top level ?? */
- g_assert(k != NULL);
- dcerpc_uuid_program = &(k->guid);
-
- /* re-create version menu */
- g_signal_handlers_disconnect_by_func(vers_combo_box, G_CALLBACK(dcerpcstat_version_select), NULL );
- ws_combo_box_clear_text_and_pointer(GTK_COMBO_BOX(vers_combo_box));
-
- g_hash_table_foreach(dcerpc_uuids, (GHFunc)dcerpcstat_find_vers, vers_combo_box);
-
- g_signal_connect(vers_combo_box, "changed", G_CALLBACK(dcerpcstat_version_select), NULL);
- ws_combo_box_set_active(GTK_COMBO_BOX(vers_combo_box), 0); /* default: triggers dcerpcstat_version_select callback */
-
-}
-
-static GtkTreeIter
-dcerpcstat_add_program_to_menu(guid_key *k, dcerpc_uuid_value *v, GtkWidget *prog_combo_box, int program_item_index)
-{
- static GtkTreeIter iter;
- char str[64];
-
- switch(program_item_index%15){
- case 0:
- g_snprintf(str,sizeof(str),"%s ...",v->name);
- iter = ws_combo_box_append_text_and_pointer_full(
- GTK_COMBO_BOX(prog_combo_box), NULL, str, NULL, FALSE); /* top-level entries are insensitive */
- break;
-
- default:
- break;
- }
-
- return ws_combo_box_append_text_and_pointer_full(
- GTK_COMBO_BOX(prog_combo_box), &iter, v->name, k, TRUE);
-}
-
-static void
-dcerpcstat_find_next_program(gpointer *key, gpointer *value, gpointer *user_data _U_)
-{
- guid_key *k = (guid_key *)key;
- dcerpc_uuid_value *v = (dcerpc_uuid_value *)value;
-
- /* first time called, just set new_uuid to this one */
- if((current_uuid_key==NULL) && (new_uuid_key==NULL)){
- new_uuid_key = k;
- new_uuid_value = v;
- return;
- }
-
- /* if we haven't got a current one yet, just check the new
- and scan for the first one alphabetically */
- if(current_uuid_key==NULL){
- if(strcmp(new_uuid_value->name, v->name)>0){
- new_uuid_key = k;
- new_uuid_value = v;
- return;
- }
- return;
- }
-
- /* searching for the next one we are only interested in those
- that sorts alphabetically after the current one */
- if(strcmp(current_uuid_value->name, v->name) >= 0){
- /* this one doesn't so just skip it */
- return;
- }
-
- /* is it the first potential new entry? */
- if(new_uuid_key==NULL){
- new_uuid_key = k;
- new_uuid_value = v;
- return;
- }
-
- /* does it sort before the current new one? */
- if(strcmp(new_uuid_value->name, v->name) > 0){
- new_uuid_key = k;
- new_uuid_value = v;
- return;
- }
-
- return;
-}
-
-
-static void
-dlg_destroy_cb(GtkWidget *w _U_, gpointer user_data _U_)
-{
- dlg = NULL;
-}
-
-
-void gtk_dcerpcstat_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- GtkWidget *dlg_box;
- GtkWidget *prog_box, *prog_label, *prog_combo_box;
- GtkWidget *vers_label, *vers_combo_box;
- GtkWidget *filter_box, *filter_bt;
- GtkWidget *bbox, *start_button, *cancel_button;
- GtkCellRenderer *cell_renderer;
-#if 0
- GtkTreeIter program_first_item_iter;
-#endif
- const char *filter;
- int program_item_index = 0;
-
- static construct_args_t args = {
- "Service Response Time Statistics Filter",
- FALSE,
- FALSE,
- FALSE
- };
-
- /* if the window is already open, bring it to front and
- un-minimize it, as necessary */
- if(dlg){
- reactivate_window(dlg);
- return;
- }
-
- dlg = dlg_window_new("Wireshark: Compute DCE-RPC SRT statistics");
- gtk_window_set_default_size(GTK_WINDOW(dlg), 400, -1);
-
- dlg_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 10, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(dlg_box), 10);
- gtk_container_add(GTK_CONTAINER(dlg), dlg_box);
- gtk_widget_show(dlg_box);
-
- /* Program box */
- prog_box = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
-
- /* Program label */
- gtk_container_set_border_width(GTK_CONTAINER(prog_box), 10);
- prog_label = gtk_label_new("Program:");
- gtk_box_pack_start(GTK_BOX(prog_box), prog_label, FALSE, FALSE, 0);
- gtk_widget_show(prog_label);
-
- /* Program menu */
- dcerpc_uuid_program = NULL; /* default: no program selected */
-
- /* The "program combo box" is implemented with a two-level tree.
- Each top-level of the tree has (up to) 15 selectable "program name"
- children and shows the name of the first child of that entry
- as "child_name ...". Each of the top-level entries can be expanded
- (to show the children) but is "insensitive": ie: cannot be selected.
- (dcerpcstat_add_program_to_menu() does the actual work to add entries
- to the combo box).
- XXX: A simpler alternative might be to just do away with all the two-level
- complexity and just use a standard ws_combo_box... even though the
- list of "program names" is quite large.
- XXX: The gtkrc file distributed with Windows Wireshark has the
- "appears-as-list" GtkComboBox style property set to 1 and thus
- on Windows the entries for this combo box will appear as a tree-view.
- The default is 0(FALSE). In this case the the combo box entries will
- display as a menu with sub-menus.
- A possibility would be to set "appears-as-list" to 0 just for this
- particular combo box on Windows so that the entries will appear as a
- menu even on Windows).
- */
- prog_combo_box = ws_combo_box_new_text_and_pointer_full(&cell_renderer);
- {
- /* XXX: Hack So that the top-level insensitive entries don't show
- as "grayed out"; The "foreground normal" color is used instead.
- This may not really be necessary but seems better to me.
- */
-#if GTK_CHECK_VERSION(3,0,0)
- GtkStyleContext *context;
- GdkRGBA *new_rgba_fg_color;
- context = gtk_widget_get_style_context (prog_combo_box);
- gtk_style_context_get (context, GTK_STATE_FLAG_NORMAL,
- "color", &new_rgba_fg_color,
- NULL);
-
- g_object_set(cell_renderer,
- "foreground-rgba", &new_rgba_fg_color,
- "foreground-set", TRUE,
- NULL);
-
-#else
- GtkStyle *s;
- s = gtk_widget_get_style(prog_combo_box);
- g_object_set(cell_renderer,
- "foreground-gdk", &(s->fg[GTK_STATE_NORMAL]),
- "foreground-set", TRUE,
- NULL);
-#endif
- }
-
- current_uuid_key = NULL;
- current_uuid_value = NULL;
- do {
- new_uuid_key = NULL;
- new_uuid_value = NULL;
- g_hash_table_foreach(dcerpc_uuids, (GHFunc)dcerpcstat_find_next_program, NULL);
- if(new_uuid_key){
-#if 0
- GtkTreeIter tmp_iter;
- tmp_iter = dcerpcstat_add_program_to_menu(new_uuid_key, new_uuid_value,
- prog_combo_box, program_item_index);
- if (program_item_index == 0)
- program_first_item_iter = tmp_iter;
-#else
- dcerpcstat_add_program_to_menu(new_uuid_key, new_uuid_value,
- prog_combo_box, program_item_index);
-#endif
- program_item_index += 1;
- }
- current_uuid_key = new_uuid_key;
- current_uuid_value = new_uuid_value;
- } while(new_uuid_key != NULL);
- gtk_box_pack_start(GTK_BOX(prog_box), prog_combo_box, TRUE, TRUE, 0);
- gtk_widget_show(prog_combo_box);
-
- /* Version label */
- gtk_container_set_border_width(GTK_CONTAINER(prog_box), 10);
- vers_label = gtk_label_new("Version:");
- gtk_box_pack_start(GTK_BOX(prog_box), vers_label, FALSE, FALSE, 0);
- gtk_widget_show(vers_label);
-
- /* Version combo-box */
- /* Note: version combo box rows set when dcerpcstat_program_select() callback invoked */
- vers_combo_box = ws_combo_box_new_text_and_pointer();
- gtk_box_pack_start(GTK_BOX(prog_box), vers_combo_box, TRUE, TRUE, 0);
- gtk_widget_show(vers_combo_box);
-
- g_signal_connect(prog_combo_box, "changed", G_CALLBACK(dcerpcstat_program_select), vers_combo_box);
-#if 0 /* Don't select an active entry given the way the drop down treeview appears if a default (active) entry is set */
- ws_combo_box_set_active_iter(GTK_COMBO_BOX(prog_combo_box), &program_first_item_iter); /* triggers callback */
-#endif
- gtk_box_pack_start(GTK_BOX(dlg_box), prog_box, TRUE, TRUE, 0);
- gtk_widget_show(prog_box);
-
- /* Filter box */
- filter_box = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
-
- /* Filter label */
- filter_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_DISPLAY_FILTER_ENTRY);
- g_signal_connect(filter_bt, "clicked", G_CALLBACK(display_filter_construct_cb), &args);
- gtk_box_pack_start(GTK_BOX(filter_box), filter_bt, FALSE, FALSE, 0);
- gtk_widget_show(filter_bt);
-
- /* Filter entry */
- filter_entry = gtk_entry_new();
- g_signal_connect(filter_entry, "changed", G_CALLBACK(filter_te_syntax_check_cb), NULL);
- g_object_set_data(G_OBJECT(filter_box), E_FILT_AUTOCOMP_PTR_KEY, NULL);
- g_signal_connect(filter_entry, "key-press-event", G_CALLBACK (filter_string_te_key_pressed_cb), NULL);
- g_signal_connect(dlg, "key-press-event", G_CALLBACK (filter_parent_dlg_key_pressed_cb), NULL);
- gtk_box_pack_start(GTK_BOX(filter_box), filter_entry, TRUE, TRUE, 0);
- filter = gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget));
- if(filter){
- gtk_entry_set_text(GTK_ENTRY(filter_entry), filter);
- } else {
- colorize_filter_te_as_empty(filter_entry);
- }
- gtk_widget_show(filter_entry);
-
- gtk_box_pack_start(GTK_BOX(dlg_box), filter_box, TRUE, TRUE, 0);
- gtk_widget_show(filter_box);
-
- g_object_set_data(G_OBJECT(filter_bt), E_FILT_TE_PTR_KEY, filter_entry);
-
- /* button box */
- bbox = dlg_button_row_new(WIRESHARK_STOCK_CREATE_STAT, GTK_STOCK_CANCEL, NULL);
- gtk_box_pack_start(GTK_BOX(dlg_box), bbox, FALSE, FALSE, 0);
- gtk_widget_show(bbox);
-
- start_button = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_CREATE_STAT);
- g_signal_connect_swapped(start_button, "clicked",
- G_CALLBACK(dcerpcstat_start_button_clicked), NULL);
-
- cancel_button = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- window_set_cancel_button(dlg, cancel_button, window_cancel_button_cb);
-
- g_signal_connect(dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(dlg, "destroy", G_CALLBACK(dlg_destroy_cb), NULL);
-
- /* Catch the "activate" signal on the filter text entry, so that
- if the user types Return there, we act as if the "Create Stat"
- button had been selected, as happens if Return is typed if some
- widget that *doesn't* handle the Return key has the input
- focus. */
- dlg_set_activate(filter_entry, start_button);
-
- gtk_widget_grab_default(start_button );
-
- /* Give the initial focus to the "Filter" entry box. */
- gtk_widget_grab_focus(filter_entry);
-
- gtk_widget_show_all(dlg);
- window_present(dlg);
-}
-
-static stat_tap_ui dcerpcstat_ui = {
- REGISTER_STAT_GROUP_RESPONSE_TIME,
- NULL,
- "dcerpc,srt",
- gtk_dcerpcstat_init,
- 0,
- NULL
-};
-
-void
-register_tap_listener_gtkdcerpcstat(void)
-{
- register_stat_tap_ui(&dcerpcstat_ui, NULL);
-}
-
-/*
- * Editor modelines - http://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/gtk/decode_as_dlg.c b/ui/gtk/decode_as_dlg.c
deleted file mode 100644
index dd3269631a..0000000000
--- a/ui/gtk/decode_as_dlg.c
+++ /dev/null
@@ -1,1513 +0,0 @@
-/* decode_as_dlg.c
- *
- * Routines to modify dissector tables on the fly.
- *
- * By David Hampton <dhampton@mac.com>
- * Copyright 2001 David Hampton
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-#include "config.h"
-
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-#if GTK_CHECK_VERSION(3,0,0)
-# include <gdk/gdkkeysyms-compat.h>
-#endif
-
-#include <epan/packet.h>
-#include <epan/epan_dissect.h>
-#include <epan/decode_as.h>
-#include <epan/prefs.h>
-#include <epan/prefs-int.h>
-#include <epan/dissectors/packet-dcerpc.h>
-
-#include "ui/decode_as_utils.h"
-#include "ui/simple_dialog.h"
-#include <wsutil/utf8_entities.h>
-
-#include "ui/gtk/main.h"
-#include "ui/gtk/decode_as_dlg.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/old-gtk-compat.h"
-#include "ui/gtk/packet_win.h"
-#include "ui/gtk/stock_icons.h"
-
-#include "globals.h"
-
-#undef DEBUG
-
-/**************************************************/
-/* Typedefs & Enums */
-/**************************************************/
-
-#define E_DECODE_MIN_HEIGHT 300
-#define E_NOTEBOOK "notebook"
-
-#define E_COMBO_BOX_MULTIVALUE "combo_box_multivalue"
-
-#define E_PAGE_DECODE_AS_DATA "decode_as_data"
-
-/*
- * Columns for a "Display" list
- */
-#define E_LIST_D_TABLE 0
-#define E_LIST_D_SELECTOR 1
-#define E_LIST_D_INITIAL 2
-#define E_LIST_D_CURRENT 3
-#define E_LIST_D_MAX E_LIST_D_CURRENT
-#define E_LIST_D_COLUMNS (E_LIST_D_MAX + 1)
-
-/*
- * Columns for a "Select" list.
- * Note that most of these columns aren't displayed; they're attached
- * to the row of the table as additional information.
- */
-#define E_LIST_S_PROTO_NAME 0
-#define E_LIST_S_TABLE 1
-/* The following is for debugging in decode_add_to_list */
-#define E_LIST_S_MAX E_LIST_S_TABLE
-#define E_LIST_S_COLUMNS (E_LIST_S_MAX + 1)
-
-#define E_PAGE_LIST "notebook_page_list"
-#define E_PAGE_TABLE "notebook_page_table_name"
-#define E_PAGE_TITLE "notebook_page_title"
-#define E_PAGE_VALUE "notebook_page_value"
-#define E_PAGE_CURR_LAYER_NUM "notebook_page_curr_layer_num"
-
-#define E_PAGE_ACTION "notebook_page_action"
-
-/**************************************************/
-/* File Global Variables */
-/**************************************************/
-
-/*
- * Keep a static pointer to the current "Decode As" window. This is
- * kept so that if somebody tries to do "Tools:Decode As" while
- * there's already a "Decode As" window up, we just pop up the
- * existing one, rather than creating a new one.
- */
-static GtkWidget *decode_w = NULL;
-
-/*
- * A static pointer to the current "Decode As:Show" window. This is
- * kept so that if somebody tries to do clock the "Show Current"
- * button or select the "Display:User Specified Decodes" menu item
- * while there's already a "Decode As:Show" window up, we just pop up
- * the existing one, rather than creating a new one.
- */
-static GtkWidget *decode_show_w = NULL;
-
-/*
- * A list of the dialog items that only have meaning when the user has
- * selected the "Decode" radio button. When the "Do not decode"
- * button is selected these items should be dimmed.
- */
-GSList *decode_dimmable = NULL;
-
-/*
- * Remember the "action" radio button that is currently selected in
- * the dialog. This value is initialized when the dialog is created,
- * modified in a callback routine, and read in the routine that
- * handles a click in the "OK" button for the dialog.
- */
-enum action_type requested_action = (enum action_type)-1;
-
-
-/**************************************************/
-/* Global Functions */
-/**************************************************/
-
-/**************************************************/
-/* Saving "Decode As" */
-/**************************************************/
-
-/*
- * Data structure to hold information of the "Decode As" entry.
- */
-struct da_entry {
- gchar *table;
- guint selector;
- gchar *initial;
- gchar *current;
-};
-
-/*
- * A typedef for the "Decode As" entry.
- */
-typedef struct da_entry da_entry_t;
-
-/*
- * Container that holds the entries of the "Decode As"
- */
-GSList *da_entries = NULL;
-
-/*
- * Free memory used by the da_entry
- */
-static void
-free_da_entry(gpointer item, gpointer user_data _U_)
-{
- da_entry_t *entry = (da_entry_t *)item;
- g_free(entry->table);
- g_free(entry->initial);
- g_free(entry->current);
-}
-
-
-/**************************************************/
-/* Show Changed Dissectors */
-/**************************************************/
-
-#define SORT_ALPHABETICAL 0
-
-static gint
-sort_iter_compare_func (GtkTreeModel *model,
- GtkTreeIter *a,
- GtkTreeIter *b,
- gpointer user_data)
-{
- gint sortcol = GPOINTER_TO_INT(user_data);
- gint ret = 0;
- switch (sortcol)
- {
- case SORT_ALPHABETICAL:
- {
- gchar *name1, *name2;
- gtk_tree_model_get(model, a, 0, &name1, -1);
- gtk_tree_model_get(model, b, 0, &name2, -1);
- if (name1 == NULL || name2 == NULL)
- {
- if (name1 == NULL && name2 == NULL)
- break; /* both equal => ret = 0 */
- ret = (name1 == NULL) ? -1 : 1;
- }
- else
- {
- ret = g_ascii_strcasecmp(name1,name2);
- }
- g_free(name1);
- g_free(name2);
- }
- break;
- default:
- g_return_val_if_reached(0);
- }
- return ret;
-}
-
-
-static void
-decode_add_to_show_list (gpointer list_data,
- const gchar *table_name,
- gchar *selector_name,
- const gchar *initial_proto_name,
- const gchar *current_proto_name)
-{
- const gchar *text[E_LIST_D_COLUMNS];
- GtkListStore *store;
- GtkTreeIter iter;
-
- store = (GtkListStore *)list_data;
-
- text[E_LIST_D_TABLE] = table_name;
- text[E_LIST_D_SELECTOR] = selector_name;
- text[E_LIST_D_INITIAL] = initial_proto_name;
- text[E_LIST_D_CURRENT] = current_proto_name;
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, E_LIST_D_TABLE, text[E_LIST_D_TABLE],
- E_LIST_D_SELECTOR, text[E_LIST_D_SELECTOR],
- E_LIST_D_INITIAL, text[E_LIST_D_INITIAL],
- E_LIST_D_CURRENT, text[E_LIST_D_CURRENT], -1);
-}
-
-
-/*
- * This routine creates one entry in the list of protocol dissector
- * that have been changed. It is called by the g_hash_foreach routine
- * once for each changed entry in a dissector table.
- *
- * @param table_name The table name in which this dissector is found.
- *
- * @param key A pointer to the key for this entry in the dissector
- * hash table. This is generally the numeric selector of the
- * protocol, i.e. the ethernet type code, IP port number, TCP port
- * number, etc.
- *
- * @param value A pointer to the value for this entry in the dissector
- * hash table. This is an opaque pointer that can only be handed back
- * to routine in the file packet.c
- *
- * @param user_data A pointer to the list in which this information
- * should be stored.
- */
-static void
-decode_build_show_list (const gchar *table_name, ftenum_t selector_type,
- gpointer key, gpointer value, gpointer user_data)
-{
- dissector_handle_t current, initial;
- const gchar *current_proto_name, *initial_proto_name;
- gchar *selector_name;
- gchar string1[20];
- da_entry_t *entry;
-
- entry = g_new(da_entry_t,1);
-
- g_assert(user_data);
- g_assert(value);
-
- current = dtbl_entry_get_handle((dtbl_entry_t *)value);
- if (current == NULL)
- current_proto_name = DECODE_AS_NONE;
- else
- current_proto_name = dissector_handle_get_short_name(current);
- initial = dtbl_entry_get_initial_handle((dtbl_entry_t *)value);
- if (initial == NULL)
- initial_proto_name = DECODE_AS_NONE;
- else
- initial_proto_name = dissector_handle_get_short_name(initial);
-
- switch (selector_type) {
-
- case FT_UINT8:
- case FT_UINT16:
- case FT_UINT24:
- case FT_UINT32:
- switch (get_dissector_table_param(table_name)) {
-
- case BASE_DEC:
- g_snprintf(string1, sizeof(string1), "%u", GPOINTER_TO_UINT(key));
- break;
-
- case BASE_HEX:
- switch (get_dissector_table_selector_type(table_name)) {
-
- case FT_UINT8:
- g_snprintf(string1, sizeof(string1), "0x%02x", GPOINTER_TO_UINT(key));
- break;
-
- case FT_UINT16:
- g_snprintf(string1, sizeof(string1), "0x%04x", GPOINTER_TO_UINT(key));
- break;
-
- case FT_UINT24:
- g_snprintf(string1, sizeof(string1), "0x%06x", GPOINTER_TO_UINT(key));
- break;
-
- case FT_UINT32:
- g_snprintf(string1, sizeof(string1), "0x%08x", GPOINTER_TO_UINT(key));
- break;
-
- default:
- g_assert_not_reached();
- break;
- }
- break;
-
- case BASE_OCT:
- g_snprintf(string1, sizeof(string1), "%#o", GPOINTER_TO_UINT(key));
- break;
- }
- selector_name = string1;
- break;
-
- case FT_NONE:
- selector_name = NULL;
- break;
-
- case FT_STRING:
- case FT_STRINGZ:
- case FT_UINT_STRING:
- case FT_STRINGZPAD:
- selector_name = (gchar *)key;
- break;
-
- default:
- g_assert_not_reached();
- selector_name = NULL;
- break;
- }
-
- decode_add_to_show_list (
- user_data,
- get_dissector_table_ui_name(table_name),
- selector_name,
- initial_proto_name,
- current_proto_name);
-
- entry->table = g_strdup(table_name);
- entry->selector = GPOINTER_TO_UINT(key);
- entry->initial = g_strdup(initial_proto_name);
- entry->current = g_strdup(current_proto_name);
- da_entries = g_slist_append(da_entries, entry);
-}
-
-
-/*
- * This routine is called when the user clicks the "OK" button in
- * the "Decode As:Show..." dialog window. This routine destroys the
- * dialog box and performs other housekeeping functions.
- *
- * @param ok_bt A pointer to the "OK" button.
- *
- * @param parent_w A pointer to the dialog window.
- */
-static void
-decode_show_ok_cb (GtkWidget *ok_bt _U_, gpointer parent_w)
-{
- window_destroy(GTK_WIDGET(parent_w));
-}
-
-
-/*
- * This routine is called when the user clicks the "Clear" button in
- * the "Decode As:Show..." dialog window. This routine resets all the
- * dissector values and then destroys the dialog box and performs
- * other housekeeping functions.
- *
- * @param clear_bt A pointer to the "Clear" button.
- *
- * @param parent_w A pointer to the dialog window.
- */
-static void
-decode_show_clear_cb (GtkWidget *clear_bt _U_, gpointer parent_w)
-{
- decode_clear_all();
- redissect_packets();
- redissect_all_packet_windows();
-
- window_destroy(GTK_WIDGET(parent_w));
-
- decode_show_cb(NULL, NULL);
-}
-
-
-/*
- * This routine is called when the user clicks the X at the top right end in
- * the "Decode As:Show..." dialog window. This routine simply calls the
- * ok routine as if the user had clicked the ok button.
- *
- * @param win A pointer to the dialog box.
- *
- * @param event A pointer to the event struct
- *
- * @param user_data Unused
- */
-static gboolean
-decode_show_delete_cb (GtkWidget *win _U_, GdkEvent *event _U_, gpointer user_data _U_)
-{
- decode_show_ok_cb(NULL, decode_show_w);
- return FALSE;
-}
-
-
-/*
- * This routine is called at the destruction of the "Decode As:Show"
- * dialog box. It clears the pointer maintained by this file, so that
- * the next time the user clicks the "Decode As:Show" button a new
- * dialog box will be created.
- *
- * @param win A pointer to the dialog box.
- *
- * @param user_data Unused
- */
-static void
-decode_show_destroy_cb (GtkWidget *win _U_, gpointer user_data _U_)
-{
- /* Note that we no longer have a "Decode As:Show" dialog box. */
- decode_show_w = NULL;
-
- /* Clear saved "Decode As" entries. */
- g_slist_foreach(da_entries, free_da_entry, NULL);
- g_slist_free(da_entries);
- da_entries = NULL;
-}
-
-
-/*
- * This routine saves the current "Decode As"-entries into the
- * preferences file
- *
- * @param win Unused
- *
- * @param user_data Unused
- */
-static void
-decode_show_save_cb (GtkWidget *win _U_, gpointer user_data _U_)
-{
- gchar* err = NULL;
-
- if (save_decode_as_entries(&err) < 0)
- {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err);
- g_free(err);
- }
-}
-
-/* add a single binding to the Show list */
-static void
-decode_dcerpc_add_show_list_single(gpointer data, gpointer user_data)
-{
- gchar string1[20];
-
-
- decode_dcerpc_bind_values_t *binding = (decode_dcerpc_bind_values_t *)data;
-
- g_snprintf(string1, sizeof(string1), "ctx_id: %u", binding->ctx_id);
-
- decode_add_to_show_list (
- user_data,
- "DCE-RPC",
- string1,
- "-",
- binding->ifname->str);
-}
-
-/*
- * This routine creates the "Decode As:Show" dialog box. This dialog box
- * shows the user which protocols have had their dissectors changed.
- *
- * @param w Unused
- *
- * @param user_data Unused
- */
-void
-decode_show_cb (GtkWidget *w _U_, gpointer user_data _U_)
-{
- GtkWidget *main_vb, *bbox, *ok_bt, *clear_bt, *save_bt, *help_bt, *scrolled_window;
- const gchar *titles[E_LIST_D_COLUMNS] = {
- "Table", "Value", "Initial", "Current"
- };
- gint column;
- GtkListStore *store;
- GtkTreeView *list;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *tc;
- GtkTreeIter iter;
-
- if (decode_show_w != NULL) {
- /* There's already a "Decode As" dialog box; reactivate it. */
- reactivate_window(decode_show_w);
- return;
- }
-
- decode_show_w = dlg_window_new("Wireshark: Decode As: Show");
- /* Provide a minimum of a couple of rows worth of data */
- gtk_window_set_default_size(GTK_WINDOW(decode_show_w), -1, E_DECODE_MIN_HEIGHT);
-
- /* Container for each row of widgets */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 2, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_container_add(GTK_CONTAINER(decode_show_w), main_vb);
-
- /* Initialize list */
- store = gtk_list_store_new(E_LIST_D_COLUMNS, G_TYPE_STRING,
- G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
- list = GTK_TREE_VIEW(tree_view_new(GTK_TREE_MODEL(store)));
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list), TRUE);
- gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(list), FALSE);
- gtk_tree_selection_set_mode(gtk_tree_view_get_selection(list),
- GTK_SELECTION_NONE);
-
- for (column = 0; column < E_LIST_D_COLUMNS; column++) {
- renderer = gtk_cell_renderer_text_new();
- tc = gtk_tree_view_column_new_with_attributes(titles[column],
- renderer, "text",
- column, NULL);
- gtk_tree_view_column_set_sizing(tc, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_column_set_resizable(tc, TRUE);
- gtk_tree_view_append_column(list, tc);
- }
-
- /* Add data */
- dissector_all_tables_foreach_changed(decode_build_show_list, store);
- g_object_unref(G_OBJECT(store));
- decode_dcerpc_add_show_list(decode_dcerpc_add_show_list_single, store);
-
- /* Put list into a scrolled window */
- scrolled_window = scrolled_window_new(NULL, NULL);
- /* this will result to set the width of the dialog to the required size */
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
- GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window),
- GTK_SHADOW_IN);
- gtk_container_add(GTK_CONTAINER(scrolled_window),
- GTK_WIDGET(list));
- gtk_box_pack_start(GTK_BOX(main_vb), scrolled_window, TRUE, TRUE, 0);
-
- /* Button row */
- bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CLEAR, GTK_STOCK_SAVE, GTK_STOCK_HELP, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 0);
- gtk_widget_show(bbox);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(decode_show_ok_cb), decode_show_w);
-
- clear_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLEAR);
- g_signal_connect(clear_bt, "clicked", G_CALLBACK(decode_show_clear_cb), decode_show_w);
-
- save_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_SAVE);
- g_signal_connect(save_bt, "clicked", G_CALLBACK(decode_show_save_cb), decode_show_w);
-
- help_bt =(GtkWidget *) g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_DECODE_AS_SHOW_DIALOG);
-
- /* set ok as default, this button won't change anything */
- window_set_cancel_button(decode_show_w, ok_bt, NULL);
-
- g_signal_connect(decode_show_w, "delete_event", G_CALLBACK(decode_show_delete_cb), NULL);
- g_signal_connect(decode_show_w, "destroy", G_CALLBACK(decode_show_destroy_cb), NULL);
-
- gtk_widget_set_sensitive(clear_bt,
- gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter));
-
- gtk_widget_show_all(decode_show_w);
- window_present(decode_show_w);
-}
-
-
-/**************************************************/
-/* Modify the dissector routines */
-/**************************************************/
-
-
-/**************************************************/
-/* Action routines for the "Decode As..." dialog */
-/* - called when the OK button pressed */
-/* - one per notebook page */
-/**************************************************/
-
-
-#ifdef DEBUG
-/*
- * Print debugging information about tree view selection. Extract all
- * information from the tree view entry that was selected and print it to
- * a dialog window.
- *
- * @param tree_view The tree view to dump.
- *
- * @param leadin A string to print at the start of each line.
- */
-static void
-decode_debug (GtkTreeView *tree_view, gchar *leadin)
-{
- GtkListStore *store;
- GtkTreeSelection *selection;
- GtkTreeIter iter;
- char *string, *text[E_LIST_S_COLUMNS];
- dissector_handle_t handle;
-
- selection = gtk_tree_view_get_selection(tree_view);
-
- if (gtk_tree_selection_get_selected(selection, NULL, &iter)){
- store = GTK_LIST_STORE(gtk_tree_view_get_model(tree_view));
- gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
- E_LIST_S_PROTO_NAME, &text[E_LIST_S_PROTO_NAME],
- E_LIST_S_TABLE, &text[E_LIST_S_TABLE],
- E_LIST_S_TABLE+1, &handle,
- -1);
- string = g_strdup_printf("%s list: <put handle here>, name %s, table %s",
- leadin, text[E_LIST_S_PROTO_NAME],
- text[E_LIST_S_TABLE]);
- } else {
- string = g_strdup_printf("%s list row (none), aka do not decode", leadin);
- }
- simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK, string);
- g_free(string);
-}
-#endif
-
-
-/*
- * This routine is called when the user clicks the "OK" button in the
- * "Decode As..." dialog window and a 'simple' page is foremost.
- * This routine takes care of making any changes requested to the
- * dissector tables. This routine is currently used for IP and
- * Ethertypes. Any 'single change' notebook page can use this
- * routine.
- *
- * @param notebook_pg A pointer to the "network" notebook page.
- */
-static void
-decode_simple (GtkWidget *notebook_pg)
-{
- GtkWidget *list, *combo_box;
- GtkTreeSelection *selection;
- GtkTreeModel *model;
- GtkTreeIter iter;
- decode_as_t *entry;
- gchar *table_name, *abbrev;
- dissector_handle_t handle, temp_handle;
- guint value_loop, *selector_type;
- gpointer ptr, value_ptr;
- gint requested_index = 0;
- gboolean add_reset_list = FALSE;
- dissector_table_t sub_dissectors;
-
- list = (GtkWidget *)g_object_get_data(G_OBJECT(notebook_pg), E_PAGE_LIST);
- if (requested_action == E_DECODE_NO)
- gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(list)));
-
- entry = (decode_as_t *)g_object_get_data(G_OBJECT(notebook_pg), E_PAGE_DECODE_AS_DATA);
- table_name = (gchar *)g_object_get_data(G_OBJECT(notebook_pg), E_PAGE_TABLE);
- sub_dissectors = find_dissector_table(table_name);
-
- /* (sub)dissector selection */
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
- if (gtk_tree_selection_get_selected(selection, &model, &iter) == FALSE)
- {
- abbrev = NULL;
- handle = NULL;
- } else {
- gtk_tree_model_get(model, &iter, E_LIST_S_PROTO_NAME, &abbrev,
- E_LIST_S_TABLE+1, &handle, -1);
- }
-
- if (entry->num_items > 1)
- {
- combo_box = (GtkWidget *)g_object_get_data(G_OBJECT(notebook_pg), E_COMBO_BOX_MULTIVALUE);
- if (!ws_combo_box_get_active_pointer(GTK_COMBO_BOX(combo_box), &ptr))
- g_assert_not_reached(); /* Programming error if no active item in combo_box */
- requested_index = GPOINTER_TO_INT(ptr);
- }
-
- /* Apply values to dissector table (stored in entry) */
- for (value_loop = 0; value_loop < entry->values[requested_index].num_values; value_loop++)
- {
- pref_t* pref_value;
- module_t *module;
-
- guint8 saved_curr_layer_num = cfile.edt->pi.curr_layer_num;
- cfile.edt->pi.curr_layer_num = (guint8)GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(notebook_pg), E_PAGE_CURR_LAYER_NUM));
- value_ptr = entry->values[requested_index].build_values[value_loop](&cfile.edt->pi);
- if (abbrev != NULL && strcmp(abbrev, "(default)") == 0) {
-
- add_reset_list = entry->reset_value(table_name, value_ptr);
-
- /* For now, only numeric dissector tables can use preferences */
- if (IS_FT_UINT(dissector_table_get_type(sub_dissectors))) {
- /* Find the handle currently associated with the value */
- temp_handle = dissector_get_uint_handle(sub_dissectors, GPOINTER_TO_UINT(value_ptr));
- if (temp_handle != NULL) {
- module = prefs_find_module(proto_get_protocol_filter_name(dissector_handle_get_protocol_index(temp_handle)));
- pref_value = prefs_find_preference(module, table_name);
- if (pref_value != NULL) {
- module->prefs_changed_flags |= prefs_get_effect_flags(pref_value);
- prefs_remove_decode_as_value(pref_value, GPOINTER_TO_UINT(value_ptr), TRUE);
- }
- }
- }
- } else {
- add_reset_list = entry->change_value(table_name, value_ptr, &handle, abbrev);
-
- /* For now, only numeric dissector tables can use preferences */
- if (IS_FT_UINT(dissector_table_get_type(sub_dissectors))) {
- if (requested_action != E_DECODE_NO) {
- module = prefs_find_module(proto_get_protocol_filter_name(dissector_handle_get_protocol_index(handle)));
- pref_value = prefs_find_preference(module, table_name);
- if (pref_value != NULL) {
- module->prefs_changed_flags |= prefs_get_effect_flags(pref_value);
- prefs_add_decode_as_value(pref_value, GPOINTER_TO_UINT(value_ptr), FALSE);
- }
- }
- else {
- /* Find the handle currently associated with the value */
- temp_handle = dissector_get_uint_handle(sub_dissectors, GPOINTER_TO_UINT(value_ptr));
- if (temp_handle != NULL) {
- module = prefs_find_module(proto_get_protocol_filter_name(dissector_handle_get_protocol_index(temp_handle)));
- pref_value = prefs_find_preference(module, table_name);
- if (pref_value != NULL) {
- module->prefs_changed_flags |= prefs_get_effect_flags(pref_value);
- prefs_remove_decode_as_value(pref_value, GPOINTER_TO_UINT(value_ptr), FALSE);
- }
- }
-
- }
- }
- }
- cfile.edt->pi.curr_layer_num = saved_curr_layer_num;
-
- if (add_reset_list) {
- selector_type = g_new(guint,1);
- *selector_type = GPOINTER_TO_UINT(value_ptr);
- decode_build_reset_list(table_name, FT_UINT32, selector_type, NULL, NULL);
- }
- }
-
- g_free(abbrev);
-}
-
-
-/**************************************************/
-/* Signals from the "Decode As..." dialog */
-/**************************************************/
-
-/*
- * This routine is called when the user clicks the "OK" button in the
- * "Decode As..." dialog window. This routine calls various helper
- * routines to set/clear dissector values as requested by the user.
- * These routines accumulate information on what actions they have
- * taken, and this summary information is printed by this routine.
- * This routine then destroys the dialog box and performs other
- * housekeeping functions.
- *
- * @param ok_bt A pointer to the "OK" button.
- *
- * @param parent_w A pointer to the dialog window.
- */
-static void
-decode_ok_cb (GtkWidget *ok_bt _U_, gpointer parent_w)
-{
- GtkWidget *notebook, *notebook_pg;
- void (* func)(GtkWidget *);
- gint page_num;
- decode_as_t *entry;
-
- /* Call the right routine for the page that was currently in front. */
- notebook = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_NOTEBOOK);
- page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
- notebook_pg = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), page_num);
-
- func = (void (*)(GtkWidget *))g_object_get_data(G_OBJECT(notebook_pg), E_PAGE_ACTION);
- func(notebook_pg);
-
- /* Free any values that used dynamic memory */
- entry = (decode_as_t *)g_object_get_data(G_OBJECT(notebook_pg), E_PAGE_DECODE_AS_DATA);
- if ((entry->num_items == 1) && (entry->free_func != NULL))
- entry->free_func(g_object_get_data(G_OBJECT(notebook_pg), E_PAGE_VALUE));
-
- window_destroy(GTK_WIDGET(parent_w));
- g_slist_free(decode_dimmable);
- decode_dimmable = NULL;
-
- redissect_packets();
- redissect_all_packet_windows();
-}
-
-/*
- * This routine is called when the user clicks the "Apply" button in the
- * "Decode As..." dialog window. This routine calls various helper
- * routines to set/clear dissector values as requested by the user.
- * These routines accumulate information on what actions they have
- * taken, and this summary information is printed by this routine.
- *
- * @param apply_bt A pointer to the "Apply" button.
- *
- * @param parent_w A pointer to the dialog window.
- */
-static void
-decode_apply_cb (GtkWidget *apply_bt _U_, gpointer parent_w)
-{
- GtkWidget *notebook, *notebook_pg;
- void (* func)(GtkWidget *);
- gint page_num;
-
- /* Call the right routine for the page that was currently in front. */
- notebook = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_NOTEBOOK);
- page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
- notebook_pg = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), page_num);
-
- func = (void (*)(GtkWidget *))g_object_get_data(G_OBJECT(notebook_pg), E_PAGE_ACTION);
- func(notebook_pg);
-
- redissect_packets();
- redissect_all_packet_windows();
-}
-
-/*
- * This routine is called when the user clicks the "Close" button in
- * the "Decode As..." dialog window. This routine then destroys the
- * dialog box and performs other housekeeping functions.
- *
- * @param close_bt A pointer to the "Close" button.
- *
- * @param parent_w A pointer to the dialog window.
- */
-static void
-decode_close_cb (GtkWidget *close_bt _U_, gpointer parent_w)
-{
- GtkWidget *notebook, *notebook_pg;
- gint page_num;
- decode_as_t *entry;
-
- /* Call the right routine for the page that was currently in front. */
- notebook = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_NOTEBOOK);
- page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
- notebook_pg = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), page_num);
-
- /* Free any values that used dynamic memory */
- entry = (decode_as_t *)g_object_get_data(G_OBJECT(notebook_pg), E_PAGE_DECODE_AS_DATA);
- if ((entry->num_items == 1) && (entry->free_func != NULL))
- entry->free_func(g_object_get_data(G_OBJECT(notebook_pg), E_PAGE_VALUE));
-
- window_destroy(GTK_WIDGET(parent_w));
- g_slist_free(decode_dimmable);
- decode_dimmable = NULL;
-}
-
-
-/*
- * This routine is called when the user clicks the "Close" button in
- * the "Decode As..." dialog window. This routine simply calls the
- * close routine as if the user had clicked the close button instead
- * of the close button.
- *
- * @param decode_w_lcl A pointer to the dialog box.
- *
- * @param event A pointer to the GdkEvent struct
- *
- * @param user_data Unused
- */
-static gboolean
-decode_delete_cb (GtkWidget *decode_w_lcl, GdkEvent *event _U_, gpointer user_data _U_)
-{
- decode_close_cb(NULL, decode_w_lcl);
- return FALSE;
-}
-
-
-/*
- * This routine is called at the destruction of the "Decode As..."
- * dialog box. It clears the pointer maintained by this file, so that
- * the next time the user selects the "Decode As..." menu item a new
- * dialog box will be created.
- *
- * @param win A pointer to the dialog box.
- *
- * @param user_data Unused
- *
- * @return void
- */
-static void
-decode_destroy_cb (GtkWidget *win _U_, gpointer user_data _U_)
-{
- /* Note that we no longer have a "Decode As" dialog box. */
- decode_w = NULL;
-}
-
-
-/*
- * This routine is called when the user clicks the "Clear" button in
- * the "Decode As..." dialog window. This routine resets all the
- * dissector values and performs other housekeeping functions.
- *
- * @param clear_bt A pointer to the "Clear" button.
- *
- * @param user_data Unused
- */
-static void
-decode_clear_cb(GtkWidget *clear_bt _U_, gpointer user_data _U_)
-{
- decode_clear_all();
- redissect_packets();
- redissect_all_packet_windows();
-}
-
-
-
-/**************************************************/
-/* Dialog setup - radio buttons */
-/**************************************************/
-
-/*
- * Update the requested action field of the dialog. This routine is
- * called by GTK when either of the two radio buttons in the dialog is
- * clicked.
- *
- * @param w The radio button that was clicked.
- *
- * @param user_data The enum value assigned to this radio button. This
- * will be either E_DECODE_YES or E_DECODE_NO
- */
-static void
-decode_update_action (GtkWidget *w _U_, gpointer user_data)
-{
- GSList *tmp;
- gboolean enable;
-
- requested_action = (enum action_type)GPOINTER_TO_INT(user_data);
- enable = (requested_action == E_DECODE_YES);
- for (tmp = decode_dimmable; tmp; tmp = g_slist_next(tmp)) {
- gtk_widget_set_sensitive((GtkWidget *)tmp->data, enable);
- }
-}
-
-/*
- * This routine is called to create the "Decode" and "Do not decode"
- * radio buttons. These buttons are installed into a vbox, and set up
- * as a format group.
- *
- * @return GtkWidget * A pointer to the vbox containing the buttons
- */
-static GtkWidget *
-decode_add_yes_no (void)
-{
- GtkWidget *format_vb, *radio_button;
- GSList *format_grp;
-
- format_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 2, FALSE);
-
- radio_button = gtk_radio_button_new_with_label(NULL, "Decode");
- format_grp = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_button));
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button), TRUE);
- g_signal_connect(radio_button, "clicked", G_CALLBACK(decode_update_action),
- GINT_TO_POINTER(E_DECODE_YES));
- gtk_box_pack_start(GTK_BOX(format_vb), radio_button, FALSE, FALSE, 0);
-
- radio_button = gtk_radio_button_new_with_label(format_grp, "Do not decode");
- g_signal_connect(radio_button, "clicked", G_CALLBACK(decode_update_action),
- GINT_TO_POINTER(E_DECODE_NO));
- gtk_box_pack_start(GTK_BOX(format_vb), radio_button, FALSE, FALSE, 0);
-
- return(format_vb);
-}
-
-/**************************************************/
-/* Dialog setup - simple combo_boxes */
-/**************************************************/
-
-/*
- * This routine is called to pack an combo_box into an aligment, so
- * that it doesn't expand vertically to fill up the space available to
- * it.
- *
- * @param combo_box A pointer to the option menu to be so packed.
- *
- * @return GtkWidget * A pointer to the newly created alignment.
- */
-static GtkWidget *
-decode_add_pack_combo_box (GtkWidget *combo_box)
-{
- GtkWidget *alignment;
-
- alignment = gtk_alignment_new(0.0f, 0.5f, 0.0f, 0.0f);
- gtk_container_add(GTK_CONTAINER(alignment), combo_box);
-
- return(alignment);
-}
-
-
-/*
- * This routine is called to add a selection combo_box to
- * the dialog box. The combo_box choices are determined by the dissector.
- * The default choice for the combo_box is also determined by the dissector.
- *
- * @param page A pointer notebook page that will contain all
- * widgets created by this routine.
- * @param entry Decode As structure used to setup combo_box
- *
- * @return GtkWidget * A pointer to the newly created alignment into
- * which we've packed the newly created combo_box.
- */
-static GtkWidget *
-decode_add_multivalue_combo_box (GtkWidget *page, decode_as_t *entry)
-{
- GtkWidget *combo_box, *alignment;
- guint value;
- gchar prompt[MAX_DECODE_AS_PROMPT_LEN];
-
- combo_box = ws_combo_box_new_text_and_pointer();
-
- for (value = 0; value < entry->num_items; value++)
- {
- entry->values[value].label_func(&cfile.edt->pi, prompt);
- ws_combo_box_append_text_and_pointer(GTK_COMBO_BOX(combo_box), prompt, GINT_TO_POINTER(value));
- }
-
- ws_combo_box_set_active(GTK_COMBO_BOX(combo_box), entry->default_index_value);
- g_object_set_data(G_OBJECT(page), E_COMBO_BOX_MULTIVALUE, combo_box);
-
- alignment = decode_add_pack_combo_box(combo_box);
- return(alignment);
-}
-
-/*************************************************/
-/* Dialog setup - list based menus */
-/*************************************************/
-
-struct handle_lookup_info {
- dissector_handle_t handle;
- gboolean found;
-};
-
-static gboolean
-lookup_handle(GtkTreeModel *model, GtkTreePath *path _U_, GtkTreeIter *iter,
- gpointer user_data)
-{
- dissector_handle_t handle;
- struct handle_lookup_info *hli = (struct handle_lookup_info *)user_data;
-
- gtk_tree_model_get(model, iter, E_LIST_S_TABLE+1, &handle, -1);
- if (hli->handle == handle) {
- hli->found = TRUE;
- return TRUE;
- }
- return FALSE;
-}
-
-/*
- * This routine creates one entry in the list of protocol dissector
- * that can be used. It is called by the dissector_table_foreach_handle
- * routine once for each entry in a dissector table's list of handles
- * for dissectors that could be used in that table. It guarantees unique
- * entries by iterating over the list of entries build up to this point,
- * looking for a duplicate name. If there is no duplicate, then this
- * entry is added to the list of possible dissectors.
- *
- * @param table_name The name of the dissector table currently
- * being walked.
- *
- * @param proto_name The protocol name
- *
- * @param value The dissector handle for this entry. This is an opaque
- * pointer that can only be handed back to routines in the file packet.c
- *
- * @param user_data A data block passed into each instance of this
- * routine. It contains information from the caller of the foreach
- * routine, specifying information about the dissector table and where
- * to store any information generated by this routine.
- */
-static void
-decode_add_to_list (const gchar *table_name, const gchar *proto_name, gpointer value, gpointer user_data)
-{
- const gchar *text[E_LIST_S_COLUMNS];
- GtkTreeView *list;
- GtkListStore *store;
- GtkTreeIter iter;
- struct handle_lookup_info hli;
-
- g_assert(user_data);
- g_assert(value);
-
- list = (GtkTreeView *)user_data;
-
- hli.handle = (dissector_handle_t)value;
- hli.found = FALSE;
- store = GTK_LIST_STORE(gtk_tree_view_get_model(list));
- gtk_tree_model_foreach(GTK_TREE_MODEL(store), lookup_handle, &hli);
- /* We already have an entry for this handle.
- * XXX - will this ever happen? */
- if (hli.found) return;
-
- text[E_LIST_S_PROTO_NAME] = proto_name;
- text[E_LIST_S_TABLE] = table_name;
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter,
- E_LIST_S_PROTO_NAME, text[E_LIST_S_PROTO_NAME],
- E_LIST_S_TABLE, text[E_LIST_S_TABLE],
- E_LIST_S_TABLE+1, value, -1);
-}
-
-static gboolean
-decode_list_button_press_cb(GtkWidget *list, GdkEventButton *event, gpointer user_data _U_)
-{
- if (event->type == GDK_2BUTTON_PRESS) {
- GtkWidget *main_w = gtk_widget_get_toplevel(list);
-
- decode_ok_cb (NULL, main_w);
- }
-
- return FALSE;
-}
-
-static gboolean
-decode_list_key_release_cb(GtkWidget *list, GdkEventKey *event, gpointer user_data _U_)
-{
- if (event->keyval == GDK_Return || event->keyval == GDK_KP_Enter) {
- GtkWidget *main_w = gtk_widget_get_toplevel(list);
-
- decode_ok_cb (NULL, main_w);
- }
-
- return FALSE;
-}
-
-/*
- * This routine starts the creation of a List on a notebook page. It
- * creates both a scrolled window and a list, adds the list to the
- * window, and attaches the list as a data object on the page.
- *
- * @param page A pointer to the notebook page being created.
- *
- * @param list_p Will be filled in with the address of a newly
- * created List.
- *
- * @param scrolled_win_p Will be filled in with the address of a newly
- * created GtkScrolledWindow.
- */
-static void
-decode_list_menu_start(GtkWidget *page, GtkWidget **list_p,
- GtkWidget **scrolled_win_p)
-{
- GtkTreeView *list;
- GtkListStore *store;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *tc;
- GtkTreeSortable *sortable;
-
- store = gtk_list_store_new(E_LIST_S_COLUMNS+1, G_TYPE_STRING,
- G_TYPE_STRING, G_TYPE_POINTER);
- g_object_set_data(G_OBJECT(decode_w), "sctp_data", store);
- list = GTK_TREE_VIEW(tree_view_new(GTK_TREE_MODEL(store)));
- g_object_unref(G_OBJECT(store));
- sortable = GTK_TREE_SORTABLE(store);
- gtk_tree_sortable_set_sort_func(sortable, SORT_ALPHABETICAL, sort_iter_compare_func, GINT_TO_POINTER(SORT_ALPHABETICAL), NULL);
- gtk_tree_sortable_set_sort_column_id(sortable, SORT_ALPHABETICAL, GTK_SORT_ASCENDING);
- gtk_tree_view_set_headers_clickable(list, FALSE);
-#ifndef DEBUG
- gtk_tree_view_set_headers_visible(list, FALSE);
-#endif
- renderer = gtk_cell_renderer_text_new();
- tc = gtk_tree_view_column_new_with_attributes("Short Name", renderer,
- "text", E_LIST_S_PROTO_NAME,
- NULL);
- gtk_tree_view_column_set_sizing(tc, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_append_column(list, tc);
- g_object_set_data(G_OBJECT(page), E_PAGE_LIST, list);
-
- *scrolled_win_p = scrolled_window_new(NULL, NULL);
- /* this will result to set the width of the dialog to the required size */
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(*scrolled_win_p),
- GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(*scrolled_win_p),
- GTK_SHADOW_IN);
- gtk_container_add(GTK_CONTAINER(*scrolled_win_p), GTK_WIDGET(list));
-
- *list_p = GTK_WIDGET(list);
-}
-
-/*
- * This routine finishes the creation of a List on a notebook page.
- * It adds the default entry, sets the default entry as the
- * highlighted entry, and sorts the List.
- *
- * @param list A pointer the the List to finish.
- */
-static void
-decode_list_menu_finish(GtkWidget *list)
-{
- const gchar *text[E_LIST_S_COLUMNS];
- GtkListStore *store;
- GtkTreeIter iter;
-
- text[E_LIST_S_PROTO_NAME] = "(default)";
- text[E_LIST_S_TABLE] = DECODE_AS_NONE;
- store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(list)));
- gtk_list_store_prepend(store, &iter);
- gtk_list_store_set(store, &iter,
- E_LIST_S_PROTO_NAME, text[E_LIST_S_PROTO_NAME],
- E_LIST_S_TABLE, text[E_LIST_S_TABLE],
- E_LIST_S_TABLE+1, NULL, -1);
-
- gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(list)), &iter);
- g_signal_connect(list, "button_press_event", G_CALLBACK(decode_list_button_press_cb), NULL);
- g_signal_connect(list, "key_release_event", G_CALLBACK(decode_list_key_release_cb), NULL);
-}
-
-/*
- * This routine is called to add the dissector selection list to a
- * notebook page. This scrolled list contains an entry labeled
- * "default", and an entry for each protocol that has had a dissector
- * registered. The default choice for the list is set to the
- * "default" choice, which will return the protocol/port selections to
- * their original dissector(s).
- *
- * @param page A pointer to the notebook page currently being created.
- *
- * @param entry Decode As structure used to build this (list) menu.
- *
- * @return GtkWidget * A pointer to the newly created list within a
- * scrolled window.
- */
-static GtkWidget *
-decode_add_simple_menu (GtkWidget *page, decode_as_t *entry)
-{
- GtkWidget *scrolled_window;
- GtkWidget *list;
-
- decode_list_menu_start(page, &list, &scrolled_window);
- entry->populate_list(entry->table_name, decode_add_to_list, list);
- decode_list_menu_finish(list);
- return(scrolled_window);
-}
-
-
-/**************************************************/
-/* Dialog setup */
-/**************************************************/
-
-/*
- * This routine creates a sample notebook page in the dialog box.
- * This notebook page provides a prompt specifying what is being
- * changed and its current value (e.g. "IP Protocol number (17)"), and
- * a list specifying all the available choices. The list of choices
- * is conditionally enabled, based upon the setting of the
- * "decode"/"do not decode" radio buttons.
- *
- * @param entry Decode As structure used to build this page
- *
- * @return GtkWidget * A pointer to the notebook page created by this
- * routine.
- */
-static GtkWidget *
-decode_add_simple_page (decode_as_t *entry)
-{
- GtkWidget *page, *label, *scrolled_window, *combo_box;
- gchar prompt[MAX_DECODE_AS_PROMPT_LEN];
-
- page = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5, FALSE);
- g_object_set_data(G_OBJECT(page), E_PAGE_ACTION, decode_simple);
- g_object_set_data(G_OBJECT(page), E_PAGE_TABLE, (gchar *) entry->table_name);
- g_object_set_data(G_OBJECT(page), E_PAGE_DECODE_AS_DATA, (gchar *)entry);
- g_object_set_data(G_OBJECT(page), E_PAGE_CURR_LAYER_NUM, GUINT_TO_POINTER((guint)cfile.edt->pi.curr_layer_num));
-
- if (entry->num_items == 1)
- {
- g_object_set_data(G_OBJECT(page), E_PAGE_VALUE, entry->values[0].build_values[0](&cfile.edt->pi));
-
- /* Always enabled */
- entry->values->label_func(&cfile.edt->pi, prompt);
- label = gtk_label_new(prompt);
- gtk_box_pack_start(GTK_BOX(page), label, FALSE, FALSE, 0);
- }
- else
- {
- /* Always enabled */
- if (entry->pre_value_str)
- {
- label = gtk_label_new(entry->pre_value_str);
- gtk_box_pack_start(GTK_BOX(page), label, FALSE, FALSE, 0);
- }
- combo_box = decode_add_multivalue_combo_box(page, entry);
- gtk_box_pack_start(GTK_BOX(page), combo_box, FALSE, FALSE, 0);
-
- if (entry->post_value_str)
- {
- label = gtk_label_new(entry->post_value_str);
- gtk_box_pack_start(GTK_BOX(page), label, FALSE, FALSE, 0);
- }
- }
-
- /* Conditionally enabled - only when decoding packets */
- scrolled_window = decode_add_simple_menu(page, entry);
- gtk_box_pack_start(GTK_BOX(page), scrolled_window, TRUE, TRUE, 0);
- decode_dimmable = g_slist_prepend(decode_dimmable, scrolled_window);
-
- return(page);
-}
-
-/*
- * This routine indicates whether we'd actually have any pages in the
- * notebook in a "Decode As" dialog box; if there wouldn't be, we
- * inactivate the menu item for "Decode As".
- */
-gboolean
-decode_as_ok(void)
-{
- wmem_list_frame_t *protos = wmem_list_head(cfile.edt->pi.layers);
- int proto_id;
- const char* proto_name;
- GList *list_entry;
- decode_as_t *entry;
- dissector_table_t sub_dissectors;
-
- while (protos != NULL)
- {
- proto_id = GPOINTER_TO_INT(wmem_list_frame_data(protos));
- proto_name = proto_get_protocol_filter_name(proto_id);
-
- list_entry = decode_as_list;
- while (list_entry != NULL) {
- entry = (decode_as_t *)list_entry->data;
- if (!strcmp(proto_name, entry->name))
- {
- sub_dissectors = find_dissector_table(entry->table_name);
- if (sub_dissectors != NULL)
- return TRUE;
- }
-
- list_entry = g_list_next(list_entry);
- }
-
- protos = wmem_list_frame_next(protos);
- }
-
- return FALSE;
-}
-
-
-/*
- * This routine creates the bulk of the "Decode As" dialog box. All
- * items created by this routine are packed as pages into a notebook.
- * There will be a page for each protocol layer that can be changed.
- *
- * @param format_hb A pointer to the widget in which the notebook
- * should be installed.
- */
-static void
-decode_add_notebook (GtkWidget *format_hb)
-{
- GtkWidget *notebook, *page, *label;
- wmem_list_frame_t *protos = wmem_list_head(cfile.edt->pi.layers);
- int proto_id;
- const char* proto_name;
- GList *list_entry;
- decode_as_t *entry;
- guint8 saved_curr_layer_num = cfile.edt->pi.curr_layer_num;
-
- cfile.edt->pi.curr_layer_num = 1;
-
- /* Start a nootbook for flipping between sets of changes */
- notebook = gtk_notebook_new();
- gtk_box_pack_start(GTK_BOX(format_hb), notebook, TRUE, TRUE, 0);
- g_object_set_data(G_OBJECT(decode_w), E_NOTEBOOK, notebook);
-
- while (protos != NULL)
- {
- proto_id = GPOINTER_TO_INT(wmem_list_frame_data(protos));
- proto_name = proto_get_protocol_filter_name(proto_id);
-
- list_entry = decode_as_list;
- while (list_entry != NULL) {
- entry = (decode_as_t *)list_entry->data;
- if (!strcmp(proto_name, entry->name))
- {
- if (find_dissector_table(entry->table_name) != NULL)
- {
- page = decode_add_simple_page(entry);
- label = gtk_label_new(entry->title);
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page, label);
- }
- }
-
- list_entry = g_list_next(list_entry);
- }
-
- protos = wmem_list_frame_next(protos);
- cfile.edt->pi.curr_layer_num++;
- }
-
- cfile.edt->pi.curr_layer_num = saved_curr_layer_num;
-
- /* Select the last added page (selects first by default) */
- /* Notebook must be visible for set_page to work. */
- gtk_widget_show_all(notebook);
- gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), -1);
-}
-
-
-/*
- * This routine creates the "Decode As" dialog box. This dialog box
- * asks the user which protocol to use for decoding the currently
- * selected packet. This will affect the last packet that we called a
- * dissection routine on belongs (this might be the most recently
- * selected packet, or it might be the last packet in the file).
- *
- * This routine uses an auxiliary function to create the bulk of the
- * dialog box, and then hand crafts the button box at the bottom of
- * the dialog.
- *
- * @param w Unused
- *
- * @param user_data Unused
- */
-void
-decode_as_cb (GtkWidget * w _U_, gpointer user_data _U_)
-{
- GtkWidget *main_vb, *format_hb, *bbox, *ok_bt, *close_bt, *help_bt, *button;
- GtkWidget *button_vb, *apply_bt;
-
- if (decode_w != NULL) {
- /* There's already a "Decode As" dialog box; reactivate it. */
- reactivate_window(decode_w);
- return;
- }
-
- requested_action = E_DECODE_YES;
- decode_w = dlg_window_new("Wireshark: Decode As");
- /* Provide a minimum of a couple of rows worth of data */
- gtk_window_set_default_size(GTK_WINDOW(decode_w), -1, E_DECODE_MIN_HEIGHT);
-
- /* Container for each row of widgets */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 2, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_container_add(GTK_CONTAINER(decode_w), main_vb);
-
- /* First row - Buttons and Notebook */
- format_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5, FALSE);
- gtk_box_pack_start(GTK_BOX(main_vb), format_hb, TRUE, TRUE, 10);
-
- button_vb = decode_add_yes_no();
- gtk_box_pack_start(GTK_BOX(format_hb), button_vb, FALSE, FALSE, 10);
-
- button = gtk_button_new_with_label("Show Current");
- g_signal_connect(button, "clicked", G_CALLBACK(decode_show_cb), NULL);
- gtk_widget_set_can_default(button, TRUE);
- gtk_box_pack_end(GTK_BOX(button_vb), button, FALSE, FALSE, 0);
- gtk_widget_set_tooltip_text(button, "Open a dialog showing the current settings.\n"
- "Note you need to select and press apply first to be able to save the current setting");
-
- button = ws_gtk_button_new_from_stock(GTK_STOCK_CLEAR);
- g_signal_connect(button, "clicked", G_CALLBACK(decode_clear_cb), NULL);
- gtk_widget_set_can_default(button, TRUE);
- gtk_box_pack_end(GTK_BOX(button_vb), button, FALSE, FALSE, 0);
- gtk_widget_set_tooltip_text(button, "Clear ALL settings.");
-
- decode_add_notebook(format_hb);
-
- /* Button row */
- bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_APPLY, GTK_STOCK_CLOSE, GTK_STOCK_HELP, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 0);
- gtk_widget_show(bbox);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(decode_ok_cb), decode_w);
- gtk_widget_set_tooltip_text(ok_bt, "Apply current setting, close dialog and redissect packets.");
-
- apply_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_APPLY);
- g_signal_connect(apply_bt, "clicked", G_CALLBACK(decode_apply_cb), decode_w);
- gtk_widget_set_tooltip_text(apply_bt, "Apply current setting, redissect packets and keep dialog open.");
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(decode_w, close_bt, NULL);
- g_signal_connect(close_bt, "clicked", G_CALLBACK(decode_close_cb), decode_w);
- gtk_widget_set_tooltip_text(close_bt, "Close the dialog, don't redissect packets.");
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_DECODE_AS_DIALOG);
-
- gtk_widget_grab_default(ok_bt);
-
- g_signal_connect(decode_w, "delete_event", G_CALLBACK(decode_delete_cb), NULL);
- g_signal_connect(decode_w, "destroy", G_CALLBACK(decode_destroy_cb), NULL);
-
- gtk_widget_show_all(decode_w);
- window_present(decode_w);
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/decode_as_dlg.h b/ui/gtk/decode_as_dlg.h
deleted file mode 100644
index f51f88eb8b..0000000000
--- a/ui/gtk/decode_as_dlg.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/* decode_as_dlg.h
- *
- * Routines to modify dissector tables on the fly.
- *
- * By David Hampton <dhampton@mac.com>
- * Copyright 2001 David Hampton
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- */
-
-#ifndef __DECODE_AS_DLG_H__
-#define __DECODE_AS_DLG_H__
-
-/** @file
- * "Decode As" / "User Specified Decodes" dialog box.
- * @ingroup dialog_group
- */
-
-/*
- * Enum used to track which radio button is currently selected in the
- * dialog. These buttons are labeled "Decode" and "Do not decode".
- */
-enum action_type {
- /* The "Decode" button is currently selected. */
- E_DECODE_YES,
-
- /* The "Do not decode" button is currently selected. */
- E_DECODE_NO
-};
-
-/** User requested the "Decode As" dialog box by menu or toolbar.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-void decode_as_cb(GtkWidget *widget, gpointer data);
-
-/** User requested the "User Specified Decodes" dialog box by menu or toolbar.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-void decode_show_cb(GtkWidget *widget, gpointer data);
-
-/** Have any pages in the notebook in a "Decode As" dialog box? If there
- * wouldn't be, we inactivate the menu item for "Decode As".
- *
- * @return TRUE, if we have at least one notebook page in "Decode As"
- */
-gboolean decode_as_ok(void);
-
-#endif
diff --git a/ui/gtk/dfilter_expr_dlg.c b/ui/gtk/dfilter_expr_dlg.c
deleted file mode 100644
index 7c34bb3057..0000000000
--- a/ui/gtk/dfilter_expr_dlg.c
+++ /dev/null
@@ -1,1228 +0,0 @@
-/* dfilter_expr_dlg.c
- *
- * Allow the user to construct a subexpression of a display filter
- * expression, testing a particular field; display the tree of fields
- * and the relations and values with which it can be compared.
- *
- * Copyright 2000, Jeffrey C. Foster <jfoste@woodward.com> and
- * Guy Harris <guy@alum.mit.edu>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 2000 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-/* Todo -
- * may want to check the enable field to decide if protocol should be in tree
- * improve speed of dialog box creation
- * - I believe this is slow because of tree widget creation.
- * 1) could improve the widget
- * 2) keep a copy in memory after the first time.
- * user can pop multiple tree dialogs by pressing the "Tree" button multiple
- * times. not a good thing.
- * Sort the protocols and children
- */
-
-#include "config.h"
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/ftypes/ftypes-int.h>
-
-#include "ui/simple_dialog.h"
-
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/dfilter_expr_dlg.h"
-#include "ui/gtk/proto_hier_tree_model.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-#include <wsutil/glib-compat.h>
-
-#define E_DFILTER_EXPR_TREE_KEY "dfilter_expr_tree"
-#define E_DFILTER_EXPR_CURRENT_VAR_KEY "dfilter_expr_current_var"
-#define E_DFILTER_EXPR_RELATION_LIST_KEY "dfilter_expr_relation_list"
-#define E_DFILTER_EXPR_RANGE_LABEL_KEY "dfilter_expr_range_label"
-#define E_DFILTER_EXPR_RANGE_ENTRY_KEY "dfilter_expr_range_entry"
-#define E_DFILTER_EXPR_VALUE_LABEL_KEY "dfilter_expr_value_label"
-#define E_DFILTER_EXPR_VALUE_ENTRY_KEY "dfilter_expr_value_entry"
-#define E_DFILTER_EXPR_VALUE_LIST_LABEL_KEY "dfilter_expr_value_list_label"
-#define E_DFILTER_EXPR_VALUE_LIST_KEY "dfilter_expr_value_list"
-#define E_DFILTER_EXPR_VALUE_LIST_SW_KEY "dfilter_expr_value_list_sw"
-#define E_DFILTER_EXPR_OK_BT_KEY "dfilter_expr_accept_bt"
-#define E_DFILTER_EXPR_VALUE_KEY "dfilter_expr_value"
-
-static void show_relations(GtkWidget *relation_list, ftenum_t ftype);
-static gboolean relation_is_presence_test(const char *string);
-static gboolean relation_is_in_test(const char *string);
-static void add_relation_list(GtkWidget *relation_list, const char *relation, gboolean sensitive);
-static void build_boolean_values(GtkWidget *value_list_scrolled_win,
- GtkWidget *value_list,
- const true_false_string *values);
-static void build_enum_values(GtkWidget *value_list_scrolled_win,
- GtkWidget *value_list,
- const value_string *values);
-static void add_value_list_item(GtkWidget *value_list, const gchar *string,
- gconstpointer data);
-static void display_value_fields(header_field_info *hfinfo,
- gboolean is_comparison, gboolean is_in,
- GtkWidget *value_label, GtkWidget *value_entry,
- GtkWidget *value_list_label, GtkWidget *value_list,
- GtkWidget *value_list_scrolled_win,
- GtkWidget *range_label,
- GtkWidget *range_entry);
-
-/*
- * Note that this is called every time the user clicks on an item,
- * whether it is already selected or not.
- */
-static void
-field_select_row_cb(GtkTreeSelection *sel, gpointer tree)
-{
- GtkWidget *window = (GtkWidget *)gtk_widget_get_toplevel((GtkWidget *)tree);
- GtkWidget *relation_list = (GtkWidget *)g_object_get_data(G_OBJECT(window),
- E_DFILTER_EXPR_RELATION_LIST_KEY);
- GtkWidget *range_label = (GtkWidget *)g_object_get_data(G_OBJECT(window),
- E_DFILTER_EXPR_RANGE_LABEL_KEY);
- GtkWidget *range_entry = (GtkWidget *)g_object_get_data(G_OBJECT(window),
- E_DFILTER_EXPR_RANGE_ENTRY_KEY);
- GtkWidget *value_label = (GtkWidget *)g_object_get_data(G_OBJECT(window),
- E_DFILTER_EXPR_VALUE_LABEL_KEY);
- GtkWidget *value_entry = (GtkWidget *)g_object_get_data(G_OBJECT(window),
- E_DFILTER_EXPR_VALUE_ENTRY_KEY);
- GtkWidget *value_list_label = (GtkWidget *)g_object_get_data(G_OBJECT(window),
- E_DFILTER_EXPR_VALUE_LIST_LABEL_KEY);
- GtkWidget *value_list = (GtkWidget *)g_object_get_data(G_OBJECT(window),
- E_DFILTER_EXPR_VALUE_LIST_KEY);
- GtkWidget *value_list_scrolled_win = (GtkWidget *)g_object_get_data(G_OBJECT(window),
- E_DFILTER_EXPR_VALUE_LIST_SW_KEY);
- GtkWidget *ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(window),
- E_DFILTER_EXPR_OK_BT_KEY);
- header_field_info *hfinfo, *cur_hfinfo;
- const char *value_type;
- char value_label_string[1024+1]; /* XXX - should be large enough */
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- if (!gtk_tree_selection_get_selected(sel, &model, &iter))
- return;
- gtk_tree_model_get(model, &iter, 0, &hfinfo, -1);
-
- /*
- * What was the item that was last selected?
- */
- cur_hfinfo = (header_field_info *)g_object_get_data(G_OBJECT(window), E_DFILTER_EXPR_CURRENT_VAR_KEY);
- if (cur_hfinfo == hfinfo) {
- /*
- * It's still selected; no need to change anything.
- */
- return;
- }
-
- /*
- * Mark it as currently selected.
- */
- g_object_set_data(G_OBJECT(window), E_DFILTER_EXPR_CURRENT_VAR_KEY, hfinfo);
-
- show_relations(relation_list, hfinfo->type);
-
- /*
- * Set the label for the value to indicate what type of value
- * it is.
- */
- value_type = ftype_pretty_name(hfinfo->type);
- if (value_type != NULL) {
- /*
- * Indicate what type of value it is.
- */
- g_snprintf(value_label_string, sizeof value_label_string,
- "Value (%s)", value_type);
- gtk_label_set_text(GTK_LABEL(value_label), value_label_string);
- }
-
- /*
- * Clear the entry widget for the value, as whatever
- * was there before doesn't apply.
- */
- gtk_entry_set_text(GTK_ENTRY(value_entry), "");
-
- switch (hfinfo->type) {
-
- case FT_BOOLEAN:
- /*
- * The list of values should be the strings for "true"
- * and "false"; show them in the value list.
- */
- build_boolean_values(value_list_scrolled_win, value_list,
- (const true_false_string *)hfinfo->strings);
- break;
-
- case FT_UINT8:
- case FT_UINT16:
- case FT_UINT24:
- case FT_UINT32:
- case FT_INT8:
- case FT_INT16:
- case FT_INT24:
- case FT_INT32:
- /*
- * If this has a value_string table (not a range_string table) associated with it,
- * fill up the list of values, otherwise clear the list of values.
- */
- /* XXX: ToDo: Implement "range-string" filter ? */
- if ((hfinfo->strings != NULL) &&
- ! (hfinfo->display & BASE_RANGE_STRING) &&
- ! (hfinfo->display & BASE_VAL64_STRING) &&
- ! ((hfinfo->display & FIELD_DISPLAY_E_MASK) == BASE_CUSTOM)) {
- const value_string *vals = (const value_string *)hfinfo->strings;
- if (hfinfo->display & BASE_EXT_STRING)
- vals = VALUE_STRING_EXT_VS_P((value_string_ext *)vals);
- build_enum_values(value_list_scrolled_win, value_list, vals);
- } else
- gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(value_list))));
- break;
-
- default:
- /*
- * Clear the list of values.
- */
- gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(value_list))));
- break;
- }
-
- /*
- * Display various items for the value, as appropriate.
- * The relation we start out with is 'presence'.
- */
- display_value_fields(hfinfo, FALSE, FALSE, value_label, value_entry,
- value_list_label, value_list, value_list_scrolled_win, range_label, range_entry);
-
- /*
- * XXX - in browse mode, there always has to be something
- * selected, so this should always be sensitive.
- */
- gtk_widget_set_sensitive(ok_bt, TRUE);
-}
-
-static void
-show_relations(GtkWidget *relation_list, ftenum_t ftype)
-{
- GtkTreeIter iter;
- /*
- * Clear out the currently displayed list of relations.
- */
- gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(relation_list))));
-
- /*
- * Add the supported relations.
- */
- add_relation_list(relation_list, "is present", TRUE);
- add_relation_list(relation_list, "==",
- ftype_can_eq(ftype) || (ftype_can_slice(ftype) && ftype_can_eq(FT_BYTES)));
- add_relation_list(relation_list, "!=",
- ftype_can_ne(ftype) || (ftype_can_slice(ftype) && ftype_can_ne(FT_BYTES)));
- add_relation_list(relation_list, ">",
- ftype_can_gt(ftype) || (ftype_can_slice(ftype) && ftype_can_gt(FT_BYTES)));
-
- add_relation_list(relation_list, "<",
- ftype_can_lt(ftype) || (ftype_can_slice(ftype) && ftype_can_lt(FT_BYTES)));
- add_relation_list(relation_list, ">=",
- ftype_can_ge(ftype) || (ftype_can_slice(ftype) && ftype_can_ge(FT_BYTES)));
- add_relation_list(relation_list, "<=",
- ftype_can_le(ftype) || (ftype_can_slice(ftype) && ftype_can_le(FT_BYTES)));
- add_relation_list(relation_list, "contains",
- ftype_can_contains(ftype) || (ftype_can_slice(ftype) && ftype_can_contains(FT_BYTES)));
- add_relation_list(relation_list, "matches",
- ftype_can_matches(ftype) || (ftype_can_slice(ftype) && ftype_can_matches(FT_BYTES)));
- add_relation_list(relation_list, "in",
- ftype_can_eq(ftype) || (ftype_can_slice(ftype) && ftype_can_eq(FT_BYTES)));
-
- gtk_tree_model_get_iter_first(gtk_tree_view_get_model(GTK_TREE_VIEW(relation_list)), &iter);
- gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(relation_list)), &iter);
-}
-
-/*
- * Given a string that represents a test to be made on a field, returns
- * TRUE if it tests for the field's presence, FALSE otherwise.
- */
-static gboolean
-relation_is_presence_test(const char *string)
-{
- return (strcmp(string, "is present") == 0);
-}
-
-/*
- * Given a string that represents a test to be made on a field, returns
- * TRUE if it tests for the field's value in a set, FALSE otherwise.
- */
-static gboolean
-relation_is_in_test(const char *string)
-{
- return (strcmp(string, "in") == 0);
-}
-
-static void
-add_relation_list(GtkWidget *relation_list, const char *relation, gboolean sensitive)
-{
- GtkListStore *store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(relation_list)));
- GtkTreeIter iter;
-
- /* XXX: I currently see no way to insensitive the item,
- * so for a first step, just don't show it (as before these changes :-) */
- if (!sensitive) {
- return;
- }
-
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, relation, -1);
-}
-
-static void
-relation_list_sel_cb(GtkTreeSelection *sel, gpointer user_data _U_)
-{
- GtkWidget *window = gtk_widget_get_toplevel(GTK_WIDGET(gtk_tree_selection_get_tree_view(sel)));
- GtkWidget *range_label =
- (GtkWidget *)g_object_get_data(G_OBJECT(window), E_DFILTER_EXPR_RANGE_LABEL_KEY);
- GtkWidget *range_entry =
- (GtkWidget *)g_object_get_data(G_OBJECT(window), E_DFILTER_EXPR_RANGE_ENTRY_KEY);
- GtkWidget *value_label =
- (GtkWidget *)g_object_get_data(G_OBJECT(window), E_DFILTER_EXPR_VALUE_LABEL_KEY);
- GtkWidget *value_entry =
- (GtkWidget *)g_object_get_data(G_OBJECT(window), E_DFILTER_EXPR_VALUE_ENTRY_KEY);
- GtkWidget *value_list_label =
- (GtkWidget *)g_object_get_data(G_OBJECT(window), E_DFILTER_EXPR_VALUE_LIST_LABEL_KEY);
- GtkWidget *value_list =
- (GtkWidget *)g_object_get_data(G_OBJECT(window), E_DFILTER_EXPR_VALUE_LIST_KEY);
- GtkWidget *value_list_scrolled_win =
- (GtkWidget *)g_object_get_data(G_OBJECT(window), E_DFILTER_EXPR_VALUE_LIST_SW_KEY);
- header_field_info *hfinfo =
- (header_field_info *)g_object_get_data(G_OBJECT(window), E_DFILTER_EXPR_CURRENT_VAR_KEY);
- gchar *item_str;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- /*
- * What's the relation?
- */
- if (!gtk_tree_selection_get_selected(sel, &model, &iter))
- return;
- gtk_tree_model_get(model, &iter, 0, &item_str, -1);
-
- /*
- * Update the display of various items for the value, as appropriate.
- */
- display_value_fields(hfinfo,
- !relation_is_presence_test(item_str), relation_is_in_test(item_str),
- value_label, value_entry, value_list_label, value_list,
- value_list_scrolled_win, range_label, range_entry);
- g_free(item_str);
-}
-
-static void
-build_boolean_values(GtkWidget *value_list_scrolled_win, GtkWidget *value_list,
- const true_false_string *values)
-{
- GtkTreeSelection *sel;
- GtkTreeIter iter;
-
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(value_list));
-
- /*
- * Clear out the items for the list, and put in the names
- * from the value_string list.
- */
- gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(value_list))));
-
- /*
- * Put the list in single mode, so we don't get any selection
- * events while we're building it (i.e., so we don't get any
- * on a list item BEFORE WE GET TO SET THE DATA FOR THE LIST
- * ITEM SO THAT THE HANDLER CAN HANDLE IT).
- */
- gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
-
- /*
- * Build the list.
- */
- if (values == NULL)
- values = &tfs_true_false;
- add_value_list_item(value_list, values->true_string, values);
- add_value_list_item(value_list, values->false_string, NULL);
-
- /*
- * OK, we're done, so we can finally put it in browse mode.
- * Select the first item, so that the user doesn't have to, under
- * the assumption that they're most likely to test if something
- * is true, not false.
- */
- gtk_tree_selection_set_mode(sel, GTK_SELECTION_BROWSE);
- gtk_tree_model_get_iter_first(gtk_tree_view_get_model(GTK_TREE_VIEW(value_list)), &iter);
- gtk_tree_selection_select_iter(sel, &iter);
-
- gtk_widget_show_all(value_list_scrolled_win);
-}
-
-static void
-build_enum_values(GtkWidget *value_list_scrolled_win _U_, GtkWidget *value_list,
- const value_string *values)
-{
- GtkTreeSelection *sel;
-
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(value_list));
- /*
- * Clear out the items for the list, and put in the names
- * from the value_string list.
- */
- gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(value_list))));
-
- /*
- * Put the list in single mode, so we don't get any selection
- * events while we're building it (i.e., so we don't get any
- * on a list item BEFORE WE GET TO SET THE DATA FOR THE LIST
- * ITEM SO THAT THE HANDLER CAN HANDLE IT).
- */
- gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
-
- /*
- * Build the list.
- */
- while (values->strptr != NULL) {
- add_value_list_item(value_list, values->strptr, values);
- values++;
- }
-
- /*
- * OK, we're done, so we can finally put it in browse mode.
- */
- gtk_tree_selection_set_mode(sel, GTK_SELECTION_BROWSE);
-}
-
-static void
-add_value_list_item(GtkWidget *value_list, const gchar *string, gconstpointer data)
-{
- GtkListStore *store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(value_list)));
- GtkTreeIter iter;
-
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, string, 1, data, -1);
-}
-
-/*
- * Show or hide the various values fields as appropriate for the field
- * and currently-selected relation.
- */
-static void
-display_value_fields(header_field_info *hfinfo,
- gboolean is_comparison, gboolean is_in,
- GtkWidget *value_label, GtkWidget *value_entry,
- GtkWidget *value_list_label,
- GtkWidget *value_list,
- GtkWidget *value_list_scrolled_win, GtkWidget *range_label,
- GtkWidget *range_entry)
-{
- GtkTreeSelection *sel;
-
- /* Default values */
- gboolean show_value_label = FALSE;
- gboolean show_value_list = FALSE;
- gboolean show_range = FALSE;
-
- /*
- * Either:
- *
- * this is an FT_NONE variable, in which case you can
- * only check whether it's present or absent in the
- * protocol tree
- *
- * or
- *
- * this is a Boolean variable, in which case you
- * can't specify a value to compare with, you can
- * only specify whether to test for the Boolean
- * being true or to test for it being false
- *
- * or
- *
- * this isn't a Boolean variable, in which case you
- * can test for its presence in the protocol tree,
- * and the relation is such a test, in
- * which case you don't compare with a value
- *
- * so we hide the value entry.
- */
-
- switch (hfinfo->type) {
-
- case FT_BOOLEAN:
- if (is_comparison) {
- show_value_label = TRUE; /* XXX: Allow value entry (contrary to the comment above) ?? */
- show_value_list = TRUE;
- }
- break;
-
- case FT_UINT8:
- case FT_UINT16:
- case FT_UINT24:
- case FT_UINT32:
- case FT_INT8:
- case FT_INT16:
- case FT_INT24:
- case FT_INT32:
- if (is_comparison) {
- show_value_label = TRUE;
- if ((hfinfo->strings != NULL) && !(hfinfo->display & BASE_RANGE_STRING)) {
- /*
- * We have a list of values to show.
- */
- show_value_list = TRUE;
- }
- }
- break;
-
- default:
- /*
- * There is no list of names for values; only show the value_label if needed.
- */
- if (is_comparison)
- show_value_label = TRUE;
- break;
- }
-
- gtk_widget_set_sensitive(value_label, show_value_label);
- gtk_widget_set_sensitive(value_entry, show_value_label);
-
- gtk_widget_set_sensitive(value_list_label, show_value_list);
- gtk_widget_set_sensitive(value_list_scrolled_win, show_value_list);
-
- /*
- * Is this an 'in' operation then allow mutiple entries selected
- */
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(value_list));
-
- if (show_value_list && is_in) {
- gtk_tree_selection_set_mode(sel, GTK_SELECTION_MULTIPLE);
- } else {
- gtk_tree_selection_set_mode(sel, GTK_SELECTION_BROWSE);
- }
-
- /*
- * Is this a comparison, and are ranges supported by this type?
- * If both are true, show the range stuff, otherwise hide it.
- */
- show_range = (is_comparison && ftype_can_slice(hfinfo->type));
- gtk_widget_set_sensitive(range_label, show_range);
- gtk_widget_set_sensitive(range_entry, show_range);
-}
-
-static void
-value_list_sel_cb(GtkTreeSelection *sel, gpointer value_entry_arg)
-{
- GtkWidget *value_entry = (GtkWidget *)value_entry_arg;
- GtkWidget *window = gtk_widget_get_toplevel(GTK_WIDGET(gtk_tree_selection_get_tree_view(sel)));
- GtkTreeModel *model;
- GtkTreeIter iter;
- header_field_info *hfinfo = (header_field_info *)g_object_get_data(G_OBJECT(window),
- E_DFILTER_EXPR_CURRENT_VAR_KEY);
- const value_string *value = NULL;
- gchar *value_display_string = NULL;
- GList *paths = gtk_tree_selection_get_selected_rows(sel, &model);
- GList *path;
- GtkTreePath *tree_path;
-
- if (!paths)
- return;
-
- gchar **value_display_strings = g_new0(gchar *, (1 + g_list_length(paths)));
- size_t value_element = 0;
-
- for (path = g_list_first(paths); path; path = g_list_next(path))
- {
- tree_path = (GtkTreePath *)(path->data);
-
- if (gtk_tree_model_get_iter(model, &iter, tree_path))
- {
- gtk_tree_model_get(model, &iter, 1, &value, -1);
-
- /*
- * This should either be a numeric type or a Boolean type.
- */
- if (hfinfo->type == FT_BOOLEAN) {
- /*
- * Boolean type; if the value key for the selected item
- * is non-null, it's the item for "true", otherwise it's
- * the item for "false". Compare with 1 if we're
- * testing for "true", and compare with 0 if we're
- * testing for "false".
- */
- if (value != NULL)
- value_display_strings[value_element] = g_strdup("1");
- else
- value_display_strings[value_element] = g_strdup("0");
- } else {
- /*
- * Numeric type; get the value corresponding to the
- * selected item, and display it in the base for this
- * field.
- */
- switch ((hfinfo->display) & FIELD_DISPLAY_E_MASK) {
-
- case BASE_NONE:
- case BASE_DEC:
- case BASE_DEC_HEX:
- switch (hfinfo->type) {
-
- case FT_UINT8:
- case FT_UINT16:
- case FT_UINT24:
- case FT_UINT32:
- value_display_strings[value_element] = g_strdup_printf("%u", value->value);
- break;
-
- case FT_INT8:
- case FT_INT16:
- case FT_INT24:
- case FT_INT32:
- value_display_strings[value_element] = g_strdup_printf("%d", value->value);
- break;
-
- default:
- g_assert_not_reached();
- }
- break;
-
- case BASE_HEX:
- case BASE_HEX_DEC:
- value_display_strings[value_element] = g_strdup_printf("0x%x", value->value);
- break;
-
- case BASE_OCT:
- value_display_strings[value_element] = g_strdup_printf("%#o", value->value);
- break;
-
- default:
- g_assert_not_reached();
- }
- }
-
- value_element++;
- }
- }
- g_list_free_full(paths, (GDestroyNotify)gtk_tree_path_free);
- value_display_string = g_strjoinv(" ", value_display_strings);
- g_strfreev(value_display_strings);
-
- gtk_entry_set_text(GTK_ENTRY(value_entry), value_display_string);
- g_free(value_display_string);
-}
-
-static void
-dfilter_expr_dlg_accept_cb(GtkWidget *w, gpointer filter_te_arg)
-{
- GtkWidget *filter_te = (GtkWidget *)filter_te_arg;
- GtkWidget *window = gtk_widget_get_toplevel(w);
- GtkWidget *relation_list =
- (GtkWidget *)g_object_get_data(G_OBJECT(window), E_DFILTER_EXPR_RELATION_LIST_KEY);
- GtkWidget *range_entry =
- (GtkWidget *)g_object_get_data(G_OBJECT(window), E_DFILTER_EXPR_RANGE_ENTRY_KEY);
- GtkWidget *value_entry =
- (GtkWidget *)g_object_get_data(G_OBJECT(window), E_DFILTER_EXPR_VALUE_ENTRY_KEY);
- header_field_info *hfinfo;
- gchar *item_str;
- gchar *range_str, *stripped_range_str;
- gchar *value_str, *stripped_value_str;
- int pos;
- gchar *chars;
- ftenum_t ftype;
- gboolean can_compare;
- fvalue_t *fvalue;
- gchar *err_msg;
- GtkTreeModel *model;
- GtkTreeIter iter;
- gboolean quote_it;
-
- /*
- * Get the variable to be tested.
- */
- hfinfo = (header_field_info *)g_object_get_data(G_OBJECT(window), E_DFILTER_EXPR_CURRENT_VAR_KEY);
-
- /*
- * Get the relation operator to use.
- */
- if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(relation_list)),
- &model, &iter)) {
- gtk_tree_model_get(model, &iter, 0, &item_str, -1);
- } else {
- /* Nothing selected */
- return;
- }
-
- /*
- * Get the range to use, if any.
- */
- if (gtk_widget_get_sensitive(range_entry)) {
- range_str = g_strdup(gtk_entry_get_text(GTK_ENTRY(range_entry)));
- /*
- * XXX - strip this even for strings?
- * Doing so for strings means you can't match a string that has
- * leading or trailing whitespace, but you can't see trailing
- * whitespace in a text field, so it's not clear that it's
- * a good idea to allow that.
- */
- stripped_range_str = g_strstrip(range_str);
- if (strcmp(stripped_range_str, "") == 0) {
- /*
- * No range was specified.
- */
- g_free(range_str);
- range_str = NULL;
- stripped_range_str = NULL;
- }
-
- /*
- * XXX - check it for validity?
- */
- } else {
- range_str = NULL;
- stripped_range_str = NULL;
- }
-
- /*
- * If a range was specified, the type of the LHS of the
- * comparison is FT_BYTES; otherwise, it's the type of the field.
- */
- if (range_str == NULL)
- ftype = hfinfo->type;
- else
- ftype = FT_BYTES;
-
- /*
- * Make sure the relation is valid for the type in question.
- * We may be offering relations that the type of the field
- * can't support, because the field's type supports slicing,
- * and the relation *is* supported on byte strings.
- */
- if ((strcmp(item_str, "==") == 0) || (strcmp(item_str, "in") == 0))
- can_compare = ftype_can_eq(ftype);
- else if (strcmp(item_str, "!=") == 0)
- can_compare = ftype_can_ne(ftype);
- else if (strcmp(item_str, ">") == 0)
- can_compare = ftype_can_gt(ftype);
- else if (strcmp(item_str, "<") == 0)
- can_compare = ftype_can_lt(ftype);
- else if (strcmp(item_str, ">=") == 0)
- can_compare = ftype_can_ge(ftype);
- else if (strcmp(item_str, "<=") == 0)
- can_compare = ftype_can_le(ftype);
- else if (strcmp(item_str, "contains") == 0)
- can_compare = ftype_can_contains(ftype);
- else if (strcmp(item_str, "matches") == 0)
- can_compare = ftype_can_matches(ftype);
- else
- can_compare = TRUE; /* not a comparison */
- if (!can_compare) {
- if (range_str == NULL) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "That field can't be tested with \"%s\".",
- item_str);
- } else {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Ranges of that field can't be tested with \"%s\".",
- item_str);
- }
- g_free(range_str);
- g_free(item_str);
- return;
- }
-
- /*
- * Get the value to use, if any.
- */
- if (gtk_widget_get_sensitive(value_entry)) {
- value_str = g_strdup(gtk_entry_get_text(GTK_ENTRY(value_entry)));
- stripped_value_str = g_strstrip(value_str);
- if (strcmp(stripped_value_str, "") == 0) {
- /*
- * This field takes a value, but they didn't supply
- * one.
- */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "That field must be compared with a value, "
- "but you didn't specify a value with which to "
- "compare it.");
- g_free(range_str);
- g_free(value_str);
- g_free(item_str);
- return;
- }
-
- if (strcmp(item_str, "in")) {
- /*
- * Make sure the value is valid.
- *
- * If no range string was specified, it must be valid
- * for the type of the field; if a range string was
- * specified, must be valid for FT_BYTES.
- */
- if (strcmp(item_str, "contains") == 0) {
- fvalue = fvalue_from_unparsed(ftype, stripped_value_str, TRUE,
- &err_msg);
- }
- else {
- fvalue = fvalue_from_unparsed(ftype, stripped_value_str, FALSE,
- &err_msg);
- }
- if (fvalue == NULL) {
- /*
- * It's not valid.
- */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg);
- g_free(err_msg);
- g_free(range_str);
- g_free(value_str);
- g_free(item_str);
- return;
- }
- FVALUE_FREE(fvalue);
- }
- } else {
- value_str = NULL;
- stripped_value_str = NULL;
- }
-
- /*
- * Insert the expression at the current cursor position.
- * If there's a non-whitespace character to the left of it,
- * insert a blank first; if there's a non-whitespace character
- * to the right of it, insert a blank after it.
- */
- pos = gtk_editable_get_position(GTK_EDITABLE(filter_te));
- chars = gtk_editable_get_chars(GTK_EDITABLE(filter_te), pos, pos + 1);
- if (strcmp(chars, "") != 0 && !g_ascii_isspace(chars[0]))
- gtk_editable_insert_text(GTK_EDITABLE(filter_te), " ", 1, &pos);
- g_free(chars);
-
- gtk_editable_insert_text(GTK_EDITABLE(filter_te), hfinfo->abbrev,
- (gint) strlen(hfinfo->abbrev), &pos);
- if (range_str != NULL) {
- gtk_editable_insert_text(GTK_EDITABLE(filter_te), "[", 1, &pos);
- gtk_editable_insert_text(GTK_EDITABLE(filter_te),
- stripped_range_str, (gint) strlen(stripped_range_str), &pos);
- gtk_editable_insert_text(GTK_EDITABLE(filter_te), "]", 1, &pos);
- g_free(range_str);
- }
- if (!relation_is_presence_test(item_str)) {
- gtk_editable_insert_text(GTK_EDITABLE(filter_te), " ", 1, &pos);
- gtk_editable_insert_text(GTK_EDITABLE(filter_te), item_str,
- (gint) strlen(item_str), &pos);
- }
- if (value_str != NULL) {
- gtk_editable_insert_text(GTK_EDITABLE(filter_te), " ", 1, &pos);
- /*
- * XXX - we should do this by generating an appropriate display
- * filter value string for this field; that requires us to have
- * a "generate display filter string" method for every FT_ type.
- */
- switch (hfinfo->type) {
-
- case FT_STRING:
- case FT_STRINGZ:
- case FT_UINT_STRING:
- case FT_ABSOLUTE_TIME:
- /*
- * Always put quotes around the string.
- */
- quote_it = TRUE;
- break;
-
- default:
- /*
- * If the string contains white space, put quotes around it.
- */
- quote_it = (strpbrk(stripped_value_str, " \t") != NULL);
- break;
- }
- if (strcmp(item_str, "in") == 0) {
- /*
- * Put curly braces around the value.
- */
- gtk_editable_insert_text(GTK_EDITABLE(filter_te), "{",
- 1, &pos);
- } else if (quote_it) {
- /*
- * Put quotes around the string.
- */
- gtk_editable_insert_text(GTK_EDITABLE(filter_te), "\"",
- 1, &pos);
- }
- gtk_editable_insert_text(GTK_EDITABLE(filter_te),
- stripped_value_str, (gint) strlen(stripped_value_str), &pos);
- if (strcmp(item_str, "in") == 0) {
- /*
- * Put curly braces around the value.
- */
- gtk_editable_insert_text(GTK_EDITABLE(filter_te), "}",
- 1, &pos);
- } else if (quote_it) {
- /*
- * Put quotes around the string.
- */
- gtk_editable_insert_text(GTK_EDITABLE(filter_te), "\"",
- 1, &pos);
- }
- g_free(value_str);
- }
- chars = gtk_editable_get_chars(GTK_EDITABLE(filter_te), pos + 1, pos + 2);
- if (strcmp(chars, "") != 0 && !g_ascii_isspace(chars[0]))
- gtk_editable_insert_text(GTK_EDITABLE(filter_te), " ", 1, &pos);
- g_free(chars);
-
- /*
- * Put the cursor after the expression we just entered into
- * the text entry widget.
- */
- gtk_editable_set_position(GTK_EDITABLE(filter_te), pos);
-
- /*
- * We're done; destroy the dialog box (which is the top-level
- * widget for the "Accept" button).
- */
- window_destroy(window);
- g_free(item_str);
-}
-
-static void
-dfilter_expr_dlg_cancel_cb(GtkWidget *w _U_, gpointer parent_w)
-{
- /*
- * User pressed the cancel button; close the dialog box.
- */
- window_destroy(GTK_WIDGET(parent_w));
-}
-
-/* Treat this as a cancel, by calling "prefs_main_cancel_cb()" */
-static gboolean
-dfilter_expr_dlg_delete_event_cb(GtkWidget *w _U_, GdkEvent *event _U_,
- gpointer parent_w)
-{
- dfilter_expr_dlg_cancel_cb(NULL, parent_w);
- return FALSE;
-}
-
-static void
-dfilter_expr_dlg_destroy_cb(GtkWidget *w, gpointer filter_te)
-{
- /*
- * The dialog box is being destroyed; disconnect from the
- * "destroy" signal on the text entry box to which we're
- * attached, as the handler for that signal is supposed
- * to destroy us, but we're already gone.
- */
- g_signal_handlers_disconnect_by_func(filter_te, dfilter_expr_dlg_cancel_cb, w);
-}
-
-GtkWidget *
-dfilter_expr_dlg_new(GtkWidget *filter_te)
-{
- GtkWidget *window, *main_vb, *main_hb;
-
- GtkWidget *field_vb, *field_tree_lb, *field_tree, *tree_scrolled_win;
-
- GtkWidget *relation_vb, *relation_label, *relation_list, *relation_list_scrolled_win;
-/* GtkWidget *relation_present_rb, *relation_equals_rb, *relation_unequals_rb,
- *relation_greater_rb, *relation_less_rb,
- *relation_greaterequal_rb, *relation_lessequal_rb,
- *relation_contains_rb, *relation_matches_rb;*/
-
- GtkWidget *value_vb, *value_label, *value_entry;
- GtkWidget *value_list_label, *value_list_scrolled_win, *value_list;
- GtkWidget *range_label, *range_entry;
-
- GtkWidget *list_bb, *ok_bt, *cancel_bt;
- ProtoHierTreeModel *store_proto;
- GtkTreeModel *store;
- GtkTreeSelection *selection;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
- GtkListStore *l_store;
- GtkTreeSelection *l_sel;
-
- proto_initialize_all_prefixes();
-
- window = dlg_conf_window_new("Wireshark: Filter Expression");
- gtk_window_set_default_size(GTK_WINDOW(window), 500, 400);
- gtk_container_set_border_width(GTK_CONTAINER(window), 5);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 5, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_container_add(GTK_CONTAINER(window), main_vb);
-
- main_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_hb), 5);
- gtk_box_pack_start(GTK_BOX (main_vb), main_hb, TRUE, TRUE, 0);
-
- field_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 5, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(field_vb), 5);
- gtk_box_pack_start(GTK_BOX (main_hb), field_vb, TRUE, TRUE, 0);
-
- field_tree_lb = gtk_label_new("Field name");
- gtk_misc_set_alignment(GTK_MISC(field_tree_lb), 0.0f, 0.0f);
- gtk_box_pack_start(GTK_BOX(field_vb), field_tree_lb, FALSE, FALSE, 0);
-
- tree_scrolled_win = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(tree_scrolled_win),
- GTK_SHADOW_IN);
- gtk_box_pack_start(GTK_BOX(field_vb), tree_scrolled_win, TRUE, TRUE, 0);
- gtk_widget_set_size_request(tree_scrolled_win, 300, -1);
-
-
- field_tree = tree_view_new(GTK_TREE_MODEL(NULL));
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(field_tree), FALSE);
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(field_tree));
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_BROWSE);
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Field name", renderer,
- "text", 1, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(field_tree), column);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_column_set_sort_column_id(column, 0);
- g_signal_connect(selection, "changed", G_CALLBACK(field_select_row_cb), field_tree);
- gtk_container_add(GTK_CONTAINER(tree_scrolled_win), field_tree);
-
- relation_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 5, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(relation_vb), 5);
- gtk_box_pack_start(GTK_BOX (main_hb), relation_vb, TRUE, TRUE, 0);
-
- relation_label = gtk_label_new("Relation");
- gtk_misc_set_alignment(GTK_MISC(relation_label), 0.0f, 0.0f);
- gtk_box_pack_start(GTK_BOX(relation_vb), relation_label, FALSE, FALSE, 0);
-
- relation_list_scrolled_win = scrolled_window_new(NULL, NULL);
- /* never use a scrollbar in x direction, show the complete relation string */
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(relation_list_scrolled_win),
- GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(relation_list_scrolled_win),
- GTK_SHADOW_IN);
-
- l_store = gtk_list_store_new(1, G_TYPE_STRING);
- relation_list = tree_view_new(GTK_TREE_MODEL(l_store));
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(relation_list), FALSE);
- g_object_unref(G_OBJECT(l_store));
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("relation", renderer,
- "text", 0, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(relation_list), column);
- l_sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(relation_list));
- gtk_tree_selection_set_mode(l_sel, GTK_SELECTION_BROWSE);
- gtk_container_add(GTK_CONTAINER(relation_list_scrolled_win), relation_list);
- gtk_box_pack_start(GTK_BOX(relation_vb), relation_list_scrolled_win, TRUE, TRUE, 0);
-
- /*
- * OK, show the relation label and range stuff as it would be
- * with everything turned on, so it'll request as much space
- * as it'll ever need, so the dialog box and widgets start out
- * with the right sizes.
- *
- * XXX - this doesn't work. It *doesn't* request as much space
- * as it'll ever need.
- *
- * XXX - FT_UINT8 doesn't support ranges, so even if it did work,
- * it wouldn't work right.
- *
- * XXX - this no longer affects the range stuff, as that's
- * controlled both by the type and by the relational operator
- * selected.
- */
- show_relations(relation_list, FT_UINT8);
-
- /*
- relation_present_rb = gtk_radio_button_new_with_mnemonic_from_widget(NULL, "is present");
- gtk_box_pack_start(GTK_BOX(relation_vb), relation_present_rb, FALSE, FALSE, 0);
-
- relation_equals_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(relation_present_rb), "==");
- gtk_box_pack_start(GTK_BOX(relation_vb), relation_equals_rb, FALSE, FALSE, 0);
-
- relation_unequals_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(relation_present_rb), "!=");
- gtk_box_pack_start(GTK_BOX(relation_vb), relation_unequals_rb, FALSE, FALSE, 0);
-
- relation_greater_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(relation_present_rb), ">");
- gtk_box_pack_start(GTK_BOX(relation_vb), relation_greater_rb, FALSE, FALSE, 0);
-
- relation_less_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(relation_present_rb), "<");
- gtk_box_pack_start(GTK_BOX(relation_vb), relation_less_rb, FALSE, FALSE, 0);
-
- relation_greaterequal_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(relation_present_rb), ">=");
- gtk_box_pack_start(GTK_BOX(relation_vb), relation_greaterequal_rb, FALSE, FALSE, 0);
-
- relation_lessequal_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(relation_present_rb), "<=");
- gtk_box_pack_start(GTK_BOX(relation_vb), relation_lessequal_rb, FALSE, FALSE, 0);
-
- relation_contains_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(relation_present_rb), "contains");
- gtk_box_pack_start(GTK_BOX(relation_vb), relation_contains_rb, FALSE, FALSE, 0);
-
- relation_matches_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(relation_present_rb), "matches");
- gtk_box_pack_start(GTK_BOX(relation_vb), relation_matches_rb, FALSE, FALSE, 0);
-*/
- /* value column */
- value_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 5, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(value_vb), 5);
- gtk_box_pack_start(GTK_BOX (main_hb), value_vb, TRUE, TRUE, 0);
-
- value_label = gtk_label_new("Value");
- gtk_misc_set_alignment(GTK_MISC(value_label), 0.0f, 0.0f);
- gtk_box_pack_start(GTK_BOX(value_vb), value_label, FALSE, FALSE, 0);
-
- value_entry = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(value_vb), value_entry, FALSE, FALSE, 0);
-
- value_list_label = gtk_label_new("Predefined values:");
- gtk_misc_set_alignment(GTK_MISC(value_list_label), 0.0f, 0.0f);
- gtk_box_pack_start(GTK_BOX(value_vb), value_list_label, FALSE, FALSE, 0);
-
- value_list_scrolled_win = scrolled_window_new(NULL, NULL);
- gtk_box_pack_start(GTK_BOX(value_vb), value_list_scrolled_win, TRUE,
- TRUE, 0);
-
- l_store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_POINTER);
- /*
- * value_list = tree_view_new(GTK_TREE_MODEL(l_store));
- * Replaced because tree_view_key_pressed_cb() can't handle
- * gtk_tree_view_get_selection() when mode GTK_SELECTION_MULTIPLE is used.
- */
- value_list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(l_store));
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(value_list), FALSE);
- g_object_unref(G_OBJECT(l_store));
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("value", renderer,
- "text", 0, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(value_list), column);
- g_signal_connect(gtk_tree_view_get_selection(GTK_TREE_VIEW(value_list)),
- "changed", G_CALLBACK(value_list_sel_cb), value_entry);
-
- /*
- * The value stuff may be hidden or shown depending on what
- * relation was selected; connect to the "changed" signal
- * for the relation list, so we can make that happen.
- */
- g_signal_connect(gtk_tree_view_get_selection(GTK_TREE_VIEW(relation_list)),
- "changed", G_CALLBACK(relation_list_sel_cb), NULL);
- l_sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(value_list));
- gtk_tree_selection_set_mode(l_sel, GTK_SELECTION_SINGLE);
-#if ! GTK_CHECK_VERSION(3,8,0)
- gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(value_list_scrolled_win),
- value_list);
-#else
- gtk_container_add(GTK_CONTAINER(value_list_scrolled_win),
- value_list);
-#endif
- /* This remains hidden until an enumerated field is selected */
-
- /*
- * Put the items in the Tree; we don't want to do that until
- * we've constructed the value list and set the tree's
- * E_DFILTER_EXPR_VALUE_LIST_KEY data to point to it, and
- * constructed the "Accept" button and set the tree's
- * E_DFILTER_EXPR_OK_BT_KEY data to point to it, so that
- * when the list item is "helpfully" automatically selected for us
- * we're ready to cope with the selection signal.
- */
-
- store_proto = proto_hier_tree_model_new();
- store = gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(store_proto));
- gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), 1, GTK_SORT_ASCENDING);
- g_object_unref(G_OBJECT(store_proto));
-
- gtk_tree_view_set_model(GTK_TREE_VIEW(field_tree), GTK_TREE_MODEL(store));
- gtk_tree_view_set_search_column(GTK_TREE_VIEW(field_tree), 1);
- gtk_tree_view_set_enable_search(GTK_TREE_VIEW(field_tree), TRUE);
- g_object_unref(G_OBJECT(store));
-
- range_label = gtk_label_new("Range (offset:length)");
- gtk_misc_set_alignment(GTK_MISC(range_label), 0.0f, 0.0f);
- gtk_box_pack_start(GTK_BOX(value_vb), range_label, FALSE, FALSE, 0);
-
- range_entry = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(value_vb), range_entry, FALSE, FALSE, 0);
-
-
- /* button box */
- list_bb = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CANCEL, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), list_bb, FALSE, FALSE, 0);
- gtk_container_set_border_width (GTK_CONTAINER (list_bb), 0);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(list_bb), GTK_STOCK_OK);
- gtk_widget_set_sensitive(ok_bt, FALSE);
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(dfilter_expr_dlg_accept_cb), filter_te);
-
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(list_bb), GTK_STOCK_CANCEL);
- window_set_cancel_button(window, cancel_bt, NULL);
- g_signal_connect(cancel_bt, "clicked", G_CALLBACK(dfilter_expr_dlg_cancel_cb), window);
-
- gtk_widget_grab_default(ok_bt);
-
- /* Catch the "activate" signal on the range and value text entries,
- so that if the user types Return there, we act as if the "Accept"
- button had been selected, as happens if Return is typed if some
- widget that *doesn't* handle the Return key has the input focus. */
- dlg_set_activate(range_entry, ok_bt);
- dlg_set_activate(value_entry, ok_bt);
-
- g_object_set_data(G_OBJECT(window), E_DFILTER_EXPR_RELATION_LIST_KEY, relation_list);
- g_object_set_data(G_OBJECT(window), E_DFILTER_EXPR_RANGE_LABEL_KEY, range_label);
- g_object_set_data(G_OBJECT(window), E_DFILTER_EXPR_RANGE_ENTRY_KEY, range_entry);
- g_object_set_data(G_OBJECT(window), E_DFILTER_EXPR_VALUE_LABEL_KEY, value_label);
- g_object_set_data(G_OBJECT(window), E_DFILTER_EXPR_VALUE_ENTRY_KEY, value_entry);
- g_object_set_data(G_OBJECT(window), E_DFILTER_EXPR_VALUE_LIST_KEY, value_list);
- g_object_set_data(G_OBJECT(window), E_DFILTER_EXPR_VALUE_LIST_LABEL_KEY, value_list_label);
- g_object_set_data(G_OBJECT(window), E_DFILTER_EXPR_VALUE_LIST_SW_KEY,
- value_list_scrolled_win);
- g_object_set_data(G_OBJECT(window), E_DFILTER_EXPR_OK_BT_KEY, ok_bt);
-
- g_signal_connect(window, "delete_event", G_CALLBACK(dfilter_expr_dlg_delete_event_cb), window);
-
- /*
- * Catch the "destroy" signal on our top-level window, and,
- * when it's destroyed, disconnect the signal we'll be
- * connecting below.
- */
- g_signal_connect(window, "destroy", G_CALLBACK(dfilter_expr_dlg_destroy_cb), filter_te);
-
- /*
- * Catch the "destroy" signal on the text entry widget to which
- * we're attached; if it's destroyed, we should destroy ourselves
- * as well.
- */
- g_signal_connect(filter_te, "destroy", G_CALLBACK(dfilter_expr_dlg_cancel_cb), window);
-
- gtk_widget_show_all(window);
- window_present(window);
-
- return window;
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/dfilter_expr_dlg.h b/ui/gtk/dfilter_expr_dlg.h
deleted file mode 100644
index 65bbc799f9..0000000000
--- a/ui/gtk/dfilter_expr_dlg.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* dfilter_expr_dlg.h
- * Definitions for dialog boxes for display filter expression construction
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __DFILTER_EXPR_DLG_H__
-#define __DFILTER_EXPR_DLG_H__
-
-/** @file
- * "Add Expression" dialog box.
- * @ingroup dialog_group
- */
-
-/** User requested the "Add Expression" dialog box by menu or toolbar.
- *
- * @param widget corresponding text entry widget
- * @return the newly created dialog widget
- */
-GtkWidget *dfilter_expr_dlg_new(GtkWidget *widget);
-
-#endif /* dfilter_expr_dlg.h */
diff --git a/ui/gtk/dissector_tables_dlg.c b/ui/gtk/dissector_tables_dlg.c
deleted file mode 100644
index 40289936df..0000000000
--- a/ui/gtk/dissector_tables_dlg.c
+++ /dev/null
@@ -1,442 +0,0 @@
-/* dissector_tables_dlg.c
- * dissector_tables_dlg 2010 Anders Broman
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-
-#include <epan/packet.h>
-
-#include <gtk/gtk.h>
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/dissector_tables_dlg.h"
-
-static GtkWidget *dissector_tables_dlg_w = NULL;
-
-/* The columns */
-enum
-{
- TABLE_UI_NAME_COL,
- TABLE_SHORT_NAME_COL,
- N_COLUMNS
-};
-
-static void
-win_destroy_cb(GtkWindow *win _U_, gpointer data _U_)
-{
-
- if (dissector_tables_dlg_w != NULL) {
- window_destroy(dissector_tables_dlg_w);
- dissector_tables_dlg_w = NULL;
- }
-
-
-}
-
-/*
- * For a dissector table, put
- * its short name and its
- * descriptive name in the treeview.
- */
-
-struct dissector_tables_tree_info {
- GtkWidget *tree;
- GtkTreeIter iter;
- GtkTreeIter new_iter;
-};
-
-typedef struct dissector_tables_tree_info dissector_tables_tree_info_t;
-
-static gint
-ui_sort_func(GtkTreeModel *model,
- GtkTreeIter *a,
- GtkTreeIter *b,
- gpointer user_data)
-{
- gchar *stra, *strb;
-
- /* The col to get data from is in userdata */
- gint data_column = GPOINTER_TO_INT(user_data);
-
- gtk_tree_model_get(model, a, data_column, &stra, -1);
- gtk_tree_model_get(model, b, data_column, &strb, -1);
-
- return strcmp(stra, strb);
-}
-
-
-/*
- * Struct to hold the pointer to the trees
- * for dissector tables.
- */
-struct dissector_tables_trees {
- GtkWidget *str_tree_wgt;
- GtkWidget *uint_tree_wgt;
- GtkWidget *custom_tree_wgt;
- GtkWidget *heuristic_tree_wgt;
-};
-
-typedef struct dissector_tables_trees dissector_tables_trees_t;
-
-static void
-proto_add_to_list(dissector_tables_tree_info_t *tree_info,
- GtkTreeStore *store,
- const gchar *str,
- const gchar *proto_name)
-{
- gtk_tree_store_insert_with_values(store, &tree_info->new_iter, &tree_info->iter, G_MAXINT,
- TABLE_UI_NAME_COL, str,
- TABLE_SHORT_NAME_COL, proto_name,
- -1);
-}
-
-static void
-decode_proto_add_to_list (const gchar *table_name _U_, ftenum_t selector_type,
- gpointer key, gpointer value, gpointer user_data)
-{
- GtkTreeStore *store;
- const gchar *proto_name;
- dtbl_entry_t *dtbl_entry;
- dissector_handle_t handle;
- guint32 port;
- gchar *int_str;
- const gchar *dissector_name_str;
- dissector_tables_tree_info_t *tree_info;
-
- tree_info = (dissector_tables_tree_info_t *)user_data;
- dtbl_entry = (dtbl_entry_t*)value;
- handle = dtbl_entry_get_handle(dtbl_entry);
- proto_name = dissector_handle_get_short_name(handle);
-
- store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(tree_info->tree)));
-
- switch (selector_type) {
-
- case FT_UINT8:
- case FT_UINT16:
- case FT_UINT24:
- case FT_UINT32:
- port = GPOINTER_TO_UINT(key);
- /* Hack: Use fixed width rj str so alpha sort (strcmp) will sort field numerically */
- int_str = g_strdup_printf ("%10d", port);
- proto_add_to_list(tree_info, store, int_str, proto_name);
- g_free (int_str);
- break;
-
- case FT_STRING:
- case FT_STRINGZ:
- case FT_UINT_STRING:
- case FT_STRINGZPAD:
- proto_add_to_list(tree_info, store, (const gchar*)key, proto_name);
- break;
-
- case FT_BYTES:
- case FT_GUID:
- case FT_NONE:
- dissector_name_str = dissector_handle_get_dissector_name(handle);
- if (dissector_name_str == NULL)
- dissector_name_str = "<Unknown>";
- proto_add_to_list(tree_info, store, dissector_name_str, proto_name);
- break;
-
- default:
- g_assert_not_reached();
- }
-
-}
-
-static void
-table_name_add_to_list(dissector_tables_tree_info_t *tree_info,
- GtkWidget *tree_view,
- const char *table_name,
- const char *ui_name)
-{
- GtkTreeStore *store;
-
- tree_info->tree = tree_view;
- store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(tree_view))); /* Get store */
-
- gtk_tree_store_insert_with_values(store, &tree_info->iter, NULL, G_MAXINT,
- TABLE_UI_NAME_COL, ui_name,
- TABLE_SHORT_NAME_COL, table_name,
- -1);
-}
-
-static void
-display_heur_dissector_table_entries(const char *table_name _U_,
- struct heur_dtbl_entry *dtbl_entry, gpointer user_data)
-{
- dissector_tables_tree_info_t *tree_info = (dissector_tables_tree_info_t*)user_data;
- GtkTreeStore *store;
-
- if (dtbl_entry->protocol) {
-
- store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(tree_info->tree))); /* Get store */
- proto_add_to_list(tree_info, store,
- (gchar *)proto_get_protocol_long_name(dtbl_entry->protocol),
- proto_get_protocol_short_name(dtbl_entry->protocol));
- }else{
- g_warning("no protocol info");
- }
-
-
-}
-
-static void
-display_heur_dissector_table_names(const char *table_name, struct heur_dissector_list *list, gpointer w)
-{
- dissector_tables_trees_t *dis_tbl_trees;
- dissector_tables_tree_info_t *tree_info;
-
- tree_info = g_new(dissector_tables_tree_info_t, 1);
- dis_tbl_trees = (dissector_tables_trees_t*)w;
-
- table_name_add_to_list(tree_info, dis_tbl_trees->heuristic_tree_wgt, "", table_name);
-
- if (list) {
- heur_dissector_table_foreach(table_name, display_heur_dissector_table_entries, tree_info);
- }
-
-}
-
-static void
-display_dissector_table_names(const char *table_name, const char *ui_name, void *w)
-{
- dissector_tables_trees_t *dis_tbl_trees;
- dissector_tables_tree_info_t *tree_info;
- ftenum_t selector_type = get_dissector_table_selector_type(table_name);
-
- tree_info = g_new(dissector_tables_tree_info_t, 1);
- dis_tbl_trees = (dissector_tables_trees_t*)w;
-
- switch (selector_type) {
- case FT_UINT8:
- case FT_UINT16:
- case FT_UINT24:
- case FT_UINT32:
- table_name_add_to_list(tree_info, dis_tbl_trees->uint_tree_wgt, table_name, ui_name);
- break;
- case FT_STRING:
- case FT_STRINGZ:
- case FT_UINT_STRING:
- case FT_STRINGZPAD:
- table_name_add_to_list(tree_info, dis_tbl_trees->str_tree_wgt, table_name, ui_name);
- break;
- case FT_BYTES:
- case FT_GUID:
- case FT_NONE:
- table_name_add_to_list(tree_info, dis_tbl_trees->custom_tree_wgt, table_name, ui_name);
- break;
- default:
- break;
- }
- dissector_table_foreach(table_name, decode_proto_add_to_list, tree_info);
-
- g_free(tree_info);
-}
-
-static GtkWidget *
-init_table(void)
-{
- GtkTreeStore *store;
- GtkWidget *tree;
- GtkTreeView *tree_view;
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
- GtkTreeSortable *sortable;
-
- /* Create the store */
- store = gtk_tree_store_new (N_COLUMNS, /* Total number of columns */
- G_TYPE_STRING, /* Table */
- G_TYPE_STRING); /* Table */
-
- /* Create a view */
- tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
- tree_view = GTK_TREE_VIEW(tree);
- sortable = GTK_TREE_SORTABLE(store);
-
- /* Speed up the list display */
- gtk_tree_view_set_fixed_height_mode(tree_view, TRUE);
-
- /* Setup the sortable columns */
- gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW (tree), FALSE);
-
- /* The view now holds a reference. We can get rid of our own reference */
- g_object_unref (G_OBJECT (store));
-
- /* Create the first column, associating the "text" attribute of the
- * cell_renderer to the first column of the model */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("UI name", renderer, "text", TABLE_UI_NAME_COL, NULL);
- gtk_tree_sortable_set_sort_func(sortable, TABLE_UI_NAME_COL,
- ui_sort_func, GINT_TO_POINTER(TABLE_UI_NAME_COL), NULL);
- gtk_tree_view_column_set_sort_column_id(column, TABLE_UI_NAME_COL);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 80);
- gtk_tree_view_column_set_fixed_width(column, 330);
- gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
-
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Short name", renderer, "text", TABLE_SHORT_NAME_COL, NULL);
- gtk_tree_sortable_set_sort_func(sortable, TABLE_SHORT_NAME_COL,
- ui_sort_func, GINT_TO_POINTER(TABLE_SHORT_NAME_COL), NULL);
- gtk_tree_view_column_set_sort_column_id(column, TABLE_SHORT_NAME_COL);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 80);
- gtk_tree_view_column_set_fixed_width(column, 100);
- gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
-
- return tree;
-
-}
-
-static void
-dissector_tables_dlg_init(void)
-{
- dissector_tables_trees_t dis_tbl_trees;
- GtkWidget *vbox;
- GtkWidget *hbox;
- GtkWidget *main_nb;
- GtkWidget *scrolled_window;
- GtkTreeSortable *sortable;
- GtkWidget *temp_page, *tmp;
-
- dissector_tables_dlg_w = dlg_window_new("Dissector tables"); /* transient_for top_level */
- gtk_window_set_destroy_with_parent (GTK_WINDOW(dissector_tables_dlg_w), TRUE);
- gtk_window_set_default_size(GTK_WINDOW(dissector_tables_dlg_w), 700, 300);
-
- vbox=ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_add(GTK_CONTAINER(dissector_tables_dlg_w), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 12);
-
- main_nb = gtk_notebook_new();
- gtk_box_pack_start(GTK_BOX(vbox), main_nb, TRUE, TRUE, 0);
-
- /* String tables */
- temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- tmp = gtk_label_new("String tables");
- gtk_widget_show(tmp);
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX (hbox), tmp, TRUE, TRUE, 0);
- gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
-
- scrolled_window = scrolled_window_new(NULL, NULL);
- dis_tbl_trees.str_tree_wgt = init_table();
- gtk_widget_show(dis_tbl_trees.str_tree_wgt);
- gtk_container_add(GTK_CONTAINER(scrolled_window), dis_tbl_trees.str_tree_wgt);
- gtk_box_pack_start(GTK_BOX(temp_page), scrolled_window, TRUE, TRUE, 0);
- gtk_widget_show(scrolled_window);
-
- /* uint tables */
- temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- tmp = gtk_label_new("Integer tables");
- gtk_widget_show(tmp);
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX (hbox), tmp, TRUE, TRUE, 0);
- gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
-
- scrolled_window = scrolled_window_new(NULL, NULL);
- dis_tbl_trees.uint_tree_wgt = init_table();
- gtk_widget_show(dis_tbl_trees.uint_tree_wgt);
- gtk_container_add(GTK_CONTAINER(scrolled_window), dis_tbl_trees.uint_tree_wgt);
- gtk_box_pack_start(GTK_BOX(temp_page), scrolled_window, TRUE, TRUE, 0);
- gtk_widget_show(scrolled_window);
-
- /* custom tables */
- temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- tmp = gtk_label_new("Custom tables");
- gtk_widget_show(tmp);
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX (hbox), tmp, TRUE, TRUE, 0);
- gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
-
- scrolled_window = scrolled_window_new(NULL, NULL);
- dis_tbl_trees.custom_tree_wgt = init_table();
- gtk_widget_show(dis_tbl_trees.custom_tree_wgt);
- gtk_container_add(GTK_CONTAINER(scrolled_window), dis_tbl_trees.custom_tree_wgt);
- gtk_box_pack_start(GTK_BOX(temp_page), scrolled_window, TRUE, TRUE, 0);
- gtk_widget_show(scrolled_window);
-
- /* heuristic tables */
- temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- tmp = gtk_label_new("Heuristic tables");
- gtk_widget_show(tmp);
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(hbox), tmp, TRUE, TRUE, 0);
- gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
-
- scrolled_window = scrolled_window_new(NULL, NULL);
- dis_tbl_trees.heuristic_tree_wgt = init_table();
- gtk_widget_show(dis_tbl_trees.heuristic_tree_wgt);
- gtk_container_add(GTK_CONTAINER(scrolled_window), dis_tbl_trees.heuristic_tree_wgt);
- gtk_box_pack_start(GTK_BOX(temp_page), scrolled_window, TRUE, TRUE, 0);
- gtk_widget_show(scrolled_window);
-
- /* We must display TOP LEVEL Widget before calling init_table() */
- gtk_widget_show_all(dissector_tables_dlg_w);
- g_signal_connect(dissector_tables_dlg_w, "destroy", G_CALLBACK(win_destroy_cb), NULL);
-
- /* Fill the table with data */
- dissector_all_tables_foreach_table(display_dissector_table_names, &dis_tbl_trees, NULL);
-
- dissector_all_heur_tables_foreach_table(display_heur_dissector_table_names, (gpointer)&dis_tbl_trees, NULL);
-
- sortable = GTK_TREE_SORTABLE(gtk_tree_view_get_model(GTK_TREE_VIEW(dis_tbl_trees.str_tree_wgt)));
- gtk_tree_sortable_set_sort_column_id(sortable, TABLE_UI_NAME_COL, GTK_SORT_ASCENDING);
-
- sortable = GTK_TREE_SORTABLE(gtk_tree_view_get_model(GTK_TREE_VIEW(dis_tbl_trees.uint_tree_wgt)));
- gtk_tree_sortable_set_sort_column_id(sortable, TABLE_UI_NAME_COL, GTK_SORT_ASCENDING);
-
- sortable = GTK_TREE_SORTABLE(gtk_tree_view_get_model(GTK_TREE_VIEW(dis_tbl_trees.custom_tree_wgt)));
- gtk_tree_sortable_set_sort_column_id(sortable, TABLE_UI_NAME_COL, GTK_SORT_ASCENDING);
-
- sortable = GTK_TREE_SORTABLE(gtk_tree_view_get_model(GTK_TREE_VIEW(dis_tbl_trees.heuristic_tree_wgt)));
- gtk_tree_sortable_set_sort_column_id(sortable, TABLE_UI_NAME_COL, GTK_SORT_ASCENDING);
-
-}
-
-void
-dissector_tables_dlg_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- if (dissector_tables_dlg_w) {
- reactivate_window(dissector_tables_dlg_w);
- } else {
- dissector_tables_dlg_init();
- }
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/dissector_tables_dlg.h b/ui/gtk/dissector_tables_dlg.h
deleted file mode 100644
index 1018f31b45..0000000000
--- a/ui/gtk/dissector_tables_dlg.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/* dissector_tables_dlg.h
- * dissector_tables_dlg 2010 Anders Broman
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-void dissector_tables_dlg_cb(GtkWidget *w, gpointer d);
diff --git a/ui/gtk/dlg_utils.c b/ui/gtk/dlg_utils.c
deleted file mode 100644
index 07c889aa15..0000000000
--- a/ui/gtk/dlg_utils.c
+++ /dev/null
@@ -1,565 +0,0 @@
-/* dlg_utils.c
- * Utilities to use when constructing dialogs
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/old-gtk-compat.h"
-
-#include "wsutil/filesystem.h"
-
-
-static void
-dlg_activate (GtkWidget *widget, gpointer ok_button);
-
-/* create a button for the button row (helper for dlg_button_row_new) */
-static GtkWidget *
-dlg_button_new(GtkWidget *hbox, GtkWidget *button_hbox, const gchar *stock_id)
-{
- GtkWidget *button;
-
- button = ws_gtk_button_new_from_stock(stock_id);
- gtk_widget_set_can_default(button, TRUE);
- g_object_set_data(G_OBJECT(hbox), stock_id, button);
- gtk_box_pack_end(GTK_BOX(button_hbox), button, FALSE, FALSE, 0);
- gtk_widget_show(button);
- return button;
-}
-
-/*
- * Set the focus and default for the nth item in a button row, with
- * 0 being the first item.
- */
-#define BUTTON_HBOX_KEY "button_hbox"
-void
-dlg_button_focus_nth(GtkWidget *hbox, gint focus_item) {
- GtkWidget *button_hbox, *button;
- GList *children;
- gint cur_item = 0;
-
- if (!hbox)
- return;
-
- button_hbox = (GtkWidget *)g_object_get_data(G_OBJECT(hbox), BUTTON_HBOX_KEY);
- children = gtk_container_get_children(GTK_CONTAINER(button_hbox));
-
- while (children) {
- if (cur_item == focus_item) {
- button = (GtkWidget *)children->data;
- gtk_widget_grab_focus(button);
- gtk_widget_grab_default(button);
- break;
- }
- children = g_list_next(children);
- cur_item++;
- }
-
- g_list_free(children);
-}
-
-/* create a button row for a dialog */
-
-/* The purpose of this is, to have one place available, where all button rows
- * from all dialogs are laid out. This will:
- *
- * a.) keep the button layout more consistent over the different dialogs
- * b.) being able to switch between different button layouts, e.g.:
- * e.g. Win32: "OK" "Apply" "Cancel"
- * e.g. GNOME: "Apply" "Cancel" "OK"
- */
-GtkWidget *
-dlg_button_row_new(const gchar *stock_id_first, ...)
-{
- gint buttons = 0;
- va_list stock_id_list;
- const gchar *stock_id = stock_id_first;
- GtkWidget *hbox;
- GtkWidget *button_hbox;
- GtkWidget *help_hbox;
- GtkWidget *button;
-
- const gchar *apply = NULL;
- const gchar *cancel = NULL;
- const gchar *cap_start = NULL;
- const gchar *cap_stop = NULL;
- const gchar *cap_options = NULL;
-#ifdef _WIN32
- const gchar *cap_details = NULL;
-#endif
- const gchar *clear = NULL;
- const gchar *closex = NULL;
- const gchar *copy = NULL;
- const gchar *create_stat = NULL;
- const gchar *delete_id = NULL;
- const gchar *dont_save = NULL;
- const gchar *filter_stream = NULL;
- const gchar *find = NULL;
- const gchar *help = NULL;
- const gchar *jump = NULL;
- const gchar *no = NULL;
- const gchar *ok = NULL;
- const gchar *print = NULL;
- const gchar *save = NULL;
- const gchar *save_as = NULL;
- const gchar *save_all = NULL;
- const gchar *stop = NULL;
- const gchar *yes = NULL;
- const gchar *refresh = NULL;
- const gchar *add = NULL;
-#ifdef HAVE_GEOIP
- const gchar *map = NULL;
-#endif /* HAVE_GEOIP */
- const gchar *follow_stream = NULL;
- const gchar *graph_a_b = NULL;
- const gchar *graph_b_a = NULL;
-
-
- va_start(stock_id_list, stock_id_first);
-
- /* get all buttons needed */
- while(stock_id != NULL) {
- if (strcmp(stock_id, GTK_STOCK_OK) == 0) {
- ok = stock_id;
- } else if (strcmp(stock_id, WIRESHARK_STOCK_CREATE_STAT) == 0) {
- create_stat = stock_id;
- } else if (strcmp(stock_id, GTK_STOCK_APPLY) == 0) {
- apply = stock_id;
- } else if (strcmp(stock_id, GTK_STOCK_SAVE) == 0) {
- save = stock_id;
- } else if (strcmp(stock_id, GTK_STOCK_SAVE_AS) == 0) {
- save_as = stock_id;
- } else if (strcmp(stock_id, WIRESHARK_STOCK_SAVE_ALL) == 0) {
- save_all = stock_id;
- } else if (strcmp(stock_id, WIRESHARK_STOCK_DONT_SAVE) == 0) {
- dont_save = stock_id;
- } else if (strcmp(stock_id, WIRESHARK_STOCK_QUIT_DONT_SAVE) == 0) {
- dont_save = stock_id;
- } else if (strcmp(stock_id, GTK_STOCK_CANCEL) == 0) {
- cancel = stock_id;
- } else if (strcmp(stock_id, GTK_STOCK_CLOSE) == 0) {
- closex = stock_id;
- } else if (strcmp(stock_id, GTK_STOCK_CLEAR) == 0) {
- clear = stock_id;
- } else if (strcmp(stock_id, GTK_STOCK_REFRESH) == 0) {
- refresh = stock_id;
- } else if (strcmp(stock_id, GTK_STOCK_ADD) == 0) {
- add = stock_id;
-#ifdef HAVE_LIBPCAP
- } else if (strcmp(stock_id, WIRESHARK_STOCK_CAPTURE_START) == 0) {
- cap_start = stock_id;
- } else if (strcmp(stock_id, WIRESHARK_STOCK_CAPTURE_STOP) == 0) {
- cap_stop = stock_id;
- } else if (strcmp(stock_id, WIRESHARK_STOCK_CAPTURE_OPTIONS) == 0) {
- cap_options = stock_id;
-#ifdef _WIN32
- } else if (strcmp(stock_id, WIRESHARK_STOCK_CAPTURE_DETAILS) == 0) {
- cap_details = stock_id;
-#endif
-#endif /* HAVE_LIBPCAP */
-#ifdef HAVE_GEOIP
- } else if (strcmp(stock_id, WIRESHARK_STOCK_MAP) == 0) {
- map = stock_id;
-#endif /* HAVE_GEOIP */
- } else if (strcmp(stock_id, WIRESHARK_STOCK_FOLLOW_STREAM) == 0) {
- follow_stream = stock_id;
- } else if (strcmp(stock_id, GTK_STOCK_STOP) == 0) {
- stop = stock_id;
- } else if (strcmp(stock_id, GTK_STOCK_HELP) == 0) {
- help = stock_id;
- } else if (strcmp(stock_id, GTK_STOCK_PRINT) == 0) {
- print = stock_id;
- } else if (strcmp(stock_id, GTK_STOCK_FIND) == 0) {
- find = stock_id;
- } else if (strcmp(stock_id, GTK_STOCK_JUMP_TO) == 0) {
- jump = stock_id;
- } else if (strcmp(stock_id, GTK_STOCK_YES) == 0) {
- yes = stock_id;
- } else if (strcmp(stock_id, GTK_STOCK_NO) == 0) {
- no = stock_id;
- } else if (strcmp(stock_id, WIRESHARK_STOCK_FILTER_OUT_STREAM) == 0) {
- filter_stream = stock_id;
- } else if (strcmp(stock_id, GTK_STOCK_DELETE) == 0) {
- delete_id = stock_id;
- } else if (strcmp(stock_id, GTK_STOCK_COPY) == 0) {
- copy = stock_id;
- } else if (strcmp(stock_id, WIRESHARK_STOCK_GRAPH_A_B) == 0) {
- graph_a_b = stock_id;
- } else if (strcmp(stock_id, WIRESHARK_STOCK_GRAPH_B_A) == 0) {
- graph_b_a = stock_id;
- } else {
- /* we don't know that button! */
- g_assert_not_reached();
- }
- buttons++;
- stock_id = va_arg(stock_id_list, gchar *);
- }
- va_end(stock_id_list);
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
- gtk_widget_show(hbox);
-
- button_hbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_end(GTK_BOX(hbox), button_hbox, TRUE, TRUE, 0);
- g_object_set_data(G_OBJECT(hbox), BUTTON_HBOX_KEY, button_hbox);
- gtk_widget_show(button_hbox);
- gtk_box_set_spacing(GTK_BOX(button_hbox), DLG_BUTTON_SPACING);
-
- help_hbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_end(GTK_BOX(hbox), help_hbox, FALSE, FALSE, 0);
- gtk_widget_show(help_hbox);
- gtk_box_set_spacing(GTK_BOX(help_hbox), DLG_BUTTON_SPACING);
-
- if (buttons == 0) {
- /* if no buttons wanted, simply do nothing */
- return hbox;
- }
-
- if (buttons == 1) {
- /* if only one button, simply put it in the middle (default) */
- dlg_button_new(hbox, button_hbox, stock_id_first);
- return hbox;
- }
-
- /* do we have a help button? -> special handling for it */
- if (help) {
- button = ws_gtk_button_new_from_stock(help);
- gtk_widget_set_can_default(button, TRUE);
- g_object_set_data(G_OBJECT(hbox), help, button);
- gtk_box_pack_start(GTK_BOX(help_hbox), button, FALSE, FALSE, 0);
- gtk_widget_show(button);
- buttons--;
- }
-
- /* do we have a copy button? -> special handling for it */
- if (copy) {
- button = ws_gtk_button_new_from_stock(copy);
- gtk_widget_set_can_default(button, TRUE);
- g_object_set_data(G_OBJECT(hbox), copy, button);
- gtk_box_pack_start(GTK_BOX(help_hbox), button, FALSE, FALSE, 0);
- gtk_widget_show(button);
- buttons--;
- }
-
- /* do we have a refresh button? -> special handling for it */
- if (refresh) {
- button = ws_gtk_button_new_from_stock(refresh);
- g_object_set_data(G_OBJECT(hbox), refresh, button);
- gtk_box_pack_start(GTK_BOX(help_hbox), button, FALSE, FALSE, 0);
- gtk_widget_show(button);
- buttons--;
- }
-
- /* do we have an add button? -> special handling for it */
- if (add) {
- button = ws_gtk_button_new_from_stock(add);
- g_object_set_data(G_OBJECT(hbox), add, button);
- gtk_box_pack_start(GTK_BOX(help_hbox), button, FALSE, FALSE, 0);
- gtk_widget_show(button);
- buttons--;
- }
-
-#ifdef HAVE_GEOIP
- /* do we have a map button? -> special handling for it */
- if (map) {
- button = ws_gtk_button_new_from_stock(map);
- gtk_widget_set_can_default(button, TRUE);
- g_object_set_data(G_OBJECT(hbox), map, button);
- gtk_box_pack_start(GTK_BOX(help_hbox), button, FALSE, FALSE, 0);
- gtk_widget_show(button);
- buttons--;
- }
-#endif /* HAVE_GEOIP */
-
- /* if more than one button, sort buttons from left to right */
- /* (the whole button cluster will then be right aligned) */
- gtk_button_box_set_layout (GTK_BUTTON_BOX(button_hbox), GTK_BUTTONBOX_END);
-
-#if !defined(_WIN32)
- /* beware: sequence of buttons are important! */
-
- /* XXX: this can be implemented more elegant of course, but it works as it should */
- if (buttons == 2) {
- if (ok && cancel) {
- dlg_button_new(hbox, button_hbox, cancel);
- dlg_button_new(hbox, button_hbox, ok);
- return hbox;
- }
- if (print && cancel) {
- dlg_button_new(hbox, button_hbox, cancel);
- dlg_button_new(hbox, button_hbox, print);
- return hbox;
- }
- if (find && cancel) {
- dlg_button_new(hbox, button_hbox, cancel);
- dlg_button_new(hbox, button_hbox, find);
- return hbox;
- }
- if (jump && cancel) {
- dlg_button_new(hbox, button_hbox, cancel);
- dlg_button_new(hbox, button_hbox, jump);
- return hbox;
- }
- if (save && cancel) {
- dlg_button_new(hbox, button_hbox, cancel);
- dlg_button_new(hbox, button_hbox, save);
- return hbox;
- }
- if (ok && clear) {
- dlg_button_new(hbox, button_hbox, clear);
- dlg_button_new(hbox, button_hbox, ok);
- return hbox;
- }
- if (save && closex) {
- dlg_button_new(hbox, button_hbox, closex);
- dlg_button_new(hbox, button_hbox, save);
- return hbox;
- }
- if (create_stat && cancel) {
- dlg_button_new(hbox, button_hbox, cancel);
- dlg_button_new(hbox, button_hbox, create_stat);
- return hbox;
- }
- if (cap_start && cancel) {
- dlg_button_new(hbox, button_hbox, cancel);
- dlg_button_new(hbox, button_hbox, cap_start);
- return hbox;
- }
- if (cap_stop && cancel) {
- dlg_button_new(hbox, button_hbox, cancel);
- dlg_button_new(hbox, button_hbox, cap_stop);
- return hbox;
- }
- if (delete_id && cancel) {
- dlg_button_new(hbox, button_hbox, cancel);
- dlg_button_new(hbox, button_hbox, delete_id);
- return hbox;
- }
- }
- if (buttons == 3) {
- if (ok && save && closex) {
- dlg_button_new(hbox, button_hbox, save);
- dlg_button_new(hbox, button_hbox, closex);
- dlg_button_new(hbox, button_hbox, ok);
- return hbox;
- }
- if (ok && apply && cancel) {
- dlg_button_new(hbox, button_hbox, apply);
- dlg_button_new(hbox, button_hbox, cancel);
- dlg_button_new(hbox, button_hbox, ok);
- return hbox;
- }
- if (apply && save && closex) {
- dlg_button_new(hbox, button_hbox, save);
- dlg_button_new(hbox, button_hbox, closex);
- dlg_button_new(hbox, button_hbox, apply);
- return hbox;
- }
- if (yes && no && cancel) {
- dlg_button_new(hbox, button_hbox, no);
- dlg_button_new(hbox, button_hbox, cancel);
- dlg_button_new(hbox, button_hbox, yes);
- return hbox;
- }
- if (save && dont_save && cancel) {
- dlg_button_new(hbox, button_hbox, dont_save);
- dlg_button_new(hbox, button_hbox, cancel);
- dlg_button_new(hbox, button_hbox, save);
- return hbox;
- }
- }
- if (buttons == 4) {
- if (ok && apply && save && cancel) {
- dlg_button_new(hbox, button_hbox, save);
- dlg_button_new(hbox, button_hbox, apply);
- dlg_button_new(hbox, button_hbox, cancel);
- dlg_button_new(hbox, button_hbox, ok);
- return hbox;
- }
- if (ok && apply && save && closex) {
- dlg_button_new(hbox, button_hbox, save);
- dlg_button_new(hbox, button_hbox, apply);
- dlg_button_new(hbox, button_hbox, closex);
- dlg_button_new(hbox, button_hbox, ok);
- return hbox;
- }
- }
-#endif
-
- /* beware: sequence of buttons is important! */
- if (ok != NULL) dlg_button_new(hbox, button_hbox, ok);
- if (delete_id != NULL) dlg_button_new(hbox, button_hbox, delete_id);
- if (jump != NULL) dlg_button_new(hbox, button_hbox, jump);
- if (find != NULL) dlg_button_new(hbox, button_hbox, find);
- if (print != NULL) dlg_button_new(hbox, button_hbox, print);
- if (create_stat != NULL) dlg_button_new(hbox, button_hbox, create_stat);
- if (apply != NULL) dlg_button_new(hbox, button_hbox, apply);
- if (yes != NULL) dlg_button_new(hbox, button_hbox, yes);
- if (no != NULL) dlg_button_new(hbox, button_hbox, no);
- if (save != NULL) dlg_button_new(hbox, button_hbox, save);
- if (save_as != NULL) dlg_button_new(hbox, button_hbox, save_as);
- if (save_all != NULL) dlg_button_new(hbox, button_hbox, save_all);
- if (dont_save != NULL) dlg_button_new(hbox, button_hbox, dont_save);
- if (cap_start != NULL) dlg_button_new(hbox, button_hbox, cap_start);
- if (cap_stop != NULL) dlg_button_new(hbox, button_hbox, cap_stop);
- if (cap_options != NULL) dlg_button_new(hbox, button_hbox, cap_options);
-#ifdef _WIN32
- if (cap_details != NULL) dlg_button_new(hbox, button_hbox, cap_details);
-#endif
- if (stop != NULL) dlg_button_new(hbox, button_hbox, stop);
- if (clear != NULL) dlg_button_new(hbox, button_hbox, clear);
- if (filter_stream != NULL) dlg_button_new(hbox, button_hbox, filter_stream);
- if (follow_stream != NULL) dlg_button_new(hbox, button_hbox, follow_stream);
- if (graph_a_b != NULL) dlg_button_new(hbox, button_hbox, graph_a_b);
- if (graph_b_a != NULL) dlg_button_new(hbox, button_hbox, graph_b_a);
- if (closex != NULL) dlg_button_new(hbox, button_hbox, closex);
- if (cancel != NULL) dlg_button_new(hbox, button_hbox, cancel);
-
- return hbox;
-}
-
-
-/* Create a dialog box window that belongs to Wireshark's main window. */
-GtkWidget *
-dlg_window_new(const gchar *title)
-{
- GtkWidget *win;
-
- win = window_new(GTK_WINDOW_TOPLEVEL, title);
-
- /*
- * On Windows, making the dialogs transient to top_level behaves strangely.
- * It is not possible any more to bring the top level window to front easily.
- * So we don't do this on Windows.
- *
- * XXX: Note well: This means that *on Windows* any code which creates a
- * window using dlg_window_new() and then calls
- * gtk_widget_destroy_with_parent() will *not* get the desired effect
- * since the dialog window actually has has no parent.
- */
-#ifndef _WIN32
- if (top_level) {
- gtk_window_set_transient_for(GTK_WINDOW(win), GTK_WINDOW(top_level));
- }
-#endif /*_WIN32*/
-
- return win;
-}
-
-/* Create a dialog box window that belongs to Wireshark's main window. */
-GtkWidget *
-dlg_window_new_with_geom(const gchar *title, const gchar *geom_name, GtkWindowPosition pos)
-{
- GtkWidget *win;
-
- win = window_new_with_geom(GTK_WINDOW_TOPLEVEL, title, geom_name ? geom_name : title, pos);
-
- /*
- * XXX - if we're running in the capture child process, we can't easily
- * make this window transient for the main process's window. We just
- * punt here.
- *
- * Perhaps the child process should only capture packets, write them to
- * a file, and somehow notify the parent process and let *it* do all
- * the GUI work. If we can do that efficiently (so that we don't drop
- * more packets), perhaps we can also do so even when we're *not* doing
- * an "Update list of packets in real time" capture. That'd let the
- * child process run set-UID on platforms where you need that in order
- * to capture, and might also simplify the job of having the GUI main
- * loop wait both for user input and packet arrival.
- */
- /*
- * On Windows, making the dialogs transient to top_level behaves strangely.
- * It is not possible any more to bring the top level window to front easily.
- * So we don't do this on Windows.
- */
-#ifndef _WIN32
- if (top_level) {
- gtk_window_set_transient_for(GTK_WINDOW(win), GTK_WINDOW(top_level));
- }
-#endif /*_WIN32*/
-
- return win;
-}
-
-/* Create a configuration dialog box window that belongs to Wireshark's
- * main window and add the name of the current profile name to its title bar
- */
-GtkWidget *
-dlg_conf_window_new(const gchar *title)
-{
- const char *profile_name;
- gchar *win_name;
- GtkWidget *win;
-
- /*
- * Set window title to reflect which preferences profile we are
- * working with.
- */
- profile_name = get_profile_name();
-
- win_name = g_strdup_printf("%s - Profile: %s", title, profile_name);
- win = dlg_window_new(win_name);
-
- g_free(win_name);
-
- return win;
-}
-
-/* Set the "activate" signal for a widget to call a routine to
- activate the "OK" button for a dialog box.
-
- XXX - there should be a way to specify that a GtkEntry widget
- shouldn't itself handle the Return key, but should let it be
- passed on to the parent, so that you don't have to do this
- by hand for every GtkEntry widget in a dialog box, but, alas,
- there isn't. (Does this problem exist for other widgets?
- I.e., are there any others that seize the Return key? */
-void
-dlg_set_activate(GtkWidget *widget, GtkWidget *ok_button)
-{
- g_signal_connect(widget, "activate", G_CALLBACK(dlg_activate), ok_button);
-}
-
-static void
-dlg_activate (GtkWidget *widget _U_, gpointer ok_button)
-{
- gtk_widget_activate(GTK_WIDGET(ok_button));
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/dlg_utils.h b/ui/gtk/dlg_utils.h
deleted file mode 100644
index 9bc2ea1a53..0000000000
--- a/ui/gtk/dlg_utils.h
+++ /dev/null
@@ -1,154 +0,0 @@
-/* dlg_utils.h
- * Declarations of utilities to use when constructing dialogs
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/** @defgroup dialog_group Dialogs
- *
- * Dialogs are specially created windows and are related to their parent windows (usually the main window).
- * See: @ref howto_window_page for details.
- *
- * Normal dialogs are created using dlg_window_new().
- *
- * - "About" about_wireshark_cb()
- * - "Capture Options" capture_prep_cb()
- * - "Capture" capture_info_ui_create()
- * - "Interface Options" ifopts_edit_cb()
- * - "Coloring Rules" colorize_dialog_new()
- * - "Edit Color Filter" edit_color_filter_dialog_new()
- * - "Compute DCE-RPC SRT statistics" gtk_dcerpcstat_cb()
- * - "Decode As: Show" decode_show_cb()
- * - "Decode As" decode_as_cb()
- * - "Filter Expression" dfilter_expr_dlg_new()
- * - "Compute Fibre Channel Service Response Time statistics" gtk_fcstat_cb()
- * - "Filter" (display and capture) filter_dialog_new()
- * - "Find Packet" find_frame_cb()
- * - "Follow TCP stream" follow_stream_cb()
- * - "Go To Packet" goto_frame_cb()
- * - "Compute LDAP Service Response Time statistics" gtk_ldapstat_cb()
- * - "Preferences" tools_plugins_cmd_cb()
- * - "Print" / "Export" open_print_dialog()
- * - "Progress" create_progress_dlg()
- * - "Enabled Protocols" proto_cb()
- * - "Compute ONC-RPC SRT statistics" gtk_rpcstat_cb()
- * - "RTP Streams" rtpstream_dlg_create()
- * - "Simple Dialog" display_simple_dialog()
- * - "Compute SMB SRT statistics" gtk_smbstat_cb()
- * - "Compute ..." tap_param_dlg_cb()
- * - "Tcp Graph" create_drawing_area()
- * - "Tcp Graph Control" control_panel_create()
- * - "Help for TCP graphing" callback_create_help()
- * - "Tcp Graph Magnify" magnify_create()
- */
-
-/** @file
- * Utilities for dialog boxes. Depending on the window functions in
- * gui_utils.h, see: @ref howto_window_page for details.
- * @ingroup dialog_group
- */
-
-#ifndef __DLG_UTILS_H__
-#define __DLG_UTILS_H__
-
-#if defined(_WIN32)
-/*
- * We should calculate these values dynamically using MapDialogRect().
- * Unfortunately that requires passing a valid dialog HWND, which we
- * don't have in many cases.
- * http://msdn.microsoft.com/en-us/library/windows/desktop/aa511279.aspx#sizingspacing
- */
-
-#define DLG_OUTER_MARGIN 11
-#define DLG_BUTTON_SPACING 7
-#define DLG_LABEL_SPACING 5
-#define DLG_UNRELATED_SPACING 11
-
-/* elif defined (__APPLE__) */
-#else /* Use the GNOME HIG */
-
-/* http://developer.gnome.org/hig-book/3.2/design-window.html.en */
-
-#define DLG_OUTER_MARGIN 12
-#define DLG_BUTTON_SPACING 6
-#define DLG_LABEL_SPACING 4 /* Not specified. Guessing. */
-#define DLG_UNRELATED_SPACING 12
-
-#endif
-
-/** Create a dialog box window that belongs to Wireshark's main window.
- * If you want to create a window, use window_new() instead.
- * See window_new() for general window usage.
- *
- * @param title the title for the new dialog
- * @return the newly created dialog
- */
-extern GtkWidget *dlg_window_new(const gchar *title);
-
-/** Create a dialog box window that belongs to Wireshark's main window.
- * If you want to create a window, use window_new_with_geom() instead.
- * See window_new_with_geom() for general window usage.
- *
- * @param title the title for the new dialog
- * @param geom_name A unique name for the geometry of this new dialog
- * @param pos the initial position of the window if a previously saved geometry was not saved or found.
- * If the initial position does not matter, specify GTK_WIN_POS_NONE.
- * @return the newly created dialog
- */
-extern GtkWidget *
-dlg_window_new_with_geom(const gchar *title, const gchar *geom_name, GtkWindowPosition pos);
-
-/** Create a configuration dialog box window that belongs to Wireshark's
- * main window and add the name of the current profile name to its title bar
- * If you want to create a window, use window_new() instead.
- * See window_new() for general window usage.
- *
- * @param title the title for the new dialog
- * @return the newly created dialog
- */
-extern GtkWidget *dlg_conf_window_new(const gchar *title);
-
-/** Create a button row (with variable number of buttons) for a dialog.
- * The button widgets will be available by g_object_get_data(dlg, stock_id) later.
- *
- * @param stock_id_first the first button (e.g. GTK_STOCK_OK)
- * @param ... the next buttons, just like stock_id_first
- * @return the new button row
- * @todo move this to gui_utils.h
- */
-extern GtkWidget *dlg_button_row_new(const gchar *stock_id_first, ...);
-
-/** Set the "activate" signal for a widget to call a routine to
- * activate the "OK" button for a dialog box.
- *
- * @param widget a widget which should be connected (usually a GtkEntry)
- * @param ok_button the button to be activated
- * @todo move this to gui_utils.h
- */
-extern void dlg_set_activate(GtkWidget *widget, GtkWidget *ok_button);
-
-/** Set the focus and default for the nth item in a button row.
- *
- * @param hbox A button row returned by dlg_button_row_new().
- * @param focus_item The button to focus (0 is the first).
- * @see dlg_button_row_new()
- */
-void dlg_button_focus_nth(GtkWidget *hbox, gint focus_item);
-
-#endif
diff --git a/ui/gtk/doxygen.cfg.in b/ui/gtk/doxygen.cfg.in
deleted file mode 100644
index 700aa6645f..0000000000
--- a/ui/gtk/doxygen.cfg.in
+++ /dev/null
@@ -1,67 +0,0 @@
-# @configure_input@
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
-# by quotes) that should identify the project.
-
-PROJECT_NAME = Wireshark-GTK
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number.
-# This could be handy for archiving the generated documentation or
-# if some version control system is used.
-
-PROJECT_NUMBER = @VERSION@
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
-# base path where the generated documentation will be put.
-# If a relative path is entered, it will be relative to the location
-# where doxygen was started. If left blank the current directory will be used.
-
-OUTPUT_DIRECTORY =
-
-# The INPUT tag can be used to specify the files and/or directories that contain
-# documented source files. You may enter file names like "myfile.cpp" or
-# directories like "/usr/src/myproject". Separate the files or directories
-# with spaces.
-
-INPUT = . ../progress_dlg.h ../simple_dialog.h
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank the following patterns are tested:
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp
-# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc
-
-FILE_PATTERNS = *.h
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories
-# should be searched for input files as well. Possible values are YES and NO.
-# If left blank NO is used.
-
-RECURSIVE = YES
-
-# The EXCLUDE tag can be used to specify files and/or directories that should
-# excluded from the INPUT source files. This way you can easily exclude a
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-
-EXCLUDE =
-
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories
-# that are symbolic links (a Unix filesystem feature) are excluded from the input.
-
-EXCLUDE_SYMLINKS = NO
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories.
-
-EXCLUDE_PATTERNS =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
-# be used to specify the file name of the resulting .chm file. You
-# can add a path in front of the file if the result should not be
-# written to the html output directory.
-
-CHM_FILE = wireshark-gtk.chm
-
-@INCLUDE = ../../doxygen_global.cfg
diff --git a/ui/gtk/drag_and_drop.c b/ui/gtk/drag_and_drop.c
deleted file mode 100644
index 963e503023..0000000000
--- a/ui/gtk/drag_and_drop.c
+++ /dev/null
@@ -1,316 +0,0 @@
-/* drag_and_drop.c
- * Drag and Drop
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-
-#include "../../file.h"
-#ifdef HAVE_LIBPCAP
-#include "ui/capture.h"
-#endif
-
-#ifdef HAVE_LIBPCAP
-#include "ui/capture_globals.h"
-#endif
-#include "ui/recent_utils.h"
-#include "ui/simple_dialog.h"
-
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/capture_file_dlg.h"
-#include "ui/gtk/drag_and_drop.h"
-#include "ui/gtk/main.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-#include "globals.h"
-
-enum { DND_TARGET_STRING, DND_TARGET_ROOTWIN, DND_TARGET_URL };
-
-/* convert drag and drop URI to a local filename */
-static gchar *
-dnd_uri2filename(gchar *cf_name)
-{
- gchar *src, *dest;
- gint ret;
- guint i;
- gchar esc[3];
-
-
- /* Remove URI header.
- * we have to remove the prefix to get a valid filename. */
-#ifdef _WIN32
- /*
- * On win32 (at least WinXP), this prefix looks like (UNC):
- * file:////servername/sharename/dir1/dir2/capture-file.cap
- * or (local filename):
- * file:///d:/dir1/dir2/capture-file.cap
- */
- if (strncmp("file:////", cf_name, 9) == 0) {
- /* win32 UNC: now becoming: //servername/sharename/dir1/dir2/capture-file.cap */
- cf_name += 7;
- } else if (strncmp("file:///", cf_name, 8) == 0) {
- /* win32 local: now becoming: d:/dir1/dir2/capture-file.cap */
- cf_name += 8;
- }
-#else
- /*
- * On UNIX (at least KDE 3.0 Konqueror), this prefix looks like:
- * file:/dir1/dir2/capture-file.cap
- *
- * On UNIX (at least GNOME Nautilus 2.8.2), this prefix looks like:
- * file:///dir1/dir2/capture-file.cap
- */
- if (strncmp("file:", cf_name, 5) == 0) {
- /* now becoming: /dir1/dir2/capture-file.cap or ///dir1/dir2/capture-file.cap */
- cf_name += 5;
- /* shorten //////thing to /thing */
- for(; cf_name[1] == '/'; ++cf_name);
- }
-#endif
-
- /*
- * unescape the escaped URI characters (spaces, ...)
- *
- * we have to replace escaped chars to their equivalents,
- * e.g. %20 (always a two digit hexstring) -> ' '
- * the percent character '%' is escaped be a double one "%%"
- *
- * we do this conversation "in place" as the result is always
- * equal or smaller in size.
- */
- src = cf_name;
- dest = cf_name;
- while (*src) {
- if (*src == '%') {
- src++;
- if (*src == '%') {
- /* this is an escaped '%' char (was: "%%") */
- *dest = *src;
- src++;
- dest++;
- } else {
- /* convert escaped hexnumber to unscaped character */
- esc[0] = src[0];
- esc[1] = src[1];
- esc[2] = '\0';
- ret = sscanf(esc, "%x", &i);
- if (ret == 1) {
- src+=2;
- *dest = (gchar) i;
- dest++;
- } else {
- /* somethings wrong, just jump over that char
- * this will result in a wrong string, but we might get
- * user feedback and can fix it later ;-) */
- src++;
- }
- }
-#ifdef _WIN32
- } else if (*src == '/') {
- *dest = '\\';
- src++;
- dest++;
-#endif
- } else {
- *dest = *src;
- src++;
- dest++;
- }
- }
- *dest = '\0';
-
- return cf_name;
-}
-
-/* open/merge the dnd file */
-void
-dnd_open_file_cmd(gchar *cf_names_freeme)
-{
- int err;
- gchar *cf_name;
- int in_file_count;
- int files_work;
- char **in_filenames;
- char *tmpname;
-
- if (cf_names_freeme == NULL) return;
-
- /* DND_TARGET_URL:
- * The cf_name_freeme is a single string, containing one or more URI's,
- * terminated by CR/NL chars. The length of the whole field can be found
- * in the selection_data->length field. If it contains one file, simply open it,
- * If it contains more than one file, ask to merge these files. */
-
- /* count the number of input files */
- cf_name = cf_names_freeme;
- for(in_file_count = 0; (cf_name = strstr(cf_name, "\r\n")) != NULL; ) {
- cf_name += 2;
- in_file_count++;
- }
- if (in_file_count == 0) {
- g_free(cf_names_freeme);
- return;
- }
-
- in_filenames = (char **)g_malloc(sizeof(char*) * in_file_count);
-
- /* store the starts of the file entries in a gchar array */
- cf_name = cf_names_freeme;
- in_filenames[0] = cf_name;
- for(files_work = 1; (cf_name = strstr(cf_name, "\r\n")) != NULL && files_work < in_file_count; ) {
- cf_name += 2;
- in_filenames[files_work] = cf_name;
- files_work++;
- }
-
- /* replace trailing CR NL simply with zeroes (in place), so we get valid terminated strings */
- cf_name = cf_names_freeme;
- g_strdelimit(cf_name, "\r\n", '\0');
-
- /* convert all filenames from URI to local filename (in place) */
- for(files_work = 0; files_work < in_file_count; files_work++) {
- in_filenames[files_work] = dnd_uri2filename(in_filenames[files_work]);
- }
-
- if (in_file_count == 1) {
- /* open and read the capture file (this will close an existing file) */
- if (cf_open(&cfile, in_filenames[0], WTAP_TYPE_AUTO, FALSE, &err) == CF_OK) {
- /* XXX - add this to the menu if the read fails? */
- cf_read(&cfile, FALSE);
- add_menu_recent_capture_file(in_filenames[0]);
- } else {
- /* the capture file couldn't be read (doesn't exist, file format unknown, ...) */
- }
- } else {
- /* merge the files in chronological order */
- if (cf_merge_files_to_tempfile(top_level, &tmpname, in_file_count, in_filenames,
- WTAP_FILE_TYPE_SUBTYPE_PCAPNG, FALSE) == CF_OK) {
- /* Merge succeeded; close the currently-open file and try
- to open the merged capture file. */
- cf_close(&cfile);
- if (cf_open(&cfile, tmpname, WTAP_TYPE_AUTO, TRUE /* temporary file */, &err) == CF_OK) {
- g_free(tmpname);
- cf_read(&cfile, FALSE);
- } else {
- /* The merged file couldn't be read. */
- g_free(tmpname);
- }
- } else {
- /* merge failed */
- g_free(tmpname);
- }
- }
-
- g_free(in_filenames);
- g_free(cf_names_freeme);
-}
-
-/* we have received some drag and drop data */
-/* (as we only registered to "text/uri-list", we will only get a file list here) */
-static void
-dnd_data_received(GtkWidget *widget _U_, GdkDragContext *dc _U_, gint x _U_, gint y _U_,
- GtkSelectionData *selection_data, guint info, guint t _U_, gpointer data _U_)
-{
- gchar *cf_names_freeme;
- const guchar *sel_data_data;
- gint sel_data_len;
-
- if (info == DND_TARGET_URL) {
- /* Usually we block incoming events by disabling the corresponding menu/toolbar items.
- * This is the only place where an incoming event won't be blocked in such a way,
- * so we have to take care of NOT loading a new file while a different process
- * (e.g. capture/load/...) is still in progress. */
-
-#ifdef HAVE_LIBPCAP
- /* if a capture is running, do nothing but warn the user */
- if((global_capture_session.state != CAPTURE_STOPPED)) {
- simple_dialog(ESD_TYPE_CONFIRMATION,
- ESD_BTN_OK,
- "%sDrag and Drop currently not possible.%s\n\n"
- "Dropping a file isn't possible while a capture is in progress.",
- simple_dialog_primary_start(), simple_dialog_primary_end());
- return;
- }
-#endif
-
- /* if another file read is still in progress, do nothing but warn the user */
- if(cfile.state == FILE_READ_IN_PROGRESS) {
- simple_dialog(ESD_TYPE_CONFIRMATION,
- ESD_BTN_OK,
- "%sDrag and Drop currently not possible.%s\n\n"
- "Dropping a file isn't possible while loading another capture file.",
- simple_dialog_primary_start(), simple_dialog_primary_end());
- return;
- }
-
- /* the selection_data will soon be gone, make a copy first */
- /* the data string is not zero terminated -> make a zero terminated "copy" of it */
- sel_data_len = gtk_selection_data_get_length(selection_data);
- sel_data_data = gtk_selection_data_get_data(selection_data);
- cf_names_freeme = (gchar *)g_malloc(sel_data_len + 1);
- memcpy(cf_names_freeme, sel_data_data, sel_data_len);
- cf_names_freeme[sel_data_len] = '\0';
-
- /* If there's unsaved data, let the user save it first.
- If they cancel out of it, don't open the file. */
- if (do_file_close(&cfile, FALSE, " before opening a new capture file"))
- dnd_open_file_cmd(cf_names_freeme);
- }
-}
-
-/* init the drag and drop functionality */
-void
-dnd_init(GtkWidget *w)
-{
- /* we are only interested in the URI list containing filenames */
- static GtkTargetEntry target_entry[] = {
- /*{"STRING", 0, DND_TARGET_STRING},*/
- /*{"text/plain", 0, DND_TARGET_STRING},*/
- {"text/uri-list", 0, DND_TARGET_URL}
- };
-
- /* set this window as a dnd destination */
- gtk_drag_dest_set(
- w, GTK_DEST_DEFAULT_ALL, target_entry,
- sizeof(target_entry) / sizeof(GtkTargetEntry),
- (GdkDragAction)(GDK_ACTION_MOVE | GDK_ACTION_COPY) );
-
- /* get notified, if some dnd coming in */
- g_signal_connect(w, "drag_data_received", G_CALLBACK(dnd_data_received), NULL);
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/drag_and_drop.h b/ui/gtk/drag_and_drop.h
deleted file mode 100644
index f5d9146c58..0000000000
--- a/ui/gtk/drag_and_drop.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* drag_and_drop.h
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __DRAG_AND_DROP_H__
-#define __DRAG_AND_DROP_H__
-
-
-/** Init the drag-n-drop functionality.
- *
- * @param w the target widget for this dnd operations
- */
-extern void dnd_init(GtkWidget *w);
-
-/** Open a new file coming from drag and drop.
- * @param cf_names_freeme the selection data reported from GTK
- */
-extern void dnd_open_file_cmd(gchar *cf_names_freeme);
-
-
-#endif /* __DRAG_AND_DROP_H__ */
diff --git a/ui/gtk/edit_packet_comment_dlg.c b/ui/gtk/edit_packet_comment_dlg.c
deleted file mode 100644
index a1e6cba7ed..0000000000
--- a/ui/gtk/edit_packet_comment_dlg.c
+++ /dev/null
@@ -1,259 +0,0 @@
-/* edit_packet_comment_dlg.c
- * Dialog box for editing or adding packet comments.
- * Copyright 2012 Anders Broman <anders.broman@ericsson.com>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include "ui/main_statusbar.h"
-
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/expert_comp_dlg.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/packet_list.h"
-#include "ui/gtk/edit_packet_comment_dlg.h"
-
-#include "globals.h"
-
-static GtkWidget *edit_or_add_pkt_comment_dlg = NULL;
-static GtkWidget *edit_or_add_capture_comment_dlg = NULL;
-
-static void
-pkt_comment_text_buff_ok_cb(GtkWidget *w _U_, GtkWidget *view)
-{
- GtkTextBuffer *buffer;
- GtkTextIter start_iter;
- GtkTextIter end_iter;
- gchar *new_packet_comment;
-
- buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
- gtk_text_buffer_get_start_iter (buffer, &start_iter);
- gtk_text_buffer_get_end_iter (buffer, &end_iter);
-
- new_packet_comment = gtk_text_buffer_get_text (buffer, &start_iter, &end_iter, FALSE /* whether to include invisible text */);
-
- /*g_warning("The new comment is '%s'",new_packet_comment);*/
-
- packet_list_update_packet_comment(new_packet_comment);
- expert_comp_packet_comment_updated();
- status_expert_update();
-
- window_destroy(edit_or_add_pkt_comment_dlg);
-
-}
-
-
-static void
-capture_comment_text_buff_ok_cb(GtkWidget *w _U_, GtkWidget *view)
-{
- GtkTextBuffer *buffer;
- GtkTextIter start_iter;
- GtkTextIter end_iter;
- gchar *new_capture_comment;
-
- buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
- gtk_text_buffer_get_start_iter (buffer, &start_iter);
- gtk_text_buffer_get_end_iter (buffer, &end_iter);
-
- new_capture_comment = gtk_text_buffer_get_text (buffer, &start_iter, &end_iter, FALSE /* whether to include invisible text */);
-
- /*g_warning("The new comment is '%s'",new_capture_comment);*/
- cf_update_section_comment(&cfile, new_capture_comment);
-
- /* Update the main window as appropriate */
- main_update_for_unsaved_changes(&cfile);
-
- status_capture_comment_update();
-
- window_destroy(edit_or_add_capture_comment_dlg);
-
-}
-
-
-void
-edit_packet_comment_dlg (GtkAction *action _U_, gpointer data _U_)
-{
-
- GtkWidget *vbox;
- GtkWidget *view;
- GtkWidget *scroll;
- GtkWidget *bbox;
- GtkWidget *ok_bt, *cancel_bt, *help_bt;
- GtkTextBuffer *buffer;
- gchar *opt_comment;
-
- edit_or_add_pkt_comment_dlg = dlg_window_new ("Edit or Add Packet Comments");
- gtk_widget_set_size_request (edit_or_add_pkt_comment_dlg, 500, 160);
- gtk_window_set_resizable (GTK_WINDOW (edit_or_add_pkt_comment_dlg), TRUE);
- gtk_container_set_border_width (GTK_CONTAINER (edit_or_add_pkt_comment_dlg), DLG_OUTER_MARGIN);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
- gtk_container_add (GTK_CONTAINER (edit_or_add_pkt_comment_dlg), vbox);
- gtk_widget_show (vbox);
-
- view = gtk_text_view_new ();
- gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view), GTK_WRAP_WORD);
- buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
- gtk_widget_show (view);
-
- scroll = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll),
- GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- gtk_container_add(GTK_CONTAINER(scroll), view);
- gtk_widget_show(scroll);
- gtk_box_pack_start(GTK_BOX (vbox), scroll, TRUE, TRUE, 0);
-
- /* Get the comment */
- opt_comment = packet_list_get_packet_comment();
- /*g_warning("Fetched comment '%s'",opt_comment);*/
-
- if(opt_comment){
- gtk_text_buffer_set_text(buffer, opt_comment, -1);
- g_free(opt_comment);
- }
-
- /* Button row. */
- bbox = dlg_button_row_new (GTK_STOCK_OK, GTK_STOCK_CANCEL, GTK_STOCK_HELP, NULL);
- gtk_box_pack_end (GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
-
- ok_bt = (GtkWidget *)g_object_get_data (G_OBJECT(bbox), GTK_STOCK_OK);
- g_signal_connect (ok_bt, "clicked", G_CALLBACK(pkt_comment_text_buff_ok_cb), view);
- gtk_widget_set_sensitive (ok_bt, TRUE);
-
- cancel_bt = (GtkWidget *)g_object_get_data (G_OBJECT(bbox), GTK_STOCK_CANCEL);
- window_set_cancel_button (edit_or_add_pkt_comment_dlg, cancel_bt, window_cancel_button_cb);
-
- help_bt = (GtkWidget *)g_object_get_data (G_OBJECT(bbox), GTK_STOCK_HELP);
-#if 0
- g_signal_connect (help_bt, "clicked",/* G_CALLBACK(topic_cb)*/NULL, /*(gpointer)HELP_MANUAL_ADDR_RESOLVE_DIALOG*/NULL);
-#endif
- gtk_widget_set_sensitive (help_bt, FALSE);
-
- gtk_widget_grab_default (ok_bt);
- g_signal_connect (edit_or_add_pkt_comment_dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
-
-
- gtk_widget_show (edit_or_add_pkt_comment_dlg);
-}
-
-
-
-static void
-edit_capture_comment_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
-{
- /* Note that we no longer have an "Edit Capture Comment" dialog box. */
- edit_or_add_capture_comment_dlg = NULL;
-}
-
-void
-edit_capture_comment_dlg_launch (GtkAction *action _U_, gpointer data _U_)
-{
- GtkWidget *vbox;
- GtkWidget *view;
- GtkWidget *scroll;
- GtkWidget *bbox;
- GtkWidget *ok_bt, *cancel_bt, *help_bt;
- GtkTextBuffer *buffer = NULL;
- const gchar *comment_str = NULL;
-
- if (edit_or_add_capture_comment_dlg != NULL) {
- /* There's already an "Edit Capture Comment" dialog box; reactivate it. */
- reactivate_window(edit_or_add_capture_comment_dlg);
- return;
- }
-
- edit_or_add_capture_comment_dlg = dlg_window_new ("Edit or Add Capture Comments");
- gtk_widget_set_size_request (edit_or_add_capture_comment_dlg, 500, 160);
- gtk_window_set_resizable (GTK_WINDOW (edit_or_add_capture_comment_dlg), TRUE);
- gtk_container_set_border_width (GTK_CONTAINER (edit_or_add_capture_comment_dlg), DLG_OUTER_MARGIN);
-
- g_signal_connect(edit_or_add_capture_comment_dlg, "destroy",
- G_CALLBACK(edit_capture_comment_destroy_cb), NULL);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
- gtk_container_add (GTK_CONTAINER (edit_or_add_capture_comment_dlg), vbox);
- gtk_widget_show (vbox);
-
- view = gtk_text_view_new ();
- gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view), GTK_WRAP_WORD);
- buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
- gtk_widget_show (view);
-
- scroll = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll),
- GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- gtk_container_add(GTK_CONTAINER(scroll), view);
- gtk_widget_show(scroll);
- gtk_box_pack_start(GTK_BOX (vbox), scroll, TRUE, TRUE, 0);
-
- /* Get the comment */
- comment_str = cf_read_section_comment(&cfile);
- if(comment_str != NULL){
- gtk_text_buffer_set_text (buffer, comment_str, -1);
- }
-
- /* Button row. */
- bbox = dlg_button_row_new (GTK_STOCK_OK, GTK_STOCK_CANCEL, GTK_STOCK_HELP, NULL);
- gtk_box_pack_end (GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
-
- ok_bt = (GtkWidget *)g_object_get_data (G_OBJECT(bbox), GTK_STOCK_OK);
- g_signal_connect (ok_bt, "clicked", G_CALLBACK(capture_comment_text_buff_ok_cb), view);
- gtk_widget_set_sensitive (ok_bt, TRUE);
-
- cancel_bt = (GtkWidget *)g_object_get_data (G_OBJECT(bbox), GTK_STOCK_CANCEL);
- window_set_cancel_button (edit_or_add_capture_comment_dlg, cancel_bt, window_cancel_button_cb);
-
- help_bt = (GtkWidget *)g_object_get_data (G_OBJECT(bbox), GTK_STOCK_HELP);
-#if 0
- g_signal_connect (help_bt, "clicked",/* G_CALLBACK(topic_cb)*/NULL, /*(gpointer)HELP_MANUAL_ADDR_RESOLVE_DIALOG*/NULL);
-#endif
- gtk_widget_set_sensitive (help_bt, FALSE);
-
- gtk_widget_grab_default (ok_bt);
- g_signal_connect (edit_or_add_capture_comment_dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
-
- gtk_widget_show (edit_or_add_capture_comment_dlg);
-}
-
-
-void
-edit_capture_comment_dlg_hide(void)
-{
- window_destroy(edit_or_add_capture_comment_dlg);
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local Variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/edit_packet_comment_dlg.h b/ui/gtk/edit_packet_comment_dlg.h
deleted file mode 100644
index 117c68689f..0000000000
--- a/ui/gtk/edit_packet_comment_dlg.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* edit_packet_comment_dlg.h
- * Dialog box for editing or adding packet comments.
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __EDIT_PACKET_COMMENTS_H__
-#define __EDIT_PACKET_COMMENTS_H__
-
-void edit_packet_comment_dlg (GtkAction *action, gpointer data);
-void edit_capture_comment_dlg_launch (GtkAction *action, gpointer data);
-void edit_capture_comment_dlg_hide (void);
-
-#endif /* __EDIT_PACKET_COMMENTS_H__ */
diff --git a/ui/gtk/expert_comp_dlg.c b/ui/gtk/expert_comp_dlg.c
deleted file mode 100644
index 39ba71c59d..0000000000
--- a/ui/gtk/expert_comp_dlg.c
+++ /dev/null
@@ -1,1067 +0,0 @@
-/* expert_comp_dlg.c
- * expert_comp_dlg 2005 Greg Morris
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/packet_info.h>
-#include <epan/prefs.h>
-#include <epan/tap.h>
-#include <epan/stat_tap_ui.h>
-
-#include <wsutil/str_util.h>
-
-#include "ui/simple_dialog.h"
-
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/expert_comp_table.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/expert_comp_dlg.h"
-#include "ui/gtk/main.h"
-#ifndef HAVE_GDK_GRESOURCE
-#include "ui/gtk/pixbuf-csource.h"
-#endif
-#include "ui/gtk/packet_panes.h"
-#include "ui/gtk/old-gtk-compat.h"
-#include "ui/gtk/edit_packet_comment_dlg.h"
-#include "ui/gtk/gtkglobals.h"
-
-#include "globals.h"
-
-void register_tap_listener_expert_comp(void);
-
-enum
-{
- NO_COLUMN_C_TABLE,
- SUMMARY_COLUMN_C_TABLE,
- FOREGROUND_COLOR_COL_C_TABLE,
- BACKGROUND_COLOR_COL_C_TABLE,
- N_COLUMNS_COMMENT_TBL
-};
-
-enum
-{
- NO_COLUMN,
- SEVERITY_COLUMN,
- GROUP_COLUMN,
- PROTOCOL_COLUMN,
- SUMMARY_COLUMN,
- FOREGROUND_COLOR_COL,
- BACKGROUND_COLOR_COL,
- N_COLUMNS
-};
-
-/* used to keep track of the statistics for an entire program interface */
-typedef struct _expert_comp_dlg_t {
- GtkWidget *win;
- GtkWidget *pkt_comments_label;
- GtkWidget *chat_label;
- GtkWidget *note_label;
- GtkWidget *warn_label;
- GtkWidget *error_label;
- GtkWidget *all_label;
- error_equiv_table chat_table;
- error_equiv_table note_table;
- error_equiv_table warn_table;
- error_equiv_table error_table;
- expert_tapdata_t *etd; /* details tab info similar to error_equiv_table for others */
- guint32 pkt_comments_events;
- guint32 disp_events;
- guint32 chat_events;
- guint32 note_events;
- guint32 warn_events;
- guint32 error_events;
- gboolean use_dfilter;
-} expert_comp_dlg_t;
-
-struct expert_tapdata_s {
- GtkWidget *win;
- GtkWidget *scrolled_window;
- GtkTreeView *tree_view;
- GtkWidget *scrolled_window_comments;
- GtkTreeView *tree_view_comments;
- GtkWidget *label;
- guint32 pkt_comments_events;
- guint32 disp_events;
- guint32 chat_events;
- guint32 note_events;
- guint32 warn_events;
- guint32 error_events;
- int severity_report_level;
-
- GArray *ei_array; /* expert info items */
- guint first;
- guint last;
- GStringChunk *text; /* summary text */
-};
-
-static GtkWidget *expert_comp_dlg_w = NULL;
-
-static void
-select_row_cb(GtkTreeSelection *selection, gpointer *user_data _U_)
-{
- /*guint num = GPOINTER_TO_UINT(gtk_clist_get_row_data(clist, row));*/
-
- /*cf_goto_frame(&cfile, num);*/
-
- GtkTreeIter iter;
- GtkTreeModel *model;
- guint fnumber;
-
- if (selection==NULL)
- return;
-
- if (gtk_tree_selection_get_selected (selection, &model, &iter)){
- gtk_tree_model_get (model, &iter, NO_COLUMN, &fnumber, -1);
- cf_goto_frame(&cfile, fnumber);
- }
-
-}
-
-static void
-expert_comp_select_filter_cb(GtkWidget *widget, gpointer callback_data, guint callback_action _U_)
-{
- expert_comp_dlg_t *ss = (expert_comp_dlg_t *)callback_data;
- const char *filter;
- GString *error_string;
-
- ss->use_dfilter = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget));
- if (ss->use_dfilter) {
- filter = gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget));
- } else {
- filter = NULL;
- }
- error_string = set_tap_dfilter (ss, filter);
- if (error_string) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
- g_string_free(error_string, TRUE);
- return;
- }
- error_string = set_tap_dfilter (ss->etd, filter);
- if (error_string) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
- g_string_free(error_string, TRUE);
- return;
- }
-
- cf_retap_packets(&cfile);
-}
-
-/* reset of display only, e.g. for filtering */
-static void expert_dlg_display_reset(expert_tapdata_t * etd)
-{
- etd->disp_events = 0;
- gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(etd->tree_view))));
- gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(etd->tree_view_comments))));
-
- gtk_window_set_title(GTK_WINDOW(etd->win), "Wireshark: ? Expert Infos");
- if(etd->label) {
- gtk_label_set_text(GTK_LABEL(etd->label), "Please wait ...");
- }
-}
-
-/* complete reset, e.g. capture file closed */
-static void
-expert_dlg_reset(void *tapdata)
-{
- expert_tapdata_t * etd = (expert_tapdata_t *)tapdata;
-
- etd->chat_events = 0;
- etd->note_events = 0;
- etd->warn_events = 0;
- etd->error_events = 0;
- etd->pkt_comments_events = 0;
- etd->last = 0;
- etd->first = 0;
- /* g_string_chunk_clear() is introduced in glib 2.14 */
- g_string_chunk_free(etd->text);
- etd->text = g_string_chunk_new(100);
- g_array_set_size(etd->ei_array, 0);
-
- expert_dlg_display_reset(etd);
-}
-
-static gboolean
-expert_dlg_packet(void *tapdata, packet_info *pinfo _U_, epan_dissect_t *edt _U_, const void *pointer)
-{
- expert_info_t *ei;
- expert_tapdata_t *etd = (expert_tapdata_t *)tapdata;
-
- g_array_append_val(etd->ei_array, *(expert_info_t *)pointer);
- etd->last = etd->ei_array->len;
- ei = &g_array_index(etd->ei_array, expert_info_t, etd->last -1); /* ugly */
- ei->protocol = g_string_chunk_insert_const(etd->text, ei->protocol);
- ei->summary = g_string_chunk_insert_const(etd->text, ei->summary);
-
- switch(ei->severity) {
- case(PI_COMMENT):
- etd->pkt_comments_events++;
- break;
- case(PI_CHAT):
- etd->chat_events++;
- break;
- case(PI_NOTE):
- etd->note_events++;
- break;
- case(PI_WARN):
- etd->warn_events++;
- break;
- case(PI_ERROR):
- etd->error_events++;
- break;
- default:
- g_assert_not_reached();
- }
- if(ei->severity < etd->severity_report_level) {
- return FALSE; /* draw not required */
- } else {
- return TRUE; /* draw required */
- }
-}
-static void
-error_set_title(expert_comp_dlg_t *ss)
-{
- set_window_title(ss->win, "Expert Info");
-}
-
-static void
-error_reset(void *pss)
-{
- expert_comp_dlg_t *ss=(expert_comp_dlg_t *)pss;
- gchar *buf;
-
- ss->error_events = 0;
- ss->warn_events = 0;
- ss->note_events = 0;
- ss->chat_events = 0;
- ss->disp_events = 0;
- ss->use_dfilter = FALSE;
- ss->pkt_comments_events = 0;
-
- reset_error_table_data(&ss->error_table);
- buf = g_strdup_printf("Errors: %u (0)", ss->error_table.num_procs);
- gtk_label_set_text( GTK_LABEL(ss->error_label), buf);
- g_free(buf);
-
- reset_error_table_data(&ss->warn_table);
- buf = g_strdup_printf("Warnings: %u (0)", ss->warn_table.num_procs);
- gtk_label_set_text( GTK_LABEL(ss->warn_label), buf);
- g_free(buf);
-
- reset_error_table_data(&ss->note_table);
- buf = g_strdup_printf("Notes: %u (0)", ss->note_table.num_procs);
- gtk_label_set_text( GTK_LABEL(ss->note_label), buf);
- g_free(buf);
-
- reset_error_table_data(&ss->chat_table);
- buf = g_strdup_printf("Chats: %u (0)", ss->chat_table.num_procs);
- gtk_label_set_text( GTK_LABEL(ss->chat_label), buf);
- g_free(buf);
-
- gtk_label_set_text( GTK_LABEL(ss->all_label), "Details: 0");
-
- gtk_label_set_text( GTK_LABEL(ss->pkt_comments_label), "Packet comments: 0");
-
- error_set_title(ss);
-}
-
-static gboolean
-error_packet(void *pss, packet_info *pinfo _U_, epan_dissect_t *edt _U_, const void *prv)
-{
- expert_comp_dlg_t *ss=(expert_comp_dlg_t *)pss;
- const expert_info_t *error_pkt=(const expert_info_t *)prv;
-
- /* if return value is 0 then no error */
- if(error_pkt==NULL){
- return FALSE;
- }
-
- switch (error_pkt->severity) {
- case PI_ERROR:
- ss->disp_events++;
- ss->error_events++;
- init_error_table_row(&ss->error_table, error_pkt);
- break;
- case PI_WARN:
- ss->disp_events++;
- ss->warn_events++;
- init_error_table_row(&ss->warn_table, error_pkt);
- break;
- case PI_NOTE:
- ss->disp_events++;
- ss->note_events++;
- init_error_table_row(&ss->note_table, error_pkt);
- break;
- case PI_CHAT:
- ss->disp_events++;
- ss->chat_events++;
- init_error_table_row(&ss->chat_table, error_pkt);
- break;
- case PI_COMMENT:
- ss->disp_events++; /* Count ? */
- ss->pkt_comments_events++;
- break;
- default:
- return FALSE; /* Don't draw */
- }
- return TRUE; /* Draw */
-}
-
-static void
-expert_comp_draw(void *data)
-{
- gchar *buf;
-
- expert_comp_dlg_t *ss=(expert_comp_dlg_t *)data;
-
- buf = g_strdup_printf("Errors: %u (%u)", ss->error_table.num_procs, ss->error_events);
- gtk_label_set_text( GTK_LABEL(ss->error_label), buf);
- g_free(buf);
-
- buf = g_strdup_printf("Warnings: %u (%u)", ss->warn_table.num_procs, ss->warn_events);
- gtk_label_set_text( GTK_LABEL(ss->warn_label), buf);
- g_free(buf);
-
- buf = g_strdup_printf("Notes: %u (%u)", ss->note_table.num_procs, ss->note_events);
- gtk_label_set_text( GTK_LABEL(ss->note_label), buf);
- g_free(buf);
-
- buf = g_strdup_printf("Chats: %u (%u)", ss->chat_table.num_procs, ss->chat_events);
- gtk_label_set_text( GTK_LABEL(ss->chat_label), buf);
- g_free(buf);
-
- buf = g_strdup_printf("Details: %u", ss->disp_events);
- gtk_label_set_text( GTK_LABEL(ss->all_label), buf);
- g_free(buf);
-
- buf = g_strdup_printf("Packet Comments: %u", ss->pkt_comments_events);
- gtk_label_set_text( GTK_LABEL(ss->pkt_comments_label), buf);
- g_free(buf);
-
-}
-
-static void
-win_destroy_cb(GtkWindow *win _U_, gpointer data)
-{
- expert_comp_dlg_t *ss=(expert_comp_dlg_t *)data;
-
- remove_tap_listener(ss);
-
- if (expert_comp_dlg_w != NULL) {
- window_destroy(expert_comp_dlg_w);
- expert_comp_dlg_w = NULL;
- }
-
- free_error_table_data(&ss->error_table);
- free_error_table_data(&ss->warn_table);
- free_error_table_data(&ss->note_table);
- free_error_table_data(&ss->chat_table);
- g_free(ss);
-
-}
-
-static void
-expert_dlg_destroy_cb(GtkWindow *win _U_, gpointer data)
-{
- expert_tapdata_t *etd=(expert_tapdata_t *)data;
-
- remove_tap_listener(etd);
-
- /*free_srt_table_data(&etd->afp_srt_table);*/
- g_array_free(etd->ei_array, TRUE);
- g_string_chunk_free(etd->text);
- g_free(etd);
-}
-
-static expert_tapdata_t * expert_dlg_new_table(void)
-{
- expert_tapdata_t * etd;
- etd=(expert_tapdata_t *)g_malloc0(sizeof(expert_tapdata_t));
-
- etd->ei_array = g_array_sized_new(FALSE, FALSE, sizeof(expert_info_t), 1000);
- etd->text = g_string_chunk_new(100);
- etd->severity_report_level = PI_COMMENT;
- return etd;
-}
-
-static void
-comments_row_double_click_cb(GtkTreeView *treeview _U_, GtkTreePath *path _U_,
- GtkTreeViewColumn *col _U_, gpointer userdata _U_)
-{
- edit_packet_comment_dlg(NULL, NULL);
-}
-
-static void
-expert_dlg_init_comments_table(expert_tapdata_t * etd, GtkWidget *vbox)
-{
- GtkListStore *store;
- GtkWidget *tree;
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
- GtkTreeSortable *sortable;
- GtkTreeSelection *selection;
-
- /* Create the store */
- store = gtk_list_store_new(N_COLUMNS_COMMENT_TBL, /* Total number of columns */
- G_TYPE_UINT, /* No */
- G_TYPE_POINTER, /* Summary */
- G_TYPE_STRING, /* Foreground */
- G_TYPE_STRING); /* Background */
-
- /* Create a view */
- tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
- etd->tree_view_comments = GTK_TREE_VIEW(tree);
- sortable = GTK_TREE_SORTABLE(store);
-
- /* Speed up the list display */
- gtk_tree_view_set_fixed_height_mode(etd->tree_view_comments, TRUE);
-
- /* Setup the sortable columns */
- gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW (tree), FALSE);
-
- /* The view now holds a reference. We can get rid of our own reference */
- g_object_unref (G_OBJECT (store));
-
- /* Let the font be the default one to have the same look as the rest of the tabs
- * Bug https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=4388
- * gtk_widget_modify_font(GTK_WIDGET (etd->tree_view), user_font_get_regular());
- */
-
- /* Create a cell renderer */
- renderer = gtk_cell_renderer_text_new ();
- g_object_set(renderer, "ypad", 0, NULL);
- g_object_set(renderer, "xalign", 1.0, NULL);
-
- /* Create the first column, associating the "text" attribute of the
- * cell_renderer to the first column of the model */
- /* No */
- column = gtk_tree_view_column_new_with_attributes ("No", renderer,
- "text", NO_COLUMN_C_TABLE,
- "foreground", FOREGROUND_COLOR_COL_C_TABLE,
- "background", BACKGROUND_COLOR_COL_C_TABLE,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, NO_COLUMN_C_TABLE);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 40);
- gtk_tree_view_append_column (etd->tree_view_comments, column);
-
-
- /* Summary. */
- renderer = gtk_cell_renderer_text_new ();
- g_object_set(renderer, "ypad", 0, NULL);
- column = gtk_tree_view_column_new_with_attributes ("Summary", renderer,
- "foreground", FOREGROUND_COLOR_COL_C_TABLE,
- "background", BACKGROUND_COLOR_COL_C_TABLE,
- NULL);
- gtk_tree_view_column_set_cell_data_func(column, renderer, str_ptr_data_func,
- GINT_TO_POINTER(SUMMARY_COLUMN_C_TABLE), NULL);
-
- gtk_tree_sortable_set_sort_func(sortable, SUMMARY_COLUMN, str_ptr_sort_func,
- GINT_TO_POINTER(SUMMARY_COLUMN_C_TABLE), NULL);
-
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 90);
- gtk_tree_view_column_set_sort_column_id(column, SUMMARY_COLUMN_C_TABLE);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_append_column (etd->tree_view_comments, column);
-
- gtk_tree_view_set_search_column (etd->tree_view_comments, SUMMARY_COLUMN_C_TABLE); /* Allow searching the summary */
- gtk_tree_view_set_reorderable (etd->tree_view_comments, TRUE); /* Allow user to reorder data with drag n drop */
-
- /* Now enable the sorting of each column */
- gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(etd->tree_view_comments), TRUE);
- gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(etd->tree_view_comments), TRUE);
-
- /* Setup the selection handler */
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(etd->tree_view_comments));
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
-
- g_signal_connect (G_OBJECT (selection), "changed", /* select_row */
- G_CALLBACK (select_row_cb),
- NULL);
-
- g_signal_connect(tree, "row-activated",
- G_CALLBACK(comments_row_double_click_cb), NULL);
-
- etd->scrolled_window_comments=scrolled_window_new(NULL, NULL);
- gtk_container_add(GTK_CONTAINER(etd->scrolled_window_comments), GTK_WIDGET (etd->tree_view_comments));
-
- gtk_box_pack_start(GTK_BOX(vbox), etd->scrolled_window_comments, TRUE, TRUE, 0);
-}
-
-static void
-expert_dlg_init_table(expert_tapdata_t * etd, GtkWidget *vbox)
-{
- GtkListStore *store;
- GtkWidget *tree;
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
- GtkTreeSortable *sortable;
- GtkTreeSelection *selection;
-
- /* Create the store */
- store = gtk_list_store_new(N_COLUMNS, /* Total number of columns */
- G_TYPE_UINT, /* No */
- G_TYPE_POINTER, /* Severity */
- G_TYPE_POINTER, /* Group */
- G_TYPE_POINTER, /* Protocol */
- G_TYPE_POINTER, /* Summary */
- G_TYPE_STRING, /* Foreground */
- G_TYPE_STRING); /* Background */
-
- /* Create a view */
- tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
- etd->tree_view = GTK_TREE_VIEW(tree);
- sortable = GTK_TREE_SORTABLE(store);
-
- /* Speed up the list display */
- gtk_tree_view_set_fixed_height_mode(etd->tree_view, TRUE);
-
- /* Setup the sortable columns */
- gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW (tree), FALSE);
-
- /* The view now holds a reference. We can get rid of our own reference */
- g_object_unref (G_OBJECT (store));
-
- /* Let the font be the default one to have the same look as the rest of the tabs
- * Bug https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=4388
- * gtk_widget_modify_font(GTK_WIDGET (etd->tree_view), user_font_get_regular());
- */
-
- /* Create a cell renderer */
- renderer = gtk_cell_renderer_text_new ();
- g_object_set(renderer, "ypad", 0, NULL);
- g_object_set(renderer, "xalign", 1.0, NULL);
-
- /* Create the first column, associating the "text" attribute of the
- * cell_renderer to the first column of the model */
- /* No */
- column = gtk_tree_view_column_new_with_attributes ("No", renderer,
- "text", NO_COLUMN,
- "foreground", FOREGROUND_COLOR_COL,
- "background", BACKGROUND_COLOR_COL,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, NO_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 40);
- gtk_tree_view_append_column (etd->tree_view, column);
-
- /* Severity */
- renderer = gtk_cell_renderer_text_new ();
- g_object_set(renderer, "ypad", 0, NULL);
-
- column = gtk_tree_view_column_new_with_attributes ("Severity", renderer,
- "foreground", FOREGROUND_COLOR_COL,
- "background", BACKGROUND_COLOR_COL,
- NULL);
-
- gtk_tree_view_column_set_cell_data_func(column, renderer, str_ptr_data_func,
- GINT_TO_POINTER(SEVERITY_COLUMN), NULL);
-
- gtk_tree_sortable_set_sort_func(sortable, SEVERITY_COLUMN, str_ptr_sort_func,
- GINT_TO_POINTER(SEVERITY_COLUMN), NULL);
-
- gtk_tree_view_column_set_sort_column_id(column, SEVERITY_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 80);
- /* Add the column to the view. */
- gtk_tree_view_append_column (etd->tree_view, column);
-
- /* Group */
- renderer = gtk_cell_renderer_text_new ();
- g_object_set(renderer, "ypad", 0, NULL);
- column = gtk_tree_view_column_new_with_attributes ("Group", renderer,
- "foreground", FOREGROUND_COLOR_COL,
- "background", BACKGROUND_COLOR_COL,
- NULL);
-
- gtk_tree_view_column_set_cell_data_func(column, renderer, str_ptr_data_func,
- GINT_TO_POINTER(GROUP_COLUMN), NULL);
-
- gtk_tree_sortable_set_sort_func(sortable, GROUP_COLUMN, str_ptr_sort_func,
- GINT_TO_POINTER(GROUP_COLUMN), NULL);
-
- gtk_tree_view_column_set_sort_column_id(column, GROUP_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 80);
- /* Add the column to the view. */
- gtk_tree_view_append_column (etd->tree_view, column);
-
- /* Protocol. */
- renderer = gtk_cell_renderer_text_new ();
- g_object_set(renderer, "ypad", 0, NULL);
- column = gtk_tree_view_column_new_with_attributes ("Protocol", renderer,
- "foreground", FOREGROUND_COLOR_COL,
- "background", BACKGROUND_COLOR_COL,
- NULL);
- gtk_tree_view_column_set_cell_data_func(column, renderer, str_ptr_data_func,
- GINT_TO_POINTER(PROTOCOL_COLUMN), NULL);
-
- gtk_tree_sortable_set_sort_func(sortable, PROTOCOL_COLUMN, str_ptr_sort_func,
- GINT_TO_POINTER(PROTOCOL_COLUMN), NULL);
-
- gtk_tree_view_column_set_sort_column_id(column, PROTOCOL_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 80);
- gtk_tree_view_append_column (etd->tree_view, column);
-
- /* Summary. */
- renderer = gtk_cell_renderer_text_new ();
- g_object_set(renderer, "ypad", 0, NULL);
- column = gtk_tree_view_column_new_with_attributes ("Summary", renderer,
- "foreground", FOREGROUND_COLOR_COL,
- "background", BACKGROUND_COLOR_COL,
- NULL);
- gtk_tree_view_column_set_cell_data_func(column, renderer, str_ptr_data_func,
- GINT_TO_POINTER(SUMMARY_COLUMN), NULL);
-
- gtk_tree_sortable_set_sort_func(sortable, SUMMARY_COLUMN, str_ptr_sort_func,
- GINT_TO_POINTER(SUMMARY_COLUMN), NULL);
-
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 90);
- gtk_tree_view_column_set_sort_column_id(column, SUMMARY_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_append_column (etd->tree_view, column);
-
- gtk_tree_view_set_search_column (etd->tree_view, SUMMARY_COLUMN); /* Allow searching the summary */
- gtk_tree_view_set_reorderable (etd->tree_view, TRUE); /* Allow user to reorder data with drag n drop */
-
- /* Now enable the sorting of each column */
- gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(etd->tree_view), TRUE);
- gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(etd->tree_view), TRUE);
-
- /* Setup the selection handler */
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(etd->tree_view));
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
-
- g_signal_connect (G_OBJECT (selection), "changed", /* select_row */
- G_CALLBACK (select_row_cb),
- NULL);
-
- etd->scrolled_window=scrolled_window_new(NULL, NULL);
- gtk_container_add(GTK_CONTAINER(etd->scrolled_window), GTK_WIDGET (etd->tree_view));
-
- gtk_box_pack_start(GTK_BOX(vbox), etd->scrolled_window, TRUE, TRUE, 0);
-}
-
-static void
-expert_dlg_draw(void *data)
-{
- expert_tapdata_t *etd = (expert_tapdata_t *)data;
- expert_info_t *ei;
- gchar *title;
- const char *entries[2]; /**< column entries */
- GtkListStore *list_store, *comments_list_store;
- GtkTreeIter iter;
- gchar *color_str = NULL;
- guint packet_no = 0;
- const gchar *group_str;
- const gchar *severity_str;
-
-
- if(etd->label) {
- if(etd->last - etd->first) {
- title = g_strdup_printf("Adding: %u new messages",etd->last - etd->first);
- gtk_label_set_text(GTK_LABEL(etd->label), title);
- g_free(title);
- }
- }
-
- list_store = GTK_LIST_STORE(gtk_tree_view_get_model(etd->tree_view)); /* Get store */
- comments_list_store = GTK_LIST_STORE(gtk_tree_view_get_model(etd->tree_view_comments));
-
- /* append new events (remove from new list, append to displayed list and clist) */
- while(etd->first < etd->last){
- ei = &g_array_index(etd->ei_array, expert_info_t, etd->first);
- etd->first++;
-
- if(ei->severity < etd->severity_report_level) {
- continue;
- }
- etd->disp_events++;
-
- /* packet number */
- if(ei->packet_num) {
- packet_no = ei->packet_num;
- }
-
- /* try_val_to_str return a static string or NULL
- severity */
- severity_str = try_val_to_str(ei->severity, expert_severity_vals);
- /* group */
- group_str = try_val_to_str(ei->group, expert_group_vals);
-
- /* protocol */
- if(ei->protocol) {
- entries[0] = ei->protocol;
- } else {
- entries[0] = "-";
- }
-
- /* summary */
- entries[1] = ei->summary;
-
- /* set rows background color depending on severity */
- switch(ei->severity) {
- case(PI_COMMENT):
- color_str = expert_color_comment_str;
- gtk_list_store_insert_with_values(comments_list_store , &iter, G_MAXINT,
- NO_COLUMN_C_TABLE, packet_no,
- SUMMARY_COLUMN_C_TABLE, entries[1],
- FOREGROUND_COLOR_COL_C_TABLE, expert_color_foreground_str,
- BACKGROUND_COLOR_COL_C_TABLE, color_str,
- -1);
- break;
- case(PI_CHAT):
- color_str = expert_color_chat_str;
- break;
- case(PI_NOTE):
- color_str = expert_color_note_str;
- break;
- case(PI_WARN):
- color_str = expert_color_warn_str;
- break;
- case(PI_ERROR):
- color_str = expert_color_error_str;
- break;
- default:
- g_assert_not_reached();
- }
-
-
- /* Creates a new row at position. iter will be changed to point to this new row.
- * If position is larger than the number of rows on the list, then the new row will be appended to the list.
- * The row will be filled with the values given to this function.
- * :
- * should generally be preferred when inserting rows in a sorted list store.
- */
- gtk_list_store_insert_with_values( list_store , &iter, G_MAXINT,
- NO_COLUMN, packet_no,
- SEVERITY_COLUMN, severity_str,
- GROUP_COLUMN, group_str,
- PROTOCOL_COLUMN, entries[0],
- SUMMARY_COLUMN, entries[1],
- FOREGROUND_COLOR_COL, expert_color_foreground_str,
- BACKGROUND_COLOR_COL, color_str,
- -1);
- }
-
- if(etd->label) {
- title = g_strdup_printf("Errors: %u Warnings: %u Notes: %u Chats: %u, Packet comments: %u",
- etd->error_events, etd->warn_events,
- etd->note_events, etd->chat_events, etd->pkt_comments_events);
- gtk_label_set_text(GTK_LABEL(etd->label), title);
- g_free(title);
- }
-
- title = g_strdup_printf("Wireshark: %u Expert Info%s",
- etd->disp_events,
- plurality(etd->disp_events, "", "s"));
- gtk_window_set_title(GTK_WINDOW(etd->win), title);
- g_free(title);
-}
-
-static void
-expert_comp_init(const char *opt_arg _U_, void* userdata _U_)
-{
- expert_comp_dlg_t *ss;
- GString *error_string;
- GtkWidget *temp_page, *details_page, *comments_page;
- GtkWidget *main_nb;
- GtkWidget *vbox;
- GtkWidget *hbox;
- GtkWidget *image;
- GtkWidget *bbox;
- GtkWidget *close_bt;
- GtkWidget *help_bt;
- GtkWidget *filter_cb;
-
- ss = (expert_comp_dlg_t *)g_malloc(sizeof(expert_comp_dlg_t));
-
- ss->pkt_comments_events = 0;
- ss->disp_events = 0;
- ss->chat_events = 0;
- ss->note_events = 0;
- ss->warn_events = 0;
- ss->error_events = 0;
-
- expert_comp_dlg_w = ss->win = dlg_window_new_with_geom("Expert Info",
- NULL, GTK_WIN_POS_CENTER_ON_PARENT); /* transient_for top_level */
- gtk_window_set_destroy_with_parent (GTK_WINDOW(ss->win), TRUE);
- gtk_window_set_default_size(GTK_WINDOW(ss->win), 700, 300);
-
- error_set_title(ss);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_add(GTK_CONTAINER(ss->win), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 12);
-
- main_nb = gtk_notebook_new();
- gtk_box_pack_start(GTK_BOX(vbox), main_nb, TRUE, TRUE, 0);
-
- /* We must display TOP LEVEL Widget before calling init_table() */
- gtk_widget_show_all(ss->win);
-
- /* Errors */
- temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- ss->error_label = gtk_label_new("Errors: 0/y");
- gtk_widget_show(ss->error_label);
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- if ( prefs.gui_expert_composite_eyecandy ) {
-#ifdef HAVE_GDK_GRESOURCE
- image = pixbuf_to_widget("/org/wireshark/image/stock_icons/14x14/x-expert-error.png");
-#else
- image = pixbuf_to_widget(expert_error_pb_data);
-#endif
- gtk_widget_show(image);
- gtk_box_pack_start(GTK_BOX(hbox), image, TRUE, TRUE, 0);
- }
- gtk_box_pack_start(GTK_BOX(hbox), ss->error_label, TRUE, TRUE, 0);
- gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
- init_error_table(&ss->error_table, 0, temp_page);
-
- /* Warnings */
- temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- ss->warn_label = gtk_label_new("Warnings: 0/y");
- gtk_widget_show(ss->warn_label);
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- if ( prefs.gui_expert_composite_eyecandy ) {
-#ifdef HAVE_GDK_GRESOURCE
- image = pixbuf_to_widget("/org/wireshark/image/stock_icons/14x14/x-expert-warn.png");
-#else
- image = pixbuf_to_widget(expert_warn_pb_data);
-#endif
- gtk_widget_show(image);
- gtk_box_pack_start(GTK_BOX(hbox), image, TRUE, TRUE, 0);
-
- }
- gtk_box_pack_start(GTK_BOX(hbox), ss->warn_label, TRUE, TRUE, 0);
- gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
- init_error_table(&ss->warn_table, 0, temp_page);
-
- /* Notes */
- temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- ss->note_label = gtk_label_new("Notes: 0/y");
- gtk_widget_show(ss->note_label);
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- if ( prefs.gui_expert_composite_eyecandy ) {
-#ifdef HAVE_GDK_GRESOURCE
- image = pixbuf_to_widget("/org/wireshark/image/stock_icons/14x14/x-expert-note.png");
-#else
- image = pixbuf_to_widget(expert_note_pb_data);
-#endif
- gtk_widget_show(image);
- gtk_box_pack_start(GTK_BOX(hbox), image, TRUE, TRUE, 0);
- }
- gtk_box_pack_start(GTK_BOX(hbox), ss->note_label, TRUE, TRUE, 0);
- gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
- init_error_table(&ss->note_table, 0, temp_page);
-
- /* Chat */
- temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- ss->chat_label = gtk_label_new("Chats: 0/y");
- gtk_widget_show(ss->chat_label);
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- if ( prefs.gui_expert_composite_eyecandy ) {
-#ifdef HAVE_GDK_GRESOURCE
- image = pixbuf_to_widget("/org/wireshark/image/stock_icons/14x14/x-expert-chat.png");
-#else
- image = pixbuf_to_widget(expert_chat_pb_data);
-#endif
- gtk_widget_show(image);
- gtk_box_pack_start(GTK_BOX(hbox), image, TRUE, TRUE, 0);
- }
- gtk_box_pack_start(GTK_BOX(hbox), ss->chat_label, TRUE, TRUE, 0);
- gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
- init_error_table(&ss->chat_table, 0, temp_page);
-
- /* Details */
- details_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- ss->all_label = gtk_label_new("Details: 0/y");
- gtk_widget_show(ss->all_label);
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- if ( prefs.gui_expert_composite_eyecandy ) {
-#ifdef HAVE_GDK_GRESOURCE
- image = pixbuf_to_widget("/org/wireshark/image/capture_comment_disabled.png");
-#else
- image = pixbuf_to_widget(capture_comment_disabled_pb_data);
-#endif
- gtk_widget_show(image);
- gtk_box_pack_start(GTK_BOX(hbox), image, TRUE, TRUE, 0);
- }
- gtk_box_pack_start(GTK_BOX(hbox), ss->all_label, TRUE, TRUE, 0);
- gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), details_page, hbox);
-
- /* Packet comments */
- comments_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- ss->pkt_comments_label = gtk_label_new("Packet Comments: 0/y");
- gtk_widget_show(ss->pkt_comments_label);
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- if ( prefs.gui_expert_composite_eyecandy ) {
-#ifdef HAVE_GDK_GRESOURCE
- image = pixbuf_to_widget("/org/wireshark/image/capture_comment_update.png");
-#else
- image = pixbuf_to_widget(capture_comment_update_pb_data);
-#endif
- gtk_widget_show(image);
- gtk_box_pack_start(GTK_BOX(hbox), image, TRUE, TRUE, 0);
- }
- gtk_box_pack_start(GTK_BOX(hbox), ss->pkt_comments_label, TRUE, TRUE, 0);
- gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), comments_page, hbox);
-
- ss->etd = expert_dlg_new_table();
- ss->etd->label=gtk_label_new("Please wait ...");
- gtk_misc_set_alignment(GTK_MISC(ss->etd->label), 0.0f, 0.5f);
-
- ss->etd->win=ss->win;
- expert_dlg_init_table(ss->etd, details_page);
- expert_dlg_init_comments_table(ss->etd, comments_page);
-
- /* Add tap listener functions for expert details, From expert_dlg.c*/
- error_string=register_tap_listener("expert", ss->etd, NULL,
- TL_REQUIRES_NOTHING,
- expert_dlg_reset,
- expert_dlg_packet,
- expert_dlg_draw);
- if(error_string){
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
- g_string_free(error_string, TRUE);
- g_free(ss->etd);
- return;
- }
-
- g_signal_connect(ss->etd->win, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(ss->etd->win, "destroy", G_CALLBACK(expert_dlg_destroy_cb), ss->etd);
-
- /* Register the tap listener */
-
- error_string=register_tap_listener("expert", ss, NULL,
- TL_REQUIRES_NOTHING, error_reset, error_packet, expert_comp_draw);
- if(error_string){
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
- g_string_free(error_string, TRUE);
- g_free(ss);
- return;
- }
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_UNRELATED_SPACING, FALSE);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-
- filter_cb = gtk_check_button_new_with_mnemonic("Limit to display filter");
- gtk_box_pack_start(GTK_BOX(hbox), filter_cb, FALSE, FALSE, 0);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(filter_cb), FALSE);
- gtk_widget_set_tooltip_text(filter_cb, "Limit the expert infos to packets matching the current display filter.");
- g_signal_connect(filter_cb, "toggled", G_CALLBACK(expert_comp_select_filter_cb), ss);
-
- /* Button row. */
- bbox = dlg_button_row_new(GTK_STOCK_CLOSE, GTK_STOCK_HELP, NULL);
- gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(ss->win, close_bt, window_cancel_button_cb);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_EXPERT_INFO_DIALOG);
- gtk_widget_set_tooltip_text (help_bt, "Show topic specific help");
-
- g_signal_connect(ss->win, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(ss->win, "destroy", G_CALLBACK(win_destroy_cb), ss);
-
- gtk_widget_show_all(ss->win);
- window_present(ss->win);
-
- /*
- * At least at present, the only information the tap listener appears
- * to care about is available regardless of whether the protocol tree
- * is being built, so we don't appear to need to have the protocol
- * tree built.
- *
- * This means we can use cf_retap_packets(), even though it will only
- * build the protocol tree if at least one tap has a filter in place.
- * cf_retap_packets() is faster than cf_redissect_packets(), as it
- * assumes we didn't change anything that would cause any packets to
- * dissect differently, and thus doesn't redo the packet display.
- */
- cf_retap_packets(&cfile);
-
- /* This will bring up the progress bar
- * Put our window back in front
- */
- gdk_window_raise(gtk_widget_get_window(ss->win));
- /* Set the label text */
- expert_comp_draw(ss);
-}
-
-void
-expert_comp_dlg_launch(void)
-{
- if (expert_comp_dlg_w) {
- reactivate_window(expert_comp_dlg_w);
- } else {
- expert_comp_init("", NULL);
- }
-}
-
-static stat_tap_ui expert_comp_ui = {
- REGISTER_STAT_GROUP_GENERIC,
- NULL,
- "expert",
- expert_comp_init,
- 0,
- NULL
-};
-
-void
-register_tap_listener_expert_comp(void)
-{
- register_stat_tap_ui(&expert_comp_ui, NULL);
-}
-
-void
-expert_comp_packet_comment_updated(void)
-{
- if (expert_comp_dlg_w)
- cf_retap_packets(&cfile);
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/expert_comp_dlg.h b/ui/gtk/expert_comp_dlg.h
deleted file mode 100644
index 7c489fe686..0000000000
--- a/ui/gtk/expert_comp_dlg.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* expert_comp_dlg.h
- * expert_comp_dlg 2005 Greg Morris
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __EXPERT_COMP_DLG_H__
-#define __EXPERT_COMP_DLG_H__
-
-void expert_comp_dlg_launch(void);
-void expert_comp_packet_comment_updated(void);
-
-#endif /* __EXPERT_COMP_DLG_H__ */
diff --git a/ui/gtk/expert_comp_table.c b/ui/gtk/expert_comp_table.c
deleted file mode 100644
index beb07bc719..0000000000
--- a/ui/gtk/expert_comp_table.c
+++ /dev/null
@@ -1,877 +0,0 @@
-/* expert_comp_table.c
- * expert_comp_table 2005 Greg Morris
- * Portions copied from service_response_time_table.c by Ronnie Sahlberg
- * Helper routines common to all composite expert statistics
- * tap.
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-#include <stdlib.h>
-#include <math.h>
-
-#include <glib.h>
-
-#include "epan/packet_info.h"
-#include "epan/strutil.h"
-
-#include "ui/simple_dialog.h"
-
-#include <wsutil/utf8_entities.h>
-#include <wsutil/strtoi.h>
-
-#include "ui/gtk/expert_comp_table.h"
-#include "ui/gtk/filter_utils.h"
-#include "ui/gtk/find_dlg.h"
-#include "ui/gtk/color_dlg.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/webbrowser.h"
-#include "ui/gtk/stock_icons.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-#include "globals.h"
-
-const char *packet = "Packet:";
-
-enum
-{
- GROUP_COLUMN,
- PROTOCOL_COLUMN,
- SUMMARY_COLUMN,
- COUNT_COLUMN,
- N_COLUMNS
-};
-
-static void
-proto_data_func (GtkTreeViewColumn *column _U_,
- GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer user_data)
-{
- gchar *str = NULL;
- gchar *grp = NULL; /* type pointer, don't free */
-
- /* The col to get data from is in userdata */
- gint data_column = GPOINTER_TO_INT(user_data);
-
- gtk_tree_model_get(model, iter, data_column, &str, -1);
- gtk_tree_model_get(model, iter, GROUP_COLUMN, &grp, -1);
- /* XXX should we check that str is non NULL and print a warning or do assert? */
-
- g_object_set(renderer, "text", str, NULL);
- if (grp == packet) {
- /* it's a number right align */
- g_object_set(renderer, "xalign", 1.0, NULL);
- }
- else {
- g_object_set(renderer, "xalign", 0.0, NULL);
- }
- g_free(str);
-}
-
-static gint
-proto_sort_func(GtkTreeModel *model,
- GtkTreeIter *a,
- GtkTreeIter *b,
- gpointer user_data)
-{
- gchar *str_a = NULL;
- gchar *str_b = NULL;
- gchar *grp = NULL; /* type pointer, don't free */
- gint ret = 0;
-
- /* The col to get data from is in userdata */
- gint data_column = GPOINTER_TO_INT(user_data);
-
- gtk_tree_model_get(model, a, data_column, &str_a, -1);
- gtk_tree_model_get(model, b, data_column, &str_b, -1);
- gtk_tree_model_get(model, a, GROUP_COLUMN, &grp, -1);
-
- if (str_a == str_b) {
- ret = 0;
- }
- else if (str_a == NULL || str_b == NULL) {
- ret = (str_a == NULL) ? -1 : 1;
- }
- else {
- if (grp == packet) {
- gint int_a = 0;
- gint int_b = 0;
- if (!ws_strtoi32(str_a, NULL, &int_a) || !ws_strtoi32(str_b, NULL, &int_b) ||
- int_a == int_b)
- ret = 0;
- else if (int_a < int_b)
- ret = -1;
- else
- ret = 1;
- }
- else
- ret = g_ascii_strcasecmp(str_a,str_b);
- }
- g_free(str_a);
- g_free(str_b);
- return ret;
-}
-
-static gint find_summary_data(error_equiv_table *err, const expert_info_t *expert_data)
-{
- guint i;
- error_procedure_t *procedure;
-
- /* First time thru values will be 0 */
- if (err->num_procs==0) {
- return -1;
- }
- for (i=0;i<err->num_procs;i++) {
- procedure = &g_array_index(err->procs_array, error_procedure_t, i);
- if (strcmp(procedure->entries[0], expert_data->protocol) == 0 &&
- strcmp(procedure->entries[1], expert_data->summary) == 0) {
- return i;
- }
- }
- return -1;
-}
-
-static void
-error_select_filter_cb(GtkWidget *widget _U_, gpointer callback_data, guint callback_action)
-{
- int action, type, selection;
- error_equiv_table *err = (error_equiv_table *)callback_data;
- char str[512];
- const char *current_filter;
- error_procedure_t *procedure;
-
- GtkTreeIter iter;
- GtkTreeModel *model;
- expert_info_t expert_data;
- gchar *grp;
-
- action=FILTER_ACTION(callback_action);
- type=FILTER_ACTYPE(callback_action);
-
-
- if(!gtk_tree_selection_get_selected(err->select, &model, &iter)){
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "No selection made or the table is empty");
- return;
- }
-
- gtk_tree_model_get (model, &iter,
- GROUP_COLUMN, &grp,
- PROTOCOL_COLUMN, &expert_data.protocol,
- SUMMARY_COLUMN, &expert_data.summary,
- -1);
-
- if (strcmp(grp, packet)==0) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "You cannot filter or search for packet number. Click on a valid item header.");
- g_free(expert_data.summary);
- return;
- }
-
- /* XXX: find_summary_data doesn't (currently) reference expert_data.group. */
- /* If "group" is required, then the message from GROUP_COLUMN will need */
- /* to be translated to the group number (or the actual group number */
- /* will also need to be stored in the TreeModel). */
- selection = find_summary_data(err, &expert_data);
- /* g_free(expert_data.protocol); - const */
- g_free(expert_data.summary);
-
- if(selection>=(int)err->num_procs){
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "No items are selected");
- return;
- }
- current_filter=gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget));
-
- /* Some expert data doesn't pass an expert item. Without this we cannot create a filter */
- /* But allow for searching of internet for error string */
- procedure = &g_array_index(err->procs_array, error_procedure_t, selection);
-
- if (action != ACTION_WEB_LOOKUP && action != ACTION_COPY) {
- char *msg;
-#if 0
- if (procedure->fvalue_value==NULL) {
- if (action != ACTION_FIND_FRAME && action != ACTION_FIND_NEXT && action != ACTION_FIND_PREVIOUS) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Wireshark cannot create a filter on this item - %s, try using find instead.",
- procedure->entries[1]);
- return;
- }
- }
-#endif
- msg = (char *)g_malloc(escape_string_len(procedure->entries[1]));
- escape_string(msg, procedure->entries[1]);
- switch(type){
- case ACTYPE_SELECTED:
- /* if no expert item was passed */
- if (procedure->fvalue_value==NULL) {
- g_snprintf(str, sizeof(str), "_ws.expert.message==%s", msg);
- }
- else
- {
- /* expert item exists. Use it. */
- g_strlcpy(str, procedure->fvalue_value, sizeof(str));
- }
- break;
- case ACTYPE_NOT_SELECTED:
- /* if no expert item was passed */
- if (procedure->fvalue_value==NULL) {
- g_snprintf(str, sizeof(str), "!(_ws.expert.message==%s)", msg);
- }
- else
- {
- /* expert item exists. Use it. */
- g_snprintf(str, sizeof(str), "!(%s)", procedure->fvalue_value);
- }
- break;
- /* the remaining cases will only exist if the expert item exists so no need to check */
- case ACTYPE_AND_SELECTED:
- if ((!current_filter) || (0 == strlen(current_filter)))
- g_snprintf(str, sizeof(str), "_ws.expert.message==%s", msg);
- else
- g_snprintf(str, sizeof(str), "(%s) && (_ws.expert.message==%s)", current_filter, msg);
- break;
- case ACTYPE_OR_SELECTED:
- if ((!current_filter) || (0 == strlen(current_filter)))
- g_snprintf(str, sizeof(str), "_ws.expert.message==%s", msg);
- else
- g_snprintf(str, sizeof(str), "(%s) || (_ws.expert.message==%s)", current_filter, msg);
- break;
- case ACTYPE_AND_NOT_SELECTED:
- if ((!current_filter) || (0 == strlen(current_filter)))
- g_snprintf(str, sizeof(str), "!(_ws.expert.message==%s)", msg);
- else
- g_snprintf(str, sizeof(str), "(%s) && !(_ws.expert.message==%s)", current_filter, msg);
- break;
- case ACTYPE_OR_NOT_SELECTED:
- if ((!current_filter) || (0 == strlen(current_filter)))
- g_snprintf(str, sizeof(str), "!(_ws.expert.message==%s)", msg);
- else
- g_snprintf(str, sizeof(str), "(%s) || !(_ws.expert.message==%s)", current_filter, msg);
- break;
- default:
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Can't find menu type - %u", type);
- }
- g_free(msg);
- }
-
- switch(action){
- case ACTION_MATCH:
- gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), str);
- main_filter_packets(&cfile, str, FALSE);
- gdk_window_raise(gtk_widget_get_window(top_level));
- break;
- case ACTION_PREPARE:
- gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), str);
- break;
- case ACTION_FIND_FRAME:
- /* When trying to perform a find without expert item, we must pass
- * the expert string to the find window. The user might need to modify
- * the string and click on the text search to locate the packet in question.
- * So regardless of the type we will just bring up the find window and allow
- * the user to modify the search criteria and options.
- */
- find_frame_with_filter(str);
- break;
- case ACTION_FIND_NEXT:
- /* In the case of find next, if there was no expert item, then most likely the expert
- * string was modified to locate the text inside the message. So we can't just perform
- * a find with the expert string or we will not really be performing a find next.
- * In an effort to allow the user to modify the string and/or continue searching, we
- * will just present the user with the find window again with the default expert string.
- * A better aproach would be to attempt in capturing the last find string and utilize this
- * with a find next/previous. Also a better approach might be to just send a <Ctl-N> keystroke.
- */
- /* Fall trough */
- case ACTION_FIND_PREVIOUS:
- /* In the case of find previous, if there was no expert item, then most likely the expert
- * string was modified to locate the text inside the message. So we can't just perform
- * a find with the expert string or we will not really be performing a find previous.
- * In an effort to allow the user to modify the string and/or continue searching, we
- * will just present the user with the find window again with the default expert string.
- * A better aproach would be to attempt in capturing the last find string and utilize this
- * with a find next/previous. Also a better approach might be to just send a <Ctl-B> keystroke.
- */
- if (procedure->fvalue_value==NULL) {
- find_frame_with_filter(str);
- }
- else
- {
- /* We have an expert item so just continue search without find dialog. */
- cf_find_packet_dfilter_string(&cfile, str, SD_FORWARD);
- }
- break;
- case ACTION_COLORIZE:
- color_display_with_filter(str);
- break;
- case ACTION_WEB_LOOKUP:
- /* Lookup expert string on internet. Default search via www.google.com */
- g_snprintf(str, sizeof(str), "https://www.google.com/search?hl=en&q=%s+'%s'", procedure->entries[0], procedure->entries[1]);
- browser_open_url(str);
- break;
- case ACTION_COPY:
- {
- GString *copyString = g_string_sized_new(0);
- g_string_printf(copyString, "%s: %s",
- procedure->entries[0], procedure->entries[1]);
- copy_to_clipboard(copyString);
- g_string_free(copyString, TRUE);
- }
- break;
-
- default:
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Can't find menu action - %u", action);
- }
-}
-
-static gboolean
-error_show_popup_menu_cb(void *widg _U_, GdkEvent *event, gpointer user_data)
-{
- error_equiv_table *err = (error_equiv_table *)user_data;
- GdkEventButton *bevent = (GdkEventButton *)event;
-
- if(event->type==GDK_BUTTON_PRESS && bevent->button==3){
- gtk_menu_popup(GTK_MENU(err->menu), NULL, NULL, NULL, NULL,
- bevent->button, bevent->time);
- }
-
- return FALSE;
-}
-
-static void
-apply_as_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- error_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_SELECTED, 0));
-}
-static void
-apply_as_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- error_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_NOT_SELECTED, 0));
-}
-static void
-apply_as_and_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- error_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_AND_SELECTED, 0));
-}
-static void
-apply_as_or_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- error_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_OR_SELECTED, 0));
-}
-static void
-apply_as_and_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- error_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_AND_NOT_SELECTED, 0));
-}
-static void
-apply_as_or_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- error_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_OR_NOT_SELECTED, 0));
-}
-
-static void
-prep_as_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- error_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_SELECTED, 0));
-}
-static void
-prep_as_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- error_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_NOT_SELECTED, 0));
-}
-static void
-prep_as_and_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- error_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_AND_SELECTED, 0));
-}
-static void
-prep_as_or_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- error_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_OR_SELECTED, 0));
-}
-static void
-prep_as_and_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- error_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_AND_NOT_SELECTED, 0));
-}
-static void
-prep_as_or_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- error_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_OR_NOT_SELECTED, 0));
-}
-
-static void
-find_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- error_select_filter_cb( widget , user_data, CALLBACK_FIND_FRAME(ACTYPE_SELECTED, 0));
-}
-static void
-find_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- error_select_filter_cb( widget , user_data, CALLBACK_FIND_FRAME(ACTYPE_NOT_SELECTED, 0));
-}
-static void
-find_prev_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- error_select_filter_cb( widget , user_data, CALLBACK_FIND_PREVIOUS(ACTYPE_SELECTED, 0));
-}
-static void
-find_prev_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- error_select_filter_cb( widget , user_data, CALLBACK_FIND_PREVIOUS(ACTYPE_NOT_SELECTED, 0));
-}
-static void
-find_next_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- error_select_filter_cb( widget , user_data, CALLBACK_FIND_NEXT(ACTYPE_SELECTED, 0));
-}
-static void
-find_next_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- error_select_filter_cb( widget , user_data, CALLBACK_FIND_NEXT(ACTYPE_NOT_SELECTED, 0));
-}
-static void
-color_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- error_select_filter_cb( widget , user_data, CALLBACK_COLORIZE(ACTYPE_SELECTED, 0));
-}
-static void
-color_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- error_select_filter_cb( widget , user_data, CALLBACK_COLORIZE(ACTYPE_SELECTED, 0));
-}
-static void
-internet_search_cb(GtkWidget *widget, gpointer user_data)
-{
- error_select_filter_cb( widget , user_data, CALLBACK_WEB_LOOKUP);
-}
-static void
-copy_cb(GtkWidget *widget, gpointer user_data)
-{
- error_select_filter_cb( widget , user_data, CALLBACK_COPY);
-}
-
-static const char *ui_desc_expert_filter_popup =
-"<ui>\n"
-" <popup name='ExpertFilterPopup'>\n"
-" <menu action='/Apply as Filter'>\n"
-" <menuitem action='/Apply as Filter/Selected'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " not Selected'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected'/>\n"
-" </menu>\n"
-" <menu action='/Prepare a Filter'>\n"
-" <menuitem action='/Prepare a Filter/Selected'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " not Selected'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected'/>\n"
-" </menu>\n"
-" <menu action='/Find Frame'>\n"
-" <menu action='/Find Frame/Find Frame'>\n"
-" <menuitem action='/Find Frame/Selected'/>\n"
-" <menuitem action='/Find Frame/Not Selected'/>\n"
-" </menu>\n"
-" <menu action='/Find Frame/Find Next'>\n"
-" <menuitem action='/Find Next/Selected'/>\n"
-" <menuitem action='/Find Next/Not Selected'/>\n"
-" </menu>\n"
-" <menu action='/Find Frame/Find Previous'>\n"
-" <menuitem action='/Find Previous/Selected'/>\n"
-" <menuitem action='/Find Previous/Not Selected'/>\n"
-" </menu>\n"
-" </menu>\n"
-" <menu action='/Colorize Procedure'>\n"
-" <menuitem action='/Colorize Procedure/Selected'/>\n"
-" <menuitem action='/Colorize Procedure/Not Selected'/>\n"
-" </menu>\n"
-" <menu action='/Internet Search'>\n"
-" <menuitem action='/For Info Text'/>\n"
-" </menu>\n"
-" <menu action='/Copy'>\n"
-" <menuitem action='/Copy/Protocol Plus Summary'/>\n"
-" </menu>\n"
-" </popup>\n"
-"</ui>\n";
-
-
-/*
- * GtkActionEntry
- * typedef struct {
- * const gchar *name;
- * const gchar *stock_id;
- * const gchar *label;
- * const gchar *accelerator;
- * const gchar *tooltip;
- * GCallback callback;
- * } GtkActionEntry;
- * const gchar *name; The name of the action.
- * const gchar *stock_id; The stock id for the action, or the name of an icon from the icon theme.
- * const gchar *label; The label for the action. This field should typically be marked for translation,
- * see gtk_action_group_set_translation_domain().
- * If label is NULL, the label of the stock item with id stock_id is used.
- * const gchar *accelerator; The accelerator for the action, in the format understood by gtk_accelerator_parse().
- * const gchar *tooltip; The tooltip for the action. This field should typically be marked for translation,
- * see gtk_action_group_set_translation_domain().
- * GCallback callback; The function to call when the action is activated.
- *
- */
-static const GtkActionEntry expert_popup_entries[] = {
- { "/Apply as Filter", NULL, "Apply as Filter", NULL, NULL, NULL },
- { "/Prepare a Filter", NULL, "Prepare a Filter", NULL, NULL, NULL },
- { "/Find Frame", NULL, "Find Frame", NULL, NULL, NULL },
- { "/Find Frame/Find Frame", NULL, "Find Frame", NULL, NULL, NULL },
- { "/Find Frame/Find Next", NULL, "Find Next" , NULL, NULL, NULL },
- { "/Find Frame/Find Previous", NULL, "Find Previous", NULL, NULL, NULL },
- { "/Colorize Procedure", NULL, "Colorize Procedure", NULL, NULL, NULL },
- { "/Apply as Filter/Selected", NULL, "Selected", NULL, "Selected", G_CALLBACK(apply_as_selected_cb) },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " not Selected", G_CALLBACK(apply_as_not_selected_cb) },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and Selected", G_CALLBACK(apply_as_and_selected_cb) },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or Selected", G_CALLBACK(apply_as_or_selected_cb) },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and not Selected", G_CALLBACK(apply_as_and_not_selected_cb) },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or not Selected", G_CALLBACK(apply_as_or_not_selected_cb) },
- { "/Prepare a Filter/Selected", NULL, "Selected", NULL, "selcted", G_CALLBACK(prep_as_selected_cb) },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " not Selected", G_CALLBACK(prep_as_not_selected_cb) },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and Selected", G_CALLBACK(prep_as_and_selected_cb) },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or Selected", G_CALLBACK(prep_as_or_selected_cb) },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and not Selected", G_CALLBACK(prep_as_and_not_selected_cb) },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or not Selected", G_CALLBACK(prep_as_or_not_selected_cb) },
- { "/Find Frame/Selected", NULL, "Selected", NULL, "Selected", G_CALLBACK(find_selected_cb) },
- { "/Find Frame/Not Selected", NULL, "Not Selected", NULL, "Not Selected", G_CALLBACK(find_not_selected_cb) },
- { "/Find Previous/Selected", NULL, "Selected", NULL, "Selected", G_CALLBACK(find_prev_selected_cb) },
- { "/Find Previous/Not Selected", NULL, "Not Selected", NULL, "Not Selected", G_CALLBACK(find_prev_not_selected_cb) },
- { "/Find Next/Selected", NULL, "Selected", NULL, "Selected", G_CALLBACK(find_next_selected_cb) },
- { "/Find Next/Not Selected", NULL, "Not Selected", NULL, "Not Selected", G_CALLBACK(find_next_not_selected_cb) },
- { "/Colorize Procedure/Selected", NULL, "Selected", NULL, "Selected", G_CALLBACK(color_selected_cb) },
- { "/Colorize Procedure/Not Selected", NULL, "Not Selected", NULL, "Not Selected", G_CALLBACK(color_not_selected_cb) },
- { "/Internet Search", WIRESHARK_STOCK_INTERNET, "Internet Search", NULL, "Internet Search", NULL },
- { "/For Info Text", NULL, "For Info Text", NULL, "For Info Text", G_CALLBACK(internet_search_cb) },
- { "/Copy", NULL, "Copy", NULL, "Copy", NULL },
- { "/Copy/Protocol Plus Summary", NULL, "Protocol Plus Summary", NULL, "Protocol Plus Summary", G_CALLBACK(copy_cb) },
-};
-
-int gselection_count = 0;
-
-static void
-expert_goto_pkt_cb (GtkTreeSelection *selection, gpointer data _U_)
-{
- GtkTreeIter iter;
- GtkTreeModel *model;
- gchar *pkt;
- gint32 pkt_num = 0;
- gchar *grp;
-
- if (gtk_tree_selection_get_selected (selection, &model, &iter))
- {
- gselection_count++;
-
- gtk_tree_model_get (model, &iter,
- PROTOCOL_COLUMN, &pkt,
- GROUP_COLUMN, &grp,
- -1);
-
- if (strcmp(grp, packet)==0) {
- if (ws_strtoi32(pkt, NULL, &pkt_num))
- cf_goto_frame(&cfile, pkt_num);
- }
- g_free (pkt);
- }
-}
-
-static void
-error_create_popup_menu(error_equiv_table *err)
-{
- GtkUIManager *ui_manager;
- GtkActionGroup *action_group;
- GError *error = NULL;
-
- err->select = gtk_tree_view_get_selection (GTK_TREE_VIEW (err->tree_view));
- gtk_tree_selection_set_mode (err->select, GTK_SELECTION_SINGLE);
- g_signal_connect (G_OBJECT (err->select), "changed", G_CALLBACK(expert_goto_pkt_cb), NULL);
-
- action_group = gtk_action_group_new ("ExpertFilterPopupActionGroup");
- gtk_action_group_add_actions (action_group, /* the action group */
- (GtkActionEntry *)expert_popup_entries, /* an array of action descriptions */
- G_N_ELEMENTS(expert_popup_entries), /* the number of entries */
- err); /* data to pass to the action callbacks */
-
- ui_manager = gtk_ui_manager_new ();
- gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);
- gtk_ui_manager_add_ui_from_string (ui_manager,ui_desc_expert_filter_popup, -1, &error);
- if (error != NULL)
- {
- fprintf (stderr, "Warning: building expert filter popup failed: %s\n",
- error->message);
- g_error_free (error);
- error = NULL;
- }
- err->menu = gtk_ui_manager_get_widget(ui_manager, "/ExpertFilterPopup");
- g_signal_connect(err->tree_view, "button_press_event", G_CALLBACK(error_show_popup_menu_cb), err);
-}
-
-void
-init_error_table(error_equiv_table *err, guint num_procs, GtkWidget *vbox)
-{
- GtkTreeStore *store;
- GtkWidget *tree;
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
- GtkTreeSortable *sortable;
-
- /* Create the store */
- store = gtk_tree_store_new (4, /* Total number of columns */
- G_TYPE_POINTER, /* Group */
- G_TYPE_STRING, /* Protocol */
- G_TYPE_STRING, /* Summary */
- G_TYPE_INT); /* Count */
-
- /* Create a view */
- tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
- err->tree_view = GTK_TREE_VIEW(tree);
- sortable = GTK_TREE_SORTABLE(store);
-
- /* Speed up the list display */
- gtk_tree_view_set_fixed_height_mode(err->tree_view, TRUE);
-
- gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW (tree), FALSE);
-
- /* The view now holds a reference. We can get rid of our own reference */
- g_object_unref (G_OBJECT (store));
-
- /* Create a cell renderer */
- renderer = gtk_cell_renderer_text_new ();
-
- /* Create the first column, associating the "text" attribute of the
- * cell_renderer to the first column of the model
- */
- column = gtk_tree_view_column_new_with_attributes ("Group", renderer, NULL);
- gtk_tree_view_column_set_sort_column_id(column, GROUP_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_cell_data_func(column, renderer, str_ptr_data_func,
- GINT_TO_POINTER(GROUP_COLUMN), NULL);
-
- gtk_tree_sortable_set_sort_func(sortable, GROUP_COLUMN, str_ptr_sort_func,
- GINT_TO_POINTER(GROUP_COLUMN), NULL);
-
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 80);
- gtk_tree_view_column_set_fixed_width(column, 80);
- /* Add the column to the view. */
- gtk_tree_view_append_column (GTK_TREE_VIEW (err->tree_view), column);
-
- /* Second column.. Protocol. */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Protocol", renderer, "text", PROTOCOL_COLUMN, NULL);
- gtk_tree_view_column_set_sort_column_id(column, PROTOCOL_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_cell_data_func(column, renderer, proto_data_func,
- GINT_TO_POINTER(PROTOCOL_COLUMN), NULL);
-
- gtk_tree_sortable_set_sort_func(sortable, PROTOCOL_COLUMN, proto_sort_func,
- GINT_TO_POINTER(PROTOCOL_COLUMN), NULL);
-
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 80);
- gtk_tree_view_column_set_fixed_width(column, 100);
- gtk_tree_view_append_column (GTK_TREE_VIEW (err->tree_view), column);
-
- /* Third column.. Summary. */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Summary", renderer, "text", SUMMARY_COLUMN, NULL);
- gtk_tree_view_column_set_sort_column_id(column, SUMMARY_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 300);
- gtk_tree_view_column_set_fixed_width(column,
- 700 /* window size */ -
- (80 /* group */ + 100 /* protocol */ + 80 /* count */ +
- 24 /* border */ + 22 /* vbar */));
- gtk_tree_view_append_column (GTK_TREE_VIEW (err->tree_view), column);
-
- /* Last column.. Count. */
- renderer = gtk_cell_renderer_text_new ();
- /* right align */
- g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
- column = gtk_tree_view_column_new_with_attributes ("Count", renderer, "text", COUNT_COLUMN, NULL);
- gtk_tree_view_column_set_sort_column_id(column, COUNT_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 80);
- gtk_tree_view_append_column (GTK_TREE_VIEW (err->tree_view), column);
-
- err->scrolled_window=scrolled_window_new(NULL, NULL);
-
- gtk_container_add(GTK_CONTAINER(err->scrolled_window), GTK_WIDGET (err->tree_view));
-
- gtk_box_pack_start(GTK_BOX(vbox), err->scrolled_window, TRUE, TRUE, 0);
-
- gtk_tree_view_set_search_column (err->tree_view, SUMMARY_COLUMN); /* Allow searching the summary */
- gtk_tree_view_set_reorderable (err->tree_view, TRUE); /* Allow user to reorder data with drag n drop */
-
- /* Now enable the sorting of each column */
- gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(err->tree_view), TRUE);
- gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(err->tree_view), TRUE);
-
- gtk_widget_show(err->scrolled_window);
-
- err->num_procs=num_procs;
-
- err->text = g_string_chunk_new(100);
- err->procs_array = g_array_sized_new(FALSE, FALSE, sizeof(error_procedure_t), num_procs);
-
- /* create popup menu for this table */
- error_create_popup_menu(err);
-}
-
-void
-init_error_table_row(error_equiv_table *err, const expert_info_t *expert_data)
-{
- guint old_num_procs=err->num_procs;
- gint row;
- error_procedure_t *procedure;
- GtkTreeStore *store;
- GtkTreeIter new_iter;
- gchar num[10];
-
- /* we have discovered a new procedure. Extend the table accordingly */
- row = find_summary_data(err, expert_data);
- if(row==-1){
- error_procedure_t new_procedure;
- /* First time we have seen this event so initialize memory table */
- row = old_num_procs; /* Number of expert events since this is a new event */
-
- new_procedure.count=0; /* count of events for this item */
- new_procedure.fvalue_value = NULL; /* Filter string value */
-
- g_array_append_val(err->procs_array, new_procedure);
- procedure = &g_array_index(err->procs_array, error_procedure_t, row);
-
- /* Create the item in our memory table */
- procedure->entries[0]=(char *)g_string_chunk_insert_const(err->text, expert_data->protocol); /* Protocol */
- procedure->entries[1]=(char *)g_string_chunk_insert_const(err->text, expert_data->summary); /* Summary */
-
- /* Create a new item in our tree view */
- store = GTK_TREE_STORE(gtk_tree_view_get_model(err->tree_view)); /* Get store */
- gtk_tree_store_append (store, &procedure->iter, NULL); /* Acquire an iterator */
-
- /* try_val_to_str return a static constant or null */
- gtk_tree_store_set (store, &procedure->iter,
- GROUP_COLUMN, try_val_to_str(expert_data->group, expert_group_vals),
- PROTOCOL_COLUMN, procedure->entries[0],
- SUMMARY_COLUMN, procedure->entries[1], -1);
-
- /* If an expert item was passed then build the filter string */
- if (expert_data->pitem) {
- char *filter;
-
- g_assert(PITEM_FINFO(expert_data->pitem));
- filter = proto_construct_match_selected_string(PITEM_FINFO(expert_data->pitem), NULL);
- if (filter != NULL)
- {
- procedure->fvalue_value = g_string_chunk_insert_const(err->text, filter);
- wmem_free(NULL, filter);
- }
- }
- /* Store the updated count of events */
- err->num_procs = ++old_num_procs;
- }
-
- /* Update our memory table with event data */
- procedure = &g_array_index(err->procs_array, error_procedure_t, row);
- procedure->count++; /* increment the count of events for this item */
-
- /* Update the tree with new count for this event */
- store = GTK_TREE_STORE(gtk_tree_view_get_model(err->tree_view));
- gtk_tree_store_set(store, &procedure->iter,
- COUNT_COLUMN, procedure->count,
- -1);
-
- g_snprintf(num, sizeof(num), "%d", expert_data->packet_num);
-#if 0
- This does not have a big performance improvment :(
- gtk_tree_store_insert_with_values (store,
- &new_iter, /* *iter */
- &procedure->iter, /* *parent*/
- G_MAXINT, /* position */
-
-#else
-
- /* FIXME gtk is plagued with slow algorithms
- gtk_tree_store_append call new_path and its nice recursive linear search....
- */
- if (procedure->count > 1000) {
- /* If there's more than 1000 sub rows give up and prepend new rows, at least
- it will end in a reasonable time. Anyway with so many rows it's not
- very useful and if sorted the right order is restored.
- */
- gtk_tree_store_prepend(store, &new_iter, &procedure->iter);
- }
- else {
- gtk_tree_store_append(store, &new_iter, &procedure->iter);
- }
- gtk_tree_store_set(store, &new_iter,
-#endif
- GROUP_COLUMN, packet,
- PROTOCOL_COLUMN, num,
- COUNT_COLUMN, 1,
- -1);
-}
-
-void
-reset_error_table_data(error_equiv_table *err)
-{
- GtkTreeStore *store;
-
- store = GTK_TREE_STORE(gtk_tree_view_get_model(err->tree_view));
- gtk_tree_store_clear(store);
- err->num_procs = 0;
- /* g_string_chunk_clear() is introduced in glib 2.14 */
- g_string_chunk_free(err->text);
- err->text = g_string_chunk_new(100);
-
- g_array_set_size(err->procs_array, 0);
-}
-
-void
-free_error_table_data(error_equiv_table *err)
-{
- err->num_procs=0;
- g_string_chunk_free(err->text);
- g_array_free(err->procs_array, TRUE);
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/expert_comp_table.h b/ui/gtk/expert_comp_table.h
deleted file mode 100644
index 87f337c8cb..0000000000
--- a/ui/gtk/expert_comp_table.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/* expert_comp_table.h
- * expert_comp_table 2005 Greg Morris
- * Portions copied from service_response_time_table.h by Ronnie Sahlberg
- * Helper routines common to all composite expert statistics
- * tap.
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __EXPERT_COMP_TABLE_H__
-#define __EXPERT_COMP_TABLE_H__
-
-#include <gtk/gtk.h>
-#include <epan/expert.h>
-
-typedef struct expert_tapdata_s expert_tapdata_t;
-
-/** @file
- * Helper routines common to all error statistics tap.
- */
-
-/** Procedure data */
-typedef struct _error_procedure_t {
- char *entries[2]; /**< column entries */
- char *fvalue_value; /**< filter value */
- GtkTreeIter iter;
- guint count; /**< number of expert items encountered
- for this entry */
-} error_procedure_t;
-
-/** Statistics table */
-typedef struct _error_equiv_table {
- GtkWidget *scrolled_window; /**< window widget */
- GtkTreeSelection *select; /**< item selected */
- GtkTreeView *tree_view; /**< Tree view */
- GtkWidget *menu; /**< context menu */
- guint num_procs; /**< number of elements on procedures array */
- GArray *procs_array; /**< the procedures array error_procedure_t *procedures */
- GStringChunk* text;
-}error_equiv_table;
-
-/** Init an err table data structure.
- *
- * @param err the err table to init
- * @param num_procs number of procedures
- * @param vbox the corresponding GtkVBox to fill in
- */
-void init_error_table(error_equiv_table *err, guint num_procs, GtkWidget *vbox);
-
-/** Init an err table row data structure.
- *
- * @param err the err table
- * @param expert_data data
- */
-void init_error_table_row(error_equiv_table *err, const expert_info_t *expert_data);
-
-/** Draw the err table data.
- *
- * @param err the err table
- */
-void draw_error_table_data(error_equiv_table *err);
-
-/** Reset the err table data.
- *
- * @param err the err table
- */
-void reset_error_table_data(error_equiv_table *err);
-
-/** Free the err table data.
- *
- * @param err the err table
- */
-void free_error_table_data(error_equiv_table *err);
-
-#endif /* __EXPERT_COMP_TABLE_H__ */
diff --git a/ui/gtk/export_object_dlg.c b/ui/gtk/export_object_dlg.c
deleted file mode 100644
index d56acd9f2b..0000000000
--- a/ui/gtk/export_object_dlg.c
+++ /dev/null
@@ -1,492 +0,0 @@
-/* export_object.c
- * Common routines for tracking & saving objects found in streams of data
- * Copyright 2007, Stephen Fisher (see AUTHORS file)
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
- */
-
-#include "config.h"
-
-#include <gtk/gtk.h>
-
-#include <epan/packet_info.h>
-#include <epan/prefs.h>
-#include <epan/tap.h>
-
-#include <wsutil/str_util.h>
-
-#include <ui/export_object_ui.h>
-#include <ui/simple_dialog.h>
-
-#include "globals.h"
-
-#include "dlg_utils.h"
-#include "file_dlg.h"
-#include "gui_utils.h"
-#include "help_dlg.h"
-#include "main.h"
-#include "stock_icons.h"
-#include "export_object_dlg.h"
-
-enum {
- EO_PKT_NUM_COLUMN,
- EO_HOSTNAME_COLUMN,
- EO_CONTENT_TYPE_COLUMN,
- EO_BYTES_COLUMN,
- EO_FILENAME_COLUMN,
- EO_NUM_COLUMNS /* must be last */
-};
-
-typedef struct _export_object_list_gui_t {
- GSList *entries;
- GtkWidget *tree, *dlg;
- GtkTreeView *tree_view;
- GtkTreeIter *iter;
- GtkTreeStore *store;
- gint row_selected;
-} export_object_list_gui_t;
-
-static export_object_gui_reset_cb eo_protocoldata_reset = NULL;
-
-static void
-eo_remember_this_row(GtkTreeModel *model _U_, GtkTreePath *path,
- GtkTreeIter *iter _U_, gpointer arg)
-{
- export_object_list_t *tap_object = (export_object_list_t *)arg;
- export_object_list_gui_t *object_list = (export_object_list_gui_t*)tap_object->gui_data;
- export_object_entry_t *entry;
-
- gint *path_index;
-
- if((path_index = gtk_tree_path_get_indices(path)) == NULL)
- /* Row not found in tree - shouldn't happen */
- return;
-
- object_list->row_selected = path_index[0];
-
- /* Select the corresponding packet in the packet list */
- entry = (export_object_entry_t *)g_slist_nth_data(object_list->entries,
- object_list->row_selected);
- cf_goto_frame(&cfile, entry->pkt_num);
-}
-
-static void
-eo_remember_row_num(GtkTreeSelection *sel, gpointer data)
-{
- gtk_tree_selection_selected_foreach(sel, eo_remember_this_row, data);
-}
-
-
-/* Called when the Export Object window is closed in any way */
-static void
-eo_win_destroy_cb(GtkWindow *win _U_, gpointer data)
-{
- export_object_list_t *tap_object = (export_object_list_t *)data;
- export_object_list_gui_t *object_list = (export_object_list_gui_t*)tap_object->gui_data;
- export_object_entry_t *entry;
- GSList *slist = object_list->entries;
-
- remove_tap_listener(tap_object);
-
- /* Free the GSList attributes */
- while(slist) {
- entry = (export_object_entry_t *)slist->data;
- eo_free_entry(entry);
-
- slist = slist->next;
- }
-
- /* Free the GSList elements */
- g_slist_free(object_list->entries);
- g_free(object_list);
-
- /* Free the private export_object_xxx data */
- if (eo_protocoldata_reset != NULL) eo_protocoldata_reset();
-}
-
-static char *
-gtk_eo_save_object_as_file(export_object_list_gui_t *object_list, char *auxfilename)
-{
- GtkWidget *save_as_w;
- char *pathname;
-
- save_as_w = file_selection_new("Wireshark: Save Object As ...",
- GTK_WINDOW(object_list->dlg),
- FILE_SELECTION_SAVE);
-
- gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(save_as_w),
- auxfilename);
- pathname = file_selection_run(save_as_w);
- if (pathname == NULL) {
- /* User cancelled or closed the dialog. */
- return NULL;
- }
-
- /* We've crosed the Rubicon; get rid of the dialog box. */
- window_destroy(save_as_w);
-
- return pathname;
-}
-
-static void
-eo_save_clicked_cb(GtkWidget *widget _U_, gpointer arg)
-{
- export_object_list_t *tap_object = (export_object_list_t *)arg;
- export_object_list_gui_t *object_list = (export_object_list_gui_t*)tap_object->gui_data;
- export_object_entry_t *entry;
- GString *safe_filename = NULL;
- char *pathname;
-
- entry =(export_object_entry_t *) g_slist_nth_data(object_list->entries,
- object_list->row_selected);
-
- if(!entry) {
- simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK, "No object was selected for saving. Please click on an object and click save again.");
- return;
- }
-
- safe_filename = eo_massage_str(entry->filename, EXPORT_OBJECT_MAXFILELEN, 0);
-
- /*
- * Loop until the user either selects a file or gives up.
- */
- for (;;) {
- pathname = gtk_eo_save_object_as_file(object_list, safe_filename->str);
- if (pathname == NULL) {
- /* User gave up. */
- break;
- }
- if (eo_save_entry(pathname, entry, TRUE)) {
- /* We succeeded. */
- g_free(pathname);
- break;
- }
- /* Dump failed; let the user select another file
- or give up. */
- g_free(pathname);
- }
-
- g_string_free(safe_filename, TRUE);
-}
-
-static void
-eo_save_all_clicked_cb(GtkWidget *widget _U_, gpointer arg)
-{
- gchar *save_as_fullpath = NULL;
- export_object_list_t *tap_object = (export_object_list_t *)arg;
- export_object_list_gui_t *object_list = (export_object_list_gui_t*)tap_object->gui_data;
- export_object_entry_t *entry;
- GtkWidget *save_in_w;
- GSList *slist = object_list->entries;
- gboolean all_saved = TRUE;
- gchar *save_in_path;
- GString *safe_filename;
- int count = 0;
-
- save_in_w = file_selection_new("Wireshark: Save All Objects In ...",
- GTK_WINDOW(object_list->dlg),
- FILE_SELECTION_CREATE_FOLDER);
-
- if (gtk_dialog_run(GTK_DIALOG(save_in_w)) == GTK_RESPONSE_ACCEPT) {
- while (slist) {
- entry = (export_object_entry_t *)slist->data;
-
- save_in_path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(save_in_w));
- if ((strlen(save_in_path) < EXPORT_OBJECT_MAXFILELEN)) {
- do {
- g_free(save_as_fullpath);
- if (entry->filename) {
- safe_filename = eo_massage_str(entry->filename,
- EXPORT_OBJECT_MAXFILELEN - strlen(save_in_path), count);
- } else {
- char generic_name[EXPORT_OBJECT_MAXFILELEN+1];
- const char *ext;
- ext = eo_ct2ext(entry->content_type);
- g_snprintf(generic_name, sizeof(generic_name),
- "object%u%s%s", entry->pkt_num, ext ? "." : "",
- ext ? ext : "");
- safe_filename = eo_massage_str(generic_name,
- EXPORT_OBJECT_MAXFILELEN - strlen(save_in_path), count);
- }
- save_as_fullpath = g_build_filename(
- save_in_path, safe_filename->str, NULL);
- g_string_free(safe_filename, TRUE);
- } while (g_file_test(save_as_fullpath, G_FILE_TEST_EXISTS) && ++count < 1000);
- count = 0;
- if (!eo_save_entry(save_as_fullpath, entry, FALSE))
- all_saved = FALSE;
- g_free(save_as_fullpath);
- save_as_fullpath = NULL;
- }
- else
- all_saved = FALSE;
-
- slist = slist->next;
- }
- }
-
- if (!all_saved)
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Some files could not be saved.");
-
- window_destroy(save_in_w);
-}
-
-/* Runs at the beginning of tapping only */
-static void
-eo_reset(void *tapdata)
-{
- export_object_list_t *tap_object = (export_object_list_t *)tapdata;
- export_object_list_gui_t *object_list = (export_object_list_gui_t*)tap_object->gui_data;
-
- object_list->entries = NULL;
- object_list->iter = NULL;
- object_list->row_selected = -1;
-
- if (eo_protocoldata_reset != NULL) eo_protocoldata_reset();
-}
-
-static void
-eo_draw(void *tapdata)
-{
- export_object_list_t *tap_object = (export_object_list_t *)tapdata;
- export_object_list_gui_t *object_list = (export_object_list_gui_t*)tap_object->gui_data;
- export_object_entry_t *eo_entry;
- gchar *size_str;
-
- GSList *slist = object_list->entries;
- GtkTreeIter new_iter;
-
- /* Free the tree first, since we may get called more than once for the same capture
- Not doing so caused duplicate entries and clicking them caused crashes.
- */
-
- gtk_tree_store_clear(object_list->store);
-
- while(slist) {
- eo_entry = (export_object_entry_t *)slist->data;
-
- gtk_tree_store_append(object_list->store, &new_iter,
- object_list->iter);
-
- size_str = format_size(eo_entry->payload_len, (format_size_flags_e)(format_size_unit_bytes|format_size_prefix_si));
- gtk_tree_store_set(object_list->store, &new_iter,
- EO_PKT_NUM_COLUMN, eo_entry->pkt_num,
- EO_HOSTNAME_COLUMN, eo_entry->hostname,
- EO_CONTENT_TYPE_COLUMN, eo_entry->content_type,
- EO_BYTES_COLUMN, size_str,
- EO_FILENAME_COLUMN, eo_entry->filename,
- -1);
- g_free(size_str);
-
- slist = slist->next;
- }
-}
-
-static void
-object_list_add_entry(void *gui_data, export_object_entry_t *entry)
-{
- export_object_list_gui_t *object_list = (export_object_list_gui_t*)gui_data;
-
- object_list->entries = g_slist_append(object_list->entries, entry);
-}
-
-static export_object_entry_t*
-object_list_get_entry(void *gui_data, int row) {
- export_object_list_gui_t *object_list = (export_object_list_gui_t*)gui_data;
-
- return (export_object_entry_t *)g_slist_nth_data(object_list->entries, row);
-}
-
-static void
-export_object_window(const gchar *tapname, const gchar *name, tap_packet_cb tap_packet, export_object_gui_reset_cb eo_protocoldata_resetfn)
-{
- GtkWidget *sw;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
- GtkTreeSelection *selection;
- GtkWidget *vbox, *bbox, *help_bt, *cancel_bt, *save_bt, *save_all_bt;
- GString *error_msg;
- export_object_list_t *tap_data;
- export_object_list_gui_t *object_list;
- gchar *window_title;
-
- /* Initialize the pointer to the private data clearing function */
- eo_protocoldata_reset = eo_protocoldata_resetfn;
-
- /* Initialize our object list structure */
- tap_data = g_new0(export_object_list_t,1);
- object_list = g_new0(export_object_list_gui_t,1);
-
- tap_data->add_entry = object_list_add_entry;
- tap_data->get_entry = object_list_get_entry;
- tap_data->gui_data = (void*)object_list;
-
- /* Data will be gathered via a tap callback */
- error_msg = register_tap_listener(tapname, tap_data, NULL, 0,
- eo_reset,
- tap_packet,
- eo_draw);
-
- if (error_msg) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't register %s tap: %s\n", name, error_msg->str);
- g_string_free(error_msg, TRUE);
- g_free(tap_data);
- g_free(object_list);
- return;
- }
-
- /* Setup our GUI window */
- window_title = g_strdup_printf("Wireshark: %s object list", name);
- object_list->dlg = dlg_window_new(window_title);
- g_free(window_title);
-
- gtk_window_set_default_size(GTK_WINDOW(object_list->dlg),
- DEF_WIDTH, DEF_HEIGHT);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 5, FALSE);
-
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
- gtk_container_add(GTK_CONTAINER(object_list->dlg), vbox);
-
- sw = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw),
- GTK_SHADOW_IN);
-
- gtk_box_pack_start(GTK_BOX (vbox), sw, TRUE, TRUE, 0);
-
- object_list->store = gtk_tree_store_new(EO_NUM_COLUMNS,
- G_TYPE_INT, G_TYPE_STRING,
- /* we need a UINT64
- (was G_TYPE_STRING, G_TYPE_INT,) */
- G_TYPE_STRING, G_TYPE_STRING,
- G_TYPE_STRING);
-
- object_list->tree = tree_view_new(GTK_TREE_MODEL(object_list->store));
- g_object_unref(G_OBJECT(object_list->store));
-
- object_list->tree_view = GTK_TREE_VIEW(object_list->tree);
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Packet num",
- renderer,
- "text",
- EO_PKT_NUM_COLUMN,
- NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_append_column(object_list->tree_view, column);
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Hostname",
- renderer,
- "text",
- EO_HOSTNAME_COLUMN,
- NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_append_column(object_list->tree_view, column);
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Content Type",
- renderer,
- "text",
- EO_CONTENT_TYPE_COLUMN,
- NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_append_column(object_list->tree_view, column);
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Size",
- renderer,
- "text",
- EO_BYTES_COLUMN,
- NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_append_column(object_list->tree_view, column);
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Filename",
- renderer,
- "text",
- EO_FILENAME_COLUMN,
- NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_append_column(object_list->tree_view, column);
-
- gtk_container_add(GTK_CONTAINER(sw), object_list->tree);
-
- selection = gtk_tree_view_get_selection(object_list->tree_view);
- g_signal_connect(selection, "changed", G_CALLBACK(eo_remember_row_num), tap_data);
-
- bbox = dlg_button_row_new(GTK_STOCK_HELP, WIRESHARK_STOCK_SAVE_ALL, GTK_STOCK_SAVE_AS, GTK_STOCK_CANCEL, NULL);
-
- /* Help button */
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_EXPORT_OBJECT_LIST);
- gtk_widget_set_tooltip_text(help_bt, "Show help for this dialog.");
-
- /* Save All button */
- save_all_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_SAVE_ALL);
- g_signal_connect(save_all_bt, "clicked", G_CALLBACK(eo_save_all_clicked_cb), tap_data);
- gtk_widget_set_tooltip_text(save_all_bt, "Save all listed objects with their displayed filenames.");
-
- /* Save As button */
- save_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_SAVE_AS);
- g_signal_connect(save_bt, "clicked", G_CALLBACK(eo_save_clicked_cb), tap_data);
- gtk_widget_set_tooltip_text(save_bt, "Saves the currently selected content to a file.");
-
- /* Cancel button */
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- gtk_widget_set_tooltip_text(cancel_bt, "Cancel this dialog.");
-
- /* Pack the buttons into the "button box" */
- gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
- gtk_widget_show(bbox);
-
- /* Setup cancel/delete/destroy signal handlers */
- g_signal_connect(object_list->dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(object_list->dlg, "destroy", G_CALLBACK(eo_win_destroy_cb), tap_data);
- window_set_cancel_button(object_list->dlg, cancel_bt,
- window_cancel_button_cb);
-
- /* Show the window */
- gtk_widget_show_all(object_list->dlg);
- window_present(object_list->dlg);
-
- cf_retap_packets(&cfile);
-}
-
-void exportobject_cb(register_eo_t *eo)
-{
- export_object_window(get_eo_tap_listener_name(eo), proto_get_protocol_short_name(find_protocol_by_id(get_eo_proto_id(eo))), get_eo_packet_func(eo), get_eo_reset_func(eo));
-}
-
-/*
- * Editor modelines - http://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/gtk/export_object_dlg.h b/ui/gtk/export_object_dlg.h
deleted file mode 100644
index 72121df593..0000000000
--- a/ui/gtk/export_object_dlg.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* export_object.h
- * Common routines for tracking & saving objects found in streams of data
- * Copyright 2007, Stephen Fisher (see AUTHORS file)
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
- */
-
-#ifndef __EXPORT_OBJECT_DLG_H__
-#define __EXPORT_OBJECT_DLG_H__
-
-#include <epan/export_object.h>
-
-void exportobject_cb(register_eo_t *eo);
-
-#endif /* __EXPORT_OBJECT_DLG_H__ */
diff --git a/ui/gtk/export_pdu_dlg.c b/ui/gtk/export_pdu_dlg.c
deleted file mode 100644
index 323f5dca0b..0000000000
--- a/ui/gtk/export_pdu_dlg.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/* export_pdu_dlg.c
- * Dialog for exporting PDUs to file
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <gtk/gtk.h>
-
-#include <wiretap/pcap-encap.h>
-
-#include <epan/exported_pdu.h>
-
-
-#include "ui/gtk/old-gtk-compat.h"
-#include "ui/gtk/capture_file_dlg.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/filter_dlg.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/filter_autocomplete.h"
-#include "ui/gtk/stock_icons.h"
-
-
-#include "ui/tap_export_pdu.h"
-#include "ui/export_pdu_ui_utils.h"
-#include "ui/gtk/export_pdu_dlg.h"
-
-static GtkWidget *export_pdu_dlg = NULL;
-
-
-typedef struct _exp_pdu_dlg_t {
- GtkWidget *filter_widget;
- GtkWidget *tap_name_widget;
- exp_pdu_t exp_pdu_tap_data;
-} exp_pdu_dlg_t;
-
-
-static void
-export_pdu_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
-{
- /* Note that we no longer have a export_pdu dialog box. */
- export_pdu_dlg = NULL;
-}
-
-void
-export_pdu_action(gpointer data)
-{
- const char *filter = NULL;
- exp_pdu_dlg_t *exp_pdu_dlg_data = (exp_pdu_dlg_t *)data;
- gchar *tap_name = NULL;
-
- filter = gtk_entry_get_text(GTK_ENTRY(exp_pdu_dlg_data->filter_widget));
- tap_name = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(exp_pdu_dlg_data->tap_name_widget));
-
- do_export_pdu(filter, tap_name, &(exp_pdu_dlg_data->exp_pdu_tap_data));
- window_destroy(export_pdu_dlg);
- g_free(exp_pdu_dlg_data);
-}
-
-
-void
-export_pdu_show_cb(GtkWidget *w _U_, gpointer d _U_)
-{
-
- GtkWidget *main_vb, *bbox, *close_bt, *ok_bt;
- GtkWidget *grid, *filter_bt;
- exp_pdu_dlg_t *exp_pdu_dlg_data;
- const char *filter = NULL;
- guint row;
- GSList *tap_name_list;
-
- static construct_args_t args = {
- "Wireshark: Export PDUs Filter",
- TRUE, /* dialog should have an Apply button */
- FALSE, /* if parent text widget should be activated on "Ok" or "Apply" */
- FALSE /* dialog is modal and transient to the parent window */
- };
-
- if (export_pdu_dlg != NULL) {
- /* There's already a export_pdu dialog box; reactivate it. */
- reactivate_window(export_pdu_dlg);
- return;
- }
-
- exp_pdu_dlg_data = (exp_pdu_dlg_t *)g_malloc(sizeof(exp_pdu_dlg_t));
- exp_pdu_dlg_data->exp_pdu_tap_data.pkt_encap = wtap_wtap_encap_to_pcap_encap(WTAP_ENCAP_WIRESHARK_UPPER_PDU);
-
- export_pdu_dlg = window_new(GTK_WINDOW_TOPLEVEL, "Wireshark: Export PDUs to pcapng file");
-
- g_signal_connect(export_pdu_dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(export_pdu_dlg, "destroy", G_CALLBACK(export_pdu_destroy_cb), NULL);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 3);
- gtk_container_add(GTK_CONTAINER(export_pdu_dlg), main_vb);
-
- /* grid */
- grid = ws_gtk_grid_new();
- ws_gtk_grid_set_column_spacing(GTK_GRID(grid), 6);
- ws_gtk_grid_set_row_spacing(GTK_GRID(grid), 3);
- gtk_box_pack_start(GTK_BOX(main_vb), grid, TRUE, TRUE, 0);
- row = 0;
-
- /* Filter button */
- filter_bt=ws_gtk_button_new_from_stock(WIRESHARK_STOCK_DISPLAY_FILTER_ENTRY);
- g_signal_connect(filter_bt, "clicked", G_CALLBACK(display_filter_construct_cb), &args);
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), filter_bt, 0, row, 1, 1);
- gtk_widget_show(filter_bt);
-
- /* Entry */
- exp_pdu_dlg_data->filter_widget=gtk_entry_new();
- g_signal_connect(exp_pdu_dlg_data->filter_widget, "changed", G_CALLBACK(filter_te_syntax_check_cb), NULL);
- g_object_set_data(G_OBJECT(grid), E_FILT_AUTOCOMP_PTR_KEY, NULL);
- g_signal_connect(exp_pdu_dlg_data->filter_widget, "key-press-event", G_CALLBACK (filter_string_te_key_pressed_cb), NULL);
- g_object_set_data(G_OBJECT(filter_bt), E_FILT_TE_PTR_KEY, exp_pdu_dlg_data->filter_widget);
-
- filter=gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget));
- if(filter){
- gtk_entry_set_text(GTK_ENTRY(exp_pdu_dlg_data->filter_widget), filter);
- } else {
- colorize_filter_te_as_empty(exp_pdu_dlg_data->filter_widget);
- }
-
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), exp_pdu_dlg_data->filter_widget, 1, row, 1, 1);
- gtk_widget_show(exp_pdu_dlg_data->filter_widget);
- row++;
-
- /* Select which tap to run */
- /* Combo box */
- exp_pdu_dlg_data->tap_name_widget = gtk_combo_box_text_new();
- for (tap_name_list = get_export_pdu_tap_list(); tap_name_list; tap_name_list = g_slist_next(tap_name_list)) {
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(exp_pdu_dlg_data->tap_name_widget), (const char*)(tap_name_list->data));
- }
- gtk_combo_box_set_active(GTK_COMBO_BOX(exp_pdu_dlg_data->tap_name_widget), 0);
-
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), exp_pdu_dlg_data->tap_name_widget, 0, row, 1, 1);
- gtk_widget_show(exp_pdu_dlg_data->tap_name_widget);
-
- /* Setup the button row */
-
- bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CANCEL, NULL);
- gtk_box_pack_end(GTK_BOX(main_vb), bbox, FALSE, FALSE, 3);
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- window_set_cancel_button(export_pdu_dlg, close_bt, window_cancel_button_cb);
- gtk_widget_set_tooltip_text(close_bt, "Close this dialog");
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(file_export_pdu_ok_cb), exp_pdu_dlg_data);
- gtk_widget_grab_default(ok_bt);
- gtk_widget_set_tooltip_text(ok_bt, "Export PDUs to a temporary capture file");
-
- gtk_widget_show_all(export_pdu_dlg);
- window_present(export_pdu_dlg);
-
-}
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/export_pdu_dlg.h b/ui/gtk/export_pdu_dlg.h
deleted file mode 100644
index cce844a10d..0000000000
--- a/ui/gtk/export_pdu_dlg.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* export_pdu_dlg.h
- * Routines for dialogs for exporting PDUs to file
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __EXPORT_PDU_DLG_H__
-#define __EXPORT_PDU_DLG_H__
-
-void export_pdu_show_cb(GtkWidget *widget, gpointer data);
-void export_pdu_action(gpointer data);
-
-#endif /* __EXPORT_PDU_DLG_H__ */
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/export_sslkeys.c b/ui/gtk/export_sslkeys.c
deleted file mode 100644
index be52722645..0000000000
--- a/ui/gtk/export_sslkeys.c
+++ /dev/null
@@ -1,196 +0,0 @@
-/* export_sslkeys.c
- *
- * Export SSL Session Keys dialog
- * by Sake Blok <sake@euronet.nl> (20110526)
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-#include <errno.h>
-
-#include <wsutil/file_util.h>
-#include <wsutil/str_util.h>
-
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-#if GTK_CHECK_VERSION(3,0,0)
-# include <gdk/gdkkeysyms-compat.h>
-#endif
-
-#include <wsutil/filesystem.h>
-#include <epan/packet.h>
-#include <epan/epan_dissect.h>
-#include <epan/charsets.h>
-#include <epan/prefs.h>
-
-#include "ui/alert_box.h"
-#include "ui/last_open_dir.h"
-#include "ui/progress_dlg.h"
-#include "ui/recent.h"
-#include "ui/simple_dialog.h"
-#include "ui/ssl_key_export.h"
-#include "ui/ws_ui_util.h"
-
-#include "ui/gtk/keys.h"
-#include "ui/gtk/color_utils.h"
-#include "ui/gtk/packet_win.h"
-#include "ui/gtk/file_dlg.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/font_utils.h"
-#include "ui/gtk/webbrowser.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/export_sslkeys.h"
-
-#ifdef _WIN32
-#include <gdk/gdkwin32.h>
-#include <windows.h>
-#include "ui/win32/file_dlg_win32.h"
-#include "ui/gtk/old-gtk-compat.h"
-#endif
-
-/* save the SSL Session Keys */
-static gboolean
-savesslkeys_save_clicked_cb(char *file, gchar *keylist)
-{
- int fd;
-
- fd = ws_open(file, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0666);
- if (fd == -1) {
- open_failure_alert_box(file, errno, TRUE);
- return FALSE;
- }
- /*
- * Thanks, Microsoft, for not using size_t for the third argument to
- * _write(). Presumably this string will be <= 4GiB long....
- */
- if (ws_write(fd, keylist, (unsigned int)strlen(keylist)) < 0) {
- write_failure_alert_box(file, errno);
- ws_close(fd);
- return FALSE;
- }
- if (ws_close(fd) < 0) {
- write_failure_alert_box(file, errno);
- return FALSE;
- }
-
- g_free(keylist);
- return TRUE;
-}
-
-
-/* Launch the dialog box to put up the file selection box etc */
-#ifdef _WIN32
-void
-savesslkeys_cb(GtkWidget * w _U_, gpointer data _U_)
-{
- win32_export_sslkeys_file(GDK_WINDOW_HWND(gtk_widget_get_window(top_level)));
- return;
-}
-#else
-static char *
-gtk_export_sslkeys_file(guint keylist_len)
-{
- GtkWidget *savesslkeys_dlg;
- gchar *label;
- GtkWidget *dlg_lb;
- char *pathname;
-
- /*
- * Build the dialog box we need.
- */
- savesslkeys_dlg = file_selection_new("Wireshark: Export SSL Session Keys",
- GTK_WINDOW(top_level),
- FILE_SELECTION_SAVE);
-
- /* label */
- label = g_strdup_printf("Will save %u SSL Session %s to specified file.",
- keylist_len, plurality(keylist_len, "key", "keys"));
- dlg_lb = gtk_label_new(label);
- g_free(label);
- file_selection_set_extra_widget(savesslkeys_dlg, dlg_lb);
- gtk_widget_show(dlg_lb);
-
- pathname = file_selection_run(savesslkeys_dlg);
- if (pathname == NULL) {
- /* User cancelled or closed the dialog. */
- return NULL;
- }
-
- /* We've crosed the Rubicon; get rid of the dialog box. */
- window_destroy(savesslkeys_dlg);
-
- return pathname;
-}
-
-void
-savesslkeys_cb(GtkWidget * w _U_, gpointer data _U_)
-{
- char *pathname;
- guint keylist_len;
- gchar *keylist;
-
- keylist_len = ssl_session_key_count();
- /* don't show up the dialog, if no data has to be saved */
- if (keylist_len==0) {
- /* shouldn't happen as the menu item should have been greyed out */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "There are no SSL Session Keys to save.");
- return;
- }
-
- /*
- * Retrieve the info we need
- */
- keylist = ssl_export_sessions();
-
- /*
- * Loop until the user either selects a file or gives up.
- */
- for (;;) {
- pathname = gtk_export_sslkeys_file(keylist_len);
- if (pathname == NULL) {
- /* User gave up. */
- break;
- }
- if (savesslkeys_save_clicked_cb(pathname, keylist)) {
- /* We succeeded. */
- g_free(pathname);
- break;
- }
- /* Dump failed; let the user select another file or give up. */
- g_free(pathname);
- }
-}
-#endif
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/export_sslkeys.h b/ui/gtk/export_sslkeys.h
deleted file mode 100644
index 8e94bc6c3c..0000000000
--- a/ui/gtk/export_sslkeys.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* export_sslkeys.h
- *
- * Export SSL Session Keys dialog
- * by Sake Blok <sake@euronet.nl> (20110526)
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __EXPORT_SSLKEYS_H__
-#define __EXPORT_SSLKEYS_H__
-
-/** Callback for "Export SSL Session Keys" operation.
- *
- * @param w unused
- * @param data unused
- */
-extern void savesslkeys_cb(GtkWidget * w, gpointer data);
-
-#endif /* __EXPORT_SSLKEYS_H__ */
diff --git a/ui/gtk/extcap_gtk.c b/ui/gtk/extcap_gtk.c
deleted file mode 100644
index 0df5526ce3..0000000000
--- a/ui/gtk/extcap_gtk.c
+++ /dev/null
@@ -1,960 +0,0 @@
-/* extcap_gtk.c
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-#include <glib.h>
-
-#include <ui/gtk/gui_utils.h>
-#include <wsutil/filesystem.h>
-
-#include "extcap_gtk.h"
-#include "ui/gtk/old-gtk-compat.h"
-
-#include "log.h"
-
-static gboolean extcap_gtk_count_tree_elements(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
-{
- int *ptr_count = (int*)data;
- gboolean multi_enabled;
- (void)path;
-
- g_assert(ptr_count != NULL);
-
- gtk_tree_model_get(model, iter,
- EXTCAP_GTK_MULTI_COL_CHECK, &multi_enabled, -1);
-
- if (multi_enabled)
- {
- ++(*ptr_count);
- }
-
- return FALSE; /* Continue iteration. */
-}
-
-typedef struct _extcap_gtk_multi_fill_cb_data
-{
- gchar **list;
- int num;
- int max;
-} extcap_gtk_multi_fill_cb_data;
-
-static gboolean extcap_gtk_fill_multi_list(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
-{
- extcap_gtk_multi_fill_cb_data *ptr_data = (extcap_gtk_multi_fill_cb_data*)data;
- gboolean multi_enabled;
- extcap_value *value;
- (void)path;
-
- g_assert(ptr_data != NULL);
-
- gtk_tree_model_get(model, iter,
- EXTCAP_GTK_MULTI_COL_CHECK, &multi_enabled,
- EXTCAP_GTK_MULTI_COL_VALUE, &value, -1);
-
- if (multi_enabled)
- {
- g_assert(ptr_data->num < ptr_data->max);
-
- if (ptr_data->num < ptr_data->max)
- {
- ptr_data->list[ptr_data->num] = g_strdup(value->call);
- ptr_data->num++;
- }
- }
-
- return FALSE; /* Continue iteration. */
-}
-
-typedef struct _extcap_gtk_multi_find_cb_data
-{
- gchar *parent;
- GtkTreeIter *parent_iter;
-} extcap_gtk_multi_find_cb_data;
-
-static gboolean extcap_gtk_find_parent_in_multi_list(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
-{
- extcap_gtk_multi_find_cb_data *ptr_data = (extcap_gtk_multi_find_cb_data*)data;
- extcap_value *value;
- (void)path;
-
- g_assert(ptr_data != NULL);
-
- gtk_tree_model_get(model, iter,
- EXTCAP_GTK_MULTI_COL_VALUE, &value, -1);
-
- if (0 == g_strcmp0(ptr_data->parent, value->call))
- {
- ptr_data->parent_iter = gtk_tree_iter_copy(iter);
- return TRUE; /* Stop iteration. */
- }
-
- return FALSE; /* Continue iteration. */
-}
-
-GHashTable *extcap_gtk_get_state(GtkWidget *widget) {
- GSList *widget_list, *widget_iter;
- GSList *radio_list = NULL, *radio_iter = NULL;
-
- GtkWidget *list_widget, *radio_widget, *tree_widget, *entry_widget;
-
- extcap_arg *arg = NULL;
- extcap_value *value = NULL;
- extcap_complex *parsed_complex = NULL;
-
- GtkTreeSelection *treeselection;
- GtkTreeModel *treemodel;
- GtkTreeIter treeiter;
-
- GHashTable *ret_hash;
-
- gchar *call_string = NULL;
-
- extcap_gtk_multi_fill_cb_data multi_data = { NULL, 0, 0 };
-
- int multi_num = 0;
-
- guint year = 0;
- guint month = 0;
- guint day = 0;
- guint64 unix_ts = 0;
-
- widget_list = (GSList *) g_object_get_data(G_OBJECT(widget),
- EXTCAP_GTK_DATA_KEY_WIDGETLIST);
-
- if (widget_list == NULL)
- return NULL ;
-
- /* String hash */
- ret_hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
-
- for (widget_iter = widget_list; widget_iter; widget_iter =
- widget_iter->next) {
- list_widget = (GtkWidget *) widget_iter->data;
-
- if ((arg = (extcap_arg *) g_object_get_data(G_OBJECT(list_widget),
- EXTCAP_GTK_DATA_KEY_ARGPTR)) == NULL) {
- continue;
- }
-
- switch (arg->arg_type) {
- case EXTCAP_ARG_INTEGER:
- case EXTCAP_ARG_UNSIGNED:
- case EXTCAP_ARG_LONG:
- case EXTCAP_ARG_DOUBLE:
- case EXTCAP_ARG_STRING:
- case EXTCAP_ARG_PASSWORD:
- parsed_complex = extcap_parse_complex(arg->arg_type,
- gtk_entry_get_text(GTK_ENTRY(list_widget)));
- if (parsed_complex == NULL) {
- continue;
- }
- break;
- case EXTCAP_ARG_BOOLEAN:
- case EXTCAP_ARG_BOOLFLAG:
- parsed_complex = extcap_parse_complex(arg->arg_type,
- gtk_toggle_button_get_active(
- GTK_TOGGLE_BUTTON(list_widget)) ? "true" : "false");
- break;
- case EXTCAP_ARG_FILESELECT:
- if ((entry_widget =
- (GtkWidget *) g_object_get_data(G_OBJECT(list_widget),
- EXTCAP_GTK_DATA_KEY_FILENAME)) == NULL) {
- continue;
- }
- parsed_complex = extcap_parse_complex(arg->arg_type,
- gtk_entry_get_text(GTK_ENTRY(entry_widget)));
- if (parsed_complex == NULL) {
- continue;
- }
- break;
- case EXTCAP_ARG_TIMESTAMP: {
- struct tm t;
- gtk_calendar_get_date((GtkCalendar*)list_widget, &year, &month, &day);
- t.tm_year = year;
- t.tm_mon = month;
- t.tm_mday = day;
- t.tm_hour = 0;
- t.tm_min = 0;
- t.tm_sec = 0;
- unix_ts = mktime(&t);
- call_string = g_strdup_printf("%" G_GINT64_MODIFIER "u", unix_ts);
- }
- break;
- case EXTCAP_ARG_RADIO:
- if ((radio_widget = (GtkWidget *) g_object_get_data(
- G_OBJECT(list_widget),
- EXTCAP_GTK_DATA_KEY_FIRSTRADIO)) == NULL) {
- continue;
- }
-
- if ((radio_list = gtk_radio_button_get_group(
- GTK_RADIO_BUTTON(radio_widget))) == NULL) {
- continue;
- }
-
- for (radio_iter = radio_list; radio_iter;
- radio_iter = radio_iter->next) {
- GtkWidget *cur_radio = (GtkWidget *) radio_iter->data;
-
- if (gtk_toggle_button_get_active(
- GTK_TOGGLE_BUTTON(cur_radio))) {
- if ((value = (extcap_value *) g_object_get_data(
- G_OBJECT(cur_radio),
- EXTCAP_GTK_DATA_KEY_VALPTR)) == NULL) {
- continue;
- }
-
- if (value->is_default)
- continue;
-
- call_string = g_strdup(value->call);
- break;
- }
- }
-
- break;
- case EXTCAP_ARG_SELECTOR:
- if ((tree_widget = (GtkWidget *) g_object_get_data(
- G_OBJECT(list_widget),
- EXTCAP_GTK_DATA_KEY_TREEVIEW)) == NULL) {
- continue;
- }
-
- treeselection = gtk_tree_view_get_selection(
- GTK_TREE_VIEW(tree_widget));
- treemodel = gtk_tree_view_get_model(GTK_TREE_VIEW(tree_widget));
- if (gtk_tree_selection_get_selected(treeselection, &treemodel,
- &treeiter)) {
- gtk_tree_model_get(treemodel, &treeiter, EXTCAP_GTK_COL_VALUE,
- &value, -1);
-
- if (value->is_default)
- continue;
-
- call_string = g_strdup(value->call);
- }
-
- break;
- case EXTCAP_ARG_MULTICHECK:
- if ((tree_widget = (GtkWidget *) g_object_get_data(
- G_OBJECT(list_widget),
- EXTCAP_GTK_DATA_KEY_TREEVIEW)) == NULL) {
- continue;
- }
-
- gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_widget));
- treemodel = gtk_tree_view_get_model(GTK_TREE_VIEW(tree_widget));
-
- multi_num = 0;
-
- /* Count the # of items enabled */
- gtk_tree_model_foreach(treemodel, extcap_gtk_count_tree_elements,
- &multi_num);
-
- if (multi_num > 0)
- {
- multi_data.list = g_new(gchar *, multi_num + 1);
- multi_data.num = 0;
- multi_data.max = multi_num;
-
- multi_num = 0;
-
- /* Get values list of items enabled */
- gtk_tree_model_foreach(treemodel, extcap_gtk_fill_multi_list,
- &multi_data);
-
- multi_data.list[multi_data.max] = NULL;
-
- call_string = g_strjoinv(",", multi_data.list);
-
- g_strfreev(multi_data.list);
- }
- else
- {
- /* There are no enabled items. Skip this argument from command line. */
- continue;
- }
-
- break;
- default:
- break;
- }
-
- if (parsed_complex == NULL && call_string == NULL)
- continue;
-
-
- /* Flags are set as is, and have not true/false switch */
- if (arg->arg_type == EXTCAP_ARG_BOOLFLAG)
- {
- if (extcap_complex_get_bool(parsed_complex) == TRUE)
- {
- /* Include boolflag call in list.
- * Only arg->call should appear in commandline arguments.
- * Setting call_string to NULL here makes it perform as desired.
- */
- call_string = NULL;
- }
- else
- {
- /* Omit boolflag call from list. */
- g_free(parsed_complex);
- parsed_complex = NULL;
- continue;
- }
- }
- else
- {
- /* Comparing if the user has changed the value at all, and ignoring it if so.
- * This does not apply to EXTCAP_ARG_BOOLFLAG.
- */
- if (extcap_compare_is_default(arg, parsed_complex))
- continue;
-
- if (parsed_complex != NULL && call_string == NULL)
- call_string = extcap_get_complex_as_string(parsed_complex);
- }
-
- g_hash_table_insert(ret_hash, g_strdup(arg->call),
- g_strdup(call_string));
-
- g_free(call_string);
- call_string = NULL;
-
- g_free(parsed_complex);
- parsed_complex = NULL;
- }
-
- return ret_hash;
-}
-
-static void extcap_gtk_treeview_vscroll_map_handler(GtkTreeView *treeView,
- gpointer data) {
- GtkWidget *padBox = (GtkWidget*) data;
- gint x, y;
-
- g_assert(GTK_IS_BOX(padBox));
-
- /* Set the padding above the scrollbar to the height of the tree header window */
- gtk_tree_view_convert_bin_window_to_widget_coords(GTK_TREE_VIEW(treeView),
- 0, 0, &x, &y);
- gtk_widget_set_size_request(padBox, -1, y);
-}
-
-static GtkWidget *extcap_gtk_wrap_scroll_treeview(GtkWidget *view) {
- GtkWidget *vscroll, *padbox, *hbox, *vbox;
- GtkAdjustment *padj;
-
-#if GTK_CHECK_VERSION(3, 0, 0)
- padj = gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(view));
-#if GTK_CHECK_VERSION(3, 2, 0)
- vscroll = gtk_scrollbar_new(GTK_ORIENTATION_VERTICAL, padj);
-#else
- vscroll = gtk_vscrollbar_new(padj);
-#endif
-#else
- padj = gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(view));
- vscroll = gtk_vscrollbar_new(padj);
-#endif
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
-
- /* First insert the tree view */
- gtk_box_pack_start(GTK_BOX(hbox), view, TRUE, TRUE, 0);
- gtk_widget_show(view);
-
- /* Pack to the right a vbox containing a box for padding at top and scrollbar */
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
- gtk_widget_show(vbox);
-
- padbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(vbox), padbox, FALSE, FALSE, 0);
- gtk_widget_show(padbox);
-
- gtk_box_pack_start(GTK_BOX(vbox), vscroll, TRUE, TRUE, 0);
- gtk_widget_show(vscroll);
-
- g_object_set_data(G_OBJECT(hbox), EXTCAP_GTK_DATA_KEY_TREEVIEW, view);
-
- g_signal_connect(view, "map",
- G_CALLBACK(extcap_gtk_treeview_vscroll_map_handler), padbox);
-
- return hbox;
-}
-
-GtkWidget *extcap_create_gtk_listwidget(extcap_arg *argument,
- GHashTable *prev_map) {
- GtkCellRenderer *renderer;
- GtkTreeModel *model;
- GtkWidget *view, *retview;
- GtkListStore *store;
- GtkTreeIter iter;
- GtkTreeSelection *selection;
- extcap_value *v = NULL;
- GList * walker = NULL;
- gchar *prev_item = NULL;
-
- if (g_list_length(argument->values) == 0)
- return NULL ;
-
- view = gtk_tree_view_new();
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
-
- store = gtk_list_store_new(EXTCAP_GTK_NUM_COLS, G_TYPE_STRING,
- G_TYPE_POINTER);
-
- model = GTK_TREE_MODEL(store);
- gtk_tree_view_set_model(GTK_TREE_VIEW(view), model);
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
-
- if (prev_map != NULL)
- prev_item = (gchar *) g_hash_table_lookup(prev_map, argument->call);
-
- for (walker = g_list_first(argument->values); walker != NULL ; walker =
- walker->next) {
- v = (extcap_value *) walker->data;
- if (v->display == NULL)
- break;
-
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, EXTCAP_GTK_COL_DISPLAY, v->display,
- EXTCAP_GTK_COL_VALUE, v, -1);
-
- if (prev_item != NULL) {
- if (g_ascii_strcasecmp(prev_item, v->call) == 0) {
- gtk_tree_selection_select_iter(selection, &iter);
- }
- } else if (v->is_default) {
- gtk_tree_selection_select_iter(selection, &iter);
- }
- }
-
- renderer = gtk_cell_renderer_text_new();
- gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, "Name",
- renderer, "text", EXTCAP_GTK_COL_DISPLAY, NULL);
-
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);
-
- retview = extcap_gtk_wrap_scroll_treeview(view);
-
- if (gtk_tree_model_iter_n_children(model, NULL) > 3)
- gtk_widget_set_size_request(retview, 0, 100);
-
- /* Tree view has own reference */
- g_object_unref(model);
-
- return retview;
-}
-
-GtkWidget *extcap_create_gtk_radiowidget(extcap_arg *argument,
- GHashTable *prev_map) {
- GtkWidget *radiobox = NULL, *last_radio = NULL;
- extcap_value *v = NULL;
- GList * walker = NULL;
- gchar *prev_item = NULL;
-
- if (g_list_length(argument->values) == 0)
- return NULL ;
-
- if (prev_map != NULL)
- prev_item = (gchar *) g_hash_table_lookup(prev_map, argument->call);
-
- radiobox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 1, FALSE);
-
- for (walker = g_list_first(argument->values); walker != NULL ; walker =
- walker->next) {
- v = (extcap_value *) walker->data;
-
- if (last_radio == NULL) {
- last_radio = gtk_radio_button_new_with_label(NULL, v->display);
- /* Set a pointer to the first radio button */
- g_object_set_data(G_OBJECT(radiobox),
- EXTCAP_GTK_DATA_KEY_FIRSTRADIO, last_radio);
- } else {
- last_radio = gtk_radio_button_new_with_label_from_widget(
- GTK_RADIO_BUTTON(last_radio), v->display);
- }
-
- /* Set a pointer to the value used in this radio */
- g_object_set_data(G_OBJECT(last_radio), EXTCAP_GTK_DATA_KEY_VALPTR, v);
-
- if (prev_item != NULL) {
- if (g_ascii_strcasecmp(prev_item, v->call) == 0) {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(last_radio),
- TRUE);
- }
- } else if (v->is_default) {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(last_radio), TRUE);
- }
-
- gtk_box_pack_start(GTK_BOX(radiobox), last_radio, TRUE, TRUE, 0);
- gtk_widget_show(last_radio);
- }
-
- return radiobox;
-}
-
-static void extcap_gtk_multicheck_toggled(GtkCellRendererToggle *cell _U_,
- gchar *path_str, gpointer data) {
- GtkTreeModel *model = (GtkTreeModel *) data;
- GtkTreeIter iter;
- GtkTreePath *path = gtk_tree_path_new_from_string(path_str);
- gboolean enabled;
-
- gtk_tree_model_get_iter(model, &iter, path);
- gtk_tree_model_get(model, &iter, EXTCAP_GTK_MULTI_COL_CHECK, &enabled, -1);
-
- enabled ^= 1;
-
- gtk_tree_store_set(GTK_TREE_STORE(model), &iter, EXTCAP_GTK_MULTI_COL_CHECK,
- enabled, -1);
-
- gtk_tree_path_free(path);
-}
-
-GtkWidget *extcap_create_gtk_rangewidget(extcap_arg *argument,
- GHashTable *prev_map _U_) {
- GtkWidget *spinButton;
- GtkAdjustment *adjustment;
-
- gfloat def = 0.0f, min = 0.0f, max = 0.0f;
-
- switch (argument->arg_type) {
- case EXTCAP_ARG_INTEGER:
- def = (gfloat) extcap_complex_get_int(argument->default_complex);
- min = (gfloat) extcap_complex_get_int(argument->range_start);
- max = (gfloat) extcap_complex_get_int(argument->range_end);
- break;
- case EXTCAP_ARG_UNSIGNED:
- def = (gfloat) extcap_complex_get_uint(argument->default_complex);
- min = (gfloat) extcap_complex_get_uint(argument->range_start);
- max = (gfloat) extcap_complex_get_uint(argument->range_end);
- break;
- case EXTCAP_ARG_LONG:
- def = (gfloat) extcap_complex_get_long(argument->default_complex);
- min = (gfloat) extcap_complex_get_long(argument->range_start);
- max = (gfloat) extcap_complex_get_long(argument->range_end);
- break;
- case EXTCAP_ARG_DOUBLE:
- def = (gfloat) extcap_complex_get_double(argument->default_complex);
- min = (gfloat) extcap_complex_get_double(argument->range_start);
- max = (gfloat) extcap_complex_get_double(argument->range_end);
- break;
- default:
- return NULL ;
- break;
- }
-
- adjustment = (GtkAdjustment *)gtk_adjustment_new(def, min, max, 1.0, 10.0, 0.0);
-
- spinButton = gtk_spin_button_new(adjustment, 0, 0);
- gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(spinButton), TRUE);
- gtk_widget_set_size_request(spinButton, 80, -1);
-
- return spinButton;
-}
-
-static void extcap_file_selectiondialog( GtkWidget *widget _U_, gpointer data )
-{
- GtkWidget * filechooser = NULL;
- GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SAVE;
- gchar *filename = NULL;
- gint res = 0;
- extcap_arg *argument = NULL;
-
- if ( GTK_ENTRY(data) == NULL )
- return;
-
- argument = (extcap_arg *)g_object_get_data(G_OBJECT(data), EXTCAP_GTK_DATA_KEY_ARGUMENT);
- if ( argument != NULL && argument->fileexists == TRUE )
- action = GTK_FILE_CHOOSER_ACTION_OPEN;
-
- filechooser = gtk_file_chooser_dialog_new("Select file path", NULL, action,
- "_Cancel", GTK_RESPONSE_CANCEL, "_Open", GTK_RESPONSE_ACCEPT, NULL);
-
- res = gtk_dialog_run (GTK_DIALOG (filechooser));
- if (res == GTK_RESPONSE_ACCEPT)
- {
- GtkFileChooser *chooser = GTK_FILE_CHOOSER (filechooser);
- filename = gtk_file_chooser_get_filename (chooser);
-
- /* this check might not be necessary, but just to be on the safe side */
- if ( action == GTK_FILE_CHOOSER_ACTION_OPEN && ! file_exists ( filename ) )
- filename = g_strdup ( " " );
-
- gtk_entry_set_text(GTK_ENTRY(data), filename);
- }
-
- gtk_widget_destroy (filechooser);
-}
-
-static GtkWidget *extcap_create_gtk_fileselect(extcap_arg *argument,
- GHashTable *prev_map _U_, gchar * file _U_) {
- GtkWidget * entry = NULL;
- GtkWidget * button = NULL;
- GtkWidget * ret_box = NULL;
-
- button = gtk_button_new_with_label ("...");
- entry = gtk_entry_new();
- if (file != NULL)
- gtk_entry_set_text(GTK_ENTRY(entry), file);
- gtk_editable_set_editable (GTK_EDITABLE (entry), FALSE);
- g_object_set_data(G_OBJECT(entry), EXTCAP_GTK_DATA_KEY_ARGUMENT, argument);
-
-#if GTK_CHECK_VERSION(3, 0, 0)
- ret_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3);
-#else
- ret_box = ws_gtk_hbox_new(FALSE, 3);
-#endif
-
- gtk_box_pack_start ( GTK_BOX(ret_box), entry, TRUE, TRUE, 5 );
- gtk_widget_show(entry);
- gtk_box_pack_end ( GTK_BOX(ret_box), button, FALSE, FALSE, 5 );
- gtk_widget_show(button);
-
- g_signal_connect (button, "clicked",
- G_CALLBACK (extcap_file_selectiondialog), (gpointer) entry);
-
- g_object_set_data(G_OBJECT(ret_box), EXTCAP_GTK_DATA_KEY_FILENAME, entry);
-
- return ret_box;
-}
-
-GtkWidget *extcap_create_gtk_multicheckwidget(extcap_arg *argument,
- GHashTable *prev_map) {
- GtkCellRenderer *renderer, *togglerenderer;
- GtkTreeModel *model;
- GtkWidget *view, *retview;
- GtkTreeStore *store;
- GtkTreeIter iter;
- GtkTreeSelection *selection;
- extcap_value *v = NULL;
- GList * walker = NULL;
- gchar *prev_item = NULL;
- gchar **prev_list = NULL, **prev_iter = NULL;
- gboolean prev_value, prev_matched;
- extcap_gtk_multi_find_cb_data find_data;
-
- if (g_list_length(argument->values) == 0)
- return NULL ;
-
- view = gtk_tree_view_new();
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
-
- store = gtk_tree_store_new(EXTCAP_GTK_MULTI_NUM_COLS, G_TYPE_BOOLEAN,
- G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN);
-
- model = GTK_TREE_MODEL(store);
- gtk_tree_view_set_model(GTK_TREE_VIEW(view), model);
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_NONE);
-
- if (prev_map != NULL)
- prev_item = (gchar *) g_hash_table_lookup(prev_map, argument->call);
-
- if (prev_item != NULL)
- prev_list = g_strsplit(prev_item, ",", 0);
-
- for (walker = g_list_first(argument->values); walker != NULL ; walker =
- walker->next) {
- v = (extcap_value *) walker->data;
- if (v->display == NULL)
- break;
-
- find_data.parent = v->parent;
- find_data.parent_iter = NULL;
-
- if (find_data.parent != NULL)
- {
- gtk_tree_model_foreach(model, extcap_gtk_find_parent_in_multi_list,
- &find_data);
- if (find_data.parent_iter == NULL)
- {
- g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG,
- "Extcap parent %s not found for value %s (%s)",
- v->parent, v->call, argument->call);
- }
- }
-
- prev_value = FALSE;
- gtk_tree_store_append(store, &iter, find_data.parent_iter);
-
- if (find_data.parent_iter != NULL)
- {
- gtk_tree_iter_free(find_data.parent_iter);
- find_data.parent_iter = NULL;
- }
-
- if (prev_list != NULL) {
- prev_matched = FALSE;
- prev_iter = prev_list;
-
- while (*prev_iter != NULL ) {
- if (g_strcmp0(*prev_iter, v->call) == 0) {
- prev_matched = TRUE;
- prev_value = TRUE;
- break;
- }
-
- prev_iter++;
- }
-
- if (prev_matched == FALSE)
- prev_value = v->enabled;
- }
- else
- {
- /* Use default value if there is no information about previously selected items. */
- prev_value = v->is_default;
- }
-
-
- /* v->is_default is set when there was {default=true} for this value. */
- /* v->enabled is false for non-clickable tree items ({enabled=false}). */
- gtk_tree_store_set(store, &iter, EXTCAP_GTK_MULTI_COL_CHECK, prev_value,
- EXTCAP_GTK_MULTI_COL_DISPLAY, v->display,
- EXTCAP_GTK_MULTI_COL_VALUE, v,
- EXTCAP_GTK_MULTI_COL_ACTIVATABLE, v->enabled, -1);
- }
-
- g_strfreev(prev_list);
-
- renderer = gtk_cell_renderer_text_new();
- togglerenderer = gtk_cell_renderer_toggle_new();
- g_signal_connect(togglerenderer, "toggled",
- G_CALLBACK(extcap_gtk_multicheck_toggled), model);
- gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1,
- "Enabled", togglerenderer, "active", EXTCAP_GTK_MULTI_COL_CHECK,
- "activatable", EXTCAP_GTK_MULTI_COL_ACTIVATABLE,
- "visible", EXTCAP_GTK_MULTI_COL_ACTIVATABLE,
- NULL);
- gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, "Name",
- renderer, "text", EXTCAP_GTK_MULTI_COL_DISPLAY,
- NULL);
-
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);
-
- retview = extcap_gtk_wrap_scroll_treeview(view);
-
- if (gtk_tree_model_iter_n_children(model, NULL) > 3)
- gtk_widget_set_size_request(retview, 0, 100);
-
- /* Tree view has own reference */
- g_object_unref(model);
-
- return retview;
-}
-
-void extcap_gtk_free_args(GtkWidget *vbox) {
- GList *arguments = (GList *) g_object_get_data(G_OBJECT(vbox),
- EXTCAP_GTK_DATA_KEY_ARGPTR);
- extcap_free_arg_list(arguments);
- g_object_set_data(G_OBJECT(vbox), EXTCAP_GTK_DATA_KEY_ARGPTR, NULL);
-}
-
-GSList *extcap_populate_gtk_vbox(GList *arguments, GtkWidget *vbox,
- GHashTable *prev_map) {
- GSList *widget_toplist = NULL;
-
- extcap_arg *arg_iter = NULL;
-
- extcap_complex *prev_complex = NULL;
- gchar *prev_call = NULL, *default_str;
-
- GList * arg_list = g_list_first(arguments);
- if ( arg_list == NULL )
- return NULL;
-
- g_object_set_data(G_OBJECT(vbox), EXTCAP_GTK_DATA_KEY_ARGPTR, arguments);
-
- while (arg_list != NULL ) {
- GtkWidget *hbox = NULL, *label = NULL, *item = NULL;
-
- arg_iter = (extcap_arg*) (arg_list->data);
-
- /* A new storage box for label + element */
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5, FALSE);
-
- if (prev_map != NULL
- && (prev_call = (gchar *) g_hash_table_lookup(prev_map,
- arg_iter->call)) != NULL) {
- prev_complex = extcap_parse_complex(arg_iter->arg_type, prev_call);
- } else {
- prev_complex = NULL;
- }
-
- switch (arg_iter->arg_type) {
- case EXTCAP_ARG_INTEGER:
- case EXTCAP_ARG_UNSIGNED:
- case EXTCAP_ARG_LONG:
- case EXTCAP_ARG_DOUBLE:
- label = gtk_label_new(arg_iter->display);
- gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.1f);
- item = extcap_create_gtk_rangewidget(arg_iter, prev_map);
- if (item == NULL) {
- item = gtk_entry_new();
-
- if (prev_complex != NULL) {
- default_str = extcap_get_complex_as_string(prev_complex);
- gtk_entry_set_text(GTK_ENTRY(item), default_str);
- g_free(default_str);
- } else if (arg_iter->default_complex != NULL) {
- default_str = extcap_get_complex_as_string(
- arg_iter->default_complex);
- gtk_entry_set_text(GTK_ENTRY(item), default_str);
- g_free(default_str);
- }
- }
- break;
- case EXTCAP_ARG_STRING:
- case EXTCAP_ARG_PASSWORD:
- label = gtk_label_new(arg_iter->display);
-
- item = gtk_entry_new();
- default_str = NULL;
-
- if (prev_complex != NULL)
- default_str = extcap_get_complex_as_string(prev_complex);
- else if (arg_iter->default_complex != NULL)
- default_str = extcap_get_complex_as_string(
- arg_iter->default_complex);
-
- if (default_str != NULL) {
- gtk_entry_set_text(GTK_ENTRY(item), default_str);
- g_free(default_str);
- }
-
- if ( arg_iter->arg_type == EXTCAP_ARG_PASSWORD)
- gtk_entry_set_visibility(GTK_ENTRY(item), FALSE);
-
- break;
- case EXTCAP_ARG_FILESELECT:
- label = gtk_label_new(arg_iter->display);
- default_str = NULL;
-
- if (prev_complex != NULL)
- default_str = extcap_get_complex_as_string(prev_complex);
- else if (arg_iter->default_complex != NULL)
- default_str = extcap_get_complex_as_string(
- arg_iter->default_complex);
-
- gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.1f);
- item = extcap_create_gtk_fileselect(arg_iter, prev_map, default_str);
- g_free(default_str);
- break;
- case EXTCAP_ARG_TIMESTAMP:
- default_str = NULL;
- if (prev_complex != NULL)
- default_str = extcap_get_complex_as_string(prev_complex);
- else if (arg_iter->default_complex != NULL)
- default_str = extcap_get_complex_as_string(
- arg_iter->default_complex);
- label = gtk_label_new(arg_iter->display);
- gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.1f);
- if (default_str != NULL) {
- gtk_entry_set_text(GTK_ENTRY(item), default_str);
- g_free(default_str);
- }
-
- item = gtk_calendar_new();
- break;
- case EXTCAP_ARG_BOOLEAN:
- case EXTCAP_ARG_BOOLFLAG:
- item = gtk_check_button_new_with_label(arg_iter->display);
-
- if (prev_complex != NULL) {
- if (extcap_complex_get_bool(prev_complex))
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(item), TRUE);
- } else if (arg_iter->default_complex != NULL
- && extcap_complex_get_bool(arg_iter->default_complex)) {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(item), TRUE);
- }
-
- break;
- case EXTCAP_ARG_RADIO:
- label = gtk_label_new(arg_iter->display);
- gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.1f);
- item = extcap_create_gtk_radiowidget(arg_iter, prev_map);
- break;
- case EXTCAP_ARG_SELECTOR:
- label = gtk_label_new(arg_iter->display);
- gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.1f);
- item = extcap_create_gtk_listwidget(arg_iter, prev_map);
- break;
- case EXTCAP_ARG_MULTICHECK:
- label = gtk_label_new(arg_iter->display);
- gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.1f);
- item = extcap_create_gtk_multicheckwidget(arg_iter, prev_map);
- break;
- default:
- break;
- }
-
- if (prev_complex != NULL)
- extcap_free_complex(prev_complex);
-
- if (label != NULL) {
- gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
- gtk_widget_show(label);
- }
-
- if (item != NULL) {
- gtk_box_pack_start(GTK_BOX(hbox), item, TRUE, TRUE, 0);
- gtk_widget_show(item);
- g_object_set_data(G_OBJECT(item), EXTCAP_GTK_DATA_KEY_ARGPTR,
- arg_iter);
-
- if (arg_iter->tooltip != NULL) {
- gtk_widget_set_tooltip_text(item, arg_iter->tooltip);
- }
-
- widget_toplist = g_slist_append(widget_toplist, item);
- }
-
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 1);
-
- gtk_widget_show(hbox);
-
- arg_list = arg_list->next;
- }
-
- return widget_toplist;
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/extcap_gtk.h b/ui/gtk/extcap_gtk.h
deleted file mode 100644
index cdc26167ab..0000000000
--- a/ui/gtk/extcap_gtk.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/* extcap_gtk.c
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __EXTCAP_GTK_H__
-#define __EXTCAP_GTK_H__
-
-#include <stdio.h>
-#include <string.h>
-
-#include <glib.h>
-#include <gtk/gtk.h>
-
-#include <extcap_parser.h>
-
-/*
- * GObject data keys for linking argument records to the gtk
- * UI
- */
-#define EXTCAP_GTK_DATA_KEY_ARGPTR "EXTCAP_ARGPTR"
-#define EXTCAP_GTK_DATA_KEY_VALPTR "EXTCAP_VALPTR"
-#define EXTCAP_GTK_DATA_KEY_FIRSTRADIO "EXTCAP_FIRSTRADIO"
-#define EXTCAP_GTK_DATA_KEY_WIDGETLIST "EXTCAP_WIDGETLIST"
-#define EXTCAP_GTK_DATA_KEY_TREEVIEW "EXTCAP_TREEVIEW"
-#define EXTCAP_GTK_DATA_KEY_FILENAME "EXTCAP_FILENAME"
-#define EXTCAP_GTK_DATA_KEY_TIMESTAMP "EXTCAP_TIMESTAMP"
-#define EXTCAP_GTK_DATA_KEY_ARGUMENT "EXTCAP_ARGUMENT"
-
-/*
- * GTK UI / EXTCAP Linkage:
- *
- * Packed vbox of widgets
- * Contains EXTCAP_WIDGETLIST pointing to enclosed widget list
- *
- * GSList gtk_ui_widgets
- * Linked list of drawable widgets in the UI
- *
- * GtkWidget contained in GSList
- * Drawn GTK UI element. If UI element is directly linked
- * to argument, will contain EXTCAP_ARGPTR.
- *
- * Top-level GTK widgets will include text boxes, sliders
- * (if supported), and checkboxes.
- *
- * If the top level widget contains radio buttons, it will
- * contain an EXTCAP_ARGPTR *and* an EXTCAP_FIRSTRADIO
- *
- * Radio buttons
- * Each radio button will contain an EXTCAP_VALPTR reference
- * to the extcap_value * value being used.
- *
- * Selectors
- * Each selector row contains a pointer to the value, in the
- * column COL_VALUE
- *
- */
-
-enum extcap_gtk_col_types {
- EXTCAP_GTK_COL_DISPLAY = 0, EXTCAP_GTK_COL_VALUE = 1, EXTCAP_GTK_NUM_COLS
-};
-
-enum extcap_gtk_multi_col_types {
- EXTCAP_GTK_MULTI_COL_CHECK = 0,
- EXTCAP_GTK_MULTI_COL_DISPLAY = 1,
- EXTCAP_GTK_MULTI_COL_VALUE = 2,
- EXTCAP_GTK_MULTI_COL_ACTIVATABLE = 3,
- EXTCAP_GTK_MULTI_NUM_COLS
-};
-
-/* Get a hash map of calls and values from the top widget */
-GHashTable *extcap_gtk_get_state(GtkWidget *widget);
-
-GtkWidget *extcap_create_gtk_rangewidget(extcap_arg *argument,
- GHashTable *prev_map);
-GtkWidget *extcap_create_gtk_listwidget(extcap_arg *argument,
- GHashTable *prev_map);
-GtkWidget *extcap_create_gtk_radiowidget(extcap_arg *argument,
- GHashTable *prev_map);
-GtkWidget *extcap_create_gtk_multicheckwidget(extcap_arg *argument,
- GHashTable *prev_map);
-
-/*
- * Populate a (pre-created) container widget based on an arguments record.
- * For secondary repopulations, a saved state can be passed to populate
- * with known values. This should occur when setting interface options
- * repeatedly, for example
- */
-GSList *extcap_populate_gtk_vbox(GList *arguments, GtkWidget *vbox,
- GHashTable *prev_map);
-
-/* Free args associated with a GTK item */
-void extcap_gtk_free_args(GtkWidget *vbox);
-
-#endif
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
-
diff --git a/ui/gtk/file_dlg.c b/ui/gtk/file_dlg.c
deleted file mode 100644
index 47e8938302..0000000000
--- a/ui/gtk/file_dlg.c
+++ /dev/null
@@ -1,474 +0,0 @@
-/* file_dlg.c
- * Utilities to use when constructing file selection dialogs
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/*
- * Code to handle Windows shortcuts courtesy of:
- *
- * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2012 Hiroyuki Yamamoto
- *
- * licensed under the GPL2 or later.
- */
-
-#include "config.h"
-#include <string.h>
-#include <errno.h>
-
-#include <gtk/gtk.h>
-
-#ifdef _WIN32
-# define COBJMACROS
-# include <windows.h>
-# include <objbase.h>
-# include <objidl.h>
-# include <shlobj.h>
-#endif
-
-#include <wsutil/file_util.h>
-
-#include <wsutil/filesystem.h>
-
-#include "ui/last_open_dir.h"
-#include "ui/util.h"
-
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/file_dlg.h"
-#include "ui/gtk/keys.h"
-#include "ui/gtk/stock_icons.h"
-
-
-static gchar *last_open_dir = NULL;
-
-static void file_selection_browse_destroy_cb(GtkWidget *win, GtkWidget* file_te);
-
-/* Keys ... */
-#define E_FS_CALLER_PTR_KEY "fs_caller_ptr"
-
-/* Create a file selection dialog box window that belongs to a top-level
- window. */
-GtkWidget *
-file_selection_new(const gchar *title, GtkWindow *parent,
- file_selection_action_t action)
-{
- GtkWidget *win;
- GtkFileChooserAction gtk_action;
- const gchar *ok_button_text;
-
- switch (action) {
-
- case FILE_SELECTION_OPEN:
- gtk_action = GTK_FILE_CHOOSER_ACTION_OPEN;
- ok_button_text = GTK_STOCK_OPEN;
- break;
-
- case FILE_SELECTION_READ_BROWSE:
- gtk_action = GTK_FILE_CHOOSER_ACTION_OPEN;
- ok_button_text = GTK_STOCK_OK;
- break;
-
- case FILE_SELECTION_SAVE:
- gtk_action = GTK_FILE_CHOOSER_ACTION_SAVE;
- ok_button_text = WIRESHARK_STOCK_SAVE;
- break;
-
- case FILE_SELECTION_WRITE_BROWSE:
- gtk_action = GTK_FILE_CHOOSER_ACTION_SAVE;
- ok_button_text = GTK_STOCK_OK;
- break;
-
- case FILE_SELECTION_CREATE_FOLDER:
- gtk_action = GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER;
- ok_button_text = GTK_STOCK_OK;
- break;
-
- default:
- g_assert_not_reached();
- gtk_action = (GtkFileChooserAction)-1;
- ok_button_text = NULL;
- break;
- }
- win = gtk_file_chooser_dialog_new(title, parent, gtk_action,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- ok_button_text, GTK_RESPONSE_ACCEPT,
- NULL);
- gtk_dialog_set_alternative_button_order(GTK_DIALOG(win),
- GTK_RESPONSE_ACCEPT,
- GTK_RESPONSE_CANCEL,
- -1);
- if (action == FILE_SELECTION_SAVE)
- gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(win), TRUE);
-
- /* If we've opened a file before, start out by showing the files in the directory
- in which that file resided. */
- if (last_open_dir) {
- file_selection_set_current_folder(win, last_open_dir);
- }
- return win;
-}
-
-/* Set the current folder for a file selection dialog. */
-gboolean
-file_selection_set_current_folder(GtkWidget *fs, const gchar *filename)
-{
- gboolean ret;
- size_t filename_len = strlen(filename);
- gchar *new_filename;
-
- /* trim filename, so gtk_file_chooser_set_current_folder() likes it, see below */
- if (filename[filename_len -1] == G_DIR_SEPARATOR
-#ifdef _WIN32
- && filename_len > 3) /* e.g. "D:\" */
-#else
- && filename_len > 1) /* e.g. "/" */
-#endif
- {
- new_filename = g_strdup(filename);
- new_filename[filename_len-1] = '\0';
- } else {
- new_filename = g_strdup(filename);
- }
-
- /* this function is very pedantic about its filename parameter */
- /* no trailing '\' allowed, unless a win32 root dir "D:\" */
- ret = gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(fs), new_filename);
- g_free(new_filename);
- return ret;
-}
-
-/* Set the "extra" widget for a file selection dialog, with user-supplied
- options. */
-void
-file_selection_set_extra_widget(GtkWidget *fs, GtkWidget *extra)
-{
- gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(fs), extra);
-}
-
-#ifdef _WIN32
-static gchar *filesel_get_link(const gchar *link_file)
-{
- WIN32_FIND_DATAW wfd;
- IShellLinkW *psl;
- IPersistFile *ppf;
- wchar_t *wlink_file;
- wchar_t wtarget[MAX_PATH];
- gchar *target = NULL;
-
- wtarget[0] = 0L;
-
- CoInitialize(NULL);
- if (S_OK == CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
- &IID_IShellLinkW, (void **)&psl)) {
- if (S_OK == IShellLinkW_QueryInterface(psl, &IID_IPersistFile,
- (void **)&ppf)) {
- wlink_file = g_utf8_to_utf16(link_file, -1, NULL, NULL, NULL);
- if (S_OK == IPersistFile_Load(ppf, wlink_file, STGM_READ)) {
- if (S_OK == IShellLinkW_GetPath(psl, wtarget, MAX_PATH, &wfd,
- SLGP_UNCPRIORITY)) {
- target = g_utf16_to_utf8(wtarget, -1, NULL, NULL, NULL);
- }
- }
- IPersistFile_Release(ppf);
- g_free(wlink_file);
- }
- IShellLinkW_Release(psl);
- }
- CoUninitialize();
-
- return target;
-}
-#endif /* _WIN32 */
-
-/* Run the dialog, and handle some common operations, such as, if the
- user selects a directory, browsing that directory, and handling
- shortcuts on Windows.
-
- Returns NULL if the user decided not to open/write to a file,
- returns the pathname of the selected file if they selected a
- file. */
-gchar *
-file_selection_run(GtkWidget *fs)
-{
- gchar *cf_name;
-#ifdef _WIN32
- gchar *target;
- const gchar *ext;
-#endif
-
- for (;;) {
- if (gtk_dialog_run(GTK_DIALOG(fs)) != GTK_RESPONSE_ACCEPT) {
- /* They clicked "Cancel" or closed the dialog or...;
- destroy the dialog and tell our caller the user decided
- not to do anything with the file. */
- window_destroy(fs);
- return NULL;
- }
-
- cf_name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fs));
-
- /* Perhaps the user specified a directory instead of a file.
- Check whether they did. */
- if (test_for_directory(cf_name) == EISDIR) {
- /* It's a directory - set the file selection box to display that
- directory, and go back and re-run it; don't try to open the
- directory as a file (you'll get crap if you get anything) or
- write to it (which won't work anyway). */
- set_last_open_dir(cf_name);
- g_free(cf_name);
- file_selection_set_current_folder(fs, get_last_open_dir());
- continue;
- }
-
-#ifdef _WIN32
- /* Perhaps the user specified a "shortcut" instead of a file.
- Check whether they did. */
- if ((ext = strrchr(cf_name, '.')) && g_ascii_strcasecmp(ext, ".lnk") == 0) {
- /* It ends with ".lnk", so it might be a shortcut. */
- target = filesel_get_link(cf_name);
- if (target != NULL) {
- /* We resolved it, so it must've been a shortcut. */
- g_free(cf_name);
- if (test_for_directory(target)) {
- /* It's a shortcut that points to a directory; treat it the same
- way we treat a directory. */
- set_last_open_dir(target);
- g_free(target);
- file_selection_set_current_folder(fs, get_last_open_dir());
- continue;
- }
- /* It's a shortcut that points to a file; act as if the target
- is what's selected. */
- cf_name = target;
- }
- }
-#endif
- break;
- }
-
- return cf_name;
-}
-
-#ifndef _WIN32
-/* If the specified file doesn't exist, return TRUE.
- If it exists and is neither user-immutable nor not writable, return
- TRUE.
- Otherwise, as the user whether they want to overwrite it anyway, and
- return TRUE if the file should be overwritten and FALSE otherwise. */
-gboolean
-file_target_unwritable_ui(GtkWidget *chooser_w, char *cf_name)
-{
- GtkWidget *msg_dialog;
- gchar *display_basename;
- gint response;
- ws_statb64 statbuf;
-
- /* Check whether the file has all the write permission bits clear
- and, on systems that have the 4.4-Lite file flags, whether it
- has the "user immutable" flag set. Treat both of those as an
- indication that the user wants to protect the file from
- casual overwriting, and ask the user if they want to override
- that.
-
- (Linux's "immutable" flag, as fetched and set by the appropriate
- ioctls (FS_IOC_GETFLAGS/FS_IOC_SETFLAGS in newer kernels,
- EXT2_IOC_GETFLAGS/EXT2_IOC_SETFLAGS in older kernels - non-ext2
- file systems that support those ioctls use the same values as ext2
- does), appears to be more like the *BSD/macOS "system immutable"
- flag, as it can be set only by the superuser or by processes with
- CAP_LINUX_IMMUTABLE, so it sounds as if it's not intended for
- arbitrary users to set or clear. */
- if (ws_stat64(cf_name, &statbuf) == -1) {
- /* Either the file doesn't exist or we can't get its attributes.
- In the former case, we have no reason to bother the user.
- In the latter case, we don't have enough information to
- know whether to bother the user, so we don't. */
- return TRUE;
- }
-
- /* OK, we have the permission bits and, if HAVE_STRUCT_STAT_ST_FLAGS
- is defined, the flags. (If we don't, we don't worry about it.) */
-#ifdef HAVE_STRUCT_STAT_ST_FLAGS
- if (statbuf.st_flags & UF_IMMUTABLE) {
- display_basename = g_filename_display_basename(cf_name);
- msg_dialog = gtk_message_dialog_new(GTK_WINDOW(chooser_w),
- (GtkDialogFlags)(GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT),
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_NONE,
-#ifdef __APPLE__
- /* Stuff in the macOS UI calls files with the "user immutable" bit
- "locked"; the classic Mac OS might have had that notion and
- called it "locked". */
- "The file \"%s\" is locked.",
-#else /* __APPLE__ */
- /* Just call it "immutable" in *BSD. */
- "The file \"%s\" is immutable.",
-#endif /* __APPLE__ */
- display_basename);
- g_free(display_basename);
- } else
-#endif /* HAVE_STRUCT_STAT_ST_FLAGS */
- if ((statbuf.st_mode & (S_IWUSR|S_IWGRP|S_IWOTH)) == 0) {
- display_basename = g_filename_display_basename(cf_name);
- msg_dialog = gtk_message_dialog_new(GTK_WINDOW(chooser_w),
- (GtkDialogFlags)(GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT),
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_NONE,
- "The file \"%s\" is read-only.",
- display_basename);
- g_free(display_basename);
- } else {
- /* No problem, just drive on. */
- msg_dialog = NULL;
- }
- if (msg_dialog != NULL) {
- /* OK, ask the user if they want to overwrite the file. */
- gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(msg_dialog),
- "Do you want to overwrite it anyway?");
-
- gtk_dialog_add_buttons(GTK_DIALOG(msg_dialog),
- "Overwrite", GTK_RESPONSE_ACCEPT,
- "Don't overwrite", GTK_RESPONSE_REJECT,
- NULL);
- gtk_dialog_set_default_response(GTK_DIALOG(msg_dialog), GTK_RESPONSE_REJECT);
-
- response = gtk_dialog_run(GTK_DIALOG(msg_dialog));
- gtk_widget_destroy(msg_dialog);
-
- if (response != GTK_RESPONSE_ACCEPT) {
- /* The user doesn't want to overwrite this file. */
- return FALSE;
- }
-
-#ifdef HAVE_STRUCT_STAT_ST_FLAGS
- /* OK, they want to overwrite the file. If it has the "user
- immutable" flag, we have to turn that off first, so we
- can move on top of, or overwrite, the file. */
- if (statbuf.st_flags & UF_IMMUTABLE) {
- /* If this fails, the attempt to save will fail, so just
- let that happen and pop up a "you lose" dialog. */
- chflags(cf_name, statbuf.st_flags & ~UF_IMMUTABLE);
- }
-#endif
- }
- return TRUE;
-}
-#endif
-
-/*
- * A generic select_file routine that is intended to be connected to
- * a Browse button on other dialog boxes. This allows the user to browse
- * for a file and select it. We fill in the text_entry that is given to us.
- *
- * We display the window label specified in our args.
- */
-void
-file_selection_browse(GtkWidget *file_bt, GtkWidget *file_te, const char *label, file_selection_action_t action)
-{
- GtkWidget *caller = gtk_widget_get_toplevel(file_bt);
- GtkWidget *fs;
- gchar *f_name;
-
- fs = file_selection_new(label, GTK_WINDOW(caller), action);
-
- g_object_set_data(G_OBJECT(fs), PRINT_FILE_TE_KEY, file_te);
-
- /* Set the E_FS_CALLER_PTR_KEY for the new dialog to point to our caller. */
- g_object_set_data(G_OBJECT(fs), E_FS_CALLER_PTR_KEY, caller);
-
- /* Set the E_FILE_SEL_DIALOG_PTR_KEY for the caller to point to us */
- g_object_set_data(G_OBJECT(caller), E_FILE_SEL_DIALOG_PTR_KEY, fs);
-
- /* Call a handler when the file selection box is destroyed, so we can inform
- our caller, if any, that it's been destroyed. */
- g_signal_connect(fs, "destroy", G_CALLBACK(file_selection_browse_destroy_cb),
- file_te);
-
- if (gtk_dialog_run(GTK_DIALOG(fs)) == GTK_RESPONSE_ACCEPT)
- {
- f_name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fs));
- gtk_entry_set_text(GTK_ENTRY(file_te), f_name);
- g_free(f_name);
- }
- window_destroy(fs);
-}
-
-
-static void
-file_selection_browse_destroy_cb(GtkWidget *win, GtkWidget* parent_te)
-{
- GtkWidget *caller;
-
- /* Get the widget that requested that we be popped up.
- (It should arrange to destroy us if it's destroyed, so
- that we don't get a pointer to a non-existent window here.) */
- caller = (GtkWidget *)g_object_get_data(G_OBJECT(win), E_FS_CALLER_PTR_KEY);
-
- /* Tell it we no longer exist. */
- g_object_set_data(G_OBJECT(caller), E_FILE_SEL_DIALOG_PTR_KEY, NULL);
-
- /* Give the focus to the file text entry widget so the user can just press
- Return to print to the file. */
- gtk_widget_grab_focus(parent_te);
-}
-
-
-void
-set_last_open_dir(const char *dirname)
-{
- size_t len;
- gchar *new_last_open_dir;
-
- if (dirname && dirname[0]) {
- len = strlen(dirname);
- if (dirname[len-1] == G_DIR_SEPARATOR) {
- new_last_open_dir = g_strconcat(dirname, NULL);
- }
- else {
- new_last_open_dir = g_strconcat(dirname,
- G_DIR_SEPARATOR_S, NULL);
- }
- } else {
- new_last_open_dir = NULL;
- }
-
- g_free(last_open_dir);
- last_open_dir = new_last_open_dir;
-}
-
-char *
-get_last_open_dir(void)
-{
- return last_open_dir;
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/file_dlg.h b/ui/gtk/file_dlg.h
deleted file mode 100644
index 4990b615e3..0000000000
--- a/ui/gtk/file_dlg.h
+++ /dev/null
@@ -1,133 +0,0 @@
-/* file_dlg.h
- * Declarations of utilities to use when constructing file selection dialogs
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/** @defgroup filesel_dialog_group File Selection Dialogs
- *
- * Dialogs are specially created windows and are related to their parent windows (usually the main window).
- * See: @ref howto_window_page for details.
- *
- * File selection dialogs are created using file_selection_new().
- *
- * - "Browse" file_selection_browse()
- * - "Open Capture File" file_open_cmd()
- * - "Save Capture File As" file_save_as_cmd()
- * - "Import Color Filters" file_color_import_cmd_cb()
- * - "Export Color Filters" file_color_export_cmd_cb()
- * - "Save TCP Follow Stream As" follow_save_as_cmd_cb()
- * - "Export Selected Packet Bytes" savehex_cb()
- * - "Save Data As CSV" save_csv_as_cb()
- * - "Save Payload As ..." on_save_bt_clicked()
- * - "Save selected stream in rtpdump" rtpstream_on_save()
- *
- */
-
-/** @file
- * Utilities for file selection dialog boxes. Depending on the window
- * functions in gui_utils.h, see: @ref howto_window_page for details.
- * @ingroup filesel_dialog_group
- */
-
-#ifndef __FILE_DLG_H__
-#define __FILE_DLG_H__
-
-/** the action a file selection is designed for */
-typedef enum {
- FILE_SELECTION_OPEN, /**< open a file */
- FILE_SELECTION_READ_BROWSE, /**< browse for a file to read */
- FILE_SELECTION_SAVE, /**< save/export a file */
- FILE_SELECTION_WRITE_BROWSE, /**< browse for a file to write to */
- FILE_SELECTION_CREATE_FOLDER /**< browse for a dir. to save in */
-} file_selection_action_t;
-
-/** Create a file selection dialog box window that belongs to a top-level
- * window. See window_new() for usage.
- *
- * @param title the title for the new file selection dialog
- * @param parent the top-level window
- * @param action the desired action
- * @return the newly created file selection dialog
- */
-extern GtkWidget *file_selection_new(const gchar *title, GtkWindow *parent,
- file_selection_action_t action);
-
-/** Set the current folder for a file selection dialog.
- *
- * @param fs the file selection dialog from file_selection_new()
- * @param filename the folder to set
- * @return TRUE if the folder could be changed successfully
- */
-extern gboolean file_selection_set_current_folder(GtkWidget *fs, const gchar *filename);
-
-/** Set the current file for a file selection dialog.
- *
- * @param chooser the file selection dialog from file_selection_new()
- * @param filename the folder to set
- * @return TRUE if the folder could be changed successfully
- */
-#define file_selection_set_current_file(chooser, filename) \
- gtk_file_chooser_set_filename(chooser, filename)
-
-/** Set the "extra" widget for a file selection dialog. This is needed to support
- * user-supplied options.
- *
- * @param fs the file selection dialog from file_selection_new()
- * @param extra the widget to set
- */
-extern void file_selection_set_extra_widget(GtkWidget *fs, GtkWidget *extra);
-
-/** Run the dialog, and handle some common operations, such as, if the
- * user selects a directory, browsing that directory, and handling
- * shortcuts on Windows.
- * @param fs the file selection dialog from file_selection_new()
- * @return the pathname of the selected file if the user selected a
- * file, NULL if they cancelled or closed the dialog.
- */
-extern gchar *file_selection_run(GtkWidget *fs);
-
-#ifndef _WIN32
-/** If the specified file doesn't exist, return TRUE.
- * If it exists and is neither user-immutable nor not writable, return
- * TRUE.
- * Otherwise, as the user whether they want to overwrite it anyway, and
- * return TRUE if the file should be overwritten and FALSE otherwise.
- *
- * @param chooser_w the GtkFileChooser used to select the file in question
- * @param cf_name the current name chosen
- */
-extern gboolean file_target_unwritable_ui(GtkWidget *chooser_w, char *cf_name);
-#endif
-
-/** The function file_selection_browse() will g_object_set_data() itself on its parent window.
- * When destroying the parent window, it can close the corresponding file selection. */
-#define E_FILE_SEL_DIALOG_PTR_KEY "file_sel_dialog_ptr"
-
-/** Browse the files and fill in the associated text entry.
- *
- * @param file_bt the button that called us (to get the toplevel widget)
- * @param file_te the GtkEntry the dialog will have to fill in the filename
- * @param title the title for the file selection dialog
- * @param action the desired action
- */
-extern void
-file_selection_browse(GtkWidget *file_bt, GtkWidget *file_te, const char *title, file_selection_action_t action);
-
-#endif
diff --git a/ui/gtk/file_import_dlg.c b/ui/gtk/file_import_dlg.c
deleted file mode 100644
index 8d9f58db95..0000000000
--- a/ui/gtk/file_import_dlg.c
+++ /dev/null
@@ -1,1224 +0,0 @@
-/* file_import_dlg.c
- * Dialog to setup for import of a text file, like text2pcap
- * November 2010, Jaap Keuter <jaap.keuter@xs4all.nl>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
- */
-
-#include "config.h"
-
-
-#include <stdlib.h>
-
-#include "globals.h"
-#include "wiretap/pcap-encap.h"
-
-#include "ui/simple_dialog.h"
-#include "ui/alert_box.h"
-
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/file_dlg.h"
-#include "ui/gtk/capture_file_dlg.h"
-#include "ui/gtk/help_dlg.h"
-
-#include "ui/gtk/file_import_dlg.h"
-#include "ui/text_import.h"
-#include "ui/text_import_scanner.h"
-
-#include "wsutil/file_util.h"
-#include "wsutil/tempfile.h"
-#include "wsutil/os_version_info.h"
-#include "version_info.h"
-#include "wiretap/wtap_opttypes.h"
-#include "wiretap/pcapng.h"
-
-#define INPUT_FRM_KEY "input_frame"
-
-#define INPUT_FILENAME_TE_KEY "input_filename_text"
-
-#define INPUT_OFFSET_HEX_RB_KEY "input_offset_hex_radio"
-#define INPUT_OFFSET_OCT_RB_KEY "input_offset_oct_radio"
-#define INPUT_OFFSET_DEC_RB_KEY "input_offset_dec_radio"
-
-#define INPUT_DATETIME_CB_KEY "input_datetime_checkbox"
-#define INPUT_TIMEFMT_LBL_KEY "input_timeformat_label"
-#define INPUT_TIMEFMT_TE_KEY "input_timeformat_entry"
-
-#define INPUT_DIR_CB_KEY "input_direction_indication_checkbox"
-
-#define IMPORT_FRM_KEY "import_frame"
-#define IMPORT_ENCAP_CO_KEY "import_encap_combo"
-
-#define IMPORT_HEADER_FRM_KEY "import_header_frame"
-#define IMPORT_HEADER_CB_KEY "import_header_checkbox"
-#define IMPORT_HEADER_ETH_RB_KEY "import_header_ethernet_radio"
-#define IMPORT_HEADER_ETYPE_LBL_KEY "import_header_etype_label"
-#define IMPORT_HEADER_ETYPE_TE_KEY "import_header_etype_text"
-#define IMPORT_HEADER_IPV4_RB_KEY "import_header_ipv4_radio"
-#define IMPORT_HEADER_PROT_LBL_KEY "import_header_prot_label"
-#define IMPORT_HEADER_PROT_TE_KEY "import_header_prot_text"
-#define IMPORT_HEADER_UDP_RB_KEY "import_header_udp_radio"
-#define IMPORT_HEADER_SRC_PORT_LBL_KEY "import_header_src_port_label"
-#define IMPORT_HEADER_SRC_PORT_TE_KEY "import_header_src_port_text"
-#define IMPORT_HEADER_TCP_RB_KEY "import_header_tcp_radio"
-#define IMPORT_HEADER_DST_PORT_LBL_KEY "import_header_dst_port_label"
-#define IMPORT_HEADER_DST_PORT_TE_KEY "import_header_dst_port_text"
-#define IMPORT_HEADER_SCTP_RB_KEY "import_header_sctp_radio"
-#define IMPORT_HEADER_TAG_LBL_KEY "import_header_tag_label"
-#define IMPORT_HEADER_TAG_TE_KEY "import_header_tag_text"
-#define IMPORT_HEADER_SCTP_D_RB_KEY "import_header_sctp_data_radio"
-#define IMPORT_HEADER_PPI_LBL_KEY "import_header_ppi_label"
-#define IMPORT_HEADER_PPI_TE_KEY "import_header_ppi_text"
-
-#define IMPORT_FRAME_LENGTH_TE_KEY "import_frame_length_text"
-
-static GtkWidget *file_import_dlg_w = NULL;
-static GtkListStore *encap_list_store = NULL;
-
-/*****************************************************************************/
-
-static void
-file_import_dlg_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
-{
- file_import_dlg_w = NULL;
-}
-
-/*****************************************************************************/
-
-static void
-browse_file_cb(GtkWidget *browse_bt, GtkWidget *filename_te)
-{
- file_selection_browse(browse_bt, filename_te, "Wireshark: Import from Hex Dump",
- FILE_SELECTION_READ_BROWSE);
-}
-
-static void
-timefmt_cb_toggle(GtkWidget *widget, gpointer data _U_)
-{
- GtkWidget *timefmt_lbl, *timefmt_te;
- gboolean apply_fmt;
-
- timefmt_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(widget), INPUT_TIMEFMT_LBL_KEY));
- timefmt_te = GTK_WIDGET(g_object_get_data(G_OBJECT(widget), INPUT_TIMEFMT_TE_KEY));
-
- apply_fmt = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
- gtk_widget_set_sensitive(timefmt_lbl, apply_fmt);
- gtk_widget_set_sensitive(timefmt_te, apply_fmt);
-}
-
-enum
-{
- ENCAP_NAME_COLUMN,
- ENCAP_VALUE_COLUMN
-};
-
-/*****************************************************************************/
-static void
-create_encap_list_store(void)
-{
- GtkTreeIter iter;
- gint encap;
- const gchar *name;
- GtkTreeSortable *sortable;
- GtkSortType order = GTK_SORT_ASCENDING;
-
- encap_list_store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_UINT);
- sortable = GTK_TREE_SORTABLE(encap_list_store);
- gtk_tree_sortable_set_sort_func(sortable, ENCAP_NAME_COLUMN,
- str_ptr_sort_func, GINT_TO_POINTER(ENCAP_NAME_COLUMN), NULL);
- gtk_tree_sortable_set_sort_column_id(sortable, ENCAP_NAME_COLUMN, order);
-
- /* Scan all Wiretap encapsulation types */
- for (encap = 1; encap < wtap_get_num_encap_types(); encap++) {
- /* Check if we can write to a PCAP file
- *
- * Exclude wtap encapsulations that require a pseudo header,
- * because we won't setup one from the text we import and
- * wiretap doesn't allow us to write 'raw' frames
- */
- if ((wtap_wtap_encap_to_pcap_encap(encap) > 0) && !wtap_encap_requires_phdr(encap)) {
- /* If it has got a name */
- if ((name = wtap_encap_string(encap))) {
- gtk_list_store_append(encap_list_store, &iter);
- gtk_list_store_set(encap_list_store, &iter, 0, name, 1, encap, -1);
- }
- }
- }
-}
-
-static GtkWidget *
-fill_encap_combo(void)
-{
- GtkWidget *encap_co;
- GtkCellRenderer *cell;
-
- encap_co = gtk_combo_box_new_with_model(GTK_TREE_MODEL(encap_list_store));
- cell = gtk_cell_renderer_text_new();
- gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(encap_co), cell, TRUE);
- gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(encap_co), cell, "text", 0, NULL);
-
- return encap_co;
-}
-
-static void header_frm_child_set(GtkWidget *widget, gpointer data);
-
-static void
-encap_co_changed(GtkComboBox *widget, gpointer data)
-{
- GtkTreeIter iter;
- gboolean result;
- GtkWidget *header_cb;
-
- result = gtk_combo_box_get_active_iter(widget, &iter);
-
- if (result) {
- guint encap;
- GtkTreeModel *model = gtk_combo_box_get_model(widget);
- gtk_tree_model_get(model, &iter, ENCAP_VALUE_COLUMN, &encap, -1);
-
- if (encap != WTAP_ENCAP_ETHERNET)
- result = FALSE;
- }
-
- if (result) {
- header_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_CB_KEY));
- g_signal_emit_by_name(G_OBJECT(header_cb), "toggled", data);
- } else {
- gtk_container_foreach(GTK_CONTAINER(data), header_frm_child_set, GUINT_TO_POINTER(result));
- }
-}
-
-/*****************************************************************************/
-
-static void
-header_frm_child_set(GtkWidget *widget, gpointer data)
-{
- gtk_widget_set_sensitive(widget, GPOINTER_TO_UINT(data));
-}
-
-static void
-header_cb_toggle(GtkWidget *widget, gpointer data)
-{
- gtk_container_foreach(GTK_CONTAINER(data), header_frm_child_set,
- GUINT_TO_POINTER(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))));
- /* The frame's checkbox must stay sensitive, of course... */
- gtk_widget_set_sensitive(widget, TRUE);
-}
-
-/*
- * Header radio button toggle handlers
- */
-static void
-header_eth_rb_toggle(GtkWidget *widget, gpointer data)
-{
- GtkWidget *etype_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_ETYPE_LBL_KEY));
- GtkWidget *etype_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_ETYPE_TE_KEY));
- GtkWidget *prot_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_PROT_LBL_KEY));
- GtkWidget *prot_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_PROT_TE_KEY));
- GtkWidget *src_port_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_SRC_PORT_LBL_KEY));
- GtkWidget *src_port_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_SRC_PORT_TE_KEY));
- GtkWidget *dst_port_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_DST_PORT_LBL_KEY));
- GtkWidget *dst_port_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_DST_PORT_TE_KEY));
- GtkWidget *tag_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_TAG_LBL_KEY));
- GtkWidget *tag_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_TAG_TE_KEY));
- GtkWidget *ppi_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_PPI_LBL_KEY));
- GtkWidget *ppi_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_PPI_TE_KEY));
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {
- gtk_widget_set_sensitive(etype_lbl, TRUE);
- gtk_widget_set_sensitive(etype_te, TRUE);
- gtk_widget_set_sensitive(prot_lbl, FALSE);
- gtk_widget_set_sensitive(prot_te, FALSE);
- gtk_widget_set_sensitive(src_port_lbl, FALSE);
- gtk_widget_set_sensitive(src_port_te, FALSE);
- gtk_widget_set_sensitive(dst_port_lbl, FALSE);
- gtk_widget_set_sensitive(dst_port_te, FALSE);
- gtk_widget_set_sensitive(tag_lbl, FALSE);
- gtk_widget_set_sensitive(tag_te, FALSE);
- gtk_widget_set_sensitive(ppi_lbl, FALSE);
- gtk_widget_set_sensitive(ppi_te, FALSE);
- } else {
- gtk_widget_set_sensitive(etype_lbl, FALSE);
- gtk_widget_set_sensitive(etype_te, FALSE);
- }
-}
-
-static void
-header_ipv4_rb_toggle(GtkWidget *widget, gpointer data)
-{
- GtkWidget *etype_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_ETYPE_LBL_KEY));
- GtkWidget *etype_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_ETYPE_TE_KEY));
- GtkWidget *prot_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_PROT_LBL_KEY));
- GtkWidget *prot_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_PROT_TE_KEY));
- GtkWidget *src_port_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_SRC_PORT_LBL_KEY));
- GtkWidget *src_port_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_SRC_PORT_TE_KEY));
- GtkWidget *dst_port_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_DST_PORT_LBL_KEY));
- GtkWidget *dst_port_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_DST_PORT_TE_KEY));
- GtkWidget *tag_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_TAG_LBL_KEY));
- GtkWidget *tag_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_TAG_TE_KEY));
- GtkWidget *ppi_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_PPI_LBL_KEY));
- GtkWidget *ppi_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_PPI_TE_KEY));
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {
- gtk_widget_set_sensitive(etype_lbl, FALSE);
- gtk_widget_set_sensitive(etype_te, FALSE);
- gtk_widget_set_sensitive(prot_lbl, TRUE);
- gtk_widget_set_sensitive(prot_te, TRUE);
- gtk_widget_set_sensitive(src_port_lbl, FALSE);
- gtk_widget_set_sensitive(src_port_te, FALSE);
- gtk_widget_set_sensitive(dst_port_lbl, FALSE);
- gtk_widget_set_sensitive(dst_port_te, FALSE);
- gtk_widget_set_sensitive(tag_lbl, FALSE);
- gtk_widget_set_sensitive(tag_te, FALSE);
- gtk_widget_set_sensitive(ppi_lbl, FALSE);
- gtk_widget_set_sensitive(ppi_te, FALSE);
- } else {
- gtk_widget_set_sensitive(prot_lbl, FALSE);
- gtk_widget_set_sensitive(prot_te, FALSE);
- }
-}
-
-static void
-header_udp_rb_toggle(GtkWidget *widget, gpointer data)
-{
- GtkWidget *etype_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_ETYPE_LBL_KEY));
- GtkWidget *etype_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_ETYPE_TE_KEY));
- GtkWidget *prot_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_PROT_LBL_KEY));
- GtkWidget *prot_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_PROT_TE_KEY));
- GtkWidget *src_port_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_SRC_PORT_LBL_KEY));
- GtkWidget *src_port_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_SRC_PORT_TE_KEY));
- GtkWidget *dst_port_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_DST_PORT_LBL_KEY));
- GtkWidget *dst_port_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_DST_PORT_TE_KEY));
- GtkWidget *tag_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_TAG_LBL_KEY));
- GtkWidget *tag_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_TAG_TE_KEY));
- GtkWidget *ppi_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_PPI_LBL_KEY));
- GtkWidget *ppi_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_PPI_TE_KEY));
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {
- gtk_widget_set_sensitive(etype_lbl, FALSE);
- gtk_widget_set_sensitive(etype_te, FALSE);
- gtk_widget_set_sensitive(prot_lbl, FALSE);
- gtk_widget_set_sensitive(prot_te, FALSE);
- gtk_widget_set_sensitive(src_port_lbl, TRUE);
- gtk_widget_set_sensitive(src_port_te, TRUE);
- gtk_widget_set_sensitive(dst_port_lbl, TRUE);
- gtk_widget_set_sensitive(dst_port_te, TRUE);
- gtk_widget_set_sensitive(tag_lbl, FALSE);
- gtk_widget_set_sensitive(tag_te, FALSE);
- gtk_widget_set_sensitive(ppi_lbl, FALSE);
- gtk_widget_set_sensitive(ppi_te, FALSE);
- } else {
- gtk_widget_set_sensitive(src_port_lbl, FALSE);
- gtk_widget_set_sensitive(src_port_te, FALSE);
- gtk_widget_set_sensitive(dst_port_lbl, FALSE);
- gtk_widget_set_sensitive(dst_port_te, FALSE);
- }
-}
-
-static void
-header_tcp_rb_toggle(GtkWidget *widget, gpointer data)
-{
- GtkWidget *etype_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_ETYPE_LBL_KEY));
- GtkWidget *etype_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_ETYPE_TE_KEY));
- GtkWidget *prot_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_PROT_LBL_KEY));
- GtkWidget *prot_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_PROT_TE_KEY));
- GtkWidget *src_port_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_SRC_PORT_LBL_KEY));
- GtkWidget *src_port_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_SRC_PORT_TE_KEY));
- GtkWidget *dst_port_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_DST_PORT_LBL_KEY));
- GtkWidget *dst_port_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_DST_PORT_TE_KEY));
- GtkWidget *tag_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_TAG_LBL_KEY));
- GtkWidget *tag_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_TAG_TE_KEY));
- GtkWidget *ppi_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_PPI_LBL_KEY));
- GtkWidget *ppi_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_PPI_TE_KEY));
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {
- gtk_widget_set_sensitive(etype_lbl, FALSE);
- gtk_widget_set_sensitive(etype_te, FALSE);
- gtk_widget_set_sensitive(prot_lbl, FALSE);
- gtk_widget_set_sensitive(prot_te, FALSE);
- gtk_widget_set_sensitive(src_port_lbl, TRUE);
- gtk_widget_set_sensitive(src_port_te, TRUE);
- gtk_widget_set_sensitive(dst_port_lbl, TRUE);
- gtk_widget_set_sensitive(dst_port_te, TRUE);
- gtk_widget_set_sensitive(tag_lbl, FALSE);
- gtk_widget_set_sensitive(tag_te, FALSE);
- gtk_widget_set_sensitive(ppi_lbl, FALSE);
- gtk_widget_set_sensitive(ppi_te, FALSE);
- } else {
- gtk_widget_set_sensitive(src_port_lbl, FALSE);
- gtk_widget_set_sensitive(src_port_te, FALSE);
- gtk_widget_set_sensitive(dst_port_lbl, FALSE);
- gtk_widget_set_sensitive(dst_port_te, FALSE);
- }
-}
-
-static void
-header_sctp_rb_toggle(GtkWidget *widget, gpointer data)
-{
- GtkWidget *etype_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_ETYPE_LBL_KEY));
- GtkWidget *etype_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_ETYPE_TE_KEY));
- GtkWidget *prot_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_PROT_LBL_KEY));
- GtkWidget *prot_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_PROT_TE_KEY));
- GtkWidget *src_port_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_SRC_PORT_LBL_KEY));
- GtkWidget *src_port_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_SRC_PORT_TE_KEY));
- GtkWidget *dst_port_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_DST_PORT_LBL_KEY));
- GtkWidget *dst_port_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_DST_PORT_TE_KEY));
- GtkWidget *tag_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_TAG_LBL_KEY));
- GtkWidget *tag_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_TAG_TE_KEY));
- GtkWidget *ppi_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_PPI_LBL_KEY));
- GtkWidget *ppi_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_PPI_TE_KEY));
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {
- gtk_widget_set_sensitive(etype_lbl, FALSE);
- gtk_widget_set_sensitive(etype_te, FALSE);
- gtk_widget_set_sensitive(prot_lbl, FALSE);
- gtk_widget_set_sensitive(prot_te, FALSE);
- gtk_widget_set_sensitive(src_port_lbl, TRUE);
- gtk_widget_set_sensitive(src_port_te, TRUE);
- gtk_widget_set_sensitive(dst_port_lbl, TRUE);
- gtk_widget_set_sensitive(dst_port_te, TRUE);
- gtk_widget_set_sensitive(tag_lbl, TRUE);
- gtk_widget_set_sensitive(tag_te, TRUE);
- gtk_widget_set_sensitive(ppi_lbl, FALSE);
- gtk_widget_set_sensitive(ppi_te, FALSE);
- } else {
- gtk_widget_set_sensitive(src_port_lbl, FALSE);
- gtk_widget_set_sensitive(src_port_te, FALSE);
- gtk_widget_set_sensitive(dst_port_lbl, FALSE);
- gtk_widget_set_sensitive(dst_port_te, FALSE);
- gtk_widget_set_sensitive(tag_lbl, FALSE);
- gtk_widget_set_sensitive(tag_te, FALSE);
- }
-}
-
-static void
-header_sctp_data_rb_toggle(GtkWidget *widget, gpointer data)
-{
- GtkWidget *etype_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_ETYPE_LBL_KEY));
- GtkWidget *etype_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_ETYPE_TE_KEY));
- GtkWidget *prot_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_PROT_LBL_KEY));
- GtkWidget *prot_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_PROT_TE_KEY));
- GtkWidget *src_port_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_SRC_PORT_LBL_KEY));
- GtkWidget *src_port_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_SRC_PORT_TE_KEY));
- GtkWidget *dst_port_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_DST_PORT_LBL_KEY));
- GtkWidget *dst_port_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_DST_PORT_TE_KEY));
- GtkWidget *tag_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_TAG_LBL_KEY));
- GtkWidget *tag_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_TAG_TE_KEY));
- GtkWidget *ppi_lbl = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_PPI_LBL_KEY));
- GtkWidget *ppi_te = GTK_WIDGET(g_object_get_data(G_OBJECT(data), IMPORT_HEADER_PPI_TE_KEY));
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {
- gtk_widget_set_sensitive(etype_lbl, FALSE);
- gtk_widget_set_sensitive(etype_te, FALSE);
- gtk_widget_set_sensitive(prot_lbl, FALSE);
- gtk_widget_set_sensitive(prot_te, FALSE);
- gtk_widget_set_sensitive(src_port_lbl, TRUE);
- gtk_widget_set_sensitive(src_port_te, TRUE);
- gtk_widget_set_sensitive(dst_port_lbl, TRUE);
- gtk_widget_set_sensitive(dst_port_te, TRUE);
- gtk_widget_set_sensitive(tag_lbl, FALSE);
- gtk_widget_set_sensitive(tag_te, FALSE);
- gtk_widget_set_sensitive(ppi_lbl, TRUE);
- gtk_widget_set_sensitive(ppi_te, TRUE);
- } else {
- gtk_widget_set_sensitive(src_port_lbl, FALSE);
- gtk_widget_set_sensitive(src_port_te, FALSE);
- gtk_widget_set_sensitive(dst_port_lbl, FALSE);
- gtk_widget_set_sensitive(dst_port_te, FALSE);
- gtk_widget_set_sensitive(ppi_lbl, FALSE);
- gtk_widget_set_sensitive(ppi_te, FALSE);
- }
-}
-
-/*****************************************************************************/
-
-static void
-file_import_open(text_import_info_t *info)
-{
- char *tmpname, *capfile_name;
- int err;
-
- /* pcapng defs */
- wtap_block_t shb_hdr;
- GArray *shb_hdrs = g_array_new(FALSE, FALSE, sizeof(wtap_block_t));
- wtapng_iface_descriptions_t *idb_inf;
- wtap_block_t int_data;
- wtapng_if_descr_mandatory_t *int_data_mand;
- GString *os_info_str;
- gsize opt_len;
- gchar *opt_str;
-
- /* Create data for SHB */
- os_info_str = g_string_new("");
- get_os_version_info(os_info_str);
-
- shb_hdr = wtap_block_create(WTAP_BLOCK_NG_SECTION);
-
- /* options */
- wtap_block_add_string_option_format(shb_hdr, OPT_COMMENT, "File created by File->Import of file %s", info->import_text_filename);
-
- /*
- * UTF-8 string containing the name of the operating system used to create
- * this section.
- */
- opt_len = os_info_str->len;
- opt_str = g_string_free(os_info_str, FALSE);
- if (opt_str) {
- wtap_block_add_string_option(shb_hdr, OPT_SHB_OS, opt_str, opt_len);
- g_free(opt_str);
- }
- /*
- * UTF-8 string containing the name of the application used to create
- * this section.
- */
- wtap_block_add_string_option_format(shb_hdr, OPT_SHB_USERAPPL, "Wireshark %s", get_ws_vcs_version_info());
-
- /* Create fake IDB info */
- idb_inf = g_new(wtapng_iface_descriptions_t,1);
- idb_inf->interface_data = g_array_new(FALSE, FALSE, sizeof(wtap_block_t));
-
- /* create the fake interface data */
- int_data = wtap_block_create(WTAP_BLOCK_IF_DESCR);
- int_data_mand = (wtapng_if_descr_mandatory_t*)wtap_block_get_mandatory_data(int_data);
- int_data_mand->wtap_encap = info->encapsulation;
- int_data_mand->time_units_per_second = 1000000; /* default microsecond resolution */
- int_data_mand->snap_len = WTAP_MAX_PACKET_SIZE_STANDARD;
- wtap_block_add_string_option(int_data, OPT_IDB_NAME, "Fake IF File->Import", strlen("Fake IF File->Import"));
-
- g_array_append_val(idb_inf->interface_data, int_data);
- g_array_append_val(shb_hdrs, shb_hdr);
-
- /* Use a random name for the temporary import buffer */
- info->wdh = wtap_dump_open_tempfile_ng(&tmpname, "import",
- WTAP_FILE_TYPE_SUBTYPE_PCAPNG,
- info->encapsulation,
- info->max_frame_length, FALSE,
- shb_hdrs, idb_inf, NULL, &err);
- capfile_name = g_strdup(tmpname);
- if (info->wdh == NULL) {
- cfile_dump_open_failure_alert_box(tmpname ? tmpname : "temporary file",
- err, WTAP_FILE_TYPE_SUBTYPE_PCAPNG);
- fclose(info->import_text_file);
- goto end;
- }
-
- err = text_import(info);
- if (err != 0) {
- failure_alert_box("Can't initialize scanner: %s", g_strerror(err));
- fclose(info->import_text_file);
- goto end;
- }
-
- if (fclose(info->import_text_file)) {
- read_failure_alert_box(info->import_text_filename, errno);
- }
-
- if (!wtap_dump_close(info->wdh, &err)) {
- cfile_close_failure_alert_box(capfile_name, err);
- }
-
- if (cf_open(&cfile, capfile_name, WTAP_TYPE_AUTO, TRUE /* temporary file */, &err) != CF_OK) {
- /* cf_open() put up a dialog box here */
- goto end;
- }
-
- switch (cf_read(&cfile, 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). */
- break;
- }
-
-end:
- g_free(info->import_text_filename);
- g_free(info->date_timestamp_format);
- g_free(info);
- g_free(capfile_name);
- wtap_block_array_free(shb_hdrs);
- wtap_free_idb_info(idb_inf);
- window_destroy(file_import_dlg_w);
-}
-
-static text_import_info_t *
-setup_file_import(GtkWidget *main_w)
-{
- GtkWidget *input_frm, *import_frm;
-
- text_import_info_t *text_import_info = (text_import_info_t *)g_malloc0(sizeof(text_import_info_t));
-
- /* Retrieve the input and import settings from the dialog */
-
- /* First the main components */
- input_frm = GTK_WIDGET(g_object_get_data(G_OBJECT(main_w), INPUT_FRM_KEY));
- import_frm = GTK_WIDGET(g_object_get_data(G_OBJECT(main_w), IMPORT_FRM_KEY));
-
- /* Then the input frame controls of interest */
- {
- GtkWidget *filename_te = GTK_WIDGET(g_object_get_data(G_OBJECT(input_frm), INPUT_FILENAME_TE_KEY));
- GtkWidget *offset_hex_rb = GTK_WIDGET(g_object_get_data(G_OBJECT(input_frm), INPUT_OFFSET_HEX_RB_KEY));
- GtkWidget *offset_oct_rb = GTK_WIDGET(g_object_get_data(G_OBJECT(input_frm), INPUT_OFFSET_OCT_RB_KEY));
- GtkWidget *offset_dec_rb = GTK_WIDGET(g_object_get_data(G_OBJECT(input_frm), INPUT_OFFSET_DEC_RB_KEY));
- GtkWidget *timefmt_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(input_frm), INPUT_DATETIME_CB_KEY));
- GtkWidget *timefmt_te = GTK_WIDGET(g_object_get_data(G_OBJECT(input_frm), INPUT_TIMEFMT_TE_KEY));
- GtkWidget *dir_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(input_frm), INPUT_DIR_CB_KEY));
-
- text_import_info->import_text_filename = g_strdup(gtk_entry_get_text(GTK_ENTRY(filename_te)));
-
- /* Try to open the input file */
- text_import_info->import_text_file = ws_fopen(text_import_info->import_text_filename, "rb");
- if (!text_import_info->import_text_file) {
- open_failure_alert_box(text_import_info->import_text_filename, errno, FALSE);
- g_free(text_import_info->import_text_filename);
- g_free(text_import_info->date_timestamp_format);
- g_free(text_import_info);
- return NULL;
- }
-
- text_import_info->offset_type =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(offset_hex_rb)) ? OFFSET_HEX :
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(offset_oct_rb)) ? OFFSET_OCT :
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(offset_dec_rb)) ? OFFSET_DEC :
- OFFSET_NONE;
- text_import_info->date_timestamp = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(timefmt_cb));
- text_import_info->date_timestamp_format = g_strdup(gtk_entry_get_text(GTK_ENTRY(timefmt_te)));
- text_import_info->has_direction = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dir_cb));
- }
-
- /* Then the import frame controls of interest */
- {
- GtkWidget *encap_co = GTK_WIDGET(g_object_get_data(G_OBJECT(import_frm), IMPORT_ENCAP_CO_KEY));
- GtkWidget *header_frm = GTK_WIDGET(g_object_get_data(G_OBJECT(import_frm), IMPORT_HEADER_FRM_KEY));
- GtkWidget *framelen_te = GTK_WIDGET(g_object_get_data(G_OBJECT(import_frm), IMPORT_FRAME_LENGTH_TE_KEY));
-
- /* Then the header frame controls of interest */
- GtkWidget *header_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(header_frm), IMPORT_HEADER_CB_KEY));
-
- GtkWidget *header_eth_rb = GTK_WIDGET(g_object_get_data(G_OBJECT(header_frm), IMPORT_HEADER_ETH_RB_KEY));
- GtkWidget *header_ipv4_rb = GTK_WIDGET(g_object_get_data(G_OBJECT(header_frm), IMPORT_HEADER_IPV4_RB_KEY));
- GtkWidget *header_udp_rb = GTK_WIDGET(g_object_get_data(G_OBJECT(header_frm), IMPORT_HEADER_UDP_RB_KEY));
- GtkWidget *header_tcp_rb = GTK_WIDGET(g_object_get_data(G_OBJECT(header_frm), IMPORT_HEADER_TCP_RB_KEY));
- GtkWidget *header_sctp_rb = GTK_WIDGET(g_object_get_data(G_OBJECT(header_frm), IMPORT_HEADER_SCTP_RB_KEY));
- GtkWidget *header_sctp_data_rb = GTK_WIDGET(g_object_get_data(G_OBJECT(header_frm), IMPORT_HEADER_SCTP_D_RB_KEY));
-
- GtkWidget *etype_te = GTK_WIDGET(g_object_get_data(G_OBJECT(header_frm), IMPORT_HEADER_ETYPE_TE_KEY));
- GtkWidget *protocol_te = GTK_WIDGET(g_object_get_data(G_OBJECT(header_frm), IMPORT_HEADER_PROT_TE_KEY));
- GtkWidget *src_port_te = GTK_WIDGET(g_object_get_data(G_OBJECT(header_frm), IMPORT_HEADER_SRC_PORT_TE_KEY));
- GtkWidget *dst_port_te = GTK_WIDGET(g_object_get_data(G_OBJECT(header_frm), IMPORT_HEADER_DST_PORT_TE_KEY));
- GtkWidget *tag_te = GTK_WIDGET(g_object_get_data(G_OBJECT(header_frm), IMPORT_HEADER_TAG_TE_KEY));
- GtkWidget *ppi_te = GTK_WIDGET(g_object_get_data(G_OBJECT(header_frm), IMPORT_HEADER_PPI_TE_KEY));
-
- GtkTreeIter iter;
-
- if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(encap_co), &iter)) {
- GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(encap_co));
- gtk_tree_model_get(model, &iter, 1, &text_import_info->encapsulation, -1);
- }
-
- if ((text_import_info->encapsulation == WTAP_ENCAP_ETHERNET) &&
- (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(header_cb)))) {
- text_import_info->dummy_header_type =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(header_eth_rb)) ? HEADER_ETH :
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(header_ipv4_rb)) ? HEADER_IPV4 :
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(header_udp_rb)) ? HEADER_UDP :
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(header_tcp_rb)) ? HEADER_TCP :
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(header_sctp_rb)) ? HEADER_SCTP :
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(header_sctp_data_rb)) ? HEADER_SCTP_DATA :
- HEADER_NONE;
-
- switch (text_import_info->dummy_header_type) {
- case HEADER_ETH:
- text_import_info->pid = (guint) strtol(gtk_entry_get_text(GTK_ENTRY(etype_te)), NULL, 16);
- if (text_import_info->pid > 0xffff) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The Ethertype (%x) is too large.",
- text_import_info->pid);
- g_free(text_import_info->import_text_filename);
- fclose(text_import_info->import_text_file);
- g_free(text_import_info->date_timestamp_format);
- g_free(text_import_info);
- return NULL;
- }
- break;
-
- case HEADER_IPV4:
- text_import_info->protocol = (guint) strtol(gtk_entry_get_text(GTK_ENTRY(protocol_te)), NULL, 10);
- if (text_import_info->protocol > 0xff) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The IPv4 protocol (%u) is too large.",
- text_import_info->protocol);
- g_free(text_import_info->import_text_filename);
- fclose(text_import_info->import_text_file);
- g_free(text_import_info->date_timestamp_format);
- g_free(text_import_info);
- return NULL;
- }
- break;
-
- case HEADER_UDP:
- case HEADER_TCP:
- text_import_info->src_port = (guint) strtol(gtk_entry_get_text(GTK_ENTRY(src_port_te)), NULL, 10);
- if (text_import_info->src_port > 0xffff) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The source port (%u) is too large.",
- text_import_info->src_port);
- g_free(text_import_info->import_text_filename);
- fclose(text_import_info->import_text_file);
- g_free(text_import_info->date_timestamp_format);
- g_free(text_import_info);
- return NULL;
- }
- text_import_info->dst_port = (guint) strtol(gtk_entry_get_text(GTK_ENTRY(dst_port_te)), NULL, 10);
- if (text_import_info->dst_port > 0xffff) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The destination port (%u) is too large.",
- text_import_info->dst_port);
- g_free(text_import_info->import_text_filename);
- fclose(text_import_info->import_text_file);
- g_free(text_import_info->date_timestamp_format);
- g_free(text_import_info);
- return NULL;
- }
- break;
-
- case HEADER_SCTP:
- text_import_info->src_port = (guint) strtol(gtk_entry_get_text(GTK_ENTRY(src_port_te)), NULL, 10);
- if (text_import_info->src_port > 0xffff) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The source port (%u) is too large.",
- text_import_info->src_port);
- g_free(text_import_info->import_text_filename);
- fclose(text_import_info->import_text_file);
- g_free(text_import_info->date_timestamp_format);
- g_free(text_import_info);
- return NULL;
- }
- text_import_info->dst_port = (guint) strtol(gtk_entry_get_text(GTK_ENTRY(dst_port_te)), NULL, 10);
- if (text_import_info->dst_port > 0xffff) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The destination port (%u) is too large.",
- text_import_info->dst_port);
- g_free(text_import_info->import_text_filename);
- fclose(text_import_info->import_text_file);
- g_free(text_import_info->date_timestamp_format);
- g_free(text_import_info);
- return NULL;
- }
- text_import_info->tag = (guint) strtol(gtk_entry_get_text(GTK_ENTRY(tag_te)), NULL, 10);
- break;
-
- case HEADER_SCTP_DATA:
- text_import_info->src_port = (guint) strtol(gtk_entry_get_text(GTK_ENTRY(src_port_te)), NULL, 10);
- if (text_import_info->src_port > 0xffff) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The source port (%u) is too large.",
- text_import_info->src_port);
- g_free(text_import_info->import_text_filename);
- fclose(text_import_info->import_text_file);
- g_free(text_import_info->date_timestamp_format);
- g_free(text_import_info);
- return NULL;
- }
- text_import_info->dst_port = (guint) strtol(gtk_entry_get_text(GTK_ENTRY(dst_port_te)), NULL, 10);
- if (text_import_info->dst_port > 0xffff) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The destination port (%u) is too large.",
- text_import_info->dst_port);
- g_free(text_import_info->import_text_filename);
- fclose(text_import_info->import_text_file);
- g_free(text_import_info->date_timestamp_format);
- g_free(text_import_info);
- return NULL;
- }
- text_import_info->ppi = (guint) strtol(gtk_entry_get_text(GTK_ENTRY(ppi_te)), NULL, 10);
- break;
-
- default:
- break;
- }
- } else {
- text_import_info->dummy_header_type = HEADER_NONE;
- }
-
- text_import_info->max_frame_length = (guint)strtol(gtk_entry_get_text(GTK_ENTRY(framelen_te)), NULL, 10);
- if (text_import_info->max_frame_length == 0) {
- text_import_info->max_frame_length = IMPORT_MAX_PACKET;
- } else if (text_import_info->max_frame_length > IMPORT_MAX_PACKET) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The maximum frame length (%u) is too long.",
- text_import_info->max_frame_length);
- g_free(text_import_info->import_text_filename);
- fclose(text_import_info->import_text_file);
- g_free(text_import_info->date_timestamp_format);
- g_free(text_import_info);
- return NULL;
- }
- }
-
- return text_import_info;
-}
-
-/*****************************************************************************/
-
-static void
-file_import_ok_cb(GtkWidget *widget _U_, gpointer data)
-{
- text_import_info_t *text_import_info;
-
- /* If there's unsaved data, let the user save it first.
- If they cancel out of it, don't open the file. */
- if (do_file_close(&cfile, FALSE, " before opening a new capture file")) {
- /* open the new file */
- text_import_info = setup_file_import((GtkWidget *)data);
- if (text_import_info) {
- file_import_open(text_import_info);
- }
- }
-}
-
-static void
-set_default_encap(GtkWidget *encap_co, guint default_encap)
-{
- gboolean result;
- GtkTreeIter iter;
- GtkTreeModel *model;
- gboolean more_items = TRUE;
- guint encap_value;
-
- gtk_combo_box_set_active(GTK_COMBO_BOX(encap_co), 0);
- result = gtk_combo_box_get_active_iter(GTK_COMBO_BOX(encap_co), &iter);
- if (result) {
- model = gtk_combo_box_get_model(GTK_COMBO_BOX(encap_co));
- do {
- gtk_tree_model_get(model, &iter, ENCAP_VALUE_COLUMN, &encap_value, -1);
- if (encap_value == default_encap) {
- gtk_combo_box_set_active_iter(GTK_COMBO_BOX(encap_co), &iter);
- more_items = FALSE;
- }
- else
- more_items = gtk_tree_model_iter_next(model, &iter);
- } while (more_items);
- }
-}
-
-/*****************************************************************************/
-
-/*
- * Dialog creator
- */
-static GtkWidget *
-file_import_dlg_new(void)
-{
- GtkWidget *main_w, *main_vb,
- *input_frm, *input_grid, *input_vb,
- *filename_lbl, *filename_te, *browse_bt,
- *offset_lbl, *offset_rb_vb,
- *offset_hex_rb, *offset_oct_rb, *offset_dec_rb,
- *timefmt_hb, *timefmt_cb, *timefmt_lbl, *timefmt_te,
- *dir_hb, *dir_cb,
- *import_frm, *import_vb,
- *encap_hb, *encap_lbl, *encap_co,
- *header_cb, *header_frm, *header_hb,
- *header_eth_rb, *header_ipv4_rb, *header_udp_rb,
- *header_tcp_rb, *header_sctp_rb, *header_sctp_data_rb,
- *header_rblbl_vb,
- *header_rblbl_1_hb, *header_rblbl_1_lbl,
- *header_rblbl_2_hb, *header_rblbl_2_lbl,
- *header_rblbl_3_hb, *header_rblbl_3_lbl,
- *header_rblbl_4_hb, *header_rblbl_4_lbl,
- *header_rblbl_5_hb, *header_rblbl_5_lbl,
- *header_rblbl_6_hb, *header_rblbl_6_lbl,
- *etype_te, *protocol_te, *src_port_te,
- *dst_port_te, *tag_te, *ppi_te,
- *framelen_hb, *framelen_lbl, *framelen_te,
- *bbox, *help_bt, *close_bt, *ok_bt;
- gchar *maxsize_msg;
-
- /* Setup the dialog */
-
- main_w = dlg_window_new("Wireshark: Import from Hex Dump");
- gtk_window_set_default_size(GTK_WINDOW(main_w), 400, 300);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 3);
- gtk_container_add(GTK_CONTAINER(main_w), main_vb);
-
- /* Setup the input frame */
-
- input_frm = gtk_frame_new("Input");
- gtk_box_pack_start(GTK_BOX(main_vb), input_frm, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(main_w), INPUT_FRM_KEY, input_frm);
-
- input_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(input_frm), input_vb);
-
- input_grid = ws_gtk_grid_new();
- gtk_container_set_border_width(GTK_CONTAINER(input_grid), 5);
- gtk_box_pack_start(GTK_BOX(input_vb), input_grid, FALSE, FALSE, 0);
- ws_gtk_grid_set_row_spacing(GTK_GRID(input_grid), 5);
- ws_gtk_grid_set_column_spacing(GTK_GRID(input_grid), 5);
-
- /* Filename */
- filename_lbl = gtk_label_new("Filename:");
- ws_gtk_grid_attach(GTK_GRID(input_grid), filename_lbl, 0, 0, 1, 1);
-
- filename_te = gtk_entry_new();
- gtk_widget_set_tooltip_text(filename_te, "Set name of text file to import");
- ws_gtk_grid_attach_defaults(GTK_GRID(input_grid), filename_te, 1, 0, 1, 1);
-
- g_object_set_data(G_OBJECT(input_frm), INPUT_FILENAME_TE_KEY, filename_te);
-
- browse_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_BROWSE);
- gtk_widget_set_tooltip_text(browse_bt, "Browse for text file to import");
- ws_gtk_grid_attach(GTK_GRID(input_grid), browse_bt, 2, 0, 1, 1);
-
- g_signal_connect(browse_bt, "clicked", G_CALLBACK(browse_file_cb), filename_te);
-
- /* Offsets */
-
- offset_lbl = gtk_label_new("Offsets:");
- gtk_misc_set_alignment(GTK_MISC(offset_lbl), 1.0f, 0.0f);
- ws_gtk_grid_attach(GTK_GRID(input_grid), offset_lbl, 0, 1, 1, 1);
-
- offset_rb_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- ws_gtk_grid_attach_defaults(GTK_GRID(input_grid), offset_rb_vb, 1, 1, 1, 1);
-
- /* First entry in the group */
- offset_hex_rb = gtk_radio_button_new_with_label(NULL, "Hexadecimal");
- gtk_widget_set_tooltip_text(offset_hex_rb, "Offsets in the text file are in hexadecimal notation");
- gtk_box_pack_start(GTK_BOX(offset_rb_vb), offset_hex_rb, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(input_frm), INPUT_OFFSET_HEX_RB_KEY, offset_hex_rb);
-
- offset_oct_rb = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(offset_hex_rb), "Octal");
- gtk_widget_set_tooltip_text(offset_oct_rb, "Offsets in the text file are in octal notation");
- gtk_box_pack_start(GTK_BOX(offset_rb_vb), offset_oct_rb, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(input_frm), INPUT_OFFSET_OCT_RB_KEY, offset_oct_rb);
-
- offset_dec_rb = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(offset_hex_rb), "Decimal");
- gtk_widget_set_tooltip_text(offset_dec_rb, "Offsets in the text file are in decimal notation");
- gtk_box_pack_start(GTK_BOX(offset_rb_vb), offset_dec_rb, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(input_frm), INPUT_OFFSET_DEC_RB_KEY, offset_dec_rb);
-
- /* Time format */
- timefmt_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(timefmt_hb), 3);
- gtk_box_pack_start(GTK_BOX(input_vb), timefmt_hb, FALSE, FALSE, 0);
-
- timefmt_cb = gtk_check_button_new_with_label("Date/Time");
- gtk_widget_set_tooltip_text(timefmt_cb, "Whether or not the text file contains timestamp information");
- gtk_box_pack_start(GTK_BOX(timefmt_hb), timefmt_cb, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(input_frm), INPUT_DATETIME_CB_KEY, timefmt_cb);
-
- timefmt_lbl = gtk_label_new(" Format:");
- gtk_box_pack_start(GTK_BOX(timefmt_hb), timefmt_lbl, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(timefmt_cb), INPUT_TIMEFMT_LBL_KEY, timefmt_lbl);
-
- timefmt_te = gtk_entry_new();
- gtk_entry_set_text(GTK_ENTRY(timefmt_te), "%F %T.");
- gtk_widget_set_tooltip_text(timefmt_te,
- "The format in which to parse timestamps in the text file (eg. %F %T.)."
- " Format specifiers are based on strptime(3)");
- gtk_box_pack_start(GTK_BOX(timefmt_hb), timefmt_te, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(timefmt_cb), INPUT_TIMEFMT_TE_KEY, timefmt_te);
- g_object_set_data(G_OBJECT(input_frm), INPUT_TIMEFMT_TE_KEY, timefmt_te);
-
- g_signal_connect(timefmt_cb, "toggled", G_CALLBACK(timefmt_cb_toggle), NULL);
- g_signal_emit_by_name(G_OBJECT(timefmt_cb), "toggled", NULL);
-
- /* Direction indication */
- dir_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(dir_hb), 3);
- gtk_box_pack_start(GTK_BOX(input_vb), dir_hb, FALSE, FALSE, 0);
-
- dir_cb = gtk_check_button_new_with_label("Direction indication");
- gtk_widget_set_tooltip_text(dir_cb, "Whether or not the file contains information indicating the direction "
- " (inbound or outbound) of the packet");
- gtk_box_pack_start(GTK_BOX(dir_hb), dir_cb, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(input_frm), INPUT_DIR_CB_KEY, dir_cb);
-
- /* Setup the import frame */
-
- import_frm = gtk_frame_new("Import");
- gtk_box_pack_start(GTK_BOX(main_vb), import_frm, TRUE, TRUE, 3);
-
- g_object_set_data(G_OBJECT(main_w), IMPORT_FRM_KEY, import_frm);
-
- import_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(import_frm), import_vb);
-
- /* Encapsulation */
- encap_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(encap_hb), 3);
- gtk_box_pack_start(GTK_BOX(import_vb), encap_hb, FALSE, FALSE, 0);
-
- encap_lbl = gtk_label_new("Encapsulation type:");
- gtk_box_pack_start(GTK_BOX(encap_hb), encap_lbl, FALSE, FALSE, 0);
-
- encap_co = fill_encap_combo();
- gtk_widget_set_tooltip_text(encap_co, "Encapsulation type for the frames in the import capture file");
- gtk_box_pack_start(GTK_BOX(encap_hb), encap_co, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(import_frm), IMPORT_ENCAP_CO_KEY, encap_co);
-
- /* Dummy header */
- header_frm = gtk_frame_new(NULL);
- header_cb = gtk_check_button_new_with_label("Dummy header");
- gtk_widget_set_tooltip_text(header_cb, "Whether or not to prefix a dummy header to the frames");
- gtk_frame_set_label_widget(GTK_FRAME(header_frm), header_cb);
- gtk_container_set_border_width(GTK_CONTAINER(header_frm), 3);
- gtk_box_pack_start(GTK_BOX(import_vb), header_frm, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(import_frm), IMPORT_HEADER_FRM_KEY, header_frm);
- g_object_set_data(G_OBJECT(header_frm), IMPORT_HEADER_CB_KEY, header_cb);
-
- header_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(header_hb), 3);
- gtk_container_add(GTK_CONTAINER(header_frm), header_hb);
-
- header_rblbl_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(header_hb), header_rblbl_vb, TRUE, TRUE, 0);
-
- /* Line 1 */
- header_rblbl_1_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(header_rblbl_vb), header_rblbl_1_hb, FALSE, FALSE, 2);
-
- /* First entry in the group */
- header_eth_rb = gtk_radio_button_new_with_label(NULL, "Ethernet");
- gtk_widget_set_tooltip_text(header_eth_rb, "Prefix an Ethernet header to the frames");
- g_signal_connect(header_eth_rb, "toggled", G_CALLBACK(header_eth_rb_toggle), header_frm);
- gtk_box_pack_start(GTK_BOX(header_rblbl_1_hb), header_eth_rb, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(header_frm), IMPORT_HEADER_ETH_RB_KEY, header_eth_rb);
-
- header_rblbl_1_lbl = gtk_label_new(" Ethertype (hex):");
- gtk_box_pack_start(GTK_BOX(header_rblbl_1_hb), header_rblbl_1_lbl, TRUE, TRUE, 0);
- gtk_misc_set_alignment(GTK_MISC(header_rblbl_1_lbl), 1.0f, 0.5f);
-
- etype_te = gtk_entry_new();
- gtk_widget_set_tooltip_text(etype_te, "The type to set in the Ethernet header");
- gtk_box_pack_end(GTK_BOX(header_rblbl_1_hb), etype_te, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(header_frm), IMPORT_HEADER_ETYPE_LBL_KEY, header_rblbl_1_lbl);
- g_object_set_data(G_OBJECT(header_frm), IMPORT_HEADER_ETYPE_TE_KEY, etype_te);
-
- /* Line 2 */
- header_rblbl_2_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(header_rblbl_vb), header_rblbl_2_hb, FALSE, FALSE, 2);
-
- header_ipv4_rb = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(header_eth_rb), "IPv4");
- gtk_widget_set_tooltip_text(header_ipv4_rb, "Prefix an Ethernet and IPv4 header to the frames");
- g_signal_connect(header_ipv4_rb, "toggled", G_CALLBACK(header_ipv4_rb_toggle), header_frm);
- gtk_box_pack_start(GTK_BOX(header_rblbl_2_hb), header_ipv4_rb, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(header_frm), IMPORT_HEADER_IPV4_RB_KEY, header_ipv4_rb);
-
- header_rblbl_2_lbl = gtk_label_new(" Protocol (dec):");
- gtk_box_pack_start(GTK_BOX(header_rblbl_2_hb), header_rblbl_2_lbl, TRUE, TRUE, 0);
- gtk_misc_set_alignment(GTK_MISC(header_rblbl_2_lbl), 1.0f, 0.5f);
-
- protocol_te = gtk_entry_new();
- gtk_widget_set_tooltip_text(protocol_te, "The protocol id to set in the IPv4 header");
- gtk_box_pack_end(GTK_BOX(header_rblbl_2_hb), protocol_te, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(header_frm), IMPORT_HEADER_PROT_LBL_KEY, header_rblbl_2_lbl);
- g_object_set_data(G_OBJECT(header_frm), IMPORT_HEADER_PROT_TE_KEY, protocol_te);
-
- /* Line 3 */
- header_rblbl_3_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(header_rblbl_vb), header_rblbl_3_hb, FALSE, FALSE, 2);
-
- header_udp_rb = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(header_eth_rb), "UDP");
- gtk_widget_set_tooltip_text(header_udp_rb, "Prefix an Ethernet, IPv4 and UDP header to the frames");
- g_signal_connect(header_udp_rb, "toggled", G_CALLBACK(header_udp_rb_toggle), header_frm);
- gtk_box_pack_start(GTK_BOX(header_rblbl_3_hb), header_udp_rb, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(header_frm), IMPORT_HEADER_UDP_RB_KEY, header_udp_rb);
-
- header_rblbl_3_lbl = gtk_label_new(" Source port:");
- gtk_box_pack_start(GTK_BOX(header_rblbl_3_hb), header_rblbl_3_lbl, TRUE, TRUE, 0);
- gtk_misc_set_alignment(GTK_MISC(header_rblbl_3_lbl), 1.0f, 0.5f);
-
- src_port_te = gtk_entry_new();
- gtk_widget_set_tooltip_text(src_port_te, "The source port to set in the UDP, TCP or SCTP header");
- gtk_box_pack_end(GTK_BOX(header_rblbl_3_hb), src_port_te, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(header_frm), IMPORT_HEADER_SRC_PORT_LBL_KEY, header_rblbl_3_lbl);
- g_object_set_data(G_OBJECT(header_frm), IMPORT_HEADER_SRC_PORT_TE_KEY, src_port_te);
-
- /* Line 4 */
- header_rblbl_4_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(header_rblbl_vb), header_rblbl_4_hb, FALSE, FALSE, 2);
-
- header_tcp_rb = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(header_eth_rb), "TCP");
- gtk_widget_set_tooltip_text(header_tcp_rb, "Prefix an Ethernet, IPv4 and TCP header to the frames");
- g_signal_connect(header_tcp_rb, "toggled", G_CALLBACK(header_tcp_rb_toggle), header_frm);
- gtk_box_pack_start(GTK_BOX(header_rblbl_4_hb), header_tcp_rb, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(header_frm), IMPORT_HEADER_TCP_RB_KEY, header_tcp_rb);
-
- header_rblbl_4_lbl = gtk_label_new(" Destination port:");
- gtk_box_pack_start(GTK_BOX(header_rblbl_4_hb), header_rblbl_4_lbl, TRUE, TRUE, 0);
- gtk_misc_set_alignment(GTK_MISC(header_rblbl_4_lbl), 1.0f, 0.5f);
-
- dst_port_te = gtk_entry_new();
- gtk_widget_set_tooltip_text(dst_port_te, "The destination port to set in the UDP, TCP or SCTP header");
- gtk_box_pack_end(GTK_BOX(header_rblbl_4_hb), dst_port_te, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(header_frm), IMPORT_HEADER_DST_PORT_LBL_KEY, header_rblbl_4_lbl);
- g_object_set_data(G_OBJECT(header_frm), IMPORT_HEADER_DST_PORT_TE_KEY, dst_port_te);
-
- /* Line 5 */
- header_rblbl_5_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(header_rblbl_vb), header_rblbl_5_hb, FALSE, FALSE, 2);
-
- header_sctp_rb = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(header_eth_rb), "SCTP");
- gtk_widget_set_tooltip_text(header_sctp_rb, "Prefix an Ethernet, IPv4 and SCTP header to the frames");
- g_signal_connect(header_sctp_rb, "toggled", G_CALLBACK(header_sctp_rb_toggle), header_frm);
- gtk_box_pack_start(GTK_BOX(header_rblbl_5_hb), header_sctp_rb, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(header_frm), IMPORT_HEADER_SCTP_RB_KEY, header_sctp_rb);
-
- header_rblbl_5_lbl = gtk_label_new(" Tag:");
- gtk_box_pack_start(GTK_BOX(header_rblbl_5_hb), header_rblbl_5_lbl, TRUE, TRUE, 0);
- gtk_misc_set_alignment(GTK_MISC(header_rblbl_5_lbl), 1.0f, 0.5f);
-
- tag_te = gtk_entry_new();
- gtk_widget_set_tooltip_text(tag_te, "The verification tag to set in the SCTP header");
- gtk_box_pack_end(GTK_BOX(header_rblbl_5_hb), tag_te, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(header_frm), IMPORT_HEADER_TAG_LBL_KEY, header_rblbl_5_lbl);
- g_object_set_data(G_OBJECT(header_frm), IMPORT_HEADER_TAG_TE_KEY, tag_te);
-
- /* Line 6 */
- header_rblbl_6_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(header_rblbl_vb), header_rblbl_6_hb, FALSE, FALSE, 2);
-
- header_sctp_data_rb = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(header_eth_rb), "SCTP (DATA)");
- gtk_widget_set_tooltip_text(header_sctp_data_rb, "Prefix an Ethernet, IPv4 and SCTP DATA header to the frames");
- g_signal_connect(header_sctp_data_rb, "toggled", G_CALLBACK(header_sctp_data_rb_toggle), header_frm);
- gtk_box_pack_start(GTK_BOX(header_rblbl_6_hb), header_sctp_data_rb, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(header_frm), IMPORT_HEADER_SCTP_D_RB_KEY, header_sctp_data_rb);
-
- header_rblbl_6_lbl = gtk_label_new(" PPI:");
- gtk_box_pack_start(GTK_BOX(header_rblbl_6_hb), header_rblbl_6_lbl, TRUE, TRUE, 0);
- gtk_misc_set_alignment(GTK_MISC(header_rblbl_6_lbl), 1.0f, 0.5f);
-
- ppi_te = gtk_entry_new();
- gtk_widget_set_tooltip_text(ppi_te, "The payload protocol identifier to set in the SCTP DATA header");
- gtk_box_pack_end(GTK_BOX(header_rblbl_6_hb), ppi_te, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(header_frm), IMPORT_HEADER_PPI_LBL_KEY, header_rblbl_6_lbl);
- g_object_set_data(G_OBJECT(header_frm), IMPORT_HEADER_PPI_TE_KEY, ppi_te);
-
- /* Set sensitivity */
- g_signal_connect(header_cb, "toggled", G_CALLBACK(header_cb_toggle), header_frm);
- g_signal_emit_by_name(G_OBJECT(header_cb), "toggled", header_frm);
-
- g_signal_emit_by_name(G_OBJECT(header_eth_rb), "toggled", header_frm);
- set_default_encap(encap_co, WTAP_ENCAP_ETHERNET);
- g_signal_connect(encap_co, "changed", G_CALLBACK(encap_co_changed), header_frm);
-
- /* Frame length */
- framelen_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(framelen_hb), 3);
- gtk_box_pack_start(GTK_BOX(import_vb), framelen_hb, FALSE, FALSE, 0);
-
- framelen_lbl = gtk_label_new("Max. frame length:");
- gtk_box_pack_start(GTK_BOX(framelen_hb), framelen_lbl, FALSE, FALSE, 0);
-
- framelen_te = gtk_entry_new();
- maxsize_msg = g_strdup_printf("The maximum size of the frames to write to the import capture file (max %u)",
- WTAP_MAX_PACKET_SIZE_STANDARD);
- gtk_widget_set_tooltip_text(framelen_te, maxsize_msg);
- g_free(maxsize_msg);
- gtk_box_pack_start(GTK_BOX(framelen_hb), framelen_te, FALSE, FALSE, 0);
-
- g_object_set_data(G_OBJECT(import_frm), IMPORT_FRAME_LENGTH_TE_KEY, framelen_te);
-
- /* Setup the button row */
-
- bbox = dlg_button_row_new(GTK_STOCK_HELP, GTK_STOCK_OK, GTK_STOCK_CANCEL, NULL);
- gtk_box_pack_end(GTK_BOX(main_vb), bbox, FALSE, FALSE, 3);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_IMPORT_DIALOG);
- gtk_widget_set_tooltip_text(help_bt, "Show topic specific help");
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- window_set_cancel_button(main_w, close_bt, window_cancel_button_cb);
- gtk_widget_set_tooltip_text(close_bt, "Close this dialog");
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(file_import_ok_cb), main_w);
- gtk_widget_grab_default(ok_bt);
- gtk_widget_set_tooltip_text(ok_bt, "Import the selected file into a temporary capture file");
-
- /* Setup widget handling */
-
- g_signal_connect(main_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(main_w, "destroy", G_CALLBACK(file_import_dlg_destroy_cb), NULL);
-
- gtk_widget_show_all(main_w);
- window_present(main_w);
-
- return main_w;
-}
-
-void
-file_import_cmd_cb(GtkWidget *widget _U_)
-{
- /* Do we have an encapsulation type list? */
- if (!encap_list_store) {
- /* No. Create one. */
- create_encap_list_store();
- }
-
- /* Has a file import dialog already been opened? */
- if (file_import_dlg_w) {
- /* Yes. Just re-activate that dialog box. */
- reactivate_window(file_import_dlg_w);
- } else {
- /* No. Create one */
- file_import_dlg_w = file_import_dlg_new();
- }
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/file_import_dlg.h b/ui/gtk/file_import_dlg.h
deleted file mode 100644
index de65977eff..0000000000
--- a/ui/gtk/file_import_dlg.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* file_import_dlg.h
- * Definitions for file import dialog box
- * November 2010, Jaap Keuter <jaap.keuter@xs4all.nl>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __FILE_IMPORT_DLG_H__
-#define __FILE_IMPORT_DLG_H__
-
-void file_import_cmd_cb(GtkWidget *widget);
-void file_import_txt_buf_cb(GtkWidget *widget);
-
-#endif /* file_import_dlg.h */
diff --git a/ui/gtk/fileset_dlg.c b/ui/gtk/fileset_dlg.c
deleted file mode 100644
index 027d945afa..0000000000
--- a/ui/gtk/fileset_dlg.c
+++ /dev/null
@@ -1,414 +0,0 @@
-/* fileset_dlg.c
- * Routines for the file set dialog
- *
- * 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"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <wsutil/filesystem.h>
-#include <wsutil/str_util.h>
-
-#include "../../fileset.h"
-
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/menus.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/fileset_dlg.h"
-#include "ui/gtk/old-gtk-compat.h"
-
-#include "globals.h"
-
-/*
- * Keep a static pointer to the current "File Set" window, if
- * any, so that if somebody tries to do "File Set" while there's
- * already a "File Set" window up, we just pop up the existing
- * one, rather than creating a new one.
- */
-static GtkWidget *fs_w;
-
-
-
-/* various widget related global data */
-static int row;
-static GtkWidget *fs_grid;
-static GtkWidget *fs_sw;
-static GtkWidget *fs_dir_lb;
-static GtkWidget *fs_first_rb;
-static GtkWidget *fs_grid_vb;
-
-
-
-/* open the file corresponding to the given fileset entry */
-static void
-fs_open_entry(fileset_entry *entry)
-{
- char *fname;
- int err;
-
-
- /* make a copy of the filename (cf_close will indirectly destroy it right now) */
- fname = g_strdup(entry->fullname);
-
- /* close the old and open the new file */
- cf_close(&cfile);
- if (cf_open(&cfile, fname, WTAP_TYPE_AUTO, FALSE, &err) == CF_OK) {
- cf_read(&cfile, FALSE);
- }
-
- g_free(fname);
-}
-
-
-/* radio button was pressed/released */
-static void
-fs_rb_cb(GtkWidget *open_bt, gpointer fs_data)
-{
- fileset_entry *entry = (fileset_entry *)fs_data;
-
- /* button release should have no effect */
- if (!gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(open_bt) )) {
- return;
- }
-
- fs_open_entry(entry);
-}
-
-
-/* the window was closed, cleanup things */
-static void
-fs_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
-{
- /* Note that we no longer have a "File Set" dialog box. */
- fs_w = NULL;
-}
-
-
-/* get creation date (converted from filename) */
-/* */
-static char *
-fileset_dlg_name2date_dup(const char * name) {
- char *pfx;
- char *filename;
- size_t pos;
-
-
- /* just to be sure ... */
- if (!fileset_filename_match_pattern(name)) {
- return NULL;
- }
-
- /* find char position behind the last underscore */
- pfx = strrchr(name, '_');
- pfx++;
- pos = pfx - name;
-
- /* Start conversion behind that underscore */
- /* http://en.wikipedia.org/wiki/ISO_8601 */
- filename = g_strdup_printf("%c%c%c%c-%c%c-%c%c %c%c:%c%c:%c%c",
- /* year */ name[pos] , name[pos+1], name[pos+2], name[pos+3],
- /* month */ name[pos+4], name[pos+5],
- /* day */ name[pos+6], name[pos+7],
- /* hour */ name[pos+8], name[pos+9],
- /* min */ name[pos+10], name[pos+11],
- /* second */ name[pos+12], name[pos+13]);
-
- return filename;
-}
-
-
-/* this file is a part of the current file set, add it to the dialog */
-void
-fileset_dlg_add_file(fileset_entry *entry, void *window _U_) {
- char *created;
- char *modified;
- char *size;
- struct tm *local;
- GtkWidget *fs_lb;
- GtkWidget *fs_rb;
- gchar *title;
-
-
- if (fs_w == NULL) {
- return;
- }
-
- created = fileset_dlg_name2date_dup(entry->name);
- if (!created) {
- /* if this file doesn't follow the file set pattern, */
- /* use the creation time of that file if available */
- /*
- * macOS provides 0 if the file system doesn't support the
- * creation time; FreeBSD provides -1.
- *
- * If this OS doesn't provide the creation time with stat(),
- * it will be 0.
- */
- if (entry->ctime > 0) {
- local = localtime(&entry->ctime);
- if (local != NULL) {
- created = g_strdup_printf("%04u-%02u-%02u %02u:%02u:%02u",
- local->tm_year+1900, local->tm_mon+1, local->tm_mday,
- local->tm_hour, local->tm_min, local->tm_sec);
- } else {
- created = g_strdup("Time not representable");
- }
- } else
- created = g_strdup("Not available");
- }
-
- local = localtime(&entry->mtime);
- if (local != NULL) {
- modified = g_strdup_printf("%04u-%02u-%02u %02u:%02u:%02u",
- local->tm_year+1900, local->tm_mon+1, local->tm_mday,
- local->tm_hour, local->tm_min, local->tm_sec);
- } else {
- modified = g_strdup("Time not representable");
- }
- size = g_strdup_printf("%" G_GINT64_MODIFIER "d Bytes", entry->size);
-
- fs_rb = gtk_radio_button_new_with_label_from_widget(
- fs_first_rb ? GTK_RADIO_BUTTON(fs_first_rb) : NULL, entry->name);
- if (row == 1) {
- fs_first_rb = fs_rb;
- }
- if (entry->current) {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (fs_rb), entry->current);
- }
- gtk_widget_set_tooltip_text(fs_rb, "Open this capture file");
- ws_gtk_grid_attach_extended(GTK_GRID(fs_grid), fs_rb, 0, row, 1, 1, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
- g_signal_connect(fs_rb, "toggled", G_CALLBACK(fs_rb_cb), entry);
- gtk_widget_show(fs_rb);
-
- fs_lb = gtk_label_new(created);
- ws_gtk_grid_attach_extended(GTK_GRID(fs_grid), fs_lb, 1, row, 1, 1, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
- gtk_widget_set_sensitive(fs_lb, entry->current);
- gtk_widget_show(fs_lb);
-
- fs_lb = gtk_label_new(modified);
- ws_gtk_grid_attach_extended(GTK_GRID(fs_grid), fs_lb, 2, row, 1, 1, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
- gtk_widget_set_sensitive(fs_lb, entry->current);
- gtk_widget_show(fs_lb);
-
- fs_lb = gtk_label_new(size);
- ws_gtk_grid_attach_extended(GTK_GRID(fs_grid), fs_lb, 3, row, 1, 1, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
- gtk_widget_set_sensitive(fs_lb, entry->current);
- gtk_widget_show(fs_lb);
-
- title = g_strdup_printf("Wireshark: %u File%s in Set", row, plurality(row, "", "s"));
- gtk_window_set_title(GTK_WINDOW(fs_w), title);
- g_free(title);
-
- title = g_strdup_printf("... in directory: %s", fileset_get_dirname());
- gtk_label_set_text(GTK_LABEL(fs_dir_lb), title);
- g_free(title);
-
- gtk_widget_show_all(fs_grid);
-
- /* resize the table until we use 18 rows (fits well into 800*600), if it's bigger use a scrollbar */
- /* XXX - I didn't found a way to automatically shrink the table size again */
- if (row <= 18) {
- GtkRequisition requisition;
-
- gtk_widget_get_preferred_size(fs_grid, &requisition, NULL);
- /* XXX use gtk_window_set_default_size()? */
- gtk_widget_set_size_request(fs_sw, -1, requisition.height);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(fs_sw), GTK_POLICY_NEVER, GTK_POLICY_NEVER);
- }
-
- if (row == 18) {
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(fs_sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- }
-
- row++;
-
- g_free(created);
- g_free(modified);
- g_free(size);
-}
-
-void fileset_dlg_begin_add_file(void *window _U_) { } // Qt only
-void fileset_dlg_end_add_file(void *window _U_) { } // Qt only
-
-/* init the fileset table */
-static void
-fileset_init_table(GtkWidget *parent_vb)
-{
- GtkWidget *fs_lb;
-
- fs_grid = ws_gtk_grid_new();
- ws_gtk_grid_set_row_spacing(GTK_GRID(fs_grid), 1);
- ws_gtk_grid_set_column_spacing(GTK_GRID(fs_grid), 12);
- gtk_box_pack_start(GTK_BOX(parent_vb), fs_grid, FALSE, FALSE, 0);
-
- row = 0;
- fs_first_rb = NULL;
-
- fs_lb = gtk_label_new("Filename");
- ws_gtk_grid_attach_extended(GTK_GRID(fs_grid), fs_lb, 0, row, 1, 1, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
-
- fs_lb = gtk_label_new("Created");
- ws_gtk_grid_attach_extended(GTK_GRID(fs_grid), fs_lb, 1, row, 1, 1, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
-
- fs_lb = gtk_label_new("Last Modified");
- ws_gtk_grid_attach_extended(GTK_GRID(fs_grid), fs_lb, 2, row, 1, 1, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
-
- fs_lb = gtk_label_new("Size");
- ws_gtk_grid_attach_extended(GTK_GRID(fs_grid), fs_lb, 3, row, 1, 1, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
-
- gtk_widget_hide(fs_grid);
-
- gtk_window_set_title(GTK_WINDOW(fs_w), "Wireshark: 0 Files in Set");
-
- gtk_label_set_text(GTK_LABEL(fs_dir_lb), "No capture file loaded.");
-
- row++;
-}
-
-
-/* open the fileset dialog */
-void
-fileset_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- GtkWidget *main_vb, *bbox, *close_bt, *help_bt;
-
-
- if (fs_w != NULL) {
- /* There's already a "File Set" dialog box; reactivate it. */
- reactivate_window(fs_w);
- return;
- }
-
- fs_w = dlg_window_new(""); /* transient_for top_level */
- gtk_window_set_destroy_with_parent (GTK_WINDOW(fs_w), TRUE);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 5, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_container_add(GTK_CONTAINER(fs_w), main_vb);
-
- fs_sw = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(fs_sw), GTK_POLICY_NEVER, GTK_POLICY_NEVER);
- gtk_box_pack_start(GTK_BOX(main_vb), fs_sw, TRUE, TRUE, 0);
-
- /* add a dummy container, so we can replace the table later */
- fs_grid_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
-#if ! GTK_CHECK_VERSION(3,8,0)
- gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(fs_sw), fs_grid_vb);
-#else
- gtk_container_add(GTK_CONTAINER(fs_sw), fs_grid_vb);
-#endif
-
- fs_dir_lb = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(main_vb), fs_dir_lb, FALSE, FALSE, 0);
-
- fileset_init_table(fs_grid_vb);
-
- /* Button row: close and help button */
- bbox = dlg_button_row_new(GTK_STOCK_CLOSE, GTK_STOCK_HELP, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 5);
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(fs_w, close_bt, window_cancel_button_cb);
- gtk_widget_set_tooltip_text(close_bt, "Close this window.");
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_FILESET_DIALOG);
-
- gtk_widget_grab_default(close_bt);
-
- g_signal_connect(fs_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(fs_w, "destroy", G_CALLBACK(fs_destroy_cb), NULL);
-
- /* init the dialog content */
- fileset_update_dlg(NULL);
-
- gtk_widget_show_all(fs_w);
- window_present(fs_w);
-}
-
-
-/* open the next file in the file set, or do nothing if already the last file */
-void
-fileset_next_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- fileset_entry *entry;
-
- entry = fileset_get_next();
-
- if (entry) {
- fs_open_entry(entry);
- }
-}
-
-
-/* open the previous file in the file set, or do nothing if already the first file */
-void
-fileset_previous_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- fileset_entry *entry;
-
- entry = fileset_get_previous();
-
- if (entry) {
- fs_open_entry(entry);
- }
-}
-
-
-/* a new capture file was opened, browse the dir and look for files matching the given file set */
-void
-fileset_file_opened(const capture_file *cf) {
- fileset_add_dir(cf->filename, NULL);
- if (fs_w) {
- window_present(fs_w);
- }
-
- /* update the menu */
- set_menus_for_file_set(TRUE /* file_set */,
- fileset_get_previous() != NULL, fileset_get_next() != NULL );
-}
-
-
-/* the capture file was closed */
-void
-fileset_file_closed(void)
-{
- if (fs_w) {
- /* reinit the table, title and alike */
- g_object_ref(G_OBJECT(fs_grid_vb));
- gtk_widget_destroy(fs_grid);
- fileset_delete();
- fileset_init_table(fs_grid_vb);
- window_present(fs_w);
- } else {
- fileset_delete();
- }
-
- /* update the menu */
- set_menus_for_file_set(FALSE /* file_set */,
- fileset_get_previous() != NULL,
- fileset_get_next() != NULL );
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/fileset_dlg.h b/ui/gtk/fileset_dlg.h
deleted file mode 100644
index 55d2458ebb..0000000000
--- a/ui/gtk/fileset_dlg.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* fileset_dlg.h
- * Definitions for the fileset dialog box
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __FILESET_DLG_H__
-#define __FILESET_DLG_H__
-
-/** @file
- * "File Set" dialog box.
- * @ingroup dialog_group
- */
-
-/** Enable file set menu items and look for similar files
- *
- * @param cf Capture file struct
- */
-extern void fileset_file_opened(const capture_file *cf);
-
-/** Disable file set menu items
- */
-extern void fileset_file_closed(void);
-
-
-/** Open the fileset dialog.
- *
- * @param w calling widget (unused)
- * @param d data from calling widget (unused)
- */
-extern void fileset_cb(GtkWidget *w, gpointer d);
-
-/** Open the next file in the file set, or do nothing if already the last file.
- *
- * @param w calling widget (unused)
- * @param d data from calling widget (unused)
- */
-extern void fileset_next_cb(GtkWidget *w, gpointer d);
-
-/** Open the previous file in the file set, or do nothing if already the first file.
- *
- * @param w calling widget (unused)
- * @param d data from calling widget (unused)
- */
-extern void fileset_previous_cb(GtkWidget *w, gpointer d);
-
-#endif /* fileset_dlg.h */
diff --git a/ui/gtk/filter_autocomplete.c b/ui/gtk/filter_autocomplete.c
deleted file mode 100644
index eab3325ab0..0000000000
--- a/ui/gtk/filter_autocomplete.c
+++ /dev/null
@@ -1,899 +0,0 @@
-/* filter_autocomplete.h
- * Definitions for filter autocomplete
- *
- * Copyright 2008, Bahaa Naamneh <b.naamneh@gmail.com>
- *
- * With several usability improvements:
- * Copyright 2008, Stig Bjorlykke <stig@bjorlykke.org>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <glib.h>
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-#if GTK_CHECK_VERSION(3,0,0)
-# include <gdk/gdkkeysyms-compat.h>
-#endif
-
-#include <epan/proto.h>
-
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/filter_autocomplete.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-#define E_FILT_AUTOCOMP_TREE_KEY "filter_autocomplete_tree"
-
-
-static GtkWidget *filter_autocomplete_new(GtkWidget *filter_te, const gchar *protocol_name,
- gboolean protocols_only, gboolean *stop_propagation);
-static void autocomplete_protocol_string(GtkWidget *filter_te, gchar* selected_str);
-static void autoc_filter_row_activated_cb(GtkTreeView *treeview, GtkTreePath *path,
- GtkTreeViewColumn *column, gpointer data);
-static gboolean filter_te_focus_out_cb(GtkWidget *filter_te, GdkEvent *event, gpointer data);
-static void init_autocompletion_list(GtkWidget *list);
-static void add_to_autocompletion_list(GtkWidget *list, const gchar *str);
-static gboolean autocompletion_list_lookup(GtkWidget *filter_te, GtkWidget *popup_win, GtkWidget *list,
- const gchar *str, gboolean *stop_propagation);
-static void filter_autocomplete_handle_backspace(GtkWidget *filter_te, GtkWidget *list, GtkWidget *popup_win,
- gchar *prefix, GtkWidget *main_win);
-static void filter_autocomplete_win_destroy_cb(GtkWidget *win, gpointer data);
-static gboolean is_protocol_name_being_typed(GtkWidget *filter_te, int str_len);
-
-
-/*
- * Check if the string at the cursor position is a beginning of a protocol name.
- * Possible false positives:
- * "NOT" at the beginning of the display filter editable text.
- * "NOT" adjacent to another logical operation. (e.g: exp1 AND NOT exp2).
- **/
-static gboolean
-is_protocol_name_being_typed(GtkWidget *filter_te, int str_len)
-{
- unsigned int i;
- int op_len, cursor_pos;
- gchar *start;
- gchar *pos;
- static const gchar *logic_ops[] =
- { "!", "not",
- "||", "or",
- "&&", "and",
- "^^", "xor" };
-
- /* If the cursor is located at the beginning of the filter editable text,
- * then it's _probably_ a protocol name.
- **/
- if(!(cursor_pos = gtk_editable_get_position(GTK_EDITABLE(filter_te))))
- return TRUE;
-
- start = gtk_editable_get_chars(GTK_EDITABLE(filter_te), 0, (gint) cursor_pos);
-
- /* Point to one char before the current string in the filter editable text */
- pos = start + (cursor_pos - str_len);
-
- /* Walk back through string to find last char which isn't ' ' or '(' */
- while(pos > start) {
- if(*pos != ' ' && *pos != '(') {
- /* Check if we have one of the logical operations */
- for(i = 0; i < (sizeof(logic_ops)/sizeof(logic_ops[0])); i++) {
- op_len = (int) strlen(logic_ops[i]);
-
- if(pos-start+1 < op_len)
- continue;
-
- /* If one of the logical operations is found, then the current string is _probably_ a protocol name */
- if(!strncmp(pos-op_len+1, logic_ops[i], op_len)) {
- g_free (start);
- return TRUE;
- }
- }
-
- /* If none of the logical operations was found, then the current string is not a protocol */
- g_free (start);
- return FALSE;
- }
- pos--;
- }
-
- /* The "str" preceded only by ' ' or '(' chars,
- * which means that the str is _probably_ a protocol name.
- **/
- g_free (start);
- return TRUE;
-}
-
-
-static void
-autocomplete_protocol_string(GtkWidget *filter_te, gchar *selected_str)
-{
- int pos;
- gchar *filter_str;
- gchar *pch;
-
- /* Get the current filter string */
- pos = gtk_editable_get_position(GTK_EDITABLE(filter_te));
- filter_str = gtk_editable_get_chars(GTK_EDITABLE(filter_te), 0, pos);
-
- /* Start from the end */
- pch = filter_str + strlen(filter_str);
-
- /* Walk back through string to find last non-punctuation */
- while(pch != filter_str) {
- pch--;
- if(!g_ascii_isalnum(*pch) && (*pch) != '.' && (*pch) != '_' && (*pch) != '-') {
- pch++;
- break;
- }
- }
-
- if(strncmp(pch, selected_str, pos-(pch-filter_str))) {
- gtk_editable_delete_text(GTK_EDITABLE(filter_te), (gint) (pch-filter_str), pos);
- pos = (int) (pch-filter_str);
- pch = selected_str;
- } else {
- pch = (selected_str + strlen(pch));
- }
-
- gtk_editable_insert_text(GTK_EDITABLE(filter_te), pch, (gint) strlen(pch), &pos);
- gtk_editable_set_position(GTK_EDITABLE(filter_te), pos);
- g_free (filter_str);
-}
-
-/* On row activated signal, complete the protocol string automatically */
-static void
-autoc_filter_row_activated_cb(GtkTreeView *treeview,
- GtkTreePath *path,
- GtkTreeViewColumn *column _U_,
- gpointer data)
-{
- GtkWidget *w_main;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkWidget *win;
- gchar *proto;
-
- model = gtk_tree_view_get_model(treeview);
-
- if (gtk_tree_model_get_iter(model, &iter, path)) {
-
- gtk_tree_model_get(model, &iter, 0, &proto, -1);
- autocomplete_protocol_string(GTK_WIDGET(data), proto);
-
- g_free (proto);
- }
-
- w_main = gtk_widget_get_toplevel(GTK_WIDGET(data));
- win = (GtkWidget *)g_object_get_data(G_OBJECT(w_main), E_FILT_AUTOCOMP_PTR_KEY);
- if(win != NULL) {
- gtk_widget_destroy(win);
- g_object_set_data(G_OBJECT(w_main), E_FILT_AUTOCOMP_PTR_KEY, NULL);
- }
-}
-
-static gboolean
-filter_te_focus_out_cb(GtkWidget *filter_te _U_,
- GdkEvent *event _U_,
- gpointer data)
-{
- GtkWidget *win;
-
- win = (GtkWidget *)g_object_get_data(G_OBJECT(data), E_FILT_AUTOCOMP_PTR_KEY);
- if(win != NULL) {
- gtk_widget_destroy(win);
- g_object_set_data(G_OBJECT(data), E_FILT_AUTOCOMP_PTR_KEY, NULL);
- }
-
- return FALSE;
-}
-
-static gboolean
-check_select_region (GtkWidget *filter_te, GtkWidget *popup_win,
- const gchar *string, unsigned int str_len)
-{
- gint pos1 = gtk_editable_get_position(GTK_EDITABLE(filter_te));
- gint pos2 = pos1 + (gint) strlen(string) - str_len;
- gint pos3 = pos1;
-
- if (pos2 > pos1) {
- gtk_editable_insert_text(GTK_EDITABLE(filter_te), &string[str_len-1],
- pos2-pos1+1, &pos3);
- gtk_editable_set_position(GTK_EDITABLE(filter_te), pos1+1);
- gtk_editable_select_region(GTK_EDITABLE(filter_te), pos1+1, pos2+1);
- gtk_widget_hide (popup_win);
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-init_autocompletion_list(GtkWidget *list)
-{
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
- GtkListStore *store;
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes(NULL, renderer, "text", 0, NULL);
-
- gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list), FALSE);
-
- store = gtk_list_store_new(1, G_TYPE_STRING);
-
- gtk_tree_view_set_model(GTK_TREE_VIEW(list), GTK_TREE_MODEL(store));
-
- g_object_unref(store);
-}
-
-static void
-add_to_autocompletion_list(GtkWidget *list, const gchar *str)
-{
- GtkListStore *store;
- GtkTreeIter iter;
-
- store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(list)));
-
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, str, -1);
-}
-
-static gboolean
-autocompletion_list_lookup(GtkWidget *filter_te, GtkWidget *popup_win, GtkWidget *list,
- const gchar *str, gboolean *stop_propagation)
-{
- GtkRequisition requisition;
- GtkListStore *store;
- GtkTreeIter iter;
- GtkAllocation popup_win_alloc;
- gchar *curr_str;
- unsigned int str_len = (unsigned int) strlen(str);
- gchar *first = NULL;
- gint count = 0;
- gboolean loop = TRUE;
- gboolean exact_match = FALSE;
-
- store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(list)));
-
- if( gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter) ) {
-
- do {
-
- gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 0, &curr_str, -1);
-
- if( !g_ascii_strncasecmp(str, curr_str, str_len) ) {
- loop = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
- if (strlen(curr_str) == str_len) {
- exact_match = TRUE;
- }
- count++;
- if (count == 1)
- first = g_strdup (curr_str);
- } else {
- loop = gtk_list_store_remove(store, &iter);
- }
-
- g_free(curr_str);
-
- } while( loop );
-
- if (count == 1 && !exact_match && strncmp(str, first, str_len) == 0) {
- /* Only one match (not exact) with correct case */
- *stop_propagation = check_select_region(filter_te, popup_win, first, str_len);
- }
-
- /* Don't show an autocompletion-list with only one entry with exact match */
- if ((count == 1 && exact_match && strncmp(str, first, str_len) == 0) ||
- !gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter))
- {
- g_free (first);
- return FALSE;
- }
-
- g_free (first);
-
- gtk_tree_view_columns_autosize(GTK_TREE_VIEW(list));
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_get_preferred_size(list, &requisition, NULL);
-#else
- gtk_widget_size_request(list, &requisition);
-#endif
- gtk_widget_get_allocation(popup_win, &popup_win_alloc);
-
- gtk_widget_set_size_request(popup_win, popup_win_alloc.width,
- (requisition.height<200? requisition.height+8:200));
- gtk_window_resize(GTK_WINDOW(popup_win), popup_win_alloc.width,
- (requisition.height<200? requisition.height+8:200));
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-gboolean
-filter_string_te_key_pressed_cb(GtkWidget *filter_te, GdkEventKey *event, gpointer user_data _U_)
-{
- GtkWidget *popup_win;
- GtkWidget *w_toplevel;
- GtkWidget *treeview;
- GtkTreeModel *model;
- GtkTreePath *path;
- GtkTreeSelection *selection;
- GtkTreeIter iter;
- gchar* prefix;
- gchar* prefix_start = NULL;
- gboolean stop_propagation = FALSE;
- guint k;
- guint32 ckey = '\0';
- gint string_buf_len;
- gchar string_buf[6]; /* g_unichar_to_utf8 needs 6 bytes to convert a single
- char to a code point. (ISO/IEC 10646 defines this
- maximum byte length, RFC 3629 changed this to 4) */
- gchar *key_string = NULL;
- gint pos;
-
- w_toplevel = gtk_widget_get_toplevel(filter_te);
-
- popup_win = (GtkWidget *)g_object_get_data(G_OBJECT(w_toplevel), E_FILT_AUTOCOMP_PTR_KEY);
-
- k = event->keyval;
- if (k != GDK_VoidSymbol) {
- ckey = gdk_keyval_to_unicode(k);
- string_buf_len = g_unichar_to_utf8(ckey, string_buf);
- key_string =
- g_locale_from_utf8(string_buf, string_buf_len, NULL, NULL, NULL);
- }
- if (!key_string)
- key_string = g_strdup("");
-
- /* Ignore Ctrl combinations (Ctrl-C, Ctrl-V, Ctrl-Right, ...). */
- if (event->state & GDK_CONTROL_MASK)
- goto exit;
- /* Pressing modifiers such as Shift or Ctrl should not hide the list. */
- switch (k) {
- case GDK_Shift_L:
- case GDK_Shift_R:
- case GDK_Control_L:
- case GDK_Control_R:
- goto exit;
- }
-
- if (popup_win)
- gtk_widget_show(popup_win);
-
- pos = gtk_editable_get_position(GTK_EDITABLE(filter_te));
- if (g_ascii_isalnum(ckey) ||
- k == GDK_KP_Decimal || k == GDK_period ||
- k == GDK_underscore || k == GDK_minus)
- {
- /* Ensure we delete the selected text */
- gtk_editable_delete_selection(GTK_EDITABLE(filter_te));
- } else if (k == GDK_Return || k == GDK_KP_Enter) {
- /* Remove selection */
- gtk_editable_select_region(GTK_EDITABLE(filter_te), pos, pos);
- }
- /* get the string from filter_te, start from 0 till cursor's position */
- prefix_start = gtk_editable_get_chars(GTK_EDITABLE(filter_te), 0, pos);
-
- /* If the pressed key is non-alphanumeric or one of the keys specified
- * in the condition (decimal, period...) then destroy popup window.
- **/
- if( !g_ascii_isalnum(ckey) &&
- k != GDK_KP_Decimal && k != GDK_period &&
- k != GDK_underscore && k != GDK_minus &&
- k != GDK_space && k != GDK_Return && k != GDK_KP_Enter &&
- k != GDK_Page_Down && k != GDK_Down && k != GDK_Page_Up && k != GDK_Up &&
- k != GDK_BackSpace)
- {
- if (popup_win) {
- gtk_widget_destroy(popup_win);
- g_object_set_data(G_OBJECT(w_toplevel), E_FILT_AUTOCOMP_PTR_KEY, NULL);
- }
- return FALSE;
- }
-
- /* Let prefix points to the first char that is not aphanumeric,'.', '_' or '-',
- * start from the end of filter_te_str.
- **/
- prefix = prefix_start + strlen(prefix_start);
- while(prefix != prefix_start) {
- prefix--;
- if(!g_ascii_isalnum((*prefix)) && (*prefix) != '.' && (*prefix) != '_' && (*prefix) != '-') {
- prefix++;
- break;
- }
- }
-
- /* Now, if the pressed key is decimal or period, and there is no period or
- * decimal before it in prefix then construct the popup window.
- *
- * If the pressed key is backspace, and there is no existing popup window
- * then construct the popup window again.
- **/
- if(k==GDK_period || k==GDK_KP_Decimal) {
- if( !strchr(prefix, '.') || !popup_win) {
-
- gchar* name_with_period;
-
- if (popup_win) {
- gtk_widget_destroy (popup_win);
- }
-
- name_with_period = g_strconcat(prefix, key_string, NULL);
- popup_win = filter_autocomplete_new(filter_te, name_with_period, FALSE, &stop_propagation);
- g_object_set_data(G_OBJECT(w_toplevel), E_FILT_AUTOCOMP_PTR_KEY, popup_win);
-
- g_free(name_with_period);
-
- goto exit;
- }
- } else if(k==GDK_BackSpace && !popup_win) {
-
- if(strlen(prefix) > 1) {
- /* Delete the last character in the prefix string */
- prefix[strlen(prefix)-1] = '\0';
- if(strchr(prefix, '.')) {
- popup_win = filter_autocomplete_new(filter_te, prefix, FALSE, NULL);
- g_object_set_data(G_OBJECT(w_toplevel), E_FILT_AUTOCOMP_PTR_KEY, popup_win);
- } else if(strlen(prefix) && is_protocol_name_being_typed(filter_te, (int) strlen(prefix)+2)) {
- popup_win = filter_autocomplete_new(filter_te, prefix, TRUE, NULL);
- g_object_set_data(G_OBJECT(w_toplevel), E_FILT_AUTOCOMP_PTR_KEY, popup_win);
- }
- }
-
- goto exit;
- } else if(g_ascii_isalnum(ckey) && !popup_win) {
- gchar *name = g_strconcat(prefix, key_string, NULL);
-
- if( !strchr(name, '.') && is_protocol_name_being_typed(filter_te, (int) strlen(name)) ) {
- popup_win = filter_autocomplete_new(filter_te, name, TRUE, &stop_propagation);
- g_object_set_data(G_OBJECT(w_toplevel), E_FILT_AUTOCOMP_PTR_KEY, popup_win);
- }
-
- g_free(name);
-
- goto exit;
- }
-
- /* If the popup window hasn't been constructed yet then we have nothing to do */
- if( !popup_win ) {
- stop_propagation = FALSE;
- goto exit;
- }
-
-
- treeview = (GtkWidget *)g_object_get_data(G_OBJECT(popup_win), E_FILT_AUTOCOMP_TREE_KEY);
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
-
- switch(k)
- {
- /* a better implementation for UP/DOWN keys would be moving the control to the popup'ed window, and letting
- * the treeview handle the up, down actions directly and return the control to the filter text once
- * the user press Enter or any key except for UP, DOWN arrows. * I wasn't able to find a way to do that. *
- **/
- case GDK_Page_Down:
- case GDK_Down:
- if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
- if (gtk_tree_model_iter_next(model, &iter)) {
- if (k == GDK_Page_Down) {
- /* Skip up to 8 entries */
- GtkTreeIter last_iter;
- gint count = 0;
- do {
- last_iter = iter;
- } while (++count < 8 && gtk_tree_model_iter_next(model, &iter));
- iter = last_iter;
- }
- gtk_tree_selection_select_iter(GTK_TREE_SELECTION(selection), &iter);
- path = gtk_tree_model_get_path(model, &iter);
- gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(treeview), path,
- NULL, FALSE, 0, 0);
- gtk_tree_path_free(path);
- } else {
- gtk_tree_selection_unselect_all(selection);
- }
- } else if (gtk_tree_model_get_iter_first(model, &iter)) {
- gtk_tree_selection_select_iter(GTK_TREE_SELECTION(selection), &iter);
- path = gtk_tree_model_get_path(model, &iter);
- gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(treeview), path,
- NULL, FALSE, 0, 0);
- gtk_tree_path_free(path);
- }
-
- /* stop event propagation */
- stop_propagation = TRUE;
- goto exit;
-
- case GDK_Page_Up:
- case GDK_Up:
- {
- GtkTreeIter last_iter;
-
- if (gtk_tree_selection_get_selected(selection, &model, &iter) ) {
- path = gtk_tree_model_get_path(model, &iter);
-
- if (gtk_tree_path_prev(path)) {
- if (k == GDK_Page_Up) {
- /* Skip up to 8 entries */
- GtkTreePath *last_path;
- gint count = 0;
- do {
- last_path = path;
- } while (++count < 8 && gtk_tree_path_prev(path));
- path = last_path;
- }
- gtk_tree_selection_select_path(GTK_TREE_SELECTION(selection), path);
- gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(treeview), path, NULL, FALSE, 0, 0);
- } else {
- gtk_tree_selection_unselect_iter(selection, &iter);
- }
- gtk_tree_path_free(path);
- } else if (gtk_tree_model_get_iter_first(model, &iter)) {
- do {
- last_iter = iter;
- } while (gtk_tree_model_iter_next(model, &iter));
- gtk_tree_selection_select_iter(GTK_TREE_SELECTION(selection), &last_iter);
- path = gtk_tree_model_get_path(model, &last_iter);
- gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(treeview), path,
- NULL, FALSE, 0, 0);
- gtk_tree_path_free(path);
- }
-
- /* stop event propagation */
- stop_propagation = TRUE;
- goto exit;
- }
-
-
- /* if pressed key is Space or Enter then autocomplete protocol string */
- case GDK_space:
- case GDK_Return:
- case GDK_KP_Enter:
-
- if(gtk_tree_selection_get_selected(selection, &model, &iter) ) {
- gchar *value;
-
- /* Do not autocomplete protocols with space yet, because we can be in
- * a operator or a value field.
- **/
- if(k != GDK_space || strchr(prefix, '.')) {
- /* Use chosen string */
- gtk_tree_model_get(model, &iter, 0, &value, -1);
- autocomplete_protocol_string(filter_te, value);
- g_free(value);
- }
- if(k != GDK_space) {
- stop_propagation = TRUE; /* stop event propagation */
- }
- }
-
- /* Lose popup */
- gtk_widget_destroy(popup_win);
- g_object_set_data(G_OBJECT(w_toplevel), E_FILT_AUTOCOMP_PTR_KEY, NULL);
- break;
-
- case GDK_BackSpace:
- filter_autocomplete_handle_backspace(filter_te, treeview, popup_win, prefix, w_toplevel);
- break;
-
- default: {
- gchar* updated_str;
-
- updated_str = g_strconcat(prefix, key_string, NULL);
- if( !autocompletion_list_lookup(filter_te, popup_win, treeview, updated_str, &stop_propagation) ) {
- /* function returned false, ie the list is empty -> close popup */
- gtk_widget_destroy(popup_win);
- g_object_set_data(G_OBJECT(w_toplevel), E_FILT_AUTOCOMP_PTR_KEY, NULL);
- }
-
- g_free(updated_str);
- }
-
- }
-
-exit:
- g_free(prefix_start);
- g_free(key_string);
-
- return stop_propagation;
-}
-
-/*
- * In my implementation, I'm looking for fields that match the protocol name in the whole fields list
- * and not only restrict the process by returning all the fields of the protocol that match the prefix using
- * 'proto_get_id_by_filter_name(protocol_name)'; because I have noticed that some of the fields
- * have a prefix different than its parent protocol; for example SIP protocol had this field raw_sip.line despite
- * that there is a protocol called RAW_SIP which it should be associated with it.
- * so the unorganized fields and nonexistent of a standardized protocols and fields naming rules prevent me from
- * implementing the autocomplete in an optimized way.
- **/
-static gboolean
-build_autocompletion_list(GtkWidget *filter_te, GtkWidget *treeview, GtkWidget *popup_win,
- const gchar *protocol_name, gboolean protocols_only, gboolean *stop_propagation)
-{
- void *cookie, *cookie2;
- protocol_t *protocol;
- unsigned int protocol_name_len;
- header_field_info *hfinfo;
- gint count = 0;
- gboolean exact_match = FALSE;
- const gchar *first = NULL;
- int i;
-
- protocol_name_len = (unsigned int) strlen(protocol_name);
-
- /* Force load protocol fields, if not already done */
- if(protocol_name[protocol_name_len-1] == '.')
- proto_registrar_get_byname(protocol_name);
-
- /* Walk protocols list */
- for (i = proto_get_first_protocol(&cookie); i != -1; i = proto_get_next_protocol(&cookie)) {
-
- protocol = find_protocol_by_id(i);
-
- if (!proto_is_protocol_enabled(protocol))
- continue;
-
- if (protocols_only) {
- const gchar *name = proto_get_protocol_filter_name (i);
-
- if (!g_ascii_strncasecmp(protocol_name, name, protocol_name_len)) {
- add_to_autocompletion_list(treeview, name);
- if (strlen(name) == protocol_name_len) {
- exact_match = TRUE;
- }
- count++;
- if (count == 1)
- first = name;
- }
- } else {
-
- for (hfinfo = proto_get_first_protocol_field(i, &cookie2);
- hfinfo != NULL;
- hfinfo = proto_get_next_protocol_field(i, &cookie2))
- {
- if (hfinfo->same_name_prev_id != -1) /* ignore duplicate names */
- continue;
-
- if(!g_ascii_strncasecmp(protocol_name, hfinfo->abbrev, protocol_name_len)) {
- add_to_autocompletion_list(treeview, hfinfo->abbrev);
- if (strlen(hfinfo->abbrev) == protocol_name_len) {
- exact_match = TRUE;
- }
- count++;
- if (count == 1)
- first = hfinfo->abbrev;
- }
- }
- }
- }
-
- if (count == 1 && !exact_match && stop_propagation &&
- strncmp(protocol_name, first, protocol_name_len) == 0)
- {
- /* Only one match (not exact) with correct case */
- *stop_propagation = check_select_region(filter_te, popup_win, first, protocol_name_len);
- }
-
- /* Don't show an empty autocompletion-list or
- * an autocompletion-list with only one entry with exact match
- **/
- if (count == 0 || (count == 1 && exact_match &&
- strncmp(protocol_name, first, protocol_name_len) == 0))
- return FALSE;
-
- return TRUE;
-}
-
-static void
-filter_autocomplete_disable_sorting(GtkTreeModel *model)
-{
- gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model),
- GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, GTK_SORT_ASCENDING);
-}
-
-static void
-filter_autocomplete_enable_sorting(GtkTreeModel *model)
-{
- gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model), 0, GTK_SORT_ASCENDING);
-}
-
-static GtkWidget *
-filter_autocomplete_new(GtkWidget *filter_te, const gchar *protocol_name,
- gboolean protocols_only, gboolean *stop_propagation)
-{
- GtkWidget *popup_win;
- GtkWidget *treeview;
- GtkWidget *filter_sc;
- gint x_pos, y_pos;
- GtkTreeModel *model;
- GtkTreeSelection *selection;
- GtkRequisition requisition;
- GtkWidget *w_toplevel;
- GtkAllocation filter_te_alloc;
-
- w_toplevel = gtk_widget_get_toplevel(filter_te);
-
- /* Create popup window */
- popup_win = gtk_window_new (GTK_WINDOW_POPUP);
-
- /* Create scrolled window */
- filter_sc = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (filter_sc), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(filter_sc), GTK_SHADOW_IN);
- gtk_container_add(GTK_CONTAINER(popup_win), filter_sc);
-
- /* Create tree view */
- treeview = gtk_tree_view_new();
- gtk_tree_view_set_hover_selection(GTK_TREE_VIEW(treeview), TRUE);
- init_autocompletion_list(treeview);
- g_object_set_data(G_OBJECT(popup_win), E_FILT_AUTOCOMP_TREE_KEY, treeview);
-
- /* Build list */
- if (!build_autocompletion_list(filter_te, treeview, popup_win, protocol_name, protocols_only, stop_propagation)) {
- gtk_widget_destroy(popup_win);
- return NULL;
- }
-
- /* Sort treeview */
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
- if(model)
- filter_autocomplete_enable_sorting(model);
-
- gtk_container_add (GTK_CONTAINER (filter_sc), treeview);
-
- g_signal_connect(treeview, "row-activated", G_CALLBACK(autoc_filter_row_activated_cb), filter_te);
- g_signal_connect(filter_te, "focus-out-event", G_CALLBACK(filter_te_focus_out_cb), w_toplevel);
- g_signal_connect(popup_win, "destroy", G_CALLBACK(filter_autocomplete_win_destroy_cb), NULL);
-
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_get_preferred_size(treeview, &requisition, NULL);
-#else
- gtk_widget_size_request(treeview, &requisition);
-#endif
- gtk_widget_get_allocation(filter_te, &filter_te_alloc);
-
- gtk_widget_set_size_request(popup_win, filter_te_alloc.width,
- (requisition.height<200? requisition.height+8:200));
- gtk_window_resize(GTK_WINDOW(popup_win), filter_te_alloc.width,
- (requisition.height<200? requisition.height+8:200));
-
- gdk_window_get_origin(gtk_widget_get_window(filter_te), &x_pos, &y_pos);
-#if GTK_CHECK_VERSION(3,0,0)
- x_pos += filter_te_alloc.x;
- y_pos += (filter_te_alloc.y + filter_te_alloc.height);
-#else
- y_pos += filter_te_alloc.height;
-#endif
- gtk_window_move(GTK_WINDOW(popup_win), x_pos, y_pos);
-
- gtk_widget_show_all (popup_win);
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
- gtk_tree_selection_unselect_all(selection);
-
- return popup_win;
-}
-
-static void
-filter_autocomplete_handle_backspace(GtkWidget *filter_te, GtkWidget *list, GtkWidget *popup_win,
- gchar *prefix, GtkWidget *main_win)
-{
- GtkTreeModel *model;
- GtkListStore *store;
- GtkRequisition requisition;
- size_t prefix_len;
- gboolean protocols_only = FALSE;
- GtkAllocation popup_win_alloc;
-
- prefix_len = strlen(prefix);
-
- if (prefix_len <= 1) {
- /* Remove the popup window for protocols */
- gtk_widget_destroy(popup_win);
- g_object_set_data(G_OBJECT(main_win), E_FILT_AUTOCOMP_PTR_KEY, NULL);
- return;
- }
-
- /* Delete the last character in the prefix string */
- prefix_len--;
- prefix[prefix_len] = '\0';
-
- if(strchr(prefix, '.') == NULL) {
- protocols_only = TRUE;
- }
-
- /* Empty list */
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(list));
- store = GTK_LIST_STORE(model);
- gtk_list_store_clear(store);
-
- /* Disable sorting */
- filter_autocomplete_disable_sorting(model);
-
- /* Build new list */
- if (!build_autocompletion_list(filter_te, list, popup_win, prefix, protocols_only, NULL)) {
- gtk_widget_destroy(popup_win);
- g_object_set_data(G_OBJECT(main_win), E_FILT_AUTOCOMP_PTR_KEY, NULL);
- return;
- }
-
- /* Enable sorting */
- filter_autocomplete_enable_sorting(model);
-
- gtk_tree_view_columns_autosize(GTK_TREE_VIEW(list));
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_get_preferred_size(list, &requisition, NULL);
-#else
- gtk_widget_size_request(list, &requisition);
-#endif
-
- gtk_widget_get_allocation(popup_win, &popup_win_alloc);
-
- /* XXX use gtk_window_set_default_size()? */
- gtk_widget_set_size_request(popup_win, popup_win_alloc.width,
- (requisition.height<200? requisition.height+8:200));
- gtk_window_resize(GTK_WINDOW(popup_win), popup_win_alloc.width,
- (requisition.height<200? requisition.height+8:200));
-}
-
-static void
-filter_autocomplete_win_destroy_cb(GtkWidget *win, gpointer data _U_)
-{
- /* tell that the autocomplete window doesn't exist anymore */
- g_object_set_data(G_OBJECT(win), E_FILT_AUTOCOMP_PTR_KEY, NULL);
-}
-
-gboolean
-filter_parent_dlg_key_pressed_cb(GtkWidget *win, GdkEventKey *event, gpointer user_data _U_)
-{
- GtkWidget *popup_win;
-
- popup_win = (GtkWidget *)g_object_get_data(G_OBJECT(win), E_FILT_AUTOCOMP_PTR_KEY);
-
- if(popup_win && event->keyval == GDK_Escape) {
- gtk_widget_destroy(popup_win);
- g_object_set_data(G_OBJECT(win), E_FILT_AUTOCOMP_PTR_KEY, NULL);
-
- /* stop event propagation */
- return TRUE;
- }
-
- return FALSE;
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local Variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/filter_autocomplete.h b/ui/gtk/filter_autocomplete.h
deleted file mode 100644
index 6538959d5f..0000000000
--- a/ui/gtk/filter_autocomplete.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* filter_autocomplete.h
- * Definitions for filter autocomplete
- *
- * Copyright 2008, Bahaa Naamneh <b.naamneh@gmail.com>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef _FILTER_AUTO_COMPLETE_H_
-#define _FILTER_AUTO_COMPLETE_H_
-
-
-#define E_FILT_AUTOCOMP_PTR_KEY "filter_autocomplete_window"
-
-/** @file
- * "Filter Auto Complete" dialog box.
- * @ingroup dialog_group
- */
-
-/** Callback function that is called when a "key-press-event" signal occur.
- *
- * @param filter_te text-editing filter widget
- * @param event a GdkEventButton *event
- * @param user_data pointer to user_data (unused)
- */
-extern gboolean filter_string_te_key_pressed_cb(GtkWidget *filter_te, GdkEventKey *event, gpointer user_data _U_);
-
-/** Callback function that is called when a "key-press-event" signal occur.
- *
- * @param win parent window of the text-editing filter widget
- * @param event a GdkEventButton *event
- * @param user_data pointer to user_data (unused)
- */
-extern gboolean filter_parent_dlg_key_pressed_cb(GtkWidget *win, GdkEventKey *event, gpointer user_data _U_);
-
-
-#endif
diff --git a/ui/gtk/filter_dlg.c b/ui/gtk/filter_dlg.c
deleted file mode 100644
index cf699d8467..0000000000
--- a/ui/gtk/filter_dlg.c
+++ /dev/null
@@ -1,1399 +0,0 @@
-/* filter_dlg.c
- * Dialog boxes for (display and capture) filter editing
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <wsutil/filesystem.h>
-#include <epan/prefs.h>
-#include <epan/column-info.h>
-
-#include "ui/filter_files.h"
-#include "ui/simple_dialog.h"
-#include "ui/main_statusbar.h"
-
-#include "ui/gtk/main.h"
-#include "ui/gtk/filter_dlg.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dfilter_expr_dlg.h"
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/filter_autocomplete.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-#define E_FILT_DIALOG_PTR_KEY "filter_dialog_ptr"
-#define E_FILT_BUTTON_PTR_KEY "filter_button_ptr"
-#define E_FILT_PARENT_FILTER_TE_KEY "filter_parent_filter_te"
-#define E_FILT_CONSTRUCT_ARGS_KEY "filter_construct_args"
-#define E_FILT_LIST_ITEM_MODEL_KEY "filter_list_item_model"
-#define E_FILT_LBL_KEY "filter_label"
-#define E_FILT_FILTER_L_KEY "filter_filter_l"
-#define E_FILT_CHG_BT_KEY "filter_chg_bt"
-#define E_FILT_COPY_BT_KEY "filter_copy_bt"
-#define E_FILT_DEL_BT_KEY "filter_del_bt"
-#define E_FILT_NAME_TE_KEY "filter_name_te"
-#define E_FILT_DBLFUNC_KEY "filter_dblfunc"
-#define E_FILT_DBLARG_KEY "filter_dblarg"
-#define E_FILT_DBLACTIVATE_KEY "filter_dblactivate"
-
-typedef struct _filter_cb_data {
- GList *fl;
- GtkWidget *win;
-} filter_cb_data;
-
-static GtkWidget *filter_dialog_new(GtkWidget *button, GtkWidget *filter_te,
- filter_list_type_t list_type,
- construct_args_t *construct_args);
-static void filter_dlg_dclick(GtkWidget *dummy, gpointer main_w_arg,
- gpointer activate);
-static void filter_dlg_ok_cb(GtkWidget *ok_bt, gpointer data);
-static void filter_dlg_apply_cb(GtkWidget *apply_bt, gpointer data);
-static void filter_apply(GtkWidget *main_w, gboolean destroy);
-static void filter_dlg_save(filter_list_type_t list_type);
-static void filter_dlg_save_cb(GtkWidget *save_bt, gpointer parent_w);
-static void filter_dlg_destroy_cb(GtkWidget *win, gpointer data);
-
-static gboolean
-filter_dlg_delete_event_cb(GtkWidget *prefs_w, GdkEvent *event, gpointer data);
-static void
-filter_dlg_cancel_cb(GtkWidget *cancel_bt, gpointer data);
-
-static gboolean filter_sel_list_button_cb(GtkWidget *, GdkEventButton *,
- gpointer);
-static void filter_sel_list_cb(GtkTreeSelection *, gpointer);
-static void filter_new_bt_clicked_cb(GtkWidget *, gpointer);
-static void filter_del_bt_clicked_cb(GtkWidget *, gpointer);
-static void filter_name_te_changed_cb(GtkWidget *, gpointer);
-
-#ifdef HAVE_LIBPCAP
-/* Create a filter dialog for constructing a capture filter.
-
- This is to be used as a callback for a button next to a text entry box,
- which, when clicked, pops up this dialog to allow you to construct a
- display filter by browsing the list of saved filters (the dialog
- for constructing expressions assumes display filter syntax, not
- capture filter syntax). The "OK" button sets the text entry box to the
- constructed filter and activates that text entry box (which should have
- no effect in the main capture dialog); this dialog is then dismissed. */
-void
-capture_filter_construct_cb(GtkWidget *w, gpointer user_data _U_)
-{
- GtkWidget *filter_browse_w;
- GtkWidget *parent_filter_te;
- /* No Apply button, and "OK" just sets our text widget, it doesn't
- activate it (i.e., it doesn't cause us to try to open the file). */
- static construct_args_t args = {
- "Wireshark: Capture Filter",
- FALSE,
- FALSE,
- FALSE
- };
-
- /* Has a filter dialog box already been opened for that button? */
- filter_browse_w = (GtkWidget *)g_object_get_data(G_OBJECT(w), E_FILT_DIALOG_PTR_KEY);
-
- if (filter_browse_w != NULL) {
- /* Yes. Just re-activate that dialog box. */
- reactivate_window(filter_browse_w);
- return;
- }
-
- /* No. Get the text entry attached to the button. */
- parent_filter_te = (GtkWidget *)g_object_get_data(G_OBJECT(w), E_FILT_TE_PTR_KEY);
-
- /* Now create a new dialog, without an "Add Expression..." button. */
- filter_dialog_new(w, parent_filter_te, CFILTER_LIST, &args);
-}
-#endif
-
-/* Create a filter dialog for constructing a display filter.
-
- This is to be used as a callback for a button next to a text entry box,
- which, when clicked, pops up this dialog to allow you to construct a
- display filter by browsing the list of saved filters and/or by adding
- test expressions constructed with another dialog. The "OK" button
- sets the text entry box to the constructed filter and activates that
- text entry box, causing the filter to be used; this dialog is then
- dismissed.
-
- If "wants_apply_button" is non-null, we add an "Apply" button that
- acts like "OK" but doesn't dismiss this dialog. */
-void
-display_filter_construct_cb(GtkWidget *w, gpointer construct_args_ptr)
-{
- construct_args_t *construct_args = (construct_args_t *)construct_args_ptr;
- GtkWidget *filter_browse_w;
- GtkWidget *parent_filter_te;
-
- /* Has a filter dialog box already been opened for the button? */
- filter_browse_w = (GtkWidget *)g_object_get_data(G_OBJECT(w), E_FILT_DIALOG_PTR_KEY);
-
- if (filter_browse_w != NULL) {
- /* Yes. Just re-activate that dialog box. */
- reactivate_window(filter_browse_w);
- return;
- }
-
- /* No. Get the text entry attached to the button. */
- parent_filter_te = (GtkWidget *)g_object_get_data(G_OBJECT(w), E_FILT_TE_PTR_KEY);
-
- /* Now create a new dialog, possibly with an "Apply" button, and
- definitely with an "Add Expression..." button. */
- filter_dialog_new(w, parent_filter_te, DFILTER_LIST, construct_args);
-}
-
-/* Should be called when a button that creates filters is destroyed; it
- destroys any filter dialog created by that button. */
-void
-filter_button_destroy_cb(GtkWidget *button, gpointer user_data _U_)
-{
- GtkWidget *filter_w;
-
- /* Is there a filter edit/selection dialog associated with this
- button? */
- filter_w = (GtkWidget *)g_object_get_data(G_OBJECT(button), E_FILT_DIALOG_PTR_KEY);
-
- if (filter_w != NULL) {
- /* Yes. Break the association, and destroy the dialog. */
- g_object_set_data(G_OBJECT(button), E_FILT_DIALOG_PTR_KEY, NULL);
- window_destroy(filter_w);
- }
-}
-
-#ifdef HAVE_LIBPCAP
-static GtkWidget *global_cfilter_w;
-
-/* Create a filter dialog for editing capture filters; this is to be used
- as a callback for menu items, toolbars, etc.. */
-void
-cfilter_dialog_cb(GtkWidget *w _U_)
-{
- /* No Apply button, and there's no text widget to set, much less
- activate, on "OK". */
- static construct_args_t args = {
- "Wireshark: Capture Filter",
- FALSE,
- FALSE,
- FALSE
- };
-
- /* Has a filter dialog box already been opened for editing
- capture filters? */
- if (global_cfilter_w != NULL) {
- /* Yes. Just reactivate it. */
- reactivate_window(global_cfilter_w);
- return;
- }
-
- /*
- * No. Create one; we didn't pop this up as a result of pressing
- * a button next to some text entry field, so don't associate it
- * with a text entry field or button.
- */
- global_cfilter_w = filter_dialog_new(NULL, NULL, CFILTER_LIST, &args);
-}
-#endif
-
-/* Create a filter dialog for editing display filters; this is to be used
- as a callback for menu items, toolbars, etc.. */
-void
-dfilter_dialog_cb(GtkWidget *w _U_)
-{
- static construct_args_t args = {
- "Wireshark: Display Filter",
- TRUE,
- TRUE,
- FALSE
- };
-
- display_filter_construct_cb((GtkWidget *)g_object_get_data(G_OBJECT(top_level), E_FILT_BT_PTR_KEY), &args);
-}
-
-/* List of capture filter dialogs, so that if the list of filters changes
- (the model, if you will), we can update all of their lists displaying
- the filters (the views). */
-static GList *cfilter_dialogs;
-
-/* List of display filter dialogs, so that if the list of filters changes
- (the model, if you will), we can update all of their lists displaying
- the filters (the views). */
-static GList *dfilter_dialogs;
-
-static void
-remember_filter_dialog(GtkWidget *main_w, GList **filter_dialogs)
-{
- *filter_dialogs = g_list_append(*filter_dialogs, main_w);
-}
-
-/* Remove a filter dialog from the specified list of filter_dialogs. */
-static void
-forget_filter_dialog(GtkWidget *main_w, filter_list_type_t list_type)
-{
- switch (list_type) {
-
- case CFILTER_EDITED_LIST:
- cfilter_dialogs = g_list_remove(cfilter_dialogs, main_w);
- break;
-
- case DFILTER_EDITED_LIST:
- dfilter_dialogs = g_list_remove(dfilter_dialogs, main_w);
- break;
-
- default:
- g_assert_not_reached();
- break;
- }
-}
-
-/* Get the dialog list corresponding to a particular filter list. */
-static GList *
-get_filter_dialog_list(filter_list_type_t list_type)
-{
- switch (list_type) {
-
- case CFILTER_EDITED_LIST:
- return cfilter_dialogs;
-
- case DFILTER_EDITED_LIST:
- return dfilter_dialogs;
-
- default:
- g_assert_not_reached();
- return NULL;
- }
-}
-
-
-static GtkTreeIter *
-fill_list(GtkWidget *main_w, filter_list_type_t list_type, const gchar *filter_te_str)
-{
- GList *fl_entry;
- filter_def *filt;
- GtkTreeView *filter_l;
- GtkListStore *store;
- GtkTreeIter iter;
- GtkTreeIter *l_select = NULL;
-
- filter_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(main_w), E_FILT_FILTER_L_KEY));
- store = GTK_LIST_STORE(gtk_tree_view_get_model(filter_l));
-
- /* fill in data */
- fl_entry = get_filter_list_first(list_type);
- while (fl_entry != NULL) {
- filt = (filter_def *) fl_entry->data;
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, filt->name,
- 1, fl_entry, -1);
-
- if (filter_te_str && filt->strval) {
- if (strcmp(filter_te_str, filt->strval) == 0) {
- /*
- * XXX - We're assuming that we can just copy a GtkTreeIter
- * and use it later without any crashes. This may not be a
- * valid assumption.
- */
- l_select = (GtkTreeIter *)g_memdup(&iter, sizeof(iter));
- }
- }
-
- fl_entry = fl_entry->next;
- }
- return l_select;
-}
-
-#if 0
-static void
-clear_list(GtkWidget *main_w) {
- GtkWidget *filter_l = g_object_get_data(G_OBJECT(main_w), E_FILT_FILTER_L_KEY);
- GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(filter_l));
-
- gtk_list_store_clear(GTK_LIST_STORE(model));
-}
-#endif /* 0 */
-
-static GtkWidget *
-filter_dialog_new(GtkWidget *button, GtkWidget *parent_filter_te,
- filter_list_type_t list_type, construct_args_t *construct_args)
-{
- GtkWidget *main_w, /* main window */
- *main_vb, /* main container */
- *bbox, /* button container */
- *ok_bt, /* "OK" button */
- *apply_bt, /* "Apply" button */
- *save_bt, /* "Save" button */
- *cancel_bt, /* "Cancel" button */
- *help_bt; /* "Help" button */
- GtkWidget *filter_vb, /* filter settings box */
- *props_vb;
- GtkWidget *top_hb,
- *list_bb,
- *new_bt,
- *del_bt,
- *filter_sc,
- *filter_l,
- *middle_hb,
- *name_lb,
- *name_te,
- *bottom_hb,
- *filter_lb,
- *filter_te,
- *add_expression_bt,
- *filter_fr,
- *edit_fr,
- *props_fr;
- GdkWindow *parent;
- static filter_list_type_t cfilter_list_type = CFILTER_EDITED_LIST;
- static filter_list_type_t dfilter_list_type = DFILTER_EDITED_LIST;
- filter_list_type_t *filter_list_type_p;
- GList **filter_dialogs;
- const gchar *filter_te_str = NULL;
- GtkListStore *store;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
- GtkTreeSelection *sel;
- GtkTreeIter *l_select;
- const gchar *list_name = NULL;
-
- /* Get a pointer to a static variable holding the type of filter on
- which we're working, so we can pass that pointer to callback
- routines. */
- switch (list_type) {
-
- case CFILTER_LIST:
- filter_dialogs = &cfilter_dialogs;
- filter_list_type_p = &cfilter_list_type;
- list_type = CFILTER_EDITED_LIST;
- list_name = "Capture Filter";
- break;
-
- case DFILTER_LIST:
- filter_dialogs = &dfilter_dialogs;
- filter_list_type_p = &dfilter_list_type;
- list_type = DFILTER_EDITED_LIST;
- list_name = "Display Filter";
- break;
-
- default:
- g_assert_not_reached();
- filter_dialogs = NULL;
- filter_list_type_p = NULL;
- break;
- }
-
- main_w = dlg_conf_window_new(construct_args->title);
- gtk_window_set_modal(GTK_WINDOW(main_w), TRUE);
- gtk_window_set_default_size(GTK_WINDOW(main_w), 400, 400);
- g_object_set_data(G_OBJECT(main_w), E_FILT_CONSTRUCT_ARGS_KEY, construct_args);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_container_add(GTK_CONTAINER(main_w), main_vb);
- gtk_widget_show(main_vb);
-
- /* Make sure everything is set up */
- if (parent_filter_te)
- filter_te_str = gtk_entry_get_text(GTK_ENTRY(parent_filter_te));
-
- /* Container for each row of widgets */
- filter_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(filter_vb), 0);
- gtk_box_pack_start(GTK_BOX (main_vb), filter_vb, TRUE, TRUE, 0);
- gtk_widget_show(filter_vb);
-
- /* Top row: Buttons and filter list */
- top_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX (filter_vb), top_hb, TRUE, TRUE, 0);
-
- gtk_widget_show(top_hb);
-
- edit_fr = gtk_frame_new("Edit");
- gtk_box_pack_start(GTK_BOX(top_hb), edit_fr, FALSE, FALSE, 0);
- gtk_widget_show(edit_fr);
-
- list_bb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, TRUE);
- gtk_container_set_border_width(GTK_CONTAINER(list_bb), 5);
- gtk_container_add(GTK_CONTAINER(edit_fr), list_bb);
- gtk_widget_show(list_bb);
-
- new_bt = ws_gtk_button_new_from_stock(GTK_STOCK_NEW);
- g_signal_connect(new_bt, "clicked", G_CALLBACK(filter_new_bt_clicked_cb), filter_list_type_p);
- gtk_widget_show(new_bt);
- gtk_box_pack_start (GTK_BOX (list_bb), new_bt, FALSE, FALSE, 0);
- gtk_widget_set_tooltip_text(new_bt, "Create a new filter at the end of the list (with the current properties)");
-
- del_bt = ws_gtk_button_new_from_stock(GTK_STOCK_DELETE);
- gtk_widget_set_sensitive(del_bt, FALSE);
- g_signal_connect(del_bt, "clicked", G_CALLBACK(filter_del_bt_clicked_cb), filter_list_type_p);
- g_object_set_data(G_OBJECT(main_w), E_FILT_DEL_BT_KEY, del_bt);
- gtk_widget_show(del_bt);
- gtk_box_pack_start (GTK_BOX (list_bb), del_bt, FALSE, FALSE, 0);
- gtk_widget_set_tooltip_text(del_bt, "Delete the selected filter");
-
- filter_fr = gtk_frame_new(list_name);
- gtk_box_pack_start(GTK_BOX(top_hb), filter_fr, TRUE, TRUE, 0);
- gtk_widget_show(filter_fr);
-
- filter_sc = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(filter_sc),
- GTK_SHADOW_IN);
-
- gtk_container_set_border_width (GTK_CONTAINER (filter_sc), 5);
- gtk_container_add(GTK_CONTAINER(filter_fr), filter_sc);
- gtk_widget_show(filter_sc);
-
- store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_POINTER);
- filter_l = tree_view_new(GTK_TREE_MODEL(store));
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(filter_l), FALSE);
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("", renderer, "text",
- 0, NULL);
- gtk_tree_view_column_set_sort_column_id(column, 0);
- gtk_tree_view_append_column(GTK_TREE_VIEW(filter_l), column);
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(filter_l));
- gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
- g_signal_connect(sel, "changed", G_CALLBACK(filter_sel_list_cb), NULL);
- g_signal_connect(filter_l, "button_press_event", G_CALLBACK(filter_sel_list_button_cb),
- NULL);
- g_object_set_data(G_OBJECT(main_w), E_FILT_FILTER_L_KEY, filter_l);
- gtk_container_add(GTK_CONTAINER(filter_sc), filter_l);
- gtk_widget_show(filter_l);
-
- g_object_set_data(G_OBJECT(filter_l), E_FILT_DBLFUNC_KEY, filter_dlg_dclick);
- g_object_set_data(G_OBJECT(filter_l), E_FILT_DBLARG_KEY, main_w);
- /* This is a Boolean, but we make it a non-null pointer for TRUE
- and a null pointer for FALSE, as object data is a pointer. */
- g_object_set_data(G_OBJECT(filter_l), E_FILT_DBLACTIVATE_KEY,
- construct_args->activate_on_ok ? (gpointer)"" : NULL);
-
- /* fill in data */
- l_select = fill_list(main_w, list_type, filter_te_str);
-
- g_object_unref(G_OBJECT(store));
-
-
- props_fr = gtk_frame_new("Properties");
- gtk_box_pack_start(GTK_BOX(filter_vb), props_fr, FALSE, FALSE, 0);
- gtk_widget_show(props_fr);
-
- props_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(props_vb), 5);
- gtk_container_add(GTK_CONTAINER(props_fr), props_vb);
- gtk_widget_show(props_vb);
-
- /* row: Filter name entry */
- middle_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX (props_vb), middle_hb, TRUE, TRUE, 0);
- gtk_widget_show(middle_hb);
-
- name_lb = gtk_label_new("Filter name:");
- gtk_box_pack_start(GTK_BOX(middle_hb), name_lb, FALSE, FALSE, 0);
- gtk_widget_show(name_lb);
-
- name_te = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(middle_hb), name_te, TRUE, TRUE, 0);
- g_object_set_data(G_OBJECT(main_w), E_FILT_NAME_TE_KEY, name_te);
- g_signal_connect(name_te, "changed", G_CALLBACK(filter_name_te_changed_cb), filter_list_type_p);
- gtk_widget_show(name_te);
-
- /* row: Filter text entry */
- bottom_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX (props_vb), bottom_hb, TRUE, TRUE, 0);
- gtk_widget_show(bottom_hb);
-
- filter_lb = gtk_label_new("Filter string:");
- gtk_box_pack_start(GTK_BOX(bottom_hb), filter_lb, FALSE, FALSE, 0);
- gtk_widget_show(filter_lb);
-
- filter_te = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(bottom_hb), filter_te, TRUE, TRUE, 0);
- g_object_set_data(G_OBJECT(main_w), E_FILT_FILTER_TE_KEY, filter_te);
- g_signal_connect(filter_te, "changed", G_CALLBACK(filter_name_te_changed_cb), filter_list_type_p);
- if (list_type == DFILTER_EDITED_LIST) {
- colorize_filter_te_as_empty(filter_te);
-
- g_object_set_data(G_OBJECT(main_w), E_FILT_AUTOCOMP_PTR_KEY, NULL);
- g_signal_connect(filter_te, "key-press-event", G_CALLBACK (filter_string_te_key_pressed_cb), NULL);
- g_signal_connect(main_w, "key-press-event", G_CALLBACK (filter_parent_dlg_key_pressed_cb), NULL);
- }
- gtk_widget_show(filter_te);
-
- g_object_set_data(G_OBJECT(main_w), E_FILT_PARENT_FILTER_TE_KEY, parent_filter_te);
-
- if (list_type == DFILTER_EDITED_LIST) {
- gtk_widget_set_tooltip_text(filter_te,
- "Enter a display filter. "
- "The background color of this field is changed by a continuous syntax check"
- " (green is valid, red is invalid, yellow may have unexpected results).");
-
- /* Create the "Add Expression..." button, to pop up a dialog
- for constructing filter comparison expressions. */
- add_expression_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_ADD_EXPRESSION);
- g_signal_connect(add_expression_bt, "clicked", G_CALLBACK(filter_add_expr_bt_cb), main_w);
- gtk_box_pack_start(GTK_BOX(bottom_hb), add_expression_bt, FALSE, FALSE, 0);
- gtk_widget_show(add_expression_bt);
- gtk_widget_set_tooltip_text(add_expression_bt, "Add an expression to the filter string");
- }
-
-
- /* button row (create all possible buttons and hide the unrequired later - it's a lot easier) */
- bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_APPLY, GTK_STOCK_SAVE, GTK_STOCK_CANCEL, GTK_STOCK_HELP, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 5);
- gtk_widget_show(bbox);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(filter_dlg_ok_cb), filter_list_type_p);
- gtk_widget_set_tooltip_text(ok_bt, "Apply the filters and close this dialog");
-
- /* Catch the "activate" signal on the filter name and filter
- expression text entries, so that if the user types Return
- there, we act as if the "OK" button had been selected, as
- happens if Return is typed if some widget that *doesn't*
- handle the Return key has the input focus. */
- if (parent_filter_te != NULL) {
- dlg_set_activate(name_te, ok_bt);
- dlg_set_activate(filter_te, ok_bt);
- }
-
- apply_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_APPLY);
- g_signal_connect(apply_bt, "clicked", G_CALLBACK(filter_dlg_apply_cb), filter_list_type_p);
- gtk_widget_set_tooltip_text(apply_bt, "Apply the filters and keep this dialog open");
-
- save_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_SAVE);
- g_signal_connect(save_bt, "clicked", G_CALLBACK(filter_dlg_save_cb), filter_list_type_p);
- gtk_widget_set_tooltip_text(save_bt, "Save the filters permanently and keep this dialog open");
-
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- gtk_widget_set_tooltip_text(cancel_bt, "Cancel the changes");
- g_signal_connect(cancel_bt, "clicked", G_CALLBACK(filter_dlg_cancel_cb), filter_list_type_p);
- window_set_cancel_button(main_w, cancel_bt, NULL);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- if (list_type == CFILTER_EDITED_LIST) {
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_CAPTURE_FILTERS_DIALOG);
- } else {
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_DISPLAY_FILTERS_DIALOG);
- }
- gtk_widget_set_tooltip_text(help_bt, "Show topic specific help");
-
- if(ok_bt) {
- gtk_widget_grab_default(ok_bt);
- }
-
- remember_filter_dialog(main_w, filter_dialogs);
-
- if (button != NULL) {
- /* This dialog box was created by a "Filter" button.
- Set the E_FILT_BUTTON_PTR_KEY for the new dialog to point to
- the button. */
- g_object_set_data(G_OBJECT(main_w), E_FILT_BUTTON_PTR_KEY, button);
-
- /* Set the E_FILT_DIALOG_PTR_KEY for the button to point to us */
- g_object_set_data(G_OBJECT(button), E_FILT_DIALOG_PTR_KEY, main_w);
- }
-
- /* DO SELECTION THINGS *AFTER* SHOWING THE DIALOG! */
- /* otherwise the updatings can get confused */
- if (l_select) {
- gtk_tree_selection_select_iter(sel, l_select);
- g_free(l_select);
- } else if (filter_te_str && filter_te_str[0]) {
- gtk_entry_set_text(GTK_ENTRY(name_te), "New filter");
- gtk_entry_set_text(GTK_ENTRY(filter_te), filter_te_str);
- }
-
- g_signal_connect(main_w, "delete_event", G_CALLBACK(filter_dlg_delete_event_cb), filter_list_type_p);
- g_signal_connect(main_w, "destroy", G_CALLBACK(filter_dlg_destroy_cb), filter_list_type_p);
-
- gtk_widget_show(main_w);
-
- if(construct_args->modal_and_transient) {
- parent = gtk_widget_get_parent_window(parent_filter_te);
- gdk_window_set_transient_for(gtk_widget_get_window(main_w), parent);
- gtk_window_set_modal(GTK_WINDOW(main_w), TRUE);
- }
-
- /* hide the Ok button, if we don't have to apply it and our caller wants a Save button */
- if (parent_filter_te == NULL && prefs.gui_use_pref_save) {
- gtk_widget_hide(ok_bt);
- }
-
- /* hide the Apply button, if our caller don't wants one */
- if (!construct_args->wants_apply_button) {
- gtk_widget_hide(apply_bt);
- }
-
- /* hide the Save button if the user uses implicit save */
- if (!prefs.gui_use_pref_save) {
- gtk_widget_hide(save_bt);
- }
-
- window_present(main_w);
-
- return main_w;
-}
-
-static void
-filter_dlg_dclick(GtkWidget *filter_l, gpointer main_w_arg, gpointer activate)
-{
- GtkWidget *main_w = GTK_WIDGET(main_w_arg);
- GtkWidget *parent_filter_te =
- (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_FILT_PARENT_FILTER_TE_KEY);
- GList *flp;
- filter_def *filt;
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(filter_l));
-
- if (parent_filter_te != NULL) {
- /*
- * We have a text entry widget associated with this dialog
- * box; is one of the filters in the list selected?
- */
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- /*
- * Yes. Is there a filter definition for that filter?
- */
- gtk_tree_model_get(model, &iter, 1, &flp, -1);
- if (flp) {
- /*
- * Yes - put it in the text entry widget.
- */
- filt = (filter_def *) flp->data;
- gtk_entry_set_text(GTK_ENTRY(parent_filter_te),
- filt->strval);
-
- /*
- * Are we supposed to cause the filter we
- * put there to be applied?
- */
- if (activate != NULL) {
- /*
- * Yes - do so.
- */
- g_signal_emit_by_name(G_OBJECT(parent_filter_te), "activate", NULL);
- }
- }
- }
- }
-
- window_destroy(main_w);
-}
-
-static void
-filter_dlg_ok_cb(GtkWidget *ok_bt, gpointer data)
-{
- filter_list_type_t list_type = *(filter_list_type_t *)data;
-
- /*
- * Destroy the dialog box and apply the filter.
- */
- filter_apply(gtk_widget_get_toplevel(ok_bt), TRUE);
-
- /* if we don't have a Save button, just save the settings now */
- if (!prefs.gui_use_pref_save) {
- filter_dlg_save(list_type);
- }
-}
-
-static void
-filter_dlg_apply_cb(GtkWidget *apply_bt, gpointer data)
-{
- filter_list_type_t list_type = *(filter_list_type_t *)data;
-
- /*
- * Apply the filter, but don't destroy the dialog box.
- */
- filter_apply(gtk_widget_get_toplevel(apply_bt), FALSE);
-
- /* if we don't have a Save button, just save the settings now */
- if (!prefs.gui_use_pref_save) {
- filter_dlg_save(list_type);
- }
-}
-
-static void
-filter_apply(GtkWidget *main_w, gboolean destroy)
-{
- construct_args_t *construct_args =
- (construct_args_t *)g_object_get_data(G_OBJECT(main_w), E_FILT_CONSTRUCT_ARGS_KEY);
- GtkWidget *parent_filter_te =
- (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_FILT_PARENT_FILTER_TE_KEY);
- GtkWidget *filter_te;
- const gchar *filter_string;
-
- if (parent_filter_te != NULL) {
- /*
- * We have a text entry widget associated with this dialog
- * box; put the filter in our text entry widget into that
- * text entry widget.
- */
- filter_te = (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_FILT_FILTER_TE_KEY);
- filter_string =
- (const gchar *)gtk_entry_get_text(GTK_ENTRY(filter_te));
- gtk_entry_set_text(GTK_ENTRY(parent_filter_te), filter_string);
-
- }
-
- if (destroy) {
- /*
- * Destroy the filter dialog box.
- */
- window_destroy(main_w);
- }
-
- if (parent_filter_te != NULL) {
- /*
- * We have a text entry widget associated with this dialog
- * box; activate that widget to cause the filter we put
- * there to be applied if we're supposed to do so.
- *
- * We do this after dismissing the filter dialog box,
- * as activating the widget the dialog box to which
- * it belongs to be dismissed, and that may cause it
- * to destroy our dialog box if the filter succeeds.
- * This means that our subsequent attempt to destroy
- * it will fail.
- *
- * We don't know whether it'll destroy our dialog box,
- * so we can't rely on it to do so. Instead, we
- * destroy it ourselves, which will clear the
- * E_FILT_DIALOG_PTR_KEY pointer for their dialog box,
- * meaning they won't think it has one and won't try
- * to destroy it.
- */
- if (construct_args->activate_on_ok) {
- g_signal_emit_by_name(G_OBJECT(parent_filter_te), "activate", NULL);
- }
- }
-}
-
-
-static void
-filter_dlg_save(filter_list_type_t list_type)
-{
- switch (list_type) {
-
- case CFILTER_EDITED_LIST:
- list_type = CFILTER_LIST;
- copy_filter_list(CFILTER_LIST, CFILTER_EDITED_LIST);
- break;
-
- case DFILTER_EDITED_LIST:
- list_type = DFILTER_LIST;
- copy_filter_list(DFILTER_LIST, DFILTER_EDITED_LIST);
- break;
-
- default:
- g_assert_not_reached();
- break;
- }
-
- save_filter_list(list_type);
-}
-
-
-static void
-filter_dlg_save_cb(GtkWidget *save_bt _U_, gpointer data)
-{
- filter_list_type_t list_type = *(filter_list_type_t *)data;
-
- filter_dlg_save(list_type);
-}
-
-#if 0
-/* update a remaining dialog if another one was cancelled */
-static void
-filter_dlg_update_list_cb(gpointer data, gpointer user_data)
-{
- GtkWidget *main_w = data;
- filter_list_type_t list_type = *(filter_list_type_t *)user_data;
-
- /* refill the list */
- clear_list(main_w);
- fill_list(main_w, list_type, NULL);
-}
-#endif
-
-/* cancel button pressed, revert changes and exit dialog */
-static void
-filter_dlg_cancel_cb(GtkWidget *cancel_bt, gpointer data)
-{
- filter_list_type_t list_type = *(filter_list_type_t *)data;
- GtkWidget *main_w = gtk_widget_get_toplevel(cancel_bt);
- static GList *filter_list;
-
-
- window_destroy(GTK_WIDGET(main_w));
-
- /* if this was the last open filter dialog, revert the changes made */
- filter_list = get_filter_dialog_list(list_type);
- if(g_list_length(filter_list) == 0) {
- /* revert changes in the edited list */
- switch (list_type) {
- case CFILTER_EDITED_LIST:
- copy_filter_list(CFILTER_EDITED_LIST, CFILTER_LIST);
- break;
- case DFILTER_EDITED_LIST:
- copy_filter_list(DFILTER_EDITED_LIST, DFILTER_LIST);
- break;
- default:
- g_assert_not_reached();
- break;
- }
- }
-
-#if 0
- /* update other open filter dialogs */
- g_list_foreach(get_filter_dialog_list(list_type), filter_dlg_update_list_cb, &list_type);
-#endif
-}
-
-/* Treat this as a cancel, by calling "filter_dlg_cancel_cb()" */
-static gboolean
-filter_dlg_delete_event_cb(GtkWidget *main_w, GdkEvent *event _U_,
- gpointer data)
-{
- filter_dlg_cancel_cb(main_w, data);
- return FALSE;
-}
-
-
-static void
-filter_dlg_destroy_cb(GtkWidget *win, gpointer data)
-{
- filter_list_type_t list_type = *(filter_list_type_t *)data;
- GtkWidget *button;
-
- /* Get the button that requested that we be popped up, if any.
- (It should arrange to destroy us if it's destroyed, so
- that we don't get a pointer to a non-existent window here.) */
- button = (GtkWidget *)g_object_get_data(G_OBJECT(win), E_FILT_BUTTON_PTR_KEY);
-
- if (button != NULL) {
- /* Tell it we no longer exist. */
- g_object_set_data(G_OBJECT(button), E_FILT_DIALOG_PTR_KEY, NULL);
- } else {
- /* This is an editing dialog popped up from, for example,
- a menu item; note that we no longer have one. */
- switch (list_type) {
-
-#ifdef HAVE_LIBPCAP
- case CFILTER_EDITED_LIST:
- g_assert(win == global_cfilter_w);
- global_cfilter_w = NULL;
- break;
-#endif
- default:
- g_assert_not_reached();
- break;
- }
- }
-
- /* Remove this from the list of filter dialog windows. */
- forget_filter_dialog(win, list_type);
-}
-
-static gboolean
-filter_sel_list_button_cb(GtkWidget *list, GdkEventButton *event,
- gpointer data _U_)
-{
- void (* func)(GtkWidget *, gpointer, gpointer);
- gpointer func_arg;
- gpointer func_activate;
-
- if (event->type == GDK_2BUTTON_PRESS) {
- func = ( void (*)(GtkWidget *, void *, void *))g_object_get_data(G_OBJECT(list), E_FILT_DBLFUNC_KEY);
- func_arg = g_object_get_data(G_OBJECT(list), E_FILT_DBLARG_KEY);
- func_activate = g_object_get_data(G_OBJECT(list), E_FILT_DBLACTIVATE_KEY);
-
- if (func)
- (*func)(list, func_arg, func_activate);
- }
-
- return FALSE;
-}
-
-static void
-filter_sel_list_cb(GtkTreeSelection *sel, gpointer data _U_)
-{
- GtkWidget *filter_l = GTK_WIDGET(gtk_tree_selection_get_tree_view(sel));
- GtkWidget *main_w = gtk_widget_get_toplevel(filter_l);
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_FILT_NAME_TE_KEY);
- GtkWidget *filter_te = (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_FILT_FILTER_TE_KEY);
- GtkWidget *chg_bt = (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_FILT_CHG_BT_KEY);
- GtkWidget *copy_bt = (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_FILT_COPY_BT_KEY);
- GtkWidget *del_bt = (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_FILT_DEL_BT_KEY);
- filter_def *filt;
- gchar *name = NULL, *strval = NULL;
- GList *flp;
- gint sensitivity = FALSE;
-
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- gtk_tree_model_get(model, &iter, 1, &flp, -1);
- if (flp) {
- filt = (filter_def *) flp->data;
- name = g_strdup(filt->name);
- strval = g_strdup(filt->strval);
- sensitivity = TRUE;
- }
- }
-
- /*
- * Did you know that this function is called when the window is destroyed?
- * Funny, that.
- * This means that we have to:
- *
- * attach to the top-level window data items containing pointers to
- * the widgets we affect here;
- *
- * give each of those widgets their own destroy callbacks;
- *
- * clear that pointer when the widget is destroyed;
- *
- * don't do anything to the widget if the pointer we get back is
- * null;
- *
- * so that if we're called after any of the widgets we'd affect are
- * destroyed, we know that we shouldn't do anything to those widgets.
- */
- if (name_te != NULL)
- gtk_entry_set_text(GTK_ENTRY(name_te), name ? name : "");
- if (filter_te != NULL)
- gtk_entry_set_text(GTK_ENTRY(filter_te), strval ? strval : "");
- if (chg_bt != NULL)
- gtk_widget_set_sensitive(chg_bt, sensitivity);
- if (copy_bt != NULL)
- gtk_widget_set_sensitive(copy_bt, sensitivity);
- if (del_bt != NULL)
- gtk_widget_set_sensitive(del_bt, sensitivity);
- g_free(name);
- g_free(strval);
-}
-
-/* To do: add input checking to each of these callbacks */
-
-/* Structure containing arguments to be passed to "new_filter_cb()".
-
- "active_filter_l" is the list in the dialog box in which "New" or
- "Copy" was clicked; in that dialog box, but not in any other dialog
- box, we select the newly created list item.
-
- "nflp" is the GList member in the model (filter list) for the new
- filter. */
-typedef struct {
- GtkWidget *active_filter_l;
- GList *nflp;
-} new_filter_cb_args_t;
-
-static void
-new_filter_cb(gpointer data, gpointer user_data)
-{
- GtkWidget *main_w = (GtkWidget *)data;
- GtkTreeView *filter_l;
- GtkListStore *store;
- GtkTreeIter iter;
- new_filter_cb_args_t *args = (new_filter_cb_args_t *)user_data;
- filter_def *nfilt = (filter_def *)args->nflp->data;
-
- filter_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(main_w), E_FILT_FILTER_L_KEY));
- store = GTK_LIST_STORE(gtk_tree_view_get_model(filter_l));
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, nfilt->name, 1, args->nflp, -1);
- if (GTK_WIDGET(filter_l) == args->active_filter_l) {
- /* Select the item. */
- gtk_tree_selection_select_iter(gtk_tree_view_get_selection(filter_l),
- &iter);
- }
-}
-
-static void
-filter_new_bt_clicked_cb(GtkWidget *w, gpointer data)
-{
- GtkWidget *main_w = gtk_widget_get_toplevel(w);
- GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_FILT_NAME_TE_KEY);
- GtkWidget *filter_te = (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_FILT_FILTER_TE_KEY);
- GtkWidget *filter_l = (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_FILT_FILTER_L_KEY);
- filter_list_type_t list_type = *(filter_list_type_t *)data;
- GList *fl_entry;
- const gchar *name, *strval;
- new_filter_cb_args_t args;
-
- name = gtk_entry_get_text(GTK_ENTRY(name_te));
- strval = gtk_entry_get_text(GTK_ENTRY(filter_te));
-
- /* if the user didn't entered a name, set default one */
- if (strlen(name) == 0) {
- name = "new";
- }
-
- /* if the user didn't entered a string value, set default one */
- if (strlen(strval) == 0) {
- strval = "new";
- }
-
- /* Add a new entry to the filter list. */
- fl_entry = add_to_filter_list(list_type, name, strval);
-
- /* Update all the filter list widgets, not just the one in
- the dialog box in which we clicked on "Copy". */
- args.active_filter_l = filter_l;
- args.nflp = fl_entry;
- g_list_foreach(get_filter_dialog_list(list_type), new_filter_cb, &args);
-
-}
-
-static gboolean
-chg_list_item_cb(GtkTreeModel *model, GtkTreePath *path _U_, GtkTreeIter *iter,
- gpointer data)
-{
- GList *flp = (GList *)data;
- filter_def *filt = (filter_def *)flp->data;
- GList *nl_model;
-
- gtk_tree_model_get(model, iter, 1, &nl_model, -1);
- /* Is this the item corresponding to the filter list item in question? */
- if (flp == nl_model) {
- /* Yes - change the label to correspond to the new name for the
- * filter. */
- gtk_list_store_set(GTK_LIST_STORE(model), iter, 0, filt->name, -1);
- return TRUE;
- }
- return FALSE;
-}
-
-static void
-chg_filter_cb(gpointer data, gpointer user_data)
-{
- GtkWidget *main_w = (GtkWidget *)data;
- GtkWidget *filter_l = (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_FILT_FILTER_L_KEY);
-
- gtk_tree_model_foreach(gtk_tree_view_get_model(GTK_TREE_VIEW(filter_l)),
- chg_list_item_cb, user_data);
-}
-
-static void
-filter_name_te_changed_cb(GtkWidget *w, gpointer data)
-{
- GtkWidget *main_w = gtk_widget_get_toplevel(w);
- GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_FILT_NAME_TE_KEY);
- GtkWidget *filter_te = (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_FILT_FILTER_TE_KEY);
- GtkWidget *filter_l = (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_FILT_FILTER_L_KEY);
- filter_def *filt;
- GList *fl_entry;
- filter_list_type_t list_type = *(filter_list_type_t *)data;
- const gchar *name = "";
- const gchar *strval = "";
-
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(filter_l));
- name = gtk_entry_get_text(GTK_ENTRY(name_te));
- strval = gtk_entry_get_text(GTK_ENTRY(filter_te));
-
- if (DFILTER_EDITED_LIST == list_type) {
- /* colorize filter string entry */
- filter_te_syntax_check_cb(filter_te, NULL);
- }
-
- /* if something was selected */
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- gtk_tree_model_get(model, &iter, 1, &fl_entry, -1);
- if (fl_entry != NULL) {
- filt = (filter_def *) fl_entry->data;
-
- if (strlen(name) > 0 && strlen(strval) > 0 && filt) {
- g_free(filt->name);
- g_free(filt->strval);
- filt->name = g_strdup(name);
- filt->strval = g_strdup(strval);
-
- /* Update all the filter list widgets, not just the one in
- the dialog box in which we clicked on "Copy". */
- g_list_foreach(get_filter_dialog_list(list_type), chg_filter_cb,
- fl_entry);
- }
- }
- }
-}
-
-static void
-delete_filter_cb(gpointer data, gpointer user_data)
-{
- GtkWidget *main_w = (GtkWidget *)data;
- GtkWidget *filter_l = (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_FILT_FILTER_L_KEY);
- gchar *pos = (gchar *)user_data;
- GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(filter_l));
- GtkTreeIter iter;
-
- gtk_tree_model_get_iter_from_string(model, &iter, pos);
- gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
-}
-
-static void
-filter_del_bt_clicked_cb(GtkWidget *w, gpointer data)
-{
- GtkWidget *main_w = gtk_widget_get_toplevel(w);
- GtkWidget *filter_l = (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_FILT_FILTER_L_KEY);
- filter_list_type_t list_type = *(filter_list_type_t *)data;
- GList *fl_entry;
- gchar *pos;
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkTreePath *path;
-
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(filter_l));
- /* If something was selected */
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- gtk_tree_model_get(model, &iter, 1, &fl_entry, -1);
- path = gtk_tree_model_get_path(model, &iter);
- pos = gtk_tree_path_to_string(path);
- gtk_tree_path_free(path);
- if (fl_entry != NULL) {
- /* Remove the entry from the filter list. */
- remove_from_filter_list(list_type, fl_entry);
-
- /* Update all the filter list widgets, not just the one in
- the dialog box in which we clicked on "Delete". */
- g_list_foreach(get_filter_dialog_list(list_type), delete_filter_cb, pos);
- }
- g_free(pos);
- }
-}
-
-void
-filter_add_expr_bt_cb(GtkWidget *w _U_, gpointer main_w_arg)
-{
- GtkWidget *main_w = GTK_WIDGET(main_w_arg);
- GtkWidget *filter_te, *dfilter_w;
-
- filter_te = (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_FILT_FILTER_TE_KEY);
- dfilter_w = dfilter_expr_dlg_new(filter_te);
-
- /* If we're opening a series of modal dialogs (such as when going
- * through file->open, make the latest dialog modal also so that it
- * takes over "control" from the other modal dialogs. Also set
- * the transient property of the new dialog so the user doesn't try
- * to interact with the previous window when they can't.
- * XXX: containing widget might be the Filter Toolbar */
-
- if ( GTK_IS_WINDOW(main_w) && gtk_window_get_modal(GTK_WINDOW(main_w))) {
- gtk_window_set_modal(GTK_WINDOW(dfilter_w), TRUE);
- gtk_window_set_transient_for(GTK_WINDOW(dfilter_w),
- GTK_WINDOW(main_w));
- }
-}
-
-
-#if GTK_CHECK_VERSION(3,0,0)
-static void
-ws_style_widget_using_css(GtkWidget *w, const gchar * const css)
-{
- GtkCssProvider *css_provider;
- GtkStyleContext *style;
- css_provider = gtk_css_provider_new();;
- style = gtk_widget_get_style_context (w);
- gtk_css_provider_load_from_data(css_provider, css, -1, NULL);
- gtk_style_context_add_provider(style, GTK_STYLE_PROVIDER(css_provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
- g_object_unref(css_provider);
-}
-#endif
-
-static void
-color_filter_te(GtkWidget *w, guint16 red, guint16 green, guint16 blue)
-{
-#if GTK_CHECK_VERSION(3,0,0)
- static GdkRGBA black = { 0, 0, 0, 1.0 };
- gchar *css;
- css = g_strdup_printf("@define-color theme_selected_bg_color @selected_bg_color; GtkEntry {background: rgb(%d, %d, %d);} .entry:selected {background-color: @theme_selected_bg_color;}", red / 256, green/256, blue/256);
- ws_style_widget_using_css(w, css);
- g_free(css);
-
- gtk_widget_override_color(w, GTK_STATE_FLAG_NORMAL, &black);
- gtk_widget_override_cursor(w, &black, &black);
-#else
- static GdkColor black = { 0, 0, 0, 0 };
- GdkColor bg;
-
- bg.pixel = 0;
- bg.red = red;
- bg.green = green;
- bg.blue = blue;
-
- gtk_widget_modify_text(w, GTK_STATE_NORMAL, &black);
- gtk_widget_modify_base(w, GTK_STATE_NORMAL, &bg);
- gtk_widget_modify_cursor(w, &black, &black);
-#endif
-}
-
-void
-colorize_filter_te_as_empty(GtkWidget *w)
-{
-#if GTK_CHECK_VERSION(3,0,0)
- /* use defaults */
- gtk_widget_override_color(w, GTK_STATE_FLAG_NORMAL, NULL);
- ws_style_widget_using_css(w, "@define-color theme_base_color @base_color; * {background: @theme_base_color}");
- gtk_widget_override_cursor(w, NULL, NULL);
-#else
- /* use defaults */
- gtk_widget_modify_text(w, GTK_STATE_NORMAL, NULL);
- gtk_widget_modify_base(w, GTK_STATE_NORMAL, NULL);
- gtk_widget_modify_cursor(w, NULL, NULL);
-#endif
-}
-
-void
-colorize_filter_te_as_invalid(GtkWidget *w)
-{
- color_filter_te(w, prefs.gui_text_invalid.red, prefs.gui_text_invalid.green, prefs.gui_text_invalid.blue);
-}
-
-static void
-colorize_filter_te_as_deprecated(GtkWidget *w)
-{
- color_filter_te(w, prefs.gui_text_deprecated.red, prefs.gui_text_deprecated.green, prefs.gui_text_deprecated.blue);
-}
-
-void
-colorize_filter_te_as_valid(GtkWidget *w)
-{
- color_filter_te(w, prefs.gui_text_valid.red, prefs.gui_text_valid.green, prefs.gui_text_valid.blue);
-}
-
-/*
- * XXX This calls dfilter_compile, which might call get_host_ipaddr or
- * get_host_ipaddr6. Either of of these will freeze the UI if the host
- * name resolution takes a long time to complete. We need to work
- * around this, either by disabling host name resolution or by doing
- * the resolution asynchronously.
- *
- * We could use a separate thread but we have be careful to only call
- * GTK+/GDK routines from the main thread. From the GDK threads
- * documentation:
- *
- * "With the Win32 backend, GDK calls should not be attempted from
- * multiple threads at all."
- */
-
-void
-filter_te_syntax_check_cb(GtkWidget *w, gpointer user_data _U_)
-{
- const gchar *strval;
- dfilter_t *dfp;
- GPtrArray *depr = NULL;
- gboolean use_statusbar;
- guchar c;
-
- strval = gtk_entry_get_text(GTK_ENTRY(w));
- use_statusbar = g_object_get_data(G_OBJECT(w), E_FILT_FIELD_USE_STATUSBAR_KEY) ? TRUE : FALSE;
-
- if (use_statusbar) {
- statusbar_pop_filter_msg();
- }
-
- if (g_object_get_data(G_OBJECT(w), E_FILT_MULTI_FIELD_NAME_ONLY_KEY)) {
- gchar **fields;
- guint i_field = 0;
-
- fields = g_regex_split_simple(COL_CUSTOM_PRIME_REGEX,
- strval, G_REGEX_ANCHORED, G_REGEX_MATCH_ANCHORED);
-
- for (i_field =0; i_field < g_strv_length(fields); i_field += 1) {
- if (fields[i_field] && *fields[i_field]) {
- c = proto_check_field_name(fields[i_field]);
- if (c != 0) {
- colorize_filter_te_as_invalid(w);
- if (use_statusbar)
- statusbar_push_filter_msg(" Invalid filter");
- g_strfreev(fields);
- return;
- }
- }
- }
- g_strfreev(fields);
- }
-
- /* colorize filter string entry */
- if (g_object_get_data(G_OBJECT(w), E_FILT_FIELD_NAME_ONLY_KEY) &&
- (c = proto_check_field_name(strval)) != 0)
- {
- colorize_filter_te_as_invalid(w);
- if (use_statusbar) {
- statusbar_push_filter_msg(" Illegal character in field name: '%c'", c);
- }
- } else {
- gchar *err_msg;
-
- if (dfilter_compile(strval, &dfp, &err_msg)) {
- if (dfp != NULL) {
- depr = dfilter_deprecated_tokens(dfp);
- }
- if (strlen(strval) == 0) {
- colorize_filter_te_as_empty(w);
- } else if (depr) {
- /* You keep using that word. I do not think it means what you think it means. */
- colorize_filter_te_as_deprecated(w);
- if (use_statusbar) {
- /*
- * We're being lazy and only printing the first "problem" token.
- * Would it be better to print all of them?
- */
- statusbar_push_temporary_msg(" \"%s\" may have unexpected results (see the User's Guide)",
- (const char *) g_ptr_array_index(depr, 0));
- }
- } else {
- colorize_filter_te_as_valid(w);
- }
- dfilter_free(dfp);
- } else {
- colorize_filter_te_as_invalid(w);
- if (use_statusbar)
- statusbar_push_filter_msg(" Invalid filter: %s", err_msg);
- g_free(err_msg);
- }
- }
-}
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/filter_dlg.h b/ui/gtk/filter_dlg.h
deleted file mode 100644
index 40a781feeb..0000000000
--- a/ui/gtk/filter_dlg.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/* filter_dlg.h
- * Definitions for dialog boxes for filter editing
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __FILTER_DLG_H__
-#define __FILTER_DLG_H__
-
-/** @file
- * "Capture Filter" / "Display Filter" / "Add expression" dialog boxes.
- * (This used to be a notebook page under "Preferences", hence the
- * "prefs" in the file name.)
- * @ingroup dialog_group
- */
-
-/**
- * Structure giving properties of the filter editing dialog box to be
- * created.
- */
-typedef struct {
- const gchar *title; /**< title of dialog box */
- gboolean wants_apply_button; /**< dialog should have an Apply button */
- gboolean activate_on_ok; /**< if parent text widget should be
- activated on "Ok" or "Apply" */
- gboolean modal_and_transient; /**< dialog is modal and transient to the
- parent window (e.g. to gtk_file_chooser) */
-} construct_args_t;
-
-/** Create a "Capture Filter" dialog box caused by a button click.
- *
- * @param widget parent widget
- * @param user_data unused
- */
-void capture_filter_construct_cb(GtkWidget *widget, gpointer user_data);
-
-/** Create a "Display Filter" dialog box caused by a button click.
- *
- * @param widget parent widget
- * @param construct_args_ptr parameters to construct the dialog (construct_args_t)
- */
-void display_filter_construct_cb(GtkWidget *widget, gpointer construct_args_ptr);
-
-/** Should be called when the widget (usually a button) that creates filters
- * is destroyed. It destroys any filter dialog created by that widget.
- *
- * @param widget parent widget
- * @param user_data unused
- */
-void filter_button_destroy_cb(GtkWidget *widget, gpointer user_data);
-
-/** User requested the "Capture Filter" dialog box by menu or toolbar.
- *
- * @param widget parent widget
- */
-void cfilter_dialog_cb(GtkWidget *widget);
-
-/** User requested the "Display Filter" dialog box by menu or toolbar.
- *
- * @param widget parent widget
- */
-void dfilter_dialog_cb(GtkWidget *widget);
-
-/** Create an "Add expression" dialog box caused by a button click.
- *
- * @param widget unused
- * @param main_w_arg parent widget
- */
-void filter_add_expr_bt_cb(GtkWidget *widget, gpointer main_w_arg);
-
-/** Colorize a text entry as empty.
- *
- * @param widget the text entry to colorize
- */
-void colorize_filter_te_as_empty(GtkWidget *widget);
-
-/** Colorize a text entry as a invalid.
- *
- * @param widget the text entry to colorize
- */
-void colorize_filter_te_as_invalid(GtkWidget *widget);
-
-/** Colorize a text entry as a valid.
- *
- * @param widget the text entry to colorize
- */
-void colorize_filter_te_as_valid(GtkWidget *widget);
-
-/** Colorize a filter text entry depending on "validity".
- *
- * @param widget the text entry to colorize
- * @param user_data Callback User Data pointer (unused)
- */
-void filter_te_syntax_check_cb(GtkWidget *widget, gpointer user_data _U_);
-
-/** The filter button of the top_level window. */
-#define E_FILT_BT_PTR_KEY "filter_bt_ptr"
-
-/** The filter text entry. */
-#define E_FILT_TE_PTR_KEY "filter_te_ptr"
-
-/** The filter text entry.
- * @todo Check the usage of all the text entry keys.
- */
-#define E_FILT_FILTER_TE_KEY "filter_filter_te"
-
-/** Only validate a single field entry. */
-#define E_FILT_FIELD_NAME_ONLY_KEY "filter_field_name_only"
-
-/** Only validate a multi field entry. */
-#define E_FILT_MULTI_FIELD_NAME_ONLY_KEY "filter_multi_field_name_only"
-
-/** Update statusbar when changing the filter entry. */
-#define E_FILT_FIELD_USE_STATUSBAR_KEY "filter_field_use_statusbar"
-
-#endif /* filter_dlg.h */
diff --git a/ui/gtk/filter_expression_save_dlg.c b/ui/gtk/filter_expression_save_dlg.c
deleted file mode 100644
index f9da20e3d0..0000000000
--- a/ui/gtk/filter_expression_save_dlg.c
+++ /dev/null
@@ -1,354 +0,0 @@
-/* filter_expression_save_dlg.c
- * Routines for "Filter Save" window
- * Submitted by Edwin Groothuis <wireshark@mavetju.org>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-#include <math.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/prefs.h>
-#include <epan/uat-int.h>
-
-
-#include "ui/preference_utils.h"
-
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/filter_expression_save_dlg.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/filter_dlg.h"
-#include "ui/gtk/filter_autocomplete.h"
-#include "ui/gtk/help_dlg.h"
-
-#include "globals.h"
-#include "main.h"
-
-
-/* Capture callback data keys */
-#define E_FILTER_SAVE_EXPR_KEY "filter_save_offset_expression"
-#define E_FILTER_SAVE_LABEL_KEY "filter_save_offset_label"
-
-static void filter_save_ok_cb(GtkWidget *ok_bt, GtkWindow *parent_w);
-static void filter_save_close_cb(GtkWidget *close_bt, gpointer parent_w);
-static void filter_save_frame_destroy_cb(GtkWidget *win, gpointer user_data);
-static void filter_button_cb(GtkWidget *close_bt, gpointer parent_w);
-static int filter_button_add(const char *label, const char *expr, struct filter_expression *newbutton);
-
-/*
- * Keep a static pointer to the current "Filter Save" window, if any, so
- * that if somebody tries to do "Filter Save" while there's already a
- * "Filter Save" window up, we just pop up the existing one, rather than
- * creating a new one.
- */
-static GtkWidget *filter_save_frame_w;
-
-GtkWidget *_filter_tb = NULL;
-GtkWidget *_filter_te = NULL;
-
-static GList * filter_buttons = NULL;
-
-static gboolean
-add_filter_expression_button(const void *key _U_, void *value, void *user_data _U_)
-{
- filter_expression_t* fe = (filter_expression_t*)value;
-
- filter_button_add(NULL, NULL, fe);
-
- return FALSE;
-}
-
-/*
- * This does do two things:
- * - Keep track of the various elements of the Filter Toolbar which will
- * be needed later when a new button has to be added.
- * - Since it is called after the preferences are read from the configfile,
- * this is the one also which creates the initial buttons when the
- * Filter Toolbar has been created.
- */
-void
-filter_expression_save_dlg_init(gpointer filter_tb, gpointer filter_te)
-{
- _filter_tb = (GtkWidget *)filter_tb;
- _filter_te = (GtkWidget *)filter_te;
-
- filter_expression_iterate_expressions(add_filter_expression_button, NULL);
-}
-
-static gboolean
-add_filter_buttons(const void *key _U_, void *value, void *user_data _U_)
-{
- filter_expression_t* fe = (filter_expression_t*)value;
-
- filter_button_add(NULL, NULL, fe);
-
- return FALSE;
-}
-
-void
-filter_expression_reinit(int what)
-{
- GList *button_list;
- if ((what & FILTER_EXPRESSION_REINIT_DESTROY) != 0) {
- for(button_list = filter_buttons; button_list != NULL; button_list = g_list_next(button_list)) {
- gtk_widget_destroy((GtkWidget *)button_list->data);
- }
- g_list_free(filter_buttons);
- filter_buttons = NULL;
- }
-
- if (what == FILTER_EXPRESSION_REINIT_DESTROY) {
- return;
- }
-
- if ((what & FILTER_EXPRESSION_REINIT_CREATE) != 0) {
- /* XXX - Updating of the filter index was removed
- when filter expressions were converted to a UAT.
- This will probably cause some "reordering" bugs,
- but they should be ignored since GTK GUI is deprecated */
- filter_expression_iterate_expressions(add_filter_buttons, NULL);
- }
-}
-
-static int
-filter_button_add(const char *label, const char *expr, struct filter_expression *newfe)
-{
- struct filter_expression *fe;
- GtkWidget *button;
- gchar* tooltip;
-
- /* No duplicate buttons when adding a new one */
- if (newfe == NULL)
- fe = filter_expression_new(label, expr, "", TRUE);
- else
- fe = newfe;
-
- if (fe->enabled == FALSE)
- return(0);
-
- /* Create the "Label" button */
- button = (GtkWidget*)gtk_tool_button_new(NULL, fe->label);
- g_signal_connect(button, "clicked", G_CALLBACK(filter_button_cb),
- NULL);
- gtk_widget_set_sensitive(GTK_WIDGET(button), FALSE);
- gtk_widget_show(GTK_WIDGET(button));
-
- gtk_toolbar_insert(GTK_TOOLBAR(_filter_tb), (GtkToolItem *)button, -1);
- gtk_widget_set_sensitive(GTK_WIDGET(button), TRUE);
- if (strlen(fe->comment) > 0)
- {
- tooltip = g_strdup_printf("%s\n%s", fe->comment, fe->expression);
- gtk_widget_set_tooltip_text(GTK_WIDGET(button), tooltip);
- }
- else
- {
- gtk_widget_set_tooltip_text(GTK_WIDGET(button), fe->expression);
- }
-
- fe->button = button;
- filter_buttons = g_list_append (filter_buttons, button);
-
- return(0);
-}
-
-static gboolean
-find_match_filter_button(const void *key _U_, void *value, void *user_data)
-{
- filter_expression_t* fe = (filter_expression_t*)value;
- GtkWidget *this_button = (GtkWidget *)user_data;
-
- if ((void *)fe->button == (void *)this_button) {
- gtk_entry_set_text(GTK_ENTRY(_filter_te),
- fe->expression);
- main_filter_packets(&cfile, fe->expression, FALSE);
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-filter_button_cb(GtkWidget *this_button, gpointer parent_w _U_)
-{
- filter_expression_iterate_expressions(find_match_filter_button, this_button);
-}
-
-void
-filter_expression_save_dlg(gpointer data)
-{
- GtkWidget *main_vb, *main_filter_save_hb, *filter_save_frame,
- *filter_save_type_vb, *filter_save_type_hb, *entry_hb,
- *bbox, *ok_bt, *cancel_bt, *help_bt, *filter_text_box,
- *label_text_box;
-
- const char *expr;
-
- /* The filter requested */
- expr = gtk_entry_get_text(GTK_ENTRY(data));
-
- if (filter_save_frame_w != NULL) {
- /* There's already a "Filter Save" dialog box; reactivate it. */
- reactivate_window(filter_save_frame_w);
- return;
- }
-
- filter_save_frame_w = dlg_window_new("Wireshark: Save Filter");
-
- /* Container for each row of widgets */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_container_add(GTK_CONTAINER(filter_save_frame_w), main_vb);
- gtk_widget_show(main_vb);
-
-
- /* */
- main_filter_save_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX (main_vb), main_filter_save_hb, TRUE, TRUE, 0);
- gtk_widget_show(main_filter_save_hb);
-
- /* Filter Save frame */
- filter_save_frame = gtk_frame_new("Save Filter as...");
- gtk_box_pack_start(GTK_BOX(main_filter_save_hb), filter_save_frame,
- TRUE, TRUE, 0);
- gtk_widget_show(filter_save_frame);
-
- filter_save_type_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(filter_save_type_vb), 3);
- gtk_container_add(GTK_CONTAINER(filter_save_frame),
- filter_save_type_vb);
- gtk_widget_show(filter_save_type_vb);
-
- /* filter_save type row */
- filter_save_type_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX (filter_save_type_vb), filter_save_type_hb, TRUE, TRUE, 0);
-
- gtk_widget_show(filter_save_type_hb);
-
- /* filter_save row */
- entry_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(filter_save_type_vb), entry_hb, FALSE,
- FALSE, 0);
- gtk_widget_show(entry_hb);
-
- filter_text_box = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(entry_hb), filter_text_box, TRUE, TRUE, 0);
- g_signal_connect(filter_text_box, "changed", G_CALLBACK(filter_te_syntax_check_cb), NULL);
- g_signal_connect(filter_text_box, "key-press-event", G_CALLBACK (filter_string_te_key_pressed_cb), NULL);
- g_signal_connect(filter_save_frame_w, "key-press-event", G_CALLBACK (filter_parent_dlg_key_pressed_cb), NULL);
-
- gtk_entry_set_text(GTK_ENTRY(filter_text_box), expr);
- gtk_widget_show(filter_text_box);
-
- label_text_box = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(entry_hb), label_text_box, TRUE, TRUE, 0);
- gtk_entry_set_text(GTK_ENTRY(label_text_box), "Filter");
- gtk_widget_show(label_text_box);
-
- /* Button row */
- bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CANCEL,
- GTK_STOCK_HELP, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 0);
- gtk_widget_show(bbox);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(filter_save_ok_cb),
- filter_save_frame_w);
-
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- g_signal_connect(cancel_bt, "clicked", G_CALLBACK(filter_save_close_cb),
- filter_save_frame_w);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb),
- (gpointer)HELP_FILTER_SAVE_DIALOG);
-
- g_object_set_data(G_OBJECT(filter_save_frame_w),
- E_FILTER_SAVE_EXPR_KEY, filter_text_box);
- g_object_set_data(G_OBJECT(filter_save_frame_w),
- E_FILTER_SAVE_LABEL_KEY, label_text_box);
-
- dlg_set_activate(label_text_box, ok_bt);
-
- /* Give the initial focus to the "offset" entry box. */
- gtk_widget_grab_focus(label_text_box);
-
- g_signal_connect(filter_save_frame_w, "delete_event",
- G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(filter_save_frame_w, "destroy",
- G_CALLBACK(filter_save_frame_destroy_cb), NULL);
-
- gtk_widget_show(filter_save_frame_w);
- window_present(filter_save_frame_w);
-}
-
-static void
-filter_save_ok_cb(GtkWidget *ok_bt _U_, GtkWindow *parent_w)
-{
- GtkWidget *expr_te, *label_te;
- const char *expr, *label;
-
- /* The filter requested */
- expr_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
- E_FILTER_SAVE_EXPR_KEY);
- label_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
- E_FILTER_SAVE_LABEL_KEY);
- expr = gtk_entry_get_text(GTK_ENTRY(expr_te));
- label = gtk_entry_get_text(GTK_ENTRY(label_te));
-
- if (filter_button_add(label, expr, NULL) == 0) {
- gchar *err = NULL;
-
- //Filter buttons are just a UAT, so only need to save that
- uat_save(uat_get_table_by_name("Display expressions"), &err);
- //ignore any errors
- g_free(err);
- filter_save_close_cb(NULL, parent_w);
- }
-}
-
-static void
-filter_save_close_cb(GtkWidget *close_bt _U_, gpointer parent_w)
-{
- gtk_grab_remove(GTK_WIDGET(parent_w));
- window_destroy(GTK_WIDGET(parent_w));
-}
-
-static void
-filter_save_frame_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
-{
- /* Note that we no longer have a "Filter Save" dialog box. */
- filter_save_frame_w = NULL;
-}
-
-/*
- * Editor modelines - http://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/gtk/filter_expression_save_dlg.h b/ui/gtk/filter_expression_save_dlg.h
deleted file mode 100644
index 319e49f76f..0000000000
--- a/ui/gtk/filter_expression_save_dlg.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/* filter_expression_save_dlg.h
- * Submitted by Edwin Groothuis <wireshark@mavetju.org>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __FILTER_EXPRESSIONS_SAVE_DLG_H__
-#define __FILTER_EXPRESSIONS_SAVE_DLG_H__
-
-#include "epan/filter_expressions.h"
-
-enum {
- FILTER_EXPRESSION_REINIT_DESTROY = 1,
- FILTER_EXPRESSION_REINIT_CREATE = 2
-};
-
-extern void filter_expression_save_dlg(gpointer data);
-void filter_expression_save_dlg_init(gpointer filter_tb, gpointer filter_te);
-void filter_expression_reinit(int what);
-
-#endif /* __FILTER_EXPRESSIONS_SAVE_DLG_H__ */
diff --git a/ui/gtk/filter_utils.c b/ui/gtk/filter_utils.c
deleted file mode 100644
index 1eca642d8c..0000000000
--- a/ui/gtk/filter_utils.c
+++ /dev/null
@@ -1,118 +0,0 @@
-/* filter_utils.c
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <gtk/gtk.h>
-#include <string.h>
-
-#include "ui/gtk/main.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/find_dlg.h"
-#include "ui/gtk/color_dlg.h"
-#include "ui/gtk/filter_utils.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-#include "globals.h"
-
-void
-apply_selected_filter (guint callback_action, const char *filter)
-{
- int action, type;
- char *str = NULL;
- const char *current_filter;
-
- action = FILTER_ACTION(callback_action);
- type = FILTER_ACTYPE(callback_action);
-
- current_filter = gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget));
-
- switch(type){
- case ACTYPE_SELECTED:
- str = g_strdup(filter);
- break;
- case ACTYPE_NOT_SELECTED:
- str = g_strdup_printf("!(%s)", filter);
- break;
- case ACTYPE_AND_SELECTED:
- if ((!current_filter) || (0 == strlen(current_filter)))
- str = g_strdup(filter);
- else
- str = g_strdup_printf("(%s) && (%s)", current_filter, filter);
- break;
- case ACTYPE_OR_SELECTED:
- if ((!current_filter) || (0 == strlen(current_filter)))
- str = g_strdup(filter);
- else
- str = g_strdup_printf("(%s) || (%s)", current_filter, filter);
- break;
- case ACTYPE_AND_NOT_SELECTED:
- if ((!current_filter) || (0 == strlen(current_filter)))
- str = g_strdup_printf("!(%s)", filter);
- else
- str = g_strdup_printf("(%s) && !(%s)", current_filter, filter);
- break;
- case ACTYPE_OR_NOT_SELECTED:
- if ((!current_filter) || (0 == strlen(current_filter)))
- str = g_strdup_printf("!(%s)", filter);
- else
- str = g_strdup_printf("(%s) || !(%s)", current_filter, filter);
- break;
- }
-
- switch(action){
- case ACTION_MATCH:
- gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), str);
- main_filter_packets(&cfile, str, FALSE);
- gdk_window_raise(gtk_widget_get_window(top_level));
- break;
- case ACTION_PREPARE:
- gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), str);
- break;
- case ACTION_FIND_FRAME:
- find_frame_with_filter(str);
- break;
- case ACTION_FIND_NEXT:
- cf_find_packet_dfilter_string(&cfile, str, SD_FORWARD);
- break;
- case ACTION_FIND_PREVIOUS:
- cf_find_packet_dfilter_string(&cfile, str, SD_BACKWARD);
- break;
- case ACTION_COLORIZE:
- color_display_with_filter(str);
- break;
- }
- g_free (str);
-}
-
-/*
- * Editor modelines - http://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/gtk/filter_utils.h b/ui/gtk/filter_utils.h
deleted file mode 100644
index eb238918c7..0000000000
--- a/ui/gtk/filter_utils.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/* filter_utils.h
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __FILTER_UTILS_H__
-#define __FILTER_UTILS_H__
-
-#define GTK_MENU_FUNC(a) ((GtkItemFactoryCallback)(a))
-
-/* Filter actions */
-#define ACTION_MATCH 0
-#define ACTION_PREPARE 1
-#define ACTION_FIND_FRAME 2
-#define ACTION_FIND_NEXT 3
-#define ACTION_FIND_PREVIOUS 4
-#define ACTION_COLORIZE 5
-#define ACTION_WEB_LOOKUP 6
-#define ACTION_COPY 7
-
-
-/* Action type - says what to do with the filter */
-#define ACTYPE_SELECTED 0
-#define ACTYPE_NOT_SELECTED 1
-#define ACTYPE_AND_SELECTED 2
-#define ACTYPE_OR_SELECTED 3
-#define ACTYPE_AND_NOT_SELECTED 4
-#define ACTYPE_OR_NOT_SELECTED 5
-
-/* Encoded callback arguments */
-#define CALLBACK_MATCH(type, extra) ((ACTION_MATCH<<16) | ((type)<<8) | (extra))
-#define CALLBACK_PREPARE(type, extra) ((ACTION_PREPARE<<16) | ((type)<<8) | (extra))
-#define CALLBACK_FIND_FRAME(type, extra) ((ACTION_FIND_FRAME<<16) | ((type)<<8) | (extra))
-#define CALLBACK_FIND_NEXT(type, extra) ((ACTION_FIND_NEXT<<16) | ((type)<<8) | (extra))
-#define CALLBACK_FIND_PREVIOUS(type, extra) ((ACTION_FIND_PREVIOUS<<16) | ((type)<<8) | (extra))
-#define CALLBACK_COLORIZE(type, extra) ((ACTION_COLORIZE<<16) | ((type)<<8) | (extra))
-#define CALLBACK_WEB_LOOKUP (ACTION_WEB_LOOKUP<<16)
-#define CALLBACK_COPY (ACTION_COPY<<16)
-
-
-/* Extract components of callback argument */
-#define FILTER_ACTION(cb_arg) (((cb_arg)>>16) & 0xff)
-#define FILTER_ACTYPE(cb_arg) (((cb_arg)>>8) & 0xff)
-#define FILTER_EXTRA(cb_arg) ((cb_arg) & 0xff)
-
-
-extern void apply_selected_filter (guint callback_action, const char *filter);
-
-#endif /* __FILTER_UTILS_H__ */
diff --git a/ui/gtk/find_dlg.c b/ui/gtk/find_dlg.c
deleted file mode 100644
index 3b3962f533..0000000000
--- a/ui/gtk/find_dlg.c
+++ /dev/null
@@ -1,803 +0,0 @@
-/* find_dlg.c
- * Routines for "find frame" window
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/strutil.h>
-#include <epan/prefs.h>
-
-#include "../../globals.h"
-#include "ui/main_statusbar.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/find_dlg.h"
-#include "ui/gtk/filter_dlg.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/filter_autocomplete.h"
-
-/* Capture callback data keys */
-#define E_FIND_FILT_KEY "find_filter_te"
-#define E_FIND_BACKWARD_KEY "find_backward"
-#define E_FIND_HEXDATA_KEY "find_hex"
-#define E_FIND_STRINGDATA_KEY "find_string"
-#define E_FIND_FILTERDATA_KEY "find_filter"
-#define E_FIND_STRINGTYPE_KEY "find_string_type"
-#define E_FIND_STRINGTYPE_LABEL_KEY "find_string_type_label"
-#define E_CASE_SEARCH_KEY "case_insensitive_search"
-#define E_SOURCE_DATA_KEY "packet_data_source"
-#define E_SOURCE_DECODE_KEY "decode_data_source"
-#define E_SOURCE_SUMMARY_KEY "summary_data_source"
-#define E_FILT_TE_BUTTON_KEY "find_filter_button"
-
-static gboolean case_type = TRUE;
-static gboolean summary_data = FALSE;
-static gboolean decode_data = FALSE;
-static gboolean packet_data = FALSE;
-
-static void
-find_filter_te_syntax_check_cb(GtkWidget *w, gpointer parent_w);
-
-static void
-find_frame_ok_cb(GtkWidget *ok_bt, gpointer parent_w);
-
-static void
-find_frame_close_cb(GtkWidget *close_bt, gpointer parent_w);
-
-static void
-find_frame_destroy_cb(GtkWidget *win, gpointer user_data);
-
-static void
-hex_selected_cb(GtkWidget *button_rb _U_, gpointer parent_w);
-
-static void
-string_selected_cb(GtkWidget *button_rb _U_, gpointer parent_w);
-
-static void
-filter_selected_cb(GtkWidget *button_rb _U_, gpointer parent_w);
-
-/*
- * Keep a static pointer to the current "Find Packet" window, if any, so
- * that if somebody tries to do "Find Packet" while there's already a
- * "Find Packet" window up, we just pop up the existing one, rather than
- * creating a new one.
- */
-static GtkWidget *find_frame_w;
-static GtkWidget *filter_text_box;
-
-/*
- * Save the presskey handlers to be able to dissable the auto-completion
- * feature for hex and string searches.
- */
-static gulong te_presskey_handler_id;
-static gulong win_presskey_handler_id;
-
-void
-find_frame_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- GtkWidget *main_vb, *main_find_hb, *main_options_hb,
-
- *find_type_frame, *find_type_vb,
- *find_type_hb, *find_type_lb, *hex_rb, *string_rb, *filter_rb,
- *filter_hb, *filter_bt,
-
- *direction_frame, *direction_vb,
- *up_rb, *down_rb,
-
- *data_frame, *data_vb,
- *packet_data_rb, *decode_data_rb, *summary_data_rb,
-
- *string_opt_frame, *string_opt_vb,
- *case_cb, *combo_lb, *combo_cb,
-
- *bbox, *ok_bt, *cancel_bt, *help_bt;
-
-
- /* No Apply button, but "OK" not only sets our text widget, it
- activates it (i.e., it causes us to do the search). */
- static construct_args_t args = {
- "Wireshark: Search Filter",
- FALSE,
- TRUE,
- FALSE
- };
-
- if (find_frame_w != NULL) {
- /* There's already a "Find Packet" dialog box; reactivate it. */
- reactivate_window(find_frame_w);
- return;
- }
-
- find_frame_w = dlg_window_new("Wireshark: Find Packet");
-
- /* Container for each row of widgets */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_container_add(GTK_CONTAINER(find_frame_w), main_vb);
- gtk_widget_show(main_vb);
-
-
- /* */
- main_find_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX (main_vb), main_find_hb, TRUE, TRUE, 0);
- gtk_widget_show(main_find_hb);
-
-
- /* find frame */
- find_type_frame = gtk_frame_new("Find");
- gtk_box_pack_start(GTK_BOX(main_find_hb), find_type_frame, TRUE, TRUE, 0);
- gtk_widget_show(find_type_frame);
-
- find_type_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(find_type_vb), 3);
- gtk_container_add(GTK_CONTAINER(find_type_frame), find_type_vb);
- gtk_widget_show(find_type_vb);
-
- /* find type row */
- find_type_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX (find_type_vb), find_type_hb, TRUE, TRUE, 0);
- gtk_widget_show(find_type_hb);
-
- find_type_lb = gtk_label_new("By:");
- gtk_box_pack_start(GTK_BOX(find_type_hb), find_type_lb, FALSE, FALSE, 0);
- gtk_widget_show(find_type_lb);
-
- /* Filter */
- filter_rb = gtk_radio_button_new_with_mnemonic_from_widget(NULL, "_Display filter");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(filter_rb), !cfile.hex && !cfile.string);
- gtk_box_pack_start(GTK_BOX(find_type_hb), filter_rb, FALSE, FALSE, 0);
- gtk_widget_set_tooltip_text(filter_rb, "Search for data by display filter syntax.\ne.g. ip.addr==10.1.1.1");
- gtk_widget_show(filter_rb);
-
- /* Hex */
- hex_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(filter_rb), "_Hex value");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(hex_rb), cfile.hex);
- gtk_box_pack_start(GTK_BOX(find_type_hb), hex_rb, FALSE, FALSE, 0);
- gtk_widget_set_tooltip_text(hex_rb, "Search for data by hex string.\ne.g. fffffda5");
- gtk_widget_show(hex_rb);
-
- /* ASCII Search */
- string_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(filter_rb), "_String");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(string_rb), cfile.string);
- gtk_box_pack_start(GTK_BOX(find_type_hb), string_rb, FALSE, FALSE, 0);
- gtk_widget_set_tooltip_text(string_rb, "Search for data by string value.\ne.g. My String");
- gtk_widget_show(string_rb);
-
- /* Filter row */
- filter_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(find_type_vb), filter_hb, FALSE, FALSE, 0);
- gtk_widget_show(filter_hb);
-
- filter_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_DISPLAY_FILTER_ENTRY);
- g_signal_connect(filter_bt, "clicked", G_CALLBACK(display_filter_construct_cb), &args);
- g_signal_connect(filter_bt, "destroy", G_CALLBACK(filter_button_destroy_cb), NULL);
- g_object_set_data(G_OBJECT(filter_bt), E_FILT_TE_BUTTON_KEY, filter_bt);
- gtk_box_pack_start(GTK_BOX(filter_hb), filter_bt, FALSE, TRUE, 0);
- gtk_widget_set_tooltip_text(filter_bt, "Click on the filter button to select a display filter,\nor enter your search criteria into the text box");
- gtk_widget_show(filter_bt);
-
- filter_text_box = gtk_entry_new();
- if (cfile.sfilter) gtk_entry_set_text(GTK_ENTRY(filter_text_box), cfile.sfilter);
- g_object_set_data(G_OBJECT(filter_bt), E_FILT_TE_PTR_KEY, filter_text_box);
- g_object_set_data(G_OBJECT(find_frame_w), E_FILT_TE_PTR_KEY, filter_text_box);
- gtk_box_pack_start(GTK_BOX(filter_hb), filter_text_box, TRUE, TRUE, 0);
- g_signal_connect(filter_text_box, "changed", G_CALLBACK(find_filter_te_syntax_check_cb), find_frame_w);
- g_object_set_data(G_OBJECT(find_frame_w), E_FILT_AUTOCOMP_PTR_KEY, NULL);
- te_presskey_handler_id = g_signal_connect(filter_text_box, "key-press-event", G_CALLBACK (filter_string_te_key_pressed_cb), NULL);
- win_presskey_handler_id = g_signal_connect(find_frame_w, "key-press-event", G_CALLBACK (filter_parent_dlg_key_pressed_cb), NULL);
- gtk_widget_show(filter_text_box);
-
-
- /* */
- main_options_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX (main_vb), main_options_hb, TRUE, TRUE, 0);
- gtk_widget_show(main_options_hb);
-
-
- /* search in frame */
- data_frame = gtk_frame_new("Search In");
- gtk_box_pack_start(GTK_BOX(main_options_hb), data_frame, TRUE, TRUE, 0);
- gtk_widget_show(data_frame);
-
- /* search in row */
- data_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(data_vb), 3);
- gtk_container_add(GTK_CONTAINER(data_frame), data_vb);
- gtk_widget_show(data_vb);
-
- /* Packet list */
- summary_data_rb = gtk_radio_button_new_with_mnemonic_from_widget(NULL, "Packet list");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(summary_data_rb), summary_data);
- gtk_box_pack_start(GTK_BOX(data_vb), summary_data_rb, TRUE, TRUE, 0);
- gtk_widget_set_tooltip_text(summary_data_rb, "Search for string in the Info column of the packet summary (summary pane)");
- gtk_widget_show(summary_data_rb);
-
- /* Packet details */
- decode_data_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(summary_data_rb), "Packet details");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(decode_data_rb), decode_data);
- gtk_box_pack_start(GTK_BOX(data_vb), decode_data_rb, TRUE, TRUE, 0);
- gtk_widget_set_tooltip_text(decode_data_rb, "Search for string among the decoded packet display labels (tree view pane)");
- gtk_widget_show(decode_data_rb);
-
- /* Packet bytes */
- packet_data_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(summary_data_rb), "Packet bytes");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(packet_data_rb), packet_data);
- gtk_box_pack_start(GTK_BOX(data_vb), packet_data_rb, TRUE, TRUE, 0);
- gtk_widget_set_tooltip_text(packet_data_rb, "Search for string in the ASCII-converted packet data (hex view pane)");
- gtk_widget_show(packet_data_rb);
-
- /* string options frame */
- string_opt_frame = gtk_frame_new("String Options");
- gtk_box_pack_start(GTK_BOX(main_options_hb), string_opt_frame, TRUE, TRUE, 0);
- gtk_widget_show(string_opt_frame);
-
- string_opt_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(string_opt_frame), string_opt_vb);
- gtk_container_set_border_width(GTK_CONTAINER(string_opt_vb), 3);
- gtk_widget_show(string_opt_vb);
-
- case_cb = gtk_check_button_new_with_mnemonic("Case sensitive");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(case_cb), !case_type);
- gtk_box_pack_start(GTK_BOX (string_opt_vb), case_cb, TRUE, TRUE, 0);
- gtk_widget_set_tooltip_text(case_cb, "Search by mixed upper/lower case?");
- gtk_widget_show(case_cb);
-
- combo_lb = gtk_label_new("Character width:");
- gtk_box_pack_start(GTK_BOX (string_opt_vb), combo_lb, TRUE, TRUE, 0);
- gtk_misc_set_alignment(GTK_MISC(combo_lb), 0.0f, 0.5f);
- gtk_widget_show(combo_lb);
-
- /* Character Type Selection Dropdown Box
- These only apply to the string find option */
- /* Create Combo Box */
-
- combo_cb = gtk_combo_box_text_new();
-
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combo_cb), "Narrow & wide");
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combo_cb), "Narrow (UTF-8 / ASCII)");
- /* UCS-2 might be more accurate but then we'd have to explain why we don't support UTF-16 */
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combo_cb), "Wide (UTF-16)");
-
- gtk_combo_box_set_active(GTK_COMBO_BOX(combo_cb),0);
- gtk_box_pack_start(GTK_BOX (string_opt_vb), combo_cb, TRUE, TRUE, 0);
-
- gtk_widget_show(combo_cb);
-
-
- /* direction frame */
- direction_frame = gtk_frame_new("Direction");
- gtk_box_pack_start(GTK_BOX(main_options_hb), direction_frame, FALSE, FALSE, 0);
- gtk_widget_show(direction_frame);
-
- /* Direction row: Forward and reverse radio buttons */
- direction_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(direction_vb), 3);
- gtk_container_add(GTK_CONTAINER(direction_frame), direction_vb);
- gtk_widget_show(direction_vb);
-
- up_rb = gtk_radio_button_new_with_mnemonic_from_widget(NULL, "_Up");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(up_rb), cfile.dir == SD_BACKWARD);
- gtk_box_pack_start(GTK_BOX(direction_vb), up_rb, FALSE, FALSE, 0);
- gtk_widget_show(up_rb);
-
- down_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(up_rb), "_Down");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(down_rb), cfile.dir == SD_FORWARD);
- gtk_box_pack_start(GTK_BOX(direction_vb), down_rb, FALSE, FALSE, 0);
- gtk_widget_show(down_rb);
-
-
- /* Button row */
- bbox = dlg_button_row_new(GTK_STOCK_FIND, GTK_STOCK_CANCEL, GTK_STOCK_HELP, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 0);
- gtk_widget_show(bbox);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_FIND);
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(find_frame_ok_cb), find_frame_w);
-
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- g_signal_connect(cancel_bt, "clicked", G_CALLBACK(find_frame_close_cb), find_frame_w);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_FIND_DIALOG);
-
- /* Attach pointers to needed widgets to the capture prefs window/object */
- g_object_set_data(G_OBJECT(find_frame_w), E_FIND_FILT_KEY, filter_text_box);
- g_object_set_data(G_OBJECT(find_frame_w), E_FIND_BACKWARD_KEY, up_rb);
- g_object_set_data(G_OBJECT(find_frame_w), E_FIND_FILTERDATA_KEY, filter_rb);
- g_object_set_data(G_OBJECT(find_frame_w), E_FIND_HEXDATA_KEY, hex_rb);
- g_object_set_data(G_OBJECT(find_frame_w), E_FIND_STRINGDATA_KEY, string_rb);
- g_object_set_data(G_OBJECT(find_frame_w), E_FIND_STRINGTYPE_LABEL_KEY, combo_lb);
- g_object_set_data(G_OBJECT(find_frame_w), E_FIND_STRINGTYPE_KEY, combo_cb);
- g_object_set_data(G_OBJECT(find_frame_w), E_CASE_SEARCH_KEY, case_cb);
- g_object_set_data(G_OBJECT(find_frame_w), E_SOURCE_DATA_KEY, packet_data_rb);
- g_object_set_data(G_OBJECT(find_frame_w), E_SOURCE_DECODE_KEY, decode_data_rb);
- g_object_set_data(G_OBJECT(find_frame_w), E_SOURCE_SUMMARY_KEY, summary_data_rb);
- g_object_set_data(G_OBJECT(find_frame_w), E_FILT_TE_BUTTON_KEY, filter_bt);
-
- /*
- * Now that we've attached the pointers, connect the signals - if
- * we do so before we've attached the pointers, the signals may
- * be delivered before the pointers are attached; the signal
- * handlers expect the pointers to be attached, and won't be happy.
- */
- g_signal_connect(hex_rb, "clicked", G_CALLBACK(hex_selected_cb), find_frame_w);
- g_signal_connect(string_rb, "clicked", G_CALLBACK(string_selected_cb), find_frame_w);
- g_signal_connect(filter_rb, "clicked", G_CALLBACK(filter_selected_cb), find_frame_w);
-
- string_selected_cb(NULL, find_frame_w);
- filter_selected_cb(NULL, find_frame_w);
-
- window_set_cancel_button(find_frame_w, cancel_bt, window_cancel_button_cb);
-
- gtk_widget_grab_default(ok_bt);
-
- /* Catch the "activate" signal on the filter text entry, so that
- if the user types Return there, we act as if the "OK" button
- had been selected, as happens if Return is typed if some widget
- that *doesn't* handle the Return key has the input focus. */
- dlg_set_activate(filter_text_box, ok_bt);
-
- /* Give the initial focus to the "Filter" entry box. */
- gtk_widget_grab_focus(filter_text_box);
-
- g_signal_connect(find_frame_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(find_frame_w, "destroy", G_CALLBACK(find_frame_destroy_cb), NULL);
-
- gtk_widget_show(find_frame_w);
- window_present(find_frame_w);
-}
-
-/* this function opens the find frame dialogue and sets the filter string */
-void
-find_frame_with_filter(char *filter)
-{
- find_frame_cb(NULL, NULL);
- gtk_entry_set_text(GTK_ENTRY(filter_text_box), filter);
-}
-
-/*
- * Check the filter syntax based on the type of search we're doing.
- */
-static void
-find_filter_te_syntax_check_cb(GtkWidget *w, gpointer parent_w)
-{
- const gchar *strval;
- GtkWidget *hex_rb, *string_rb;
- guint8 *bytes = NULL;
- size_t nbytes;
-
- hex_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_FIND_HEXDATA_KEY);
- string_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_FIND_STRINGDATA_KEY);
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (hex_rb))) {
- /*
- * Hex search - scan the search string to make sure it's valid hex.
- */
- strval = gtk_entry_get_text(GTK_ENTRY(w));
- if (strval == NULL) {
- /* XXX - can this happen? */
- colorize_filter_te_as_invalid(w);
- } else {
- bytes = convert_string_to_hex(strval, &nbytes);
- if (bytes == NULL)
- colorize_filter_te_as_invalid(w);
- else {
- g_free(bytes);
- colorize_filter_te_as_valid(w);
- }
- }
- } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (string_rb))) {
- /*
- * String search. Make sure the string isn't empty.
- */
- strval = gtk_entry_get_text(GTK_ENTRY(w));
- if (strval == NULL) {
- /* XXX - can this happen? */
- colorize_filter_te_as_invalid(w);
- } else {
- if (strcmp(strval, "") == 0)
- colorize_filter_te_as_invalid(w);
- else
- colorize_filter_te_as_valid(w);
- }
- } else {
- /*
- * Display filter search; check it with "filter_te_syntax_check_cb()".
- */
- filter_te_syntax_check_cb(w, NULL);
- }
-}
-
-/*
- * This function will re-check the search text syntax.
- */
-static void
-hex_selected_cb(GtkWidget *button_rb _U_, gpointer parent_w)
-{
- GtkWidget *filter_tb, *hex_rb, *filter_entry;
-
- filter_tb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_FILT_TE_PTR_KEY);
- hex_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_FIND_HEXDATA_KEY);
-
- filter_entry = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),E_FIND_FILT_KEY);
- gtk_widget_grab_focus(filter_entry);
-
- /* Disable AutoCompletion feature */
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hex_rb)) && g_signal_handler_is_connected(filter_tb, te_presskey_handler_id)) {
- g_signal_handler_disconnect(filter_tb, te_presskey_handler_id);
- g_signal_handler_disconnect(parent_w, win_presskey_handler_id);
- }
-
- /* Re-check the display filter. */
- find_filter_te_syntax_check_cb(filter_tb, parent_w);
- return;
-}
-
-/*
- * This function will disable the string options until
- * the string search is selected.
- */
-static void
-string_selected_cb(GtkWidget *button_rb _U_, gpointer parent_w)
-{
- GtkWidget *string_rb, *packet_data_rb, *decode_data_rb, *summary_data_rb,
- *data_combo_lb, *data_combo_cb, *data_case_cb, *filter_tb, *filter_entry;
-
- string_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_FIND_STRINGDATA_KEY);
- packet_data_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_SOURCE_DATA_KEY);
- decode_data_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_SOURCE_DECODE_KEY);
- summary_data_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_SOURCE_SUMMARY_KEY);
-
- data_combo_lb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_FIND_STRINGTYPE_LABEL_KEY);
- data_combo_cb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_FIND_STRINGTYPE_KEY);
- data_case_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CASE_SEARCH_KEY);
- filter_tb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_FILT_TE_PTR_KEY);
-
- filter_entry = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),E_FIND_FILT_KEY);
- gtk_widget_grab_focus(filter_entry);
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(string_rb))) {
- gtk_widget_set_sensitive(GTK_WIDGET(packet_data_rb), TRUE);
- gtk_widget_set_sensitive(GTK_WIDGET(decode_data_rb), TRUE);
- gtk_widget_set_sensitive(GTK_WIDGET(summary_data_rb), TRUE);
- gtk_widget_set_sensitive(GTK_WIDGET(data_combo_lb), TRUE);
- gtk_widget_set_sensitive(GTK_WIDGET(data_combo_cb), TRUE);
- gtk_widget_set_sensitive(GTK_WIDGET(data_case_cb), TRUE);
-
- /* Disable AutoCompletion feature */
- if(g_signal_handler_is_connected(filter_tb, te_presskey_handler_id)) {
- g_signal_handler_disconnect(filter_tb, te_presskey_handler_id);
- g_signal_handler_disconnect(parent_w, win_presskey_handler_id);
- }
-
- } else {
- gtk_widget_set_sensitive(GTK_WIDGET(packet_data_rb), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(decode_data_rb), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(summary_data_rb), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(data_combo_lb), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(data_combo_cb), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(data_case_cb), FALSE);
- }
- /* Re-check the display filter. */
- find_filter_te_syntax_check_cb(filter_tb, parent_w);
- return;
-}
-
-/*
- * This function will disable the filter button until
- * the filter search is selected.
- */
-static void
-filter_selected_cb(GtkWidget *button_rb _U_, gpointer parent_w)
-{
- GtkWidget *filter_bt, *filter_rb, *filter_te, *filter_entry;
-
- filter_bt = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_FILT_TE_BUTTON_KEY);
- filter_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_FIND_FILTERDATA_KEY);
- filter_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_FILT_TE_PTR_KEY);
-
- filter_entry = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),E_FIND_FILT_KEY);
- gtk_widget_grab_focus(filter_entry);
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(filter_rb)))
- {
- gtk_widget_set_sensitive(GTK_WIDGET(filter_bt), TRUE);
- /* Enable AutoCompletion feature */
- if(!g_signal_handler_is_connected(filter_te, te_presskey_handler_id)) {
- te_presskey_handler_id = g_signal_connect(filter_te, "key-press-event", G_CALLBACK (filter_string_te_key_pressed_cb), NULL);
- win_presskey_handler_id = g_signal_connect(parent_w, "key-press-event", G_CALLBACK (filter_parent_dlg_key_pressed_cb), NULL);
- }
- }
- else
- {
- gtk_widget_set_sensitive(GTK_WIDGET(filter_bt), FALSE);
- }
- return;
-}
-
-static void
-find_frame_ok_cb(GtkWidget *ok_bt _U_, gpointer parent_w)
-{
- GtkWidget *filter_te, *up_rb, *hex_rb, *string_rb, *combo_cb,
- *case_cb, *packet_data_rb, *decode_data_rb, *summary_data_rb;
- const gchar *filter_text;
- search_charset_t scs_type = SCS_NARROW_AND_WIDE;
- guint8 *bytes = NULL;
- size_t nbytes = 0;
- char *string = NULL;
- dfilter_t *sfcode = NULL;
- gboolean found_packet=FALSE;
- gboolean hex_search;
- gboolean string_search;
- int string_type;
-
- filter_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_FIND_FILT_KEY);
- up_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_FIND_BACKWARD_KEY);
- hex_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_FIND_HEXDATA_KEY);
- string_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_FIND_STRINGDATA_KEY);
- combo_cb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_FIND_STRINGTYPE_KEY);
- case_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CASE_SEARCH_KEY);
- packet_data_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_SOURCE_DATA_KEY);
- decode_data_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_SOURCE_DECODE_KEY);
- summary_data_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_SOURCE_SUMMARY_KEY);
-
- filter_text = gtk_entry_get_text(GTK_ENTRY(filter_te));
-
- /* Corresponds to the enum in file.c
- * Character set for text search.
- * typedef enum {
- * SCS_NARROW_AND_WIDE,
- * SCS_NARROW,
- * SCS_WIDE
- * / * add EBCDIC when it's implemented * /
- * } search_charset_t;
- */
- string_type = gtk_combo_box_get_active (GTK_COMBO_BOX(combo_cb));
-
- case_type = !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(case_cb));
- packet_data = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(packet_data_rb));
- decode_data = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(decode_data_rb));
- summary_data = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(summary_data_rb));
- hex_search = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (hex_rb));
- string_search = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (string_rb));
- /*
- * Process the search criterion.
- */
- if (hex_search) {
- /*
- * Hex search - scan the search string to make sure it's valid hex
- * and to find out how many bytes there are.
- */
- bytes = convert_string_to_hex(filter_text, &nbytes);
- if (bytes == NULL) {
- statusbar_push_temporary_msg("That's not a valid hex string.");
- return;
- }
- } else if (string_search) {
- /*
- * String search.
- * Make sure we're searching for something, first.
- */
- if (strcmp(filter_text, "") == 0) {
- statusbar_push_temporary_msg("You didn't specify any text for which to search.");
- return;
- }
-
- /*
- * We are - get the character set type.
- */
- if (string_type == SCS_NARROW_AND_WIDE)
- scs_type = SCS_NARROW_AND_WIDE;
- else if (string_type == SCS_NARROW)
- scs_type = SCS_NARROW;
- else if (string_type == SCS_WIDE)
- scs_type = SCS_WIDE;
- else {
- statusbar_push_temporary_msg("You didn't choose a valid character set.");
- return;
- }
- string = convert_string_case(filter_text, case_type);
- } else {
- /*
- * Display filter search - try to compile the filter.
- */
- gchar *err_msg;
-
- if (!dfilter_compile(filter_text, &sfcode, &err_msg)) {
- /* The attempt failed; report an error. */
- bad_dfilter_alert_box(GTK_WIDGET(parent_w), filter_text, err_msg);
- g_free(err_msg);
- return;
- }
-
- /* Was it empty? */
- if (sfcode == NULL) {
- /* Yes - complain. */
- statusbar_push_temporary_msg("That filter doesn't test anything.");
- return;
- }
- }
-
- /*
- * Remember the search parameters.
- */
- g_free(cfile.sfilter);
- cfile.sfilter = g_strdup(filter_text);
- cfile.dir = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (up_rb)) ? SD_BACKWARD : SD_FORWARD;
- cfile.hex = hex_search;
- cfile.string = string_search;
- cfile.scs_type = scs_type;
- cfile.case_type = case_type;
- cfile.regex = NULL;
- cfile.packet_data = packet_data;
- cfile.decode_data = decode_data;
- cfile.summary_data = summary_data;
-
- if (cfile.hex) {
- /* Hex value in packet data */
- found_packet = cf_find_packet_data(&cfile, bytes, nbytes, cfile.dir);
- g_free(bytes);
- if (!found_packet) {
- /* We didn't find a packet */
- statusbar_push_temporary_msg("No packet contained those bytes.");
- return;
- }
- } else if (cfile.string) {
- if (cfile.summary_data) {
- /* String in the Info column of the summary line */
- found_packet = cf_find_packet_summary_line(&cfile, string, cfile.dir);
- g_free(string);
- if (!found_packet) {
- statusbar_push_temporary_msg("No packet contained that string in its Info column.");
- return;
- }
- } else if (cfile.decode_data) {
- /* String in the protocol tree headings */
- found_packet = cf_find_packet_protocol_tree(&cfile, string, cfile.dir);
- g_free(string);
- if (!found_packet) {
- statusbar_push_temporary_msg("No packet contained that string in its dissected display.");
- return;
- }
- } else if (cfile.packet_data && string) {
- /* String in the ASCII-converted packet data */
- found_packet = cf_find_packet_data(&cfile, string, strlen(string), cfile.dir);
- g_free(string);
- if (!found_packet) {
- statusbar_push_temporary_msg("No packet contained that string in its ASCII-converted data.");
- return;
- }
- }
- } else {
- /* Search via display filter */
- found_packet = cf_find_packet_dfilter(&cfile, sfcode, cfile.dir);
- dfilter_free(sfcode);
- if (!found_packet) {
- statusbar_push_temporary_msg("No packet matched that filter.");
- g_free(bytes);
- return;
- }
- }
- window_destroy(GTK_WIDGET(parent_w));
-}
-
-static void
-find_frame_close_cb(GtkWidget *close_bt _U_, gpointer parent_w)
-{
- gtk_grab_remove(GTK_WIDGET(parent_w));
- window_destroy(GTK_WIDGET(parent_w));
-}
-
-static void
-find_frame_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
-{
- /* Note that we no longer have a "Find Packet" dialog box. */
- find_frame_w = NULL;
-}
-
-static void
-find_previous_next(GtkWidget *w, gpointer d, search_direction dir)
-{
- guint8 *bytes;
- size_t nbytes;
- char *string;
- dfilter_t *sfcode;
-
- if (cfile.sfilter) {
- cfile.dir = dir;
- if (cfile.hex) {
- bytes = convert_string_to_hex(cfile.sfilter, &nbytes);
- if (bytes == NULL) {
- /*
- * XXX - this shouldn't happen, as we've already successfully
- * translated the string once.
- */
- return;
- }
- cf_find_packet_data(&cfile, bytes, nbytes, dir);
- g_free(bytes);
- } else if (cfile.string) {
- string = convert_string_case(cfile.sfilter, cfile.case_type);
- /* OK, what are we searching? */
- if (cfile.decode_data) {
- /* The text in the protocol tree */
- cf_find_packet_protocol_tree(&cfile, string, dir);
- } else if (cfile.summary_data) {
- /* The text in the summary line */
- cf_find_packet_summary_line(&cfile, string, dir);
- } else {
- /* The raw packet data */
- cf_find_packet_data(&cfile, string, strlen(string), dir);
- }
- g_free(string);
- } else {
- if (!dfilter_compile(cfile.sfilter, &sfcode, NULL)) {
- /*
- * XXX - this shouldn't happen, as we've already successfully
- * translated the string once.
- */
- return;
- }
- if (sfcode == NULL) {
- /*
- * XXX - this shouldn't happen, as we've already found that the
- * string wasn't null.
- */
- return;
- }
- cf_find_packet_dfilter(&cfile, sfcode, dir);
- dfilter_free(sfcode);
- }
- } else
- find_frame_cb(w, d);
-}
-
-void
-find_next_cb(GtkWidget *w , gpointer d)
-{
- find_previous_next(w, d, SD_FORWARD);
-}
-
-void
-find_previous_cb(GtkWidget *w , gpointer d)
-{
- find_previous_next(w, d, SD_BACKWARD);
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local Variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/find_dlg.h b/ui/gtk/find_dlg.h
deleted file mode 100644
index 0158924d69..0000000000
--- a/ui/gtk/find_dlg.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* find_dlg.h
- * Definitions for "find frame" window
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __FIND_DLG_H__
-#define __FIND_DLG_H__
-
-/** @file
- * "Find" dialog box and related functions.
- * @ingroup dialog_group
- */
-
-/** User requested the "Find" dialog box by menu or toolbar.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-extern void find_frame_cb(GtkWidget *widget, gpointer data);
-
-/** User requested the "Find Next" function.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-extern void find_next_cb(GtkWidget *widget, gpointer data);
-
-/** User requested the "Find Previous" function.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-extern void find_previous_cb(GtkWidget *widget, gpointer data);
-
-/** Find frame by filter.
- *
- * @param filter the filter string
- */
-extern void find_frame_with_filter(char *filter);
-
-#endif /* find_dlg.h */
diff --git a/ui/gtk/firewall_dlg.c b/ui/gtk/firewall_dlg.c
deleted file mode 100644
index ec422e9e53..0000000000
--- a/ui/gtk/firewall_dlg.c
+++ /dev/null
@@ -1,549 +0,0 @@
-/* firewall_rules_dlg.c
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/*
- * Generate firewall ACL rules based on packet addresses and ports.
- * For directional rules, an outside interface is assumed.
- *
- * There may be better ways to present the information, e.g. all rules
- * in one huge text window, or some sort of tree view.
- */
-
-/* Copied from ssl-dlg.c */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/packet.h>
-#include <epan/addr_resolv.h>
-#include <epan/epan_dissect.h>
-#include <wsutil/filesystem.h>
-
-#include <ui/alert_box.h>
-#include <ui/firewall_rules.h>
-#include <ui/last_open_dir.h>
-
-#include <wsutil/file_util.h>
-
-#include "ui/gtk/main.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/file_dlg.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/old-gtk-compat.h"
-#include "ui/gtk/firewall_dlg.h"
-
-#include "globals.h"
-
-#define MAX_RULE_LEN 200
-
-/* Copied from packet_info struct */
-typedef struct _rule_info_t {
- size_t product;
- address dl_src;
- address dl_dst;
- address net_src;
- address net_dst;
- port_type ptype;
- guint32 srcport;
- guint32 destport;
- GtkWidget *text;
- GtkWidget *filter_combo_box;
- GtkWidget *deny_cb;
- GtkWidget *inbound_cb;
- gboolean inbound;
- gboolean deny;
- rule_type_e rule_type;
-} rule_info_t;
-
-static void sf_dummy(GString *rtxt, gchar *addr, guint32 port, port_type ptype, gboolean inbound, gboolean deny);
-
-static void select_product(GtkWidget * win, gpointer data);
-static void select_filter(GtkWidget * win, gpointer data);
-static void toggle_inbound(GtkToggleButton *t, gpointer data);
-static void toggle_deny(GtkToggleButton *t, gpointer data);
-static void set_rule_text(rule_info_t *rule_info);
-static void firewall_destroy_cb(GtkWidget * win, gpointer data);
-static void firewall_copy_cmd_cb(GtkWidget * w, gpointer data);
-static void firewall_save_as_cmd_cb(GtkWidget * w, gpointer data);
-
-#define WS_RULE_INFO_KEY "rule_info_key"
-
-#if 0
-/* List of "rule_info_t" structures for all rule windows. */
-static GList *rule_infos;
-
-/* Remove a "rule_info_t" structure from the list. */
-static void
-forget_rule_info(rule_info_t *rule_info)
-{
- rule_infos = g_list_remove(rule_infos, rule_info);
-}
-#endif
-
-void
-firewall_rule_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- GtkWidget *rule_w, *vbox, *txt_scrollw, *text;
- GtkWidget *label, *product_combo_box;
- GtkWidget *hbox, *button_hbox, *button;
- rule_info_t *rule_info;
- packet_info *pinfo = &cfile.edt->pi;
- size_t i;
-
- rule_info = g_new0(rule_info_t, 1);
- copy_address(&(rule_info->dl_src), &(pinfo->dl_src));
- copy_address(&(rule_info->dl_dst), &(pinfo->dl_dst));
- copy_address(&(rule_info->net_src), &(pinfo->net_src));
- copy_address(&(rule_info->net_dst), &(pinfo->net_dst));
- rule_info->ptype = pinfo->ptype;
- rule_info->srcport = pinfo->srcport;
- rule_info->destport = pinfo->destport;
- rule_info->inbound = TRUE;
- rule_info->deny = TRUE;
- rule_info->product = 0;
-
- rule_w = dlg_window_new("Firewall ACL Rules");
-
- gtk_widget_set_name(rule_w, "Firewall ACL rule window");
- gtk_container_set_border_width(GTK_CONTAINER(rule_w), 6);
-
- /* setup the container */
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- gtk_container_add(GTK_CONTAINER(rule_w), vbox);
-
- /* rule type selectors hbox */
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1, FALSE);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-
- /* product selector */
- label = gtk_label_new("Product");
- gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-
- product_combo_box = gtk_combo_box_text_new();
- for (i = 0; i < firewall_product_count(); i++) {
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(product_combo_box), firewall_product_name(i));
- }
- g_object_set_data(G_OBJECT(product_combo_box), WS_RULE_INFO_KEY, rule_info);
- g_signal_connect(product_combo_box, "changed", G_CALLBACK(select_product), NULL);
- gtk_box_pack_start(GTK_BOX(hbox), product_combo_box, FALSE, FALSE, 5);
-
- /* type selector */
- label = gtk_label_new("Filter");
- gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 10);
-
- rule_info->filter_combo_box = ws_combo_box_new_text_and_pointer();
- g_object_set_data(G_OBJECT(rule_info->filter_combo_box), WS_RULE_INFO_KEY, rule_info); \
- g_signal_connect(rule_info->filter_combo_box, "changed", G_CALLBACK(select_filter), NULL);
- gtk_box_pack_start(GTK_BOX(hbox), rule_info->filter_combo_box, FALSE, FALSE, 5);
-
- /* inbound selector */
- rule_info->inbound_cb = gtk_check_button_new_with_label("Inbound");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rule_info->inbound_cb),
- rule_info->inbound);
- gtk_box_pack_start(GTK_BOX(hbox), rule_info->inbound_cb, FALSE, FALSE, 10);
- g_signal_connect(rule_info->inbound_cb, "toggled", G_CALLBACK(toggle_inbound), rule_info);
-
- /* deny selector */
- rule_info->deny_cb = gtk_check_button_new_with_label("Deny");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rule_info->deny_cb),
- rule_info->deny);
- gtk_box_pack_start(GTK_BOX(hbox), rule_info->deny_cb, FALSE, FALSE, 10);
- g_signal_connect(rule_info->deny_cb, "toggled", G_CALLBACK(toggle_deny), rule_info);
-
- /* create a scrolled window for the text */
- txt_scrollw = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(txt_scrollw),
- GTK_SHADOW_IN);
- gtk_box_pack_start(GTK_BOX(vbox), txt_scrollw, TRUE, TRUE, 0);
-
- /* create a text box */
- text = gtk_text_view_new();
- gtk_text_view_set_editable(GTK_TEXT_VIEW(text), FALSE);
- gtk_container_add(GTK_CONTAINER(txt_scrollw), text);
- rule_info->text = text;
-
- /* Button row */
- button_hbox = dlg_button_row_new(GTK_STOCK_HELP, GTK_STOCK_COPY, GTK_STOCK_SAVE, GTK_STOCK_CANCEL, NULL);
- gtk_box_pack_start(GTK_BOX(vbox), button_hbox, FALSE, FALSE, 0);
-
- /* Create Copy Button */
- button = (GtkWidget *)g_object_get_data(G_OBJECT(button_hbox), GTK_STOCK_COPY);
- g_signal_connect(button, "clicked", G_CALLBACK(firewall_copy_cmd_cb), rule_info);
- gtk_widget_set_tooltip_text(button, "Copy rule to clipboard");
-
- /* Create Save Button */
- button = (GtkWidget *)g_object_get_data(G_OBJECT(button_hbox), GTK_STOCK_SAVE);
- g_signal_connect(button, "clicked", G_CALLBACK(firewall_save_as_cmd_cb), rule_info);
- gtk_widget_set_tooltip_text(button, "Save the rule as currently displayed");
-
- button = (GtkWidget *)g_object_get_data(G_OBJECT(button_hbox), GTK_STOCK_CANCEL);
- gtk_widget_set_tooltip_text(button, "Cancel the dialog");
- window_set_cancel_button(rule_w, button, window_cancel_button_cb);
-
- button = (GtkWidget *)g_object_get_data(G_OBJECT(button_hbox), GTK_STOCK_HELP);
- g_signal_connect(button, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_FIREWALL_DIALOG);
-
- /* Tuck away the rule_info object into the window */
- g_object_set_data(G_OBJECT(rule_w), WS_RULE_INFO_KEY, rule_info);
-
- g_signal_connect(rule_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(rule_w, "destroy", G_CALLBACK(firewall_destroy_cb), NULL);
-
- /* Make sure this widget gets destroyed if we quit the main loop,
- so that if we exit, we clean up any temporary files we have
- for "Follow SSL Stream" windows.
- gtk_quit_add_destroy is deprecated and should not be used in newly-written code. This function is going to be removed in GTK+ 3.0
-
- gtk_quit_add_destroy(gtk_main_level(), GTK_OBJECT(rule_w));
-
- */
-
- gtk_combo_box_set_active(GTK_COMBO_BOX(product_combo_box), 0); /* invokes select_product callback */
- gtk_widget_show_all(rule_w);
- window_present(rule_w);
-}
-
-/* Set the current product. */
-#define ADD_TO_FILTER_MENU(rt) \
- ws_combo_box_append_text_and_pointer(GTK_COMBO_BOX(rule_info->filter_combo_box), name, GUINT_TO_POINTER(rt)); \
- if (rule_type == RT_NONE) { \
- rule_type = rt; \
- }
-
-#define NAME_TCP_UDP (rule_info->ptype == PT_TCP ? "TCP" : "UDP")
-
-static void
-select_product(GtkWidget *w, gpointer data _U_)
-{
- guint prod = gtk_combo_box_get_active(GTK_COMBO_BOX(w));
- rule_info_t *rule_info;
- gchar name[MAX_RULE_LEN], addr_str[MAX_RULE_LEN];
- address *addr;
- rule_type_e rule_type = RT_NONE;
- gboolean sensitive = FALSE;
-
- rule_info =(rule_info_t *)g_object_get_data(G_OBJECT(w), WS_RULE_INFO_KEY);
-
- if (prod >= firewall_product_count() || !rule_info)
- return;
-
- rule_info->product = prod;
-
- /* Clear the list store (ie: the como_box list items) */
- ws_combo_box_clear_text_and_pointer(GTK_COMBO_BOX(rule_info->filter_combo_box));
-
- /* Fill in valid combo_box list items (in the list store). */
- if (firewall_product_mac_func(prod) && rule_info->dl_src.type == AT_ETHER) {
- addr = &(rule_info->dl_src);
- address_to_str_buf(addr, name, MAX_RULE_LEN);
- ADD_TO_FILTER_MENU(RT_MAC_SRC);
-
- addr = &(rule_info->dl_dst);
- address_to_str_buf(addr, name, MAX_RULE_LEN);
- ADD_TO_FILTER_MENU(RT_MAC_DST);
- }
-
- if (firewall_product_ipv4_func(prod) && rule_info->net_src.type == AT_IPv4) {
- addr = &(rule_info->net_src);
- address_to_str_buf(addr, name, MAX_RULE_LEN);
- ADD_TO_FILTER_MENU(RT_IPv4_SRC);
-
- addr = &(rule_info->net_dst);
- address_to_str_buf(addr, name, MAX_RULE_LEN);
- ADD_TO_FILTER_MENU(RT_IPv4_DST);
- }
-
- if (firewall_product_port_func(prod) && (rule_info->ptype == PT_TCP || rule_info->ptype == PT_UDP)) {
- g_snprintf(name, MAX_RULE_LEN, "%s port %u", NAME_TCP_UDP,
- rule_info->srcport);
- ADD_TO_FILTER_MENU(RT_PORT_SRC);
- if (rule_info->srcport != rule_info->destport) {
- g_snprintf(name, MAX_RULE_LEN, "%s port %u", NAME_TCP_UDP,
- rule_info->destport);
- ADD_TO_FILTER_MENU(RT_PORT_DST);
- }
- }
-
- if (firewall_product_ipv4_port_func(prod) && rule_info->net_src.type == AT_IPv4 &&
- (rule_info->ptype == PT_TCP || rule_info->ptype == PT_UDP)) {
- addr = &(rule_info->net_src);
- address_to_str_buf(addr, addr_str, MAX_RULE_LEN);
- g_snprintf(name, MAX_RULE_LEN, "%s + %s port %u", addr_str,
- NAME_TCP_UDP, rule_info->srcport);
- ADD_TO_FILTER_MENU(RT_IPv4_PORT_SRC);
-
- addr = &(rule_info->net_dst);
- address_to_str_buf(addr, addr_str, MAX_RULE_LEN);
- g_snprintf(name, MAX_RULE_LEN, "%s + %s port %u", addr_str,
- NAME_TCP_UDP, rule_info->destport);
- ADD_TO_FILTER_MENU(RT_IPv4_PORT_DST);
- }
-
- if (rule_type != RT_NONE) {
- gtk_combo_box_set_active(GTK_COMBO_BOX(rule_info->filter_combo_box), 0); /* invokes select_filter callback */
- sensitive = TRUE;
- } else {
- select_filter(rule_info->filter_combo_box, NULL); /* Call if RT_NONE [with nothing selected] */
- }
-
- gtk_widget_set_sensitive(rule_info->filter_combo_box, sensitive);
- gtk_widget_set_sensitive(rule_info->inbound_cb, firewall_product_does_inbound(prod) && sensitive);
- gtk_widget_set_sensitive(rule_info->deny_cb, sensitive);
-}
-
-/* Set the rule text based upon the current product and current filter. */
-static void
-select_filter(GtkWidget *w, gpointer data _U_)
-{
- rule_type_e cur_type;
- rule_info_t *rule_info;
- gpointer ptr;
-
- rule_info = (rule_info_t *)g_object_get_data(G_OBJECT(w), WS_RULE_INFO_KEY);
- if (!rule_info)
- return;
-
-
- if (ws_combo_box_get_active_pointer(GTK_COMBO_BOX(w), &ptr))
- cur_type = (rule_type_e)GPOINTER_TO_UINT(ptr);
- else
- cur_type = RT_NONE; /* If nothing selected (eg: nothing in filter list) */
-
- if (cur_type >= NUM_RULE_TYPES)
- return;
-
- rule_info->rule_type = cur_type;
-
- set_rule_text(rule_info);
-}
-
-/* Set inbound/outbound */
-static void
-toggle_inbound(GtkToggleButton *t, gpointer data)
-{
- rule_info_t *rule_info = (rule_info_t *) data;
-
- rule_info->inbound = gtk_toggle_button_get_active(t);
-
- set_rule_text(rule_info);
-}
-
-/* Set deny/allow. */
-static void
-toggle_deny(GtkToggleButton *t, gpointer data)
-{
- rule_info_t *rule_info = (rule_info_t *) data;
-
- rule_info->deny = gtk_toggle_button_get_active(t);
-
- set_rule_text(rule_info);
-}
-
-/* Set the rule text */
-#define DL_ADDR (rt == RT_MAC_SRC ? &(rule_info->dl_src) : &(rule_info->dl_dst))
-#define NET_ADDR (rt == RT_IPv4_SRC ? &(rule_info->net_src) : &(rule_info->net_dst))
-#define NET_PORT (rt == RT_PORT_SRC ? rule_info->srcport : rule_info->destport)
-static void
-set_rule_text(rule_info_t *rule_info) {
- GString *rtxt = g_string_new("");
- gchar addr_str[MAX_RULE_LEN];
- rule_type_e rt = rule_info->rule_type;
- size_t prod = rule_info->product;
- address *addr = NULL;
- guint32 port = 0;
- syntax_func rt_func = NULL;
-
- GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(rule_info->text));
-
- if (prod < firewall_product_count()) {
- const char *hint = firewall_product_rule_hint(prod);
- g_string_printf(rtxt, "%s %s\n", firewall_product_comment_prefix(prod), firewall_product_name(prod));
- if (strlen(hint) > 0) {
- g_string_append_printf(rtxt, " %s", hint);
- }
- switch(rt) {
- case RT_NONE:
- g_string_append_printf(rtxt, "%s Not supported", firewall_product_comment_prefix(prod));
- rt_func = sf_dummy;
- break;
- case RT_MAC_SRC:
- case RT_MAC_DST:
- addr = DL_ADDR;
- address_to_str_buf(addr, addr_str, MAX_RULE_LEN);
- rt_func = firewall_product_mac_func(prod);
- break;
- case RT_IPv4_SRC:
- case RT_IPv4_DST:
- addr = NET_ADDR;
- address_to_str_buf(addr, addr_str, MAX_RULE_LEN);
- rt_func = firewall_product_ipv4_func(prod);
- break;
- case RT_PORT_SRC:
- case RT_PORT_DST:
- port = NET_PORT;
- rt_func = firewall_product_port_func(prod);
- break;
- case RT_IPv4_PORT_SRC:
- case RT_IPv4_PORT_DST:
- addr = NET_ADDR;
- address_to_str_buf(addr, addr_str, MAX_RULE_LEN);
- port = NET_PORT;
- rt_func = firewall_product_ipv4_port_func(prod);
- break;
- default:
- break;
- }
- }
-
- if (rt_func) {
- rt_func(rtxt, addr_str, port, rule_info->ptype, rule_info->inbound, rule_info->deny);
- } else {
- g_string_append_printf(rtxt, "ERROR: Unable to create rule");
- }
-
- gtk_text_buffer_set_text(buf, rtxt->str, (gint) rtxt->len);
-
- g_string_free(rtxt, TRUE);
-}
-
-
-/* Rule text functions */
-/* Dummy */
-static void sf_dummy(GString *rtxt _U_, gchar *addr _U_, guint32 port _U_, port_type ptype _U_, gboolean inbound _U_, gboolean deny _U_) {
-}
-
-/* The destroy call back has the responsibility of
- * unlinking the temporary file
- * and freeing the filter_out_filter */
-static void
-firewall_destroy_cb(GtkWidget *w, gpointer data _U_)
-{
- rule_info_t *rule_info;
-
- rule_info = (rule_info_t *)g_object_get_data(G_OBJECT(w), WS_RULE_INFO_KEY);
-#if 0
- forget_rule_info(rule_info);
-#endif
- g_free(rule_info);
- gtk_widget_destroy(w);
-}
-
-static void
-firewall_copy_cmd_cb(GtkWidget *w _U_, gpointer data)
-{
- rule_info_t *rule_info = (rule_info_t *)data;
-
- GtkTextIter start, end;
- GtkTextBuffer *buf;
-
- buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(rule_info->text));
- gtk_text_buffer_get_start_iter(buf, &start);
- gtk_text_buffer_get_end_iter(buf, &end);
- gtk_text_buffer_select_range(buf, &start, &end);
- gtk_text_buffer_copy_clipboard(buf, gtk_clipboard_get(GDK_SELECTION_CLIPBOARD));
-}
-
-static gboolean
-firewall_save_as_ok_cb(const char *to_name, rule_info_t *rule_info)
-{
- FILE *fh;
- gchar *rule;
-
- GtkTextIter start, end;
- GtkTextBuffer *buf;
-
- fh = ws_fopen(to_name, "w");
- if (fh == NULL) {
- open_failure_alert_box(to_name, errno, TRUE);
- return FALSE;
- }
-
- buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(rule_info->text));
- gtk_text_buffer_get_start_iter(buf, &start);
- gtk_text_buffer_get_end_iter(buf, &end);
- rule = gtk_text_buffer_get_text(buf, &start, &end, FALSE);
-
- fputs(rule, fh);
- fclose(fh);
-
- return TRUE;
-}
-
-static char *
-gtk_firewall_save_as_file(GtkWidget *caller)
-{
- GtkWidget *new_win;
- char *pathname;
-
- new_win = file_selection_new("Wireshark: Save Firewall ACL Rule",
- GTK_WINDOW(caller),
- FILE_SELECTION_SAVE);
-
- pathname = file_selection_run(new_win);
- if (pathname == NULL) {
- /* User cancelled or closed the dialog. */
- return NULL;
- }
-
- /* We've crosed the Rubicon; get rid of the dialog box. */
- window_destroy(new_win);
-
- return pathname;
-}
-
-static void
-firewall_save_as_cmd_cb(GtkWidget *w, gpointer data)
-{
- GtkWidget *caller = gtk_widget_get_toplevel(w);
- rule_info_t *rule_info = (rule_info_t *)data;
- char *pathname;
-
- /*
- * Loop until the user either selects a file or gives up.
- */
- for (;;) {
- pathname = gtk_firewall_save_as_file(caller);
- if (pathname == NULL) {
- /* User gave up. */
- break;
- }
- if (firewall_save_as_ok_cb(pathname, rule_info)) {
- /* We succeeded. */
- g_free(pathname);
- break;
- }
- /* Dump failed; let the user select another file or give up. */
- g_free(pathname);
- }
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/firewall_dlg.h b/ui/gtk/firewall_dlg.h
deleted file mode 100644
index cbdf98656a..0000000000
--- a/ui/gtk/firewall_dlg.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* firewall_dlg.h
- * Produce ACL rules for various products from a packet.
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 2006 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __FIREWALL_DLG_H__
-#define __FIREWALL_DLG_H__
-
-/* Generate ACL / firewall rules from different fields in the
- selected packet. */
-void firewall_rule_cb(GtkWidget * w, gpointer data _U_);
-
-#endif /* __FIREWALL_DLG_H__ */
diff --git a/ui/gtk/flow_graph.c b/ui/gtk/flow_graph.c
deleted file mode 100644
index 011ea890e9..0000000000
--- a/ui/gtk/flow_graph.c
+++ /dev/null
@@ -1,431 +0,0 @@
-/* flow_graph.c
- * Allows to display a flow graph of the currently displayed packets
- *
- * Copyright 2004, Ericsson , Spain
- * By Francisco Alcoba <francisco.alcoba@ericsson.com>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-#include <string.h>
-
-#include <epan/packet.h>
-#include <epan/stat_tap_ui.h>
-#include <wsutil/report_message.h>
-
-#include "ui/gtk/graph_analysis.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/gui_stat_menu.h"
-#include "ui/gtk/old-gtk-compat.h"
-#include "ui/gtk/gtkglobals.h"
-
-#include "globals.h"
-
-void register_tap_listener_flow_graph(void);
-
-static seq_analysis_info_t *graph_analysis = NULL;
-static graph_analysis_data_t *graph_analysis_data = NULL;
-static const char* display_filter = NULL;
-
-static GtkWidget *flow_graph_dlg = NULL;
-
-static GtkWidget *select_all_rb;
-static GtkWidget *select_displayed_rb;
-static GtkWidget *src_dst_rb;
-static GtkWidget *net_src_dst_rb;
-static GtkWidget *select_analysis_combo;
-
-
-/****************************************************************************/
-static void
-flow_graph_data_init(void) {
- graph_analysis = sequence_analysis_info_new();
- graph_analysis->name = "any";
- display_filter = NULL;
-}
-
-
-/****************************************************************************/
-/* CALLBACKS */
-/****************************************************************************/
-static void
-flow_graph_on_destroy(GObject *object _U_, gpointer user_data _U_)
-{
- g_assert(graph_analysis != NULL);
- g_assert(graph_analysis_data != NULL);
-
- /* Clean up memory used by tap */
- sequence_analysis_info_free(graph_analysis);
- graph_analysis = NULL;
-
- g_free(graph_analysis_data);
- graph_analysis_data = NULL;
-
- /* Note that we no longer have a "Flow Graph" dialog box. */
- flow_graph_dlg = NULL;
-}
-
-static gboolean
-find_seq_name(const void *key, void *value, void *userdata)
-{
- const char* name = (const char*)key;
- register_analysis_t* analysis = (register_analysis_t*)value;
- const char* ui_name = (const char*)userdata;
-
- if (strcmp(ui_name, sequence_analysis_get_ui_name(analysis)) == 0)
- {
- graph_analysis->name = name;
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-sequence_combo_box_changed_cb(GtkComboBox *combo_box, gpointer user_data _U_)
-{
- gchar* ui_name = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(combo_box));
-
- sequence_analysis_table_iterate_tables(find_seq_name, ui_name);
-}
-
-/****************************************************************************/
-static void
-toggle_select_all(GtkWidget *widget _U_, gpointer user_data _U_)
-{
- /* is the button now active? */
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(select_all_rb))) {
- display_filter = NULL;
- }
-}
-
-/****************************************************************************/
-static void
-toggle_select_displayed(GtkWidget *widget _U_, gpointer user_data _U_)
-{
- /* is the button now active? */
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(select_displayed_rb))) {
- display_filter = gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget));
- }
-}
-
-/****************************************************************************/
-static void
-toggle_select_srcdst(GtkWidget *widget _U_, gpointer user_data _U_)
-{
- /* is the button now active? */
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(src_dst_rb))) {
- graph_analysis->any_addr = FALSE;
- }
-}
-
-/****************************************************************************/
-static void
-toggle_select_netsrcdst(GtkWidget *widget _U_, gpointer user_data _U_)
-{
- /* is the button now active? */
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(net_src_dst_rb))) {
- graph_analysis->any_addr = TRUE;
- }
-}
-
-/****************************************************************************/
-static void
-flow_graph_on_ok(GtkButton *button _U_, gpointer user_data)
-{
- register_analysis_t* analysis = sequence_analysis_find_by_name(graph_analysis->name);
-
- /* Scan for displayed packets (retap all packets) */
- sequence_analysis_list_free(graph_analysis);
-
- if (analysis != NULL)
- {
- GString *error_string;
-
- error_string = register_tap_listener(sequence_analysis_get_tap_listener_name(analysis), graph_analysis, display_filter, sequence_analysis_get_tap_flags(analysis),
- NULL, sequence_analysis_get_packet_func(analysis), NULL);
- if (error_string) {
- report_failure("Flow graph - tap registration failed: %s", error_string->str);
- g_string_free(error_string, TRUE);
- return;
- }
-
- cf_retap_packets(&cfile);
- remove_tap_listener(graph_analysis);
- }
-
- if (graph_analysis_data->dlg.window != NULL){ /* if we still have a window */
- graph_analysis_update(graph_analysis_data); /* refresh it xxx */
- }
- else{
- graph_analysis_data->dlg.parent_w = (GtkWidget *)user_data;
- graph_analysis_create(graph_analysis_data);
- }
-}
-
-static void
-flow_graph_on_cancel(GtkButton *button _U_,
- gpointer user_data)
-{
- if (graph_analysis_data->dlg.window) {
- window_destroy(graph_analysis_data->dlg.window);
- }
- window_destroy(GTK_WIDGET(user_data));
-}
-
-static gboolean
-flow_graph_on_delete(GtkButton *button _U_,
- gpointer user_data _U_)
-{
- if (graph_analysis_data->dlg.window) {
- window_destroy(graph_analysis_data->dlg.window);
- }
- return FALSE;
-}
-
-/****************************************************************************/
-/* INTERFACE */
-/****************************************************************************/
-static gboolean
-add_flow_sequence_item(const void *key _U_, void *value, void *userdata)
-{
- register_analysis_t* analysis = (register_analysis_t*)value;
- GtkWidget* combo_box = (GtkWidget*)userdata;
-
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), sequence_analysis_get_ui_name(analysis));
- return FALSE;
-}
-
-
-static void
-flow_graph_dlg_create(void)
-{
- GtkWidget *flow_graph_dlg_w;
- GtkWidget *main_vb;
- GtkWidget *hbuttonbox;
- GtkWidget *bt_cancel, *bt_ok;
-#if 0
- GtkWidget *top_label = NULL;
-#endif
- GtkWidget *flow_type_fr, *range_fr, *range_grid, *flow_type_grid, *node_addr_fr, *node_addr_grid;
-
- flow_graph_dlg_w = dlg_window_new("Wireshark: Flow Graph"); /* transient_for top_level */
- gtk_window_set_destroy_with_parent (GTK_WINDOW(flow_graph_dlg_w), TRUE);
-
- gtk_window_set_default_size(GTK_WINDOW(flow_graph_dlg_w), 250, 150);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(flow_graph_dlg_w), main_vb);
- gtk_container_set_border_width (GTK_CONTAINER (main_vb), 7);
-
-#if 0
- top_label = gtk_label_new ("Choose packets to include in the graph");
- gtk_box_pack_start (GTK_BOX (main_vb), top_label, FALSE, FALSE, 8);
-#endif
-
- gtk_widget_show(flow_graph_dlg_w);
-
- /*** Packet range frame ***/
- range_fr = gtk_frame_new("Choose packets");
- gtk_box_pack_start(GTK_BOX(main_vb), range_fr, FALSE, FALSE, 5);
-
- range_grid = ws_gtk_grid_new();
- gtk_container_set_border_width(GTK_CONTAINER(range_grid), 5);
- gtk_container_add(GTK_CONTAINER(range_fr), range_grid);
-
- /* Process all packets */
- select_all_rb = gtk_radio_button_new_with_mnemonic_from_widget(NULL, "_All packets");
- gtk_widget_set_tooltip_text (select_all_rb, ("Process all packets"));
- g_signal_connect(select_all_rb, "toggled", G_CALLBACK(toggle_select_all), NULL);
- ws_gtk_grid_attach_extended(GTK_GRID(range_grid), select_all_rb, 0, 0, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(0), 0, 0);
- if (display_filter == NULL) {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(select_all_rb),TRUE);
- }
- gtk_widget_show(select_all_rb);
-
- /* Process displayed packets */
- select_displayed_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(select_all_rb),
- "_Displayed packets");
- gtk_widget_set_tooltip_text (select_displayed_rb, ("Process displayed packets"));
- g_signal_connect(select_displayed_rb, "toggled", G_CALLBACK(toggle_select_displayed), NULL);
- ws_gtk_grid_attach_extended(GTK_GRID(range_grid), select_displayed_rb, 0, 1, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(0), 0, 0);
- if (display_filter != NULL) {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(select_displayed_rb),TRUE);
- }
- gtk_widget_show(select_displayed_rb);
-
- gtk_widget_show(range_grid);
- gtk_widget_show(range_fr);
-
- /*** Flow type frame ***/
- flow_type_fr = gtk_frame_new("Choose flow type");
- gtk_box_pack_start(GTK_BOX(main_vb), flow_type_fr, FALSE, FALSE, 5);
-
- flow_type_grid = ws_gtk_grid_new();
- gtk_container_set_border_width(GTK_CONTAINER(flow_type_grid), 5);
- gtk_container_add(GTK_CONTAINER(flow_type_fr), flow_type_grid);
-
- select_analysis_combo = gtk_combo_box_text_new();
- g_signal_connect(select_analysis_combo, "changed", G_CALLBACK(sequence_combo_box_changed_cb), NULL);
- sequence_analysis_table_iterate_tables(add_flow_sequence_item, select_analysis_combo);
- gtk_combo_box_set_active(GTK_COMBO_BOX(select_analysis_combo), 0);
-
- ws_gtk_grid_attach_extended(GTK_GRID(flow_type_grid), select_analysis_combo, 0, 0, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(0), 0, 0);
- gtk_widget_show(select_analysis_combo);
-
- gtk_widget_show(flow_type_grid);
- gtk_widget_show(flow_type_fr);
-
- /*** Node address type frame ***/
- node_addr_fr = gtk_frame_new("Choose node address type");
- gtk_box_pack_start(GTK_BOX(main_vb), node_addr_fr, FALSE, FALSE, 5);
-
- node_addr_grid = ws_gtk_grid_new();
- gtk_container_set_border_width(GTK_CONTAINER(node_addr_grid), 5);
- gtk_container_add(GTK_CONTAINER(node_addr_fr), node_addr_grid);
-
- /* Source / Dest address */
- src_dst_rb = gtk_radio_button_new_with_mnemonic_from_widget(NULL, "_Standard source/destination addresses");
- gtk_widget_set_tooltip_text (src_dst_rb,
- ("Nodes in the diagram are identified with source and destination addresses"));
- g_signal_connect(src_dst_rb, "toggled", G_CALLBACK(toggle_select_srcdst), NULL);
- ws_gtk_grid_attach_extended(GTK_GRID(node_addr_grid), src_dst_rb, 0, 0, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(0), 0, 0);
- if (graph_analysis->any_addr) {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(src_dst_rb),TRUE);
- }
- gtk_widget_show(src_dst_rb);
-
- /* Network source / dest address */
- net_src_dst_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(src_dst_rb),
- "_Network source/destination addresses");
- gtk_widget_set_tooltip_text (net_src_dst_rb,
- ("Nodes in the diagram are identified with network source and destination addresses"));
- g_signal_connect(net_src_dst_rb, "toggled", G_CALLBACK(toggle_select_netsrcdst), NULL);
- ws_gtk_grid_attach_extended(GTK_GRID(node_addr_grid), net_src_dst_rb, 0, 1, 1, 1,
- (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(0), 0, 0);
- if (!graph_analysis->any_addr) {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(net_src_dst_rb),TRUE);
- }
- gtk_widget_show(net_src_dst_rb);
-
- gtk_widget_show(node_addr_grid);
- gtk_widget_show(node_addr_fr);
-
- /* button row */
- hbuttonbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_start (GTK_BOX (main_vb), hbuttonbox, FALSE, FALSE, 5);
- gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox), GTK_BUTTONBOX_SPREAD);
- gtk_box_set_spacing (GTK_BOX (hbuttonbox), 30);
-
- bt_ok = ws_gtk_button_new_from_stock(GTK_STOCK_OK);
- gtk_box_pack_start(GTK_BOX(hbuttonbox), bt_ok, TRUE, TRUE, 0);
- gtk_widget_set_tooltip_text (bt_ok, "Show the flow graph");
- g_signal_connect(bt_ok, "clicked", G_CALLBACK(flow_graph_on_ok), flow_graph_dlg_w);
- gtk_widget_show(bt_ok);
-
- bt_cancel = ws_gtk_button_new_from_stock(GTK_STOCK_CANCEL);
- gtk_box_pack_start(GTK_BOX(hbuttonbox), bt_cancel, TRUE, TRUE, 0);
- gtk_widget_set_can_default(bt_cancel, TRUE);
- gtk_widget_set_tooltip_text (bt_cancel, "Cancel this dialog");
- g_signal_connect(bt_cancel, "clicked", G_CALLBACK(flow_graph_on_cancel), flow_graph_dlg_w);
-
- g_signal_connect(flow_graph_dlg_w, "delete_event", G_CALLBACK(flow_graph_on_delete), NULL);
- g_signal_connect(flow_graph_dlg_w, "destroy", G_CALLBACK(flow_graph_on_destroy), NULL);
-
- gtk_widget_show_all(flow_graph_dlg_w);
- window_present(flow_graph_dlg_w);
-
- flow_graph_dlg = flow_graph_dlg_w;
-}
-
-/****************************************************************************/
-/* PUBLIC */
-/****************************************************************************/
-
-/* init function for tap */
-static void
-flow_graph_init_tap(const char *dummy _U_, void *userdata _U_)
-{
- /* The storage allocated by flow_graph_data_init() and graph_analysis_init() */
- /* will be considered to be "associated with" the flow_graph_dlg dialog box. */
- /* It will be freed when the flow_graph_dlg dialog box is destroyed. */
- if (flow_graph_dlg != NULL) {
- g_assert(graph_analysis != NULL);
- g_assert(graph_analysis_data != NULL);
- /* There's already a dialog box; reactivate it. */
- reactivate_window(flow_graph_dlg);
- } else {
- g_assert(graph_analysis == NULL);
- g_assert(graph_analysis_data == NULL);
-
- /* initialize graph items store */
- flow_graph_data_init();
-
- /* init the Graph Analysis */
- graph_analysis_data = graph_analysis_init(graph_analysis);
-
- flow_graph_dlg_create();
- }
-}
-
-
-/****************************************************************************/
-/* entry point when called via the GTK menu */
-void
-flow_graph_launch(GtkAction *action _U_, gpointer user_data _U_)
-{
- flow_graph_init_tap("",NULL);
-}
-
-/****************************************************************************/
-static stat_tap_ui flow_graph_ui = {
- REGISTER_STAT_GROUP_GENERIC,
- NULL,
- "flow_graph",
- flow_graph_init_tap,
- 0,
- NULL
-};
-
-void
-register_tap_listener_flow_graph(void)
-{
- register_stat_tap_ui(&flow_graph_ui,NULL);
-}
-
-/*
- * Editor modelines - http://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/gtk/follow_stream.c b/ui/gtk/follow_stream.c
deleted file mode 100644
index e172d67556..0000000000
--- a/ui/gtk/follow_stream.c
+++ /dev/null
@@ -1,1259 +0,0 @@
-/* follow_stream.c
- * Common routines for following data streams
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/addr_resolv.h>
-#include <epan/follow.h>
-#include <epan/epan_dissect.h>
-#include <wsutil/filesystem.h>
-#include <epan/prefs.h>
-#include <epan/charsets.h>
-#include <epan/tap.h>
-
-#include <epan/print.h>
-
-#include <ui/alert_box.h>
-#include <ui/last_open_dir.h>
-#include <ui/simple_dialog.h>
-
-#include <wsutil/file_util.h>
-#include <version_info.h>
-
-#include "gtkglobals.h"
-#include "ui/gtk/keys.h"
-#include "ui/gtk/color_utils.h"
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/follow_stream.h"
-#include "ui/gtk/font_utils.h"
-#include "ui/gtk/file_dlg.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/old-gtk-compat.h"
-
-#include <wsutil/utf8_entities.h>
-#ifdef _WIN32
-#include "wsutil/tempfile.h"
-#include "ui/win32/print_win32.h"
-#endif
-
-#include "globals.h"
-
-/* static variable declarations to speed up the performance
- * of follow_load_text and follow_add_to_gtk_text
- */
-static GdkColor server_fg, server_bg;
-static GdkColor client_fg, client_bg;
-static GtkTextTag *server_tag, *client_tag;
-
-static void follow_find_destroy_cb(GtkWidget * win _U_, gpointer data);
-static void follow_find_button_cb(GtkWidget * w, gpointer data);
-static void follow_destroy_cb(GtkWidget *w, gpointer data _U_);
-
-static void follow_stream(const gchar *title, follow_info_t *follow_info,
- gchar *both_directions_string, gchar *server_to_client_string, gchar *client_to_server_string);
-static frs_return_t follow_show(follow_info_t *follow_info,
- follow_print_line_func follow_print,
- char *buffer, size_t nchars, gboolean is_from_server, void *arg,
- guint32 *global_pos, guint32 *server_packet_count,
- guint32 *client_packet_count);
-
-static GList *follow_infos = NULL;
-
-/*
- * XXX - the routine pointed to by "print_line_fcn_p" doesn't get handed lines,
- * it gets handed bufferfuls. That's fine for "follow_write_raw()"
- * and "follow_add_to_gtk_text()", but, as "follow_print_text()" calls
- * the "print_line()" routine from "print.c", and as that routine might
- * genuinely expect to be handed a line (if, for example, it's using
- * some OS or desktop environment's printing API, and that API expects
- * to be handed lines), "follow_print_text()" should probably accumulate
- * lines in a buffer and hand them "print_line()". (If there's a
- * complete line in a buffer - i.e., there's nothing of the line in
- * the previous buffer or the next buffer - it can just hand that to
- * "print_line()" after filtering out non-printables, as an
- * optimization.)
- *
- * This might or might not be the reason why C arrays display
- * correctly but get extra blank lines very other line when printed.
- */
-static frs_return_t
-follow_common_read_stream(follow_info_t *follow_info,
- follow_print_line_func follow_print,
- void *arg)
-{
- guint32 global_client_pos = 0, global_server_pos = 0;
- guint32 server_packet_count = 0;
- guint32 client_packet_count = 0;
- guint32 *global_pos;
- gboolean skip;
- GList* cur;
- frs_return_t frs_return;
- follow_record_t *follow_record;
- GByteArray *buffer = g_byte_array_new();
-
-
- for (cur = follow_info->payload; cur; cur = g_list_next(cur)) {
- follow_record = (follow_record_t *)cur->data;
- skip = FALSE;
- if (!follow_record->is_server) {
- global_pos = &global_client_pos;
- if(follow_info->show_stream == FROM_SERVER) {
- skip = TRUE;
- }
- } else {
- global_pos = &global_server_pos;
- if (follow_info->show_stream == FROM_CLIENT) {
- skip = TRUE;
- }
- }
-
- if (!skip) {
- g_byte_array_set_size(buffer, 0);
- g_byte_array_append(buffer, follow_record->data->data,
- follow_record->data->len);
-
- frs_return = follow_show(follow_info, follow_print,
- buffer->data,
- follow_record->data->len,
- follow_record->is_server, arg,
- global_pos,
- &server_packet_count,
- &client_packet_count);
- if(frs_return == FRS_PRINT_ERROR) {
- g_byte_array_free(buffer, TRUE);
- return frs_return;
- }
- }
- }
-
- g_byte_array_free(buffer, TRUE);
- return FRS_OK;
-}
-
-static void follow_stream_cb(register_follow_t* follower, follow_read_stream_func read_stream_func, GtkWidget * w _U_, gpointer data _U_)
-{
- GtkWidget *filter_cm;
- GtkWidget *filter_te;
- gchar *follow_filter;
- const gchar *previous_filter;
- int filter_out_filter_len;
- const char *hostname0, *hostname1;
- char *port0, *port1;
- gchar *server_to_client_string = NULL;
- gchar *client_to_server_string = NULL;
- gchar *both_directions_string = NULL;
- follow_info_t *follow_info;
- gtk_follow_info_t *gtk_follow_info;
- GString *msg;
- gboolean is_follow = FALSE;
- guint32 ignore_stream;
- char stream_window_title[256];
-
- is_follow = proto_is_frame_protocol(cfile.edt->pi.layers, proto_get_protocol_filter_name(get_follow_proto_id(follower)));
-
- if (!is_follow) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Error following stream. Please make\n"
- "sure you have a %s packet selected.", proto_get_protocol_short_name(find_protocol_by_id(get_follow_proto_id(follower))));
- return;
- }
-
- gtk_follow_info = g_new0(gtk_follow_info_t, 1);
- follow_info = g_new0(follow_info_t, 1);
- gtk_follow_info->read_stream = read_stream_func;
- follow_info->gui_data = gtk_follow_info;
-
- /* Create a new filter that matches all packets in the TCP stream,
- and set the display filter entry accordingly */
- follow_filter = get_follow_conv_func(follower)(&cfile.edt->pi, &ignore_stream);
- if (!follow_filter) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Error creating filter for this stream.\n"
- "A transport or network layer header is needed");
- g_free(gtk_follow_info);
- g_free(follow_info);
- return;
- }
-
- /* Set the display filter entry accordingly */
- filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(top_level), E_DFILTER_CM_KEY);
- filter_te = gtk_bin_get_child(GTK_BIN(filter_cm));
-
- /* needed in follow_filter_out_stream(), is there a better way? */
- gtk_follow_info->filter_te = filter_te;
-
- /* save previous filter, const since we're not supposed to alter */
- previous_filter =
- (const gchar *)gtk_entry_get_text(GTK_ENTRY(filter_te));
-
- /* allocate our new filter. API claims g_malloc terminates program on failure */
- /* my calc for max alloc needed is really +10 but when did a few extra bytes hurt ? */
- filter_out_filter_len = (int)(strlen(follow_filter) + strlen(previous_filter) + 16);
- follow_info->filter_out_filter = (gchar *)g_malloc(filter_out_filter_len);
-
- /* append the negation */
- if(strlen(previous_filter)) {
- g_snprintf(follow_info->filter_out_filter, filter_out_filter_len,
- "%s and !(%s)", previous_filter, follow_filter);
- } else {
- g_snprintf(follow_info->filter_out_filter, filter_out_filter_len,
- "!(%s)", follow_filter);
- }
-
- /* data will be passed via tap callback*/
- msg = register_tap_listener(get_follow_tap_string(follower), follow_info, follow_filter,
- 0, NULL, get_follow_tap_handler(follower), NULL);
- if (msg) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't register %s tap: %s\n",
- get_follow_tap_string(follower), msg->str);
- g_free(gtk_follow_info);
- g_free(follow_info->filter_out_filter);
- g_free(follow_info);
- g_free(follow_filter);
- return;
- }
-
- gtk_entry_set_text(GTK_ENTRY(filter_te), follow_filter);
-
- /* Run the display filter so it goes in effect - even if it's the
- same as the previous display filter. */
- main_filter_packets(&cfile, follow_filter, TRUE);
-
- remove_tap_listener(follow_info);
-
- hostname0 = address_to_name(&follow_info->client_ip);
- hostname1 = address_to_name(&follow_info->server_ip);
-
- port0 = get_follow_port_to_display(follower)(NULL, follow_info->client_port);
- port1 = get_follow_port_to_display(follower)(NULL, follow_info->server_port);
-
- /* Both Stream Directions */
- both_directions_string = g_strdup_printf("Entire conversation (%u bytes)", follow_info->bytes_written[0] + follow_info->bytes_written[1]);
-
- server_to_client_string =
- g_strdup_printf("%s:%s " UTF8_RIGHTWARDS_ARROW " %s:%s (%u bytes)",
- hostname0, port0,
- hostname1, port1,
- follow_info->bytes_written[0]);
-
- client_to_server_string =
- g_strdup_printf("%s:%s " UTF8_RIGHTWARDS_ARROW " %s:%s (%u bytes)",
- hostname1, port1,
- hostname0, port0,
- follow_info->bytes_written[1]);
-
- g_snprintf(stream_window_title, 256, "Follow %s Stream (%s)",
- proto_get_protocol_short_name(find_protocol_by_id(get_follow_proto_id(follower))), follow_filter);
- follow_stream(stream_window_title, follow_info, both_directions_string,
- server_to_client_string, client_to_server_string);
-
- /* Free the filter string, as we're done with it. */
- g_free(follow_filter);
-
- wmem_free(NULL, port0);
- wmem_free(NULL, port1);
- g_free(both_directions_string);
- g_free(server_to_client_string);
- g_free(client_to_server_string);
-
-}
-
-static gboolean
-follow_add_to_gtk_text(char *buffer, size_t nchars, gboolean is_from_server,
- void *arg)
-{
- GtkWidget *text = (GtkWidget *)arg;
- GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
- GtkTextIter iter;
-
- /*
- * have to convert non printable ASCII chars to '.' in order
- * to be able to see the data we *should* see
- * in the GtkText widget.
- */
- size_t i;
-
- for (i = 0; i < nchars; i++) {
- if (buffer[i] == '\n' || buffer[i] == '\r')
- continue;
- if (! g_ascii_isprint(buffer[i])) {
- buffer[i] = '.';
- }
- }
-
- gtk_text_buffer_get_end_iter(buf, &iter);
- if (is_from_server) {
- gtk_text_buffer_insert_with_tags(buf, &iter, buffer, (gint) nchars,
- server_tag, NULL);
- } else {
- gtk_text_buffer_insert_with_tags(buf, &iter, buffer, (gint) nchars,
- client_tag, NULL);
- }
- return TRUE;
-}
-
-/*
- * XXX - for text printing, we probably want to wrap lines at 80 characters;
- * (PostScript printing is doing this already), and perhaps put some kind of
- * dingbat (to use the technical term) to indicate a wrapped line, along the
- * lines of what's done when displaying this in a window, as per Warren Young's
- * suggestion.
- */
-static gboolean
-follow_print_text(char *buffer, size_t nchars, gboolean is_from_server _U_,
- void *arg)
-{
- print_stream_t *stream = (print_stream_t *)arg;
- size_t i;
- char *str;
-
- /* convert non printable characters */
- for (i = 0; i < nchars; i++) {
- if (buffer[i] == '\n' || buffer[i] == '\r')
- continue;
- if (! g_ascii_isprint(buffer[i])) {
- buffer[i] = '.';
- }
- }
-
- /* convert unterminated char array to a zero terminated string */
- str = (char *)g_malloc(nchars + 1);
- memcpy(str, buffer, nchars);
- str[nchars] = 0;
- print_line(stream, /*indent*/ 0, str);
- g_free(str);
-
- return TRUE;
-}
-
-static gboolean
-follow_write_raw(char *buffer, size_t nchars, gboolean is_from_server _U_, void *arg)
-{
- FILE *fh = (FILE *)arg;
- size_t nwritten;
-
- nwritten = fwrite(buffer, 1, nchars, fh);
- if (nwritten != nchars)
- return FALSE;
-
- return TRUE;
-}
-
-static void
-follow_load_text(follow_info_t *follow_info)
-{
- GtkTextBuffer *buf;
- gtk_follow_info_t *gtk_follow_info = (gtk_follow_info_t *)follow_info->gui_data;
-
- buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtk_follow_info->text));
-
- /* prepare colors one time for repeated use by follow_add_to_gtk_text */
- color_t_to_gdkcolor(&server_fg, &prefs.st_server_fg);
- color_t_to_gdkcolor(&server_bg, &prefs.st_server_bg);
- color_t_to_gdkcolor(&client_fg, &prefs.st_client_fg);
- color_t_to_gdkcolor(&client_bg, &prefs.st_client_bg);
-
- /* prepare tags one time for repeated use by follow_add_to_gtk_text */
- server_tag = gtk_text_buffer_create_tag(buf, NULL, "foreground-gdk",
- &server_fg, "background-gdk",
- &server_bg, "font-desc",
- user_font_get_regular(), NULL);
- client_tag = gtk_text_buffer_create_tag(buf, NULL, "foreground-gdk",
- &client_fg, "background-gdk",
- &client_bg, "font-desc",
- user_font_get_regular(), NULL);
-
- /* Delete any info already in text box */
- gtk_text_buffer_set_text(buf, "", -1);
-
- gtk_follow_info->read_stream(follow_info, follow_add_to_gtk_text,
- gtk_follow_info->text);
-}
-
-/* Handles the display style toggling */
-static void
-follow_charset_toggle_cb(GtkWidget * w _U_, gpointer data)
-{
- follow_info_t *follow_info = (follow_info_t *)data;
- gtk_follow_info_t *gtk_follow_info = (gtk_follow_info_t *)follow_info->gui_data;
-
- /*
- * A radio button toggles when it goes on and when it goes
- * off, so when you click a radio button two signals are
- * delivered. We only want to reprocess the display once,
- * so we do it only when the button goes on.
- */
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))) {
- if (w == gtk_follow_info->ebcdic_bt)
- gtk_follow_info->show_type = SHOW_EBCDIC;
- else if (w == gtk_follow_info->hexdump_bt)
- gtk_follow_info->show_type = SHOW_HEXDUMP;
- else if (w == gtk_follow_info->carray_bt)
- gtk_follow_info->show_type = SHOW_CARRAY;
- else if (w == gtk_follow_info->ascii_bt)
- gtk_follow_info->show_type = SHOW_ASCII;
- else if (w == gtk_follow_info->raw_bt)
- gtk_follow_info->show_type = SHOW_RAW;
- follow_load_text(follow_info);
- }
-}
-
-static void
-follow_filter_out_stream(GtkWidget * w _U_, gpointer data)
-{
- follow_info_t *follow_info = (follow_info_t *)data;
- gtk_follow_info_t *gtk_follow_info = (gtk_follow_info_t *)follow_info->gui_data;
-
- /* Lock out user from messing with us. (ie. don't free our data!) */
- gtk_widget_set_sensitive(gtk_follow_info->streamwindow, FALSE);
-
- /* Set the display filter. */
- gtk_entry_set_text(GTK_ENTRY(gtk_follow_info->filter_te),
- follow_info->filter_out_filter);
-
- /* Run the display filter so it goes in effect. */
- main_filter_packets(&cfile, follow_info->filter_out_filter, FALSE);
-
- /* we force a subsequent close */
- window_destroy(gtk_follow_info->streamwindow);
-
- return;
-}
-
-static void
-follow_find_cb(GtkWidget * w _U_, gpointer data)
-{
- follow_info_t *follow_info = (follow_info_t *)data;
- gtk_follow_info_t *gtk_follow_info = (gtk_follow_info_t *)follow_info->gui_data;
- GtkWidget *find_dlg_w, *main_vb, *buttons_row, *find_lb;
- GtkWidget *find_hb, *find_text_box, *find_bt, *cancel_bt;
-
- if (gtk_follow_info->find_dlg_w != NULL) {
- /* There's already a dialog box; reactivate it. */
- reactivate_window(gtk_follow_info->find_dlg_w);
- return;
- }
-
- /* Create the find box */
- find_dlg_w = dlg_window_new("Wireshark: Find text");
- gtk_window_set_transient_for(GTK_WINDOW(find_dlg_w),
- GTK_WINDOW(gtk_follow_info->streamwindow));
- gtk_widget_set_size_request(find_dlg_w, 225, -1);
- gtk_window_set_destroy_with_parent(GTK_WINDOW(find_dlg_w), TRUE);
- gtk_follow_info->find_dlg_w = find_dlg_w;
-
- g_signal_connect(find_dlg_w, "destroy", G_CALLBACK(follow_find_destroy_cb),
- follow_info);
- g_signal_connect(find_dlg_w, "delete_event", G_CALLBACK(window_delete_event_cb),
- NULL);
-
- /* Main vertical box */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_container_add(GTK_CONTAINER(find_dlg_w), main_vb);
-
- /* Horizontal box for find label, entry field and up/down radio
- buttons */
- find_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX (main_vb), find_hb, TRUE, TRUE, 0);
- gtk_widget_show(find_hb);
-
- /* Find label */
- find_lb = gtk_label_new("Find text:");
- gtk_box_pack_start(GTK_BOX(find_hb), find_lb, FALSE, FALSE, 0);
- gtk_widget_show(find_lb);
-
- /* Find field */
- find_text_box = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(find_hb), find_text_box, FALSE, FALSE, 0);
- gtk_widget_set_tooltip_text(find_text_box, "Text to search for (case sensitive)");
- gtk_widget_show(find_text_box);
-
- /* Buttons row */
- buttons_row = dlg_button_row_new(GTK_STOCK_FIND, GTK_STOCK_CANCEL,
- NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), buttons_row, TRUE, TRUE, 0);
- find_bt = (GtkWidget *)g_object_get_data(G_OBJECT(buttons_row), GTK_STOCK_FIND);
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(buttons_row), GTK_STOCK_CANCEL);
-
- g_signal_connect(find_bt, "clicked", G_CALLBACK(follow_find_button_cb), follow_info);
- g_object_set_data(G_OBJECT(find_bt), "find_string", find_text_box);
- window_set_cancel_button(find_dlg_w, cancel_bt,
- window_cancel_button_cb);
-
- /* Hitting return in the find field "clicks" the find button */
- dlg_set_activate(find_text_box, find_bt);
-
- /* Show the dialog */
- gtk_widget_show_all(find_dlg_w);
- window_present(find_dlg_w);
-}
-
-static void
-follow_find_button_cb(GtkWidget * w, gpointer data)
-{
- gboolean found;
- const gchar *find_string;
- follow_info_t *follow_info = (follow_info_t *)data;
- gtk_follow_info_t *gtk_follow_info = (gtk_follow_info_t *)follow_info->gui_data;
- GtkTextBuffer *buffer;
- GtkTextIter iter, match_start, match_end;
- GtkTextMark *last_pos_mark;
- GtkWidget *find_string_w;
-
- /* Get the text the user typed into the find field */
- find_string_w = (GtkWidget *)g_object_get_data(G_OBJECT(w), "find_string");
- find_string = gtk_entry_get_text(GTK_ENTRY(find_string_w));
-
- /* Get the buffer associated with the follow stream */
- buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtk_follow_info->text));
- gtk_text_buffer_get_start_iter(buffer, &iter);
-
- /* Look for the search string in the buffer */
- last_pos_mark = gtk_text_buffer_get_mark(buffer, "last_position");
- if(last_pos_mark)
- gtk_text_buffer_get_iter_at_mark(buffer, &iter, last_pos_mark);
-
- found = gtk_text_iter_forward_search(&iter, find_string, (GtkTextSearchFlags)0,
- &match_start,
- &match_end,
- NULL);
-
- if(found) {
- gtk_text_buffer_select_range(buffer, &match_start, &match_end);
- last_pos_mark = gtk_text_buffer_create_mark (buffer,
- "last_position",
- &match_end, FALSE);
- gtk_text_view_scroll_mark_onscreen(GTK_TEXT_VIEW(gtk_follow_info->text), last_pos_mark);
- } else {
- /* We didn't find a match */
- simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK,
- "%sFind text has reached the end of the followed "
- "stream%s\n\nThe next search will start from the "
- "beginning", simple_dialog_primary_start(),
- simple_dialog_primary_end());
- if(last_pos_mark)
- gtk_text_buffer_delete_mark(buffer, last_pos_mark);
- }
-
-}
-
-static void
-follow_find_destroy_cb(GtkWidget * win _U_, gpointer data)
-{
- follow_info_t *follow_info = (follow_info_t *)data;
- gtk_follow_info_t *gtk_follow_info = (gtk_follow_info_t *)follow_info->gui_data;
-
- /* Note that we no longer have a dialog box. */
- gtk_follow_info->find_dlg_w = NULL;
-}
-
-static void
-follow_print_stream(GtkWidget * w _U_, gpointer data)
-{
- print_stream_t *stream;
- gboolean to_file;
- const char *print_dest;
- follow_info_t *follow_info =(follow_info_t *) data;
- gtk_follow_info_t *gtk_follow_info = (gtk_follow_info_t *)follow_info->gui_data;
-#ifdef _WIN32
- gboolean win_printer = FALSE;
- int tmp_fd;
- char *tmp_namebuf;
-#endif
-
- switch (prefs.pr_dest) {
- case PR_DEST_CMD:
-#ifdef _WIN32
- win_printer = TRUE;
- /* (The code for creating a temp filename is adapted from print_dlg.c). */
- /* We currently don't have a function in util.h to create just a tempfile */
- /* name, so simply create a tempfile using the "official" function, */
- /* then delete this file again. After this, the name MUST be available. */
- /* */
- /* Don't use tmpnam() or such, as this will fail under some ACL */
- /* circumstances: http://bugs.wireshark.org/bugzilla/show_bug.cgi?id=358 */
- /* Also: tmpnam is "insecure" and should not be used. */
- tmp_fd = create_tempfile(&tmp_namebuf, "wshprint", NULL);
- if(tmp_fd == -1) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Couldn't create temporary file for printing:\n%s", tmp_namebuf);
- return;
- }
- ws_close(tmp_fd);
- ws_unlink(tmp_namebuf);
- print_dest = tmp_namebuf;
- to_file = TRUE;
-#else
- print_dest = prefs.pr_cmd;
- to_file = FALSE;
-#endif
- break;
- case PR_DEST_FILE:
- print_dest = prefs.pr_file;
- to_file = TRUE;
- break;
- default: /* "Can't happen" */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Couldn't figure out where to send the print "
- "job. Check your preferences.");
- return;
- }
-
- switch (prefs.pr_format) {
-
- case PR_FMT_TEXT:
- stream = print_stream_text_new(to_file, print_dest);
- break;
-
- case PR_FMT_PS:
- stream = print_stream_ps_new(to_file, print_dest);
- break;
-
- default:
- g_assert_not_reached();
- stream = NULL;
- }
- if (stream == NULL) {
- if (to_file) {
- open_failure_alert_box(print_dest, errno, TRUE);
- } else {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Couldn't run print command %s.",
- prefs.pr_cmd);
- }
- return;
- }
-
- if (!print_preamble(stream, cfile.filename, get_ws_vcs_version_info()))
- goto print_error;
-
- switch (gtk_follow_info->read_stream(follow_info, follow_print_text, stream)) {
- case FRS_OK:
- break;
- case FRS_OPEN_ERROR:
- case FRS_READ_ERROR:
- /* XXX - cancel printing? */
- destroy_print_stream(stream);
- return;
- case FRS_PRINT_ERROR:
- goto print_error;
- }
-
- if (!print_finale(stream))
- goto print_error;
-
- if (!destroy_print_stream(stream)) {
- if (to_file) {
- write_failure_alert_box(print_dest, errno);
- } else {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Error closing print destination.");
- }
- }
-#ifdef _WIN32
- if (win_printer) {
- print_mswin(print_dest);
-
- /* trash temp file */
- ws_remove(print_dest);
- }
-#endif
- return;
-
- print_error:
- if (to_file) {
- write_failure_alert_box(print_dest, errno);
- } else {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Error writing to print command: %s",
- g_strerror(errno));
- }
- /* XXX - cancel printing? */
- destroy_print_stream(stream);
-
-#ifdef _WIN32
- if (win_printer) {
- /* trash temp file */
- ws_remove(print_dest);
- }
-#endif
-}
-
-static char *
-gtk_follow_save_as_file(GtkWidget *caller)
-{
- GtkWidget *new_win;
- char *pathname;
-
- new_win = file_selection_new("Wireshark: Save Follow Stream As",
- GTK_WINDOW(caller),
- FILE_SELECTION_SAVE);
- pathname = file_selection_run(new_win);
- if (pathname == NULL) {
- /* User cancelled or closed the dialog. */
- return NULL;
- }
-
- /* We've crosed the Rubicon; get rid of the dialog box. */
- window_destroy(new_win);
-
- return pathname;
-}
-
-static gboolean
-follow_save_as_ok_cb(gchar *to_name, follow_info_t *follow_info)
-{
- FILE *fh;
- print_stream_t *stream;
- gtk_follow_info_t *gtk_follow_info = (gtk_follow_info_t *)follow_info->gui_data;
-
- if (gtk_follow_info->show_type == SHOW_RAW) {
- /* Write the data out as raw binary data */
- fh = ws_fopen(to_name, "wb");
- } else {
- /* Write it out as text */
- fh = ws_fopen(to_name, "w");
- }
- if (fh == NULL) {
- open_failure_alert_box(to_name, errno, TRUE);
- return FALSE;
- }
-
- if (gtk_follow_info->show_type == SHOW_RAW) {
- switch (gtk_follow_info->read_stream(follow_info, follow_write_raw, fh)) {
- case FRS_OK:
- if (fclose(fh) == EOF) {
- write_failure_alert_box(to_name, errno);
- return FALSE;
- }
- break;
-
- case FRS_OPEN_ERROR:
- case FRS_READ_ERROR:
- fclose(fh);
- return FALSE;
-
- case FRS_PRINT_ERROR:
- write_failure_alert_box(to_name, errno);
- fclose(fh);
- return FALSE;
- }
- } else {
- stream = print_stream_text_stdio_new(fh);
- switch (gtk_follow_info->read_stream(follow_info, follow_print_text, stream)) {
- case FRS_OK:
- if (!destroy_print_stream(stream)) {
- write_failure_alert_box(to_name, errno);
- return FALSE;
- }
- break;
-
- case FRS_OPEN_ERROR:
- case FRS_READ_ERROR:
- destroy_print_stream(stream);
- return FALSE;
-
- case FRS_PRINT_ERROR:
- write_failure_alert_box(to_name, errno);
- destroy_print_stream(stream);
- return FALSE;
- }
- }
-
- return TRUE;
-}
-
-static void
-follow_save_as_cmd_cb(GtkWidget *w, gpointer data)
-{
- GtkWidget *caller = gtk_widget_get_toplevel(w);
- follow_info_t *follow_info = (follow_info_t *)data;
- char *pathname;
-
- /*
- * Loop until the user either selects a file or gives up.
- */
- for (;;) {
- pathname = gtk_follow_save_as_file(caller);
- if (pathname == NULL) {
- /* User gave up. */
- break;
- }
- if (follow_save_as_ok_cb(pathname, follow_info)) {
- /* We succeeded. */
- g_free(pathname);
- break;
- }
- /* Dump failed; let the user select another file or give up. */
- g_free(pathname);
- }
-}
-
-static void
-follow_stream_direction_changed(GtkWidget *w, gpointer data)
-{
- follow_info_t *follow_info = (follow_info_t *)data;
-
- switch(gtk_combo_box_get_active(GTK_COMBO_BOX(w))) {
-
- case 0 :
- follow_info->show_stream = BOTH_HOSTS;
- follow_load_text(follow_info);
- break;
- case 1 :
- follow_info->show_stream = FROM_SERVER;
- follow_load_text(follow_info);
- break;
- case 2 :
- follow_info->show_stream = FROM_CLIENT;
- follow_load_text(follow_info);
- break;
- }
-}
-
-/* Add a "follow_info_t" structure to the list. */
-static void
-remember_follow_info(follow_info_t *follow_info)
-{
- follow_infos = g_list_append(follow_infos, follow_info);
-}
-
-#define IS_SHOW_TYPE(x) (gtk_follow_info->show_type == x ? 1 : 0)
-/* Remove a "follow_info_t" structure from the list. */
-static void
-forget_follow_info(follow_info_t *follow_info)
-{
- follow_infos = g_list_remove(follow_infos, follow_info);
-}
-
-static void
-follow_stream(const gchar *title, follow_info_t *follow_info,
- gchar *both_directions_string,
- gchar *server_to_client_string, gchar *client_to_server_string)
-{
- GtkWidget *streamwindow, *vbox, *txt_scrollw, *text;
- GtkWidget *hbox, *bbox, *button, *radio_bt;
- GtkWidget *stream_fr, *stream_vb, *direction_hbox;
- GtkWidget *stream_cmb;
- gtk_follow_info_t *gtk_follow_info = (gtk_follow_info_t *)follow_info->gui_data;
-
- gtk_follow_info->show_type = SHOW_RAW;
-
- streamwindow = dlg_window_new(title);
-
- /* needed in follow_filter_out_stream(), is there a better way? */
- gtk_follow_info->streamwindow = streamwindow;
-
- gtk_widget_set_name(streamwindow, title);
- gtk_window_set_default_size(GTK_WINDOW(streamwindow), DEF_WIDTH, DEF_HEIGHT);
- gtk_container_set_border_width(GTK_CONTAINER(streamwindow), 6);
-
- /* setup the container */
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- gtk_container_add(GTK_CONTAINER(streamwindow), vbox);
-
- /* content frame */
- stream_fr = gtk_frame_new("Stream Content");
- gtk_box_pack_start(GTK_BOX (vbox), stream_fr, TRUE, TRUE, 0);
- gtk_widget_show(stream_fr);
-
- stream_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- gtk_container_set_border_width( GTK_CONTAINER(stream_vb) , 6);
- gtk_container_add(GTK_CONTAINER(stream_fr), stream_vb);
-
- /* create a scrolled window for the text */
- txt_scrollw = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(txt_scrollw), GTK_SHADOW_IN);
- gtk_box_pack_start(GTK_BOX(stream_vb), txt_scrollw, TRUE, TRUE, 0);
-
- /* create a text box */
- text = gtk_text_view_new();
- gtk_text_view_set_editable(GTK_TEXT_VIEW(text), FALSE);
- gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD_CHAR);
-
- gtk_container_add(GTK_CONTAINER(txt_scrollw), text);
- gtk_follow_info->text = text;
-
- /* direction hbox */
- direction_hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1, FALSE);
- gtk_box_pack_start(GTK_BOX(stream_vb), direction_hbox, FALSE, FALSE, 0);
-
- stream_cmb = gtk_combo_box_text_new();
-
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(stream_cmb), both_directions_string);
- follow_info->show_stream = BOTH_HOSTS;
-
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(stream_cmb), client_to_server_string);
-
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(stream_cmb), server_to_client_string);
-
- gtk_combo_box_set_active(GTK_COMBO_BOX(stream_cmb), 0); /* Do this before signal_connect */
- /* so callback not triggered */
-
- g_signal_connect(stream_cmb, "changed", G_CALLBACK(follow_stream_direction_changed), follow_info);
-
- gtk_widget_set_tooltip_text(stream_cmb, "Select the stream direction to display");
- gtk_box_pack_start(GTK_BOX(direction_hbox), stream_cmb, TRUE, TRUE, 0);
-
- /* stream hbox */
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1, FALSE);
- gtk_box_pack_start(GTK_BOX(stream_vb), hbox, FALSE, FALSE, 0);
-
- /* Create Find Button */
- button = ws_gtk_button_new_from_stock(GTK_STOCK_FIND);
- g_signal_connect(button, "clicked", G_CALLBACK(follow_find_cb), follow_info);
- gtk_widget_set_tooltip_text(button, "Find text in the displayed content");
- gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
-
- /* Create Save As Button */
- button = ws_gtk_button_new_from_stock(GTK_STOCK_SAVE_AS);
- g_signal_connect(button, "clicked", G_CALLBACK(follow_save_as_cmd_cb), follow_info);
- gtk_widget_set_tooltip_text(button, "Save the content as currently displayed");
- gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
-
- /* Create Print Button */
- button = ws_gtk_button_new_from_stock(GTK_STOCK_PRINT);
- g_signal_connect(button, "clicked", G_CALLBACK(follow_print_stream), follow_info);
- gtk_widget_set_tooltip_text(button, "Print the content as currently displayed");
- gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
-
- /* ASCII radio button */
- radio_bt = gtk_radio_button_new_with_label(NULL, "ASCII");
- gtk_widget_set_tooltip_text(radio_bt, "Stream data output in \"ASCII\" format");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_bt), IS_SHOW_TYPE(SHOW_ASCII));
- gtk_box_pack_start(GTK_BOX(hbox), radio_bt, TRUE, TRUE, 0);
- g_signal_connect(radio_bt, "toggled", G_CALLBACK(follow_charset_toggle_cb), follow_info);
- gtk_follow_info->ascii_bt = radio_bt;
-
- /* EBCDIC radio button */
- radio_bt = gtk_radio_button_new_with_label(gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_bt)),
- "EBCDIC");
- gtk_widget_set_tooltip_text(radio_bt, "Stream data output in \"EBCDIC\" format");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_bt), IS_SHOW_TYPE(SHOW_EBCDIC));
- gtk_box_pack_start(GTK_BOX(hbox), radio_bt, TRUE, TRUE, 0);
- g_signal_connect(radio_bt, "toggled", G_CALLBACK(follow_charset_toggle_cb), follow_info);
- gtk_follow_info->ebcdic_bt = radio_bt;
-
- /* HEX DUMP radio button */
- radio_bt = gtk_radio_button_new_with_label(gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_bt)),
- "Hex Dump");
- gtk_widget_set_tooltip_text(radio_bt, "Stream data output in \"Hexdump\" format");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_bt), IS_SHOW_TYPE(SHOW_HEXDUMP));
- gtk_box_pack_start(GTK_BOX(hbox), radio_bt, TRUE, TRUE, 0);
- g_signal_connect(radio_bt, "toggled", G_CALLBACK(follow_charset_toggle_cb),follow_info);
- gtk_follow_info->hexdump_bt = radio_bt;
-
- /* C Array radio button */
- radio_bt = gtk_radio_button_new_with_label(gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_bt)),
- "C Arrays");
- gtk_widget_set_tooltip_text(radio_bt, "Stream data output in \"C Array\" format");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_bt), IS_SHOW_TYPE(SHOW_CARRAY));
- gtk_box_pack_start(GTK_BOX(hbox), radio_bt, TRUE, TRUE, 0);
- g_signal_connect(radio_bt, "toggled", G_CALLBACK(follow_charset_toggle_cb), follow_info);
- gtk_follow_info->carray_bt = radio_bt;
-
- /* Raw radio button */
- radio_bt = gtk_radio_button_new_with_label(gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_bt)),
- "Raw");
- gtk_widget_set_tooltip_text(radio_bt,
- "Stream data output in \"Raw\" (binary) format. "
- "As this contains non printable characters, "
- "the screen output will be in ASCII format");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_bt), IS_SHOW_TYPE(SHOW_RAW));
- gtk_box_pack_start(GTK_BOX(hbox), radio_bt, TRUE, TRUE, 0);
- g_signal_connect(radio_bt, "toggled", G_CALLBACK(follow_charset_toggle_cb), follow_info);
- gtk_follow_info->raw_bt = radio_bt;
-
- /* Button row: help, filter out, close button */
- bbox = dlg_button_row_new(WIRESHARK_STOCK_FILTER_OUT_STREAM, GTK_STOCK_CLOSE, GTK_STOCK_HELP,
- NULL);
- gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 5);
-
-
- button = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_FILTER_OUT_STREAM);
- gtk_widget_set_tooltip_text(button, "Build a display filter which cuts this stream from the capture");
- g_signal_connect(button, "clicked", G_CALLBACK(follow_filter_out_stream), follow_info);
-
- button = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(streamwindow, button, window_cancel_button_cb);
- gtk_widget_set_tooltip_text(button, "Close the dialog and keep the current display filter");
- gtk_widget_grab_default(button);
-
- button = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(button, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_FOLLOW_STREAM_DIALOG);
-
- /* Tuck away the follow_info object into the window */
- g_object_set_data(G_OBJECT(streamwindow), E_FOLLOW_INFO_KEY, follow_info);
-
- follow_load_text(follow_info);
- remember_follow_info(follow_info);
-
-
- g_signal_connect(streamwindow, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(streamwindow, "destroy", G_CALLBACK(follow_destroy_cb), NULL);
-
- /* Make sure this widget gets destroyed if we quit the main loop,
- so that if we exit, we clean up any temporary files we have
- for "Follow TCP Stream" windows.
- gtk_quit_add_destroy is deprecated and should not be used in newly-written code.
- This function is going to be removed in GTK+ 3.0
- gtk_quit_add_destroy(gtk_main_level(), GTK_OBJECT(streamwindow));
- */
-
- gtk_widget_show_all(streamwindow);
- window_present(streamwindow);
-}
-
-/* The destroy call back has the responsibility of
- * unlinking the temporary file
- * and freeing the filter_out_filter */
-static void
-follow_destroy_cb(GtkWidget *w, gpointer data _U_)
-{
- follow_info_t *follow_info;
- gtk_follow_info_t *gtk_follow_info;
-
- follow_info = (follow_info_t *)g_object_get_data(G_OBJECT(w), E_FOLLOW_INFO_KEY);
- gtk_follow_info = (gtk_follow_info_t *)follow_info->gui_data;
-
- forget_follow_info(follow_info);
- g_free(gtk_follow_info);
- follow_info_free(follow_info);
- gtk_widget_destroy(w);
-}
-
-static frs_return_t
-follow_show(follow_info_t *follow_info,
- follow_print_line_func follow_print,
- char *buffer, size_t nchars, gboolean is_from_server, void *arg,
- guint32 *global_pos, guint32 *server_packet_count,
- guint32 *client_packet_count)
-{
- gchar initbuf[256];
- guint32 current_pos;
- static const gchar hexchars[16] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
- gtk_follow_info_t *gtk_follow_info = (gtk_follow_info_t *)follow_info->gui_data;
-
- switch (gtk_follow_info->show_type) {
-
- case SHOW_EBCDIC:
- /* If our native arch is ASCII, call: */
- EBCDIC_to_ASCII(buffer, (guint) nchars);
- if (!follow_print(buffer, nchars, is_from_server, arg))
- return FRS_PRINT_ERROR;
- break;
-
- case SHOW_ASCII:
- /* If our native arch is EBCDIC, call:
- * ASCII_TO_EBCDIC(buffer, nchars);
- */
- if (!follow_print(buffer, nchars, is_from_server, arg))
- return FRS_PRINT_ERROR;
- break;
-
- case SHOW_RAW:
- /* Don't translate, no matter what the native arch
- * is.
- */
- if (!follow_print(buffer, nchars, is_from_server, arg))
- return FRS_PRINT_ERROR;
- break;
-
- case SHOW_HEXDUMP:
- current_pos = 0;
- while (current_pos < nchars) {
- gchar hexbuf[256];
- int i;
- gchar *cur = hexbuf, *ascii_start;
-
- /* is_from_server indentation : put 4 spaces at the
- * beginning of the string */
- /* XXX - We might want to prepend each line with "C" or "S" instead. */
- if (is_from_server && follow_info->show_stream == BOTH_HOSTS) {
- memset(cur, ' ', 4);
- cur += 4;
- }
- cur += g_snprintf(cur, 20, "%08X ", *global_pos);
- /* 49 is space consumed by hex chars */
- ascii_start = cur + 49;
- for (i = 0; i < 16 && current_pos + i < nchars; i++) {
- *cur++ =
- hexchars[(buffer[current_pos + i] & 0xf0) >> 4];
- *cur++ =
- hexchars[buffer[current_pos + i] & 0x0f];
- *cur++ = ' ';
- if (i == 7)
- *cur++ = ' ';
- }
- /* Fill it up if column isn't complete */
- while (cur < ascii_start)
- *cur++ = ' ';
-
- /* Now dump bytes as text */
- for (i = 0; i < 16 && current_pos + i < nchars; i++) {
- *cur++ =
- (g_ascii_isprint(buffer[current_pos + i]) ?
- buffer[current_pos + i] : '.' );
- if (i == 7) {
- *cur++ = ' ';
- }
- }
- current_pos += i;
- (*global_pos) += i;
- *cur++ = '\n';
- *cur = 0;
- if (!follow_print(hexbuf, strlen(hexbuf), is_from_server, arg))
- return FRS_PRINT_ERROR;
- }
- break;
-
- case SHOW_CARRAY:
- current_pos = 0;
- g_snprintf(initbuf, sizeof(initbuf), "char peer%d_%d[] = {\n",
- is_from_server ? 1 : 0,
- is_from_server ? (*server_packet_count)++ : (*client_packet_count)++);
- if (!follow_print(initbuf, strlen(initbuf), is_from_server, arg))
- return FRS_PRINT_ERROR;
-
- while (current_pos < nchars) {
- gchar hexbuf[256];
- int i, cur;
-
- cur = 0;
- for (i = 0; i < 8 && current_pos + i < nchars; i++) {
- /* Prepend entries with "0x" */
- hexbuf[cur++] = '0';
- hexbuf[cur++] = 'x';
- hexbuf[cur++] = hexchars[(buffer[current_pos + i] & 0xf0) >> 4];
- hexbuf[cur++] = hexchars[buffer[current_pos + i] & 0x0f];
-
- /* Delimit array entries with a comma */
- if (current_pos + i + 1 < nchars)
- hexbuf[cur++] = ',';
-
- hexbuf[cur++] = ' ';
- }
-
- /* Terminate the array if we are at the end */
- if (current_pos + i == nchars) {
- hexbuf[cur++] = '}';
- hexbuf[cur++] = ';';
- }
-
- current_pos += i;
- (*global_pos) += i;
- hexbuf[cur++] = '\n';
- hexbuf[cur] = 0;
- if (!follow_print(hexbuf, strlen(hexbuf), is_from_server, arg))
- return FRS_PRINT_ERROR;
- }
- break;
-
- case SHOW_YAML:
- case SHOW_UTF8:
- case SHOW_UTF16:
- g_assert_not_reached();
- break;
- }
-
- return FRS_OK;
-}
-
-/* Follow the TCP stream, if any, to which the last packet that we called
- a dissection routine on belongs (this might be the most recently
- selected packet, or it might be the last packet in the file). */
-void
-follow_tcp_stream_cb(GtkWidget * w _U_, gpointer data _U_)
-{
- register_follow_t* follower = get_follow_by_name("TCP");
-
- follow_stream_cb(follower, follow_common_read_stream, w, data);
-}
-
-/* Follow the UDP stream, if any, to which the last packet that we called
- a dissection routine on belongs (this might be the most recently
- selected packet, or it might be the last packet in the file). */
-void
-follow_udp_stream_cb(GtkWidget * w _U_, gpointer data _U_)
-{
- register_follow_t* follower = get_follow_by_name("UDP");
-
- follow_stream_cb(follower, follow_common_read_stream, w, data);
-}
-
-/* Follow the HTTP stream, if any, to which the last packet that we called
- a dissection routine on belongs (this might be the most recently
- selected packet, or it might be the last packet in the file). */
-void
-follow_http_stream_cb(GtkWidget * w _U_, gpointer data _U_)
-{
- register_follow_t* follower = get_follow_by_name("HTTP");
-
- follow_stream_cb(follower, follow_common_read_stream, w, data);
-}
-
-/* Follow the SSL stream, if any, to which the last packet that we called
- a dissection routine on belongs (this might be the most recently
- selected packet, or it might be the last packet in the file). */
-void
-follow_ssl_stream_cb(GtkWidget * w _U_, gpointer data _U_)
-{
- register_follow_t* follower = get_follow_by_name("SSL");
-
- follow_stream_cb(follower, follow_common_read_stream, w, data);
-}
-
-static void
-follow_redraw(gpointer data, gpointer user_data _U_)
-{
- follow_load_text((follow_info_t *)data);
-}
-
-/* Redraw the text in all "Follow Stream" windows. */
-void
-follow_stream_redraw_all(void)
-{
- g_list_foreach(follow_infos, follow_redraw, NULL);
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/follow_stream.h b/ui/gtk/follow_stream.h
deleted file mode 100644
index 8b3f7d7eaa..0000000000
--- a/ui/gtk/follow_stream.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/* follow_stream.h
- * Common routines for following data streams
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
- */
-
-#ifndef __FOLLOW_STREAM_H__
-#define __FOLLOW_STREAM_H__
-
-#include <gtk/gtk.h>
-#include <epan/follow.h>
-
-
-typedef struct _gtk_follow_info {
- show_type_t show_type;
- GtkWidget *text;
- GtkWidget *ascii_bt;
- GtkWidget *ebcdic_bt;
- GtkWidget *hexdump_bt;
- GtkWidget *carray_bt;
- GtkWidget *raw_bt;
- GtkWidget *find_dlg_w;
- GtkWidget *filter_te;
- GtkWidget *streamwindow;
- follow_read_stream_func read_stream;
-} gtk_follow_info_t;
-
-#define E_FOLLOW_INFO_KEY "follow_info_key"
-
-/** Redraw the text in all "Follow TCP Stream" windows. */
-extern void follow_stream_redraw_all(void);
-
-/** User requested the "Follow TCP Stream" dialog box by menu or toolbar.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-extern void follow_tcp_stream_cb( GtkWidget *widget, gpointer data);
-
-/* Follow the UDP stream, if any, to which the last packet that we called
- a dissection routine on belongs (this might be the most recently
- selected packet, or it might be the last packet in the file). */
-void follow_udp_stream_cb(GtkWidget * w, gpointer data _U_);
-
-/* Follow the HTTP stream, if any, to which the last packet that we called
- a dissection routine on belongs (this might be the most recently
- selected packet, or it might be the last packet in the file). */
-void follow_http_stream_cb(GtkWidget * w, gpointer data _U_);
-
-/* Follow the SSL stream, if any, to which the last packet that we called
- a dissection routine on belongs (this might be the most recently
- selected packet, or it might be the last packet in the file). */
-void follow_ssl_stream_cb(GtkWidget * w, gpointer data _U_);
-
-
-#endif /* __FOLLOW_STREAM_H__ */
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/font_utils.c b/ui/gtk/font_utils.c
deleted file mode 100644
index a58138c99c..0000000000
--- a/ui/gtk/font_utils.c
+++ /dev/null
@@ -1,378 +0,0 @@
-/* font_utils.c
- * Utilities to use for font manipulation
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-#include <string.h>
-#include <stdlib.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/packet.h>
-#include <epan/prefs.h>
-
-#ifdef _WIN32
-#include <windows.h>
-#include <tchar.h>
-#include <wsutil/unicode-utils.h>
-#endif
-
-#include "ui/recent.h"
-#include "ui/simple_dialog.h"
-
-#include "ui/gtk/main.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/font_utils.h"
-#include "ui/gtk/packet_panes.h"
-#include "ui/gtk/follow_stream.h"
-#include "ui/gtk/packet_list.h"
-
-
-static PangoFontDescription *m_r_font;
-
-
-/* Get the regular user font.
- *
- * @return the regular user font
- */
-PangoFontDescription *user_font_get_regular(void)
-{
- return m_r_font;
-}
-
-static void
-set_fonts(PangoFontDescription *regular)
-{
- /* Yes, assert. The code that loads the font should check
- * for NULL and provide its own error message. */
- g_assert(m_r_font);
- m_r_font = regular;
-}
-
-void
-view_zoom_in_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- gint save_gui_zoom_level;
-
- save_gui_zoom_level = recent.gui_zoom_level;
- recent.gui_zoom_level++;
- switch (user_font_apply()) {
-
- case FA_SUCCESS:
- break;
-
- case FA_ZOOMED_TOO_FAR:
- recent.gui_zoom_level = save_gui_zoom_level; /* undo zoom */
- break;
-
- case FA_FONT_NOT_AVAILABLE:
- /* We assume this means that the specified size isn't available. */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Your current font isn't available in the next larger size.\n");
- recent.gui_zoom_level = save_gui_zoom_level; /* undo zoom */
- break;
- }
-}
-
-void
-view_zoom_out_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- gint save_gui_zoom_level;
-
- save_gui_zoom_level = recent.gui_zoom_level;
- recent.gui_zoom_level--;
- switch (user_font_apply()) {
-
- case FA_SUCCESS:
- break;
-
- case FA_ZOOMED_TOO_FAR:
- recent.gui_zoom_level = save_gui_zoom_level; /* undo zoom */
- break;
-
- case FA_FONT_NOT_AVAILABLE:
- /* We assume this means that the specified size isn't available. */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Your current font isn't available in the next smaller size.\n");
- recent.gui_zoom_level = save_gui_zoom_level; /* undo zoom */
- break;
- }
-}
-
-void
-view_zoom_100_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- gint save_gui_zoom_level;
-
- save_gui_zoom_level = recent.gui_zoom_level;
- recent.gui_zoom_level = 0;
- switch (user_font_apply()) {
-
- case FA_SUCCESS:
- break;
-
- case FA_ZOOMED_TOO_FAR:
- recent.gui_zoom_level = save_gui_zoom_level; /* undo zoom */
- break;
-
- case FA_FONT_NOT_AVAILABLE:
- /* We assume this means that the specified size isn't available.
- XXX - this "shouldn't happen". */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Your current font couldn't be reloaded at the size you selected.\n");
- recent.gui_zoom_level = save_gui_zoom_level; /* undo zoom */
- break;
- }
-}
-
-
-
-gboolean
-user_font_test(gchar *font_name)
-{
- PangoFontDescription *new_r_font;
-
- new_r_font = pango_font_description_from_string(font_name);
- if (new_r_font == NULL) {
- /* Oops, that font didn't work.
- Tell the user, but don't tear down the font selection
- dialog, so that they can try again. */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "The font you selected can't be loaded.");
-
- return FALSE;
- }
-
- return TRUE;
-}
-
-
-
-/* Given a font name, construct the name of a version of that font with
- the current zoom factor applied. */
-static char *
-font_zoom(char *gui_font_name)
-{
- char *new_font_name;
- char *font_name_dup;
- char *font_name_p;
- long font_point_size_l;
-
- if (recent.gui_zoom_level == 0) {
- /* There is no zoom factor - just return the name */
- return g_strdup(gui_font_name);
- }
-
- font_name_dup = g_strdup(gui_font_name);
-
- /* find the start of the font_size string */
- font_name_p = strrchr(font_name_dup, ' ');
- *font_name_p = '\0';
- font_name_p++;
-
- /* calculate the new font size */
- font_point_size_l = strtol(font_name_p, NULL, 10);
- font_point_size_l += recent.gui_zoom_level;
- /* make sure the size didn't become zero or negative */
- if (font_point_size_l <= 0)
- return NULL;
-
- /* build a new font name */
- new_font_name = g_strdup_printf("%s %ld", font_name_dup, font_point_size_l);
-
- g_free(font_name_dup);
-
- return new_font_name;
-}
-
-fa_ret_t
-user_font_apply(void) {
- char *gui_font_name;
- PangoFontDescription *new_r_font;
- PangoFontDescription *old_r_font = NULL;
-
- /* convert font name to reflect the zoom level */
- gui_font_name = font_zoom(prefs.gui_gtk2_font_name);
- if (gui_font_name == NULL)
- return FA_ZOOMED_TOO_FAR;
-
- /* load normal font */
- new_r_font = pango_font_description_from_string(gui_font_name);
- if (new_r_font == NULL) {
- g_free(gui_font_name);
-
- /* We let our caller pop up a dialog box, as the error message
- depends on the context (did they zoom in or out, or did they
- do something else? */
- return FA_FONT_NOT_AVAILABLE;
- }
-
- /* the font(s) seem to be ok */
- packet_list_set_font(new_r_font);
- set_ptree_font_all(new_r_font);
- old_r_font = m_r_font;
- set_fonts(new_r_font);
-
- /* Redraw the packet bytes windows. */
- redraw_packet_bytes_all();
-
- /* Redraw the "Follow TCP Stream" windows. */
- follow_stream_redraw_all();
-
- /* We're no longer using the old fonts; unreference them. */
- if (old_r_font != NULL)
- pango_font_description_free(old_r_font);
- g_free(gui_font_name);
-
- return FA_SUCCESS;
-}
-
-
-#ifdef _WIN32
-
-#define NAME_BUFFER_LEN 32
-
-static char appfontname[128] = "tahoma 8";
-
-static void
-set_app_font_gtk2(const char *fontname)
-{
- GtkSettings *settings;
-
- if (fontname != NULL && *fontname == 0) return;
-
- settings = gtk_settings_get_default();
-
- if (fontname == NULL) {
- g_object_set(G_OBJECT(settings), "gtk-font-name", appfontname, NULL);
- } else {
- GtkWidget *w;
- PangoFontDescription *pfd;
- PangoContext *pc;
- PangoFont *pfont;
-
- w = gtk_label_new(NULL);
- pfd = pango_font_description_from_string(fontname);
- pc = gtk_widget_get_pango_context(w);
- pfont = pango_context_load_font(pc, pfd);
-
- if (pfont != NULL) {
- g_strlcpy(appfontname, fontname, 128);
- appfontname[127] = '\0';
- g_object_set(G_OBJECT(settings), "gtk-font-name", appfontname, NULL);
- }
-
- gtk_widget_destroy(w);
- pango_font_description_free(pfd);
- }
-}
-
-static char *default_windows_menu_fontspec_gtk2(void)
-{
- gchar *fontspec = NULL;
- NONCLIENTMETRICS ncm;
-
- memset(&ncm, 0, sizeof ncm);
- ncm.cbSize = sizeof ncm;
-
- if (SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, 0)) {
- HDC screen = GetDC(0);
- double y_scale = 72.0 / GetDeviceCaps(screen, LOGPIXELSY);
- int point_size = (int) (ncm.lfMenuFont.lfHeight * y_scale);
-
- if (point_size < 0) point_size = -point_size;
- fontspec = g_strdup_printf("%s %d", ncm.lfMenuFont.lfFaceName,
- point_size);
- ReleaseDC(0, screen);
- }
-
- return fontspec;
-}
-
-static void try_to_get_windows_font_gtk2(void)
-{
- gchar *fontspec;
-
- fontspec = default_windows_menu_fontspec_gtk2();
-
- if (fontspec != NULL) {
- int match;
- PangoFontDescription *pfd;
- PangoFont *pfont;
- PangoContext *pc;
- GtkWidget *w;
-
- pfd = pango_font_description_from_string(fontspec);
-
- w = gtk_label_new(NULL);
- pc = gtk_widget_get_pango_context(w);
- pfont = pango_context_load_font(pc, pfd);
- match = (pfont != NULL);
-
- pango_font_description_free(pfd);
- g_object_unref(G_OBJECT(pc));
- gtk_widget_destroy(w);
-
- if (match) set_app_font_gtk2(fontspec);
- g_free(fontspec);
- }
-}
-#endif /* _WIN32 */
-
-
-void font_init(void)
-{
-#ifdef _WIN32
- /* try to load the application font for GTK2 */
- try_to_get_windows_font_gtk2();
-#endif
-
- /* Try to load the regular fixed-width font */
- m_r_font = pango_font_description_from_string(prefs.gui_gtk2_font_name);
- if (m_r_font == NULL) {
- /* XXX - pop this up as a dialog box? no */
- fprintf(stderr, "wireshark: Warning: font %s not found - defaulting to Monospace 9\n",
- prefs.gui_gtk2_font_name);
- if ((m_r_font = pango_font_description_from_string("Monospace 9")) == NULL)
- {
- fprintf(stderr, "wireshark: Error: font Monospace 9 not found\n");
- exit(1);
- }
- g_free(prefs.gui_gtk2_font_name);
- prefs.gui_gtk2_font_name = g_strdup("Monospace 9");
- }
-
- /* Call this for the side-effects that set_fonts() produces */
- set_fonts(m_r_font);
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/font_utils.h b/ui/gtk/font_utils.h
deleted file mode 100644
index d9678e1121..0000000000
--- a/ui/gtk/font_utils.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/* font_utils.h
- * Declarations of utilities to use for font manipulation
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-
-/** @file
- * Utilities for font manipulation.
- *
- * There are two different fonts used:
- * - the application font for menu's, dialog's and such
- * - the user font for the packet panes
- *
- * The user font is also available in regular (m_r_font) and bold (m_b_font) versions.
- */
-
-#ifndef __FONT_UTILS_H__
-#define __FONT_UTILS_H__
-
-/** Init the application and user fonts at program start. */
-extern void font_init(void);
-
-/** Return value from font_apply() */
-typedef enum {
- FA_SUCCESS, /**< function succeeded */
- FA_ZOOMED_TOO_FAR, /**< we've zoomed too far */
- FA_FONT_NOT_AVAILABLE /**< the chosen font isn't available */
-} fa_ret_t;
-
-/** Applies a new user font, corresponding to the preferences font name and recent zoom level.
- * Will also redraw the screen.
- *
- * @return if the new font could be set or not
- */
-extern fa_ret_t user_font_apply(void);
-
-/** Test, if the given font name is available.
- *
- * @param font_name the font to test
- * @return TRUE, if this font is available
- */
-extern gboolean user_font_test(gchar *font_name);
-
-/** Get the regular user font.
- *
- * @return the regular user font
- */
-extern PangoFontDescription *user_font_get_regular(void);
-
-#endif
diff --git a/ui/gtk/funnel_stat.c b/ui/gtk/funnel_stat.c
deleted file mode 100644
index a17ebef0d6..0000000000
--- a/ui/gtk/funnel_stat.c
+++ /dev/null
@@ -1,655 +0,0 @@
-/*
- * funnel_stat.c
- *
- * EPAN's funneled GUI mini-API
- *
- * (c) 2006, Luis E. Garcia Ontanon <luis@ontanon.org>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/*
- * Most of the code here has been harvested from other Wireshark gtk modules.
- * most from prefs_dlg.c and about_dlg.c
- *
- * (From original checkin message:
- * The funneled GUI mini API.
- * A very reduced set of gui ops (by now just a text window)
- * that can be funneled to dissectors (even plugins) via epan.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/prefs.h>
-#include <epan/funnel.h>
-
-#include "ui/progress_dlg.h"
-#include "ui/simple_dialog.h"
-#include <epan/color_filters.h>
-
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/font_utils.h"
-#include "ui/gtk/gui_stat_menu.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/webbrowser.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/old-gtk-compat.h"
-
-#include "globals.h"
-
-void register_tap_listener_gtkfunnel(void);
-
-struct _funnel_text_window_t {
- GtkWidget* win;
- GtkWidget* txt;
- GtkWidget* button_hbox;
- GtkWidget* bt_close;
- text_win_close_cb_t close_cb;
- void* close_data;
- GPtrArray* buttons;
-};
-
-struct _funnel_tree_window_t {
- GtkWidget *win;
-
-};
-
-struct _funnel_node_t {
- void* dummy;
-};
-
-static void text_window_cancel_button_cb(GtkWidget *bt _U_, gpointer data) {
- funnel_text_window_t* tw = (funnel_text_window_t *)data;
-
- window_destroy(GTK_WIDGET(tw->win));
- tw->win = NULL;
-
- if (tw->close_cb)
- tw->close_cb(tw->close_data);
-}
-
-static void unref_text_win_cancel_bt_cb(GtkWidget *bt _U_, gpointer data) {
- funnel_text_window_t* tw = (funnel_text_window_t *)data;
- guint i;
-
- window_destroy(GTK_WIDGET(tw->win));
- tw->win = NULL;
-
- if (tw->close_cb)
- tw->close_cb(tw->close_data);
-
- for (i = 0; i < tw->buttons->len; i++) {
- funnel_bt_t* cbd = (funnel_bt_t *)g_ptr_array_index(tw->buttons,i);
- /* XXX a free cb should be passed somehow */
- if (cbd->data && cbd->free_data_fcn) cbd->free_data_fcn(cbd->data);
- if (cbd->free_fcn) cbd->free_fcn(cbd);
- }
- g_ptr_array_free(tw->buttons,TRUE);
- g_free(tw);
-}
-
-
-static gboolean text_window_unref_del_event_cb(GtkWidget *win _U_, GdkEvent *event _U_, gpointer user_data) {
- funnel_text_window_t* tw = (funnel_text_window_t *)user_data;
- guint i;
-
- window_destroy(GTK_WIDGET(tw->win));
- tw->win = NULL;
-
- if (tw->close_cb)
- tw->close_cb(tw->close_data);
-
- for (i = 0; i < tw->buttons->len; i++) {
- funnel_bt_t* cbd = (funnel_bt_t *)g_ptr_array_index(tw->buttons,i);
- /* XXX a free cb should be passed somehow */
- if (cbd->data && cbd->free_data_fcn) cbd->free_data_fcn(cbd->data);
- if (cbd->free_fcn) cbd->free_fcn(cbd);
- }
- g_ptr_array_free(tw->buttons,TRUE);
- g_free(tw);
-
- return TRUE;
-}
-
-static gboolean text_window_delete_event_cb(GtkWidget *win _U_, GdkEvent *event _U_, gpointer user_data)
-{
- funnel_text_window_t* tw = (funnel_text_window_t *)user_data;
-
- window_destroy(GTK_WIDGET(tw->win));
- tw->win = NULL;
-
- if (tw->close_cb)
- tw->close_cb(tw->close_data);
-
- return TRUE;
-}
-
-static funnel_text_window_t* new_text_window(const char* title) {
- funnel_text_window_t* tw = (funnel_text_window_t *)g_malloc(sizeof(funnel_text_window_t));
- GtkWidget *txt_scrollw, *main_vb, *hbox;
-
- tw->close_cb = NULL;
- tw->close_data = NULL;
- tw->buttons = g_ptr_array_new();
-
- tw->win = dlg_window_new(title); /* transient_for top_level */
- gtk_window_set_destroy_with_parent (GTK_WINDOW(tw->win), TRUE);
-
- g_signal_connect(tw->win, "delete-event", G_CALLBACK(text_window_delete_event_cb), tw);
-
- txt_scrollw = scrolled_window_new(NULL, NULL);
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 6);
- gtk_container_add(GTK_CONTAINER(tw->win), main_vb);
-
- gtk_box_pack_start(GTK_BOX (main_vb), txt_scrollw, TRUE, TRUE, 0);
-
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(txt_scrollw),
- GTK_SHADOW_IN);
-
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(txt_scrollw),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- tw->txt = gtk_text_view_new();
- gtk_text_view_set_editable(GTK_TEXT_VIEW(tw->txt), FALSE);
- gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(tw->txt), GTK_WRAP_WORD);
- gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(tw->txt), FALSE);
-
- gtk_text_view_set_left_margin(GTK_TEXT_VIEW(tw->txt), 4);
- gtk_text_view_set_right_margin(GTK_TEXT_VIEW(tw->txt), 4);
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_widget_show(hbox);
-
- tw->button_hbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_button_box_set_layout(GTK_BUTTON_BOX(tw->button_hbox), GTK_BUTTONBOX_START);
-
- gtk_box_pack_start(GTK_BOX(hbox), tw->button_hbox, TRUE, TRUE, 0);
- gtk_widget_show(tw->button_hbox);
-
- gtk_box_pack_start(GTK_BOX(main_vb), hbox, FALSE, FALSE, 0);
-
- tw->bt_close = gtk_button_new_with_label("Close");
- gtk_widget_set_can_default(tw->bt_close, TRUE);
- g_object_set_data(G_OBJECT(hbox), "Close", tw->bt_close);
-
- gtk_box_pack_end(GTK_BOX(hbox), tw->bt_close, FALSE, FALSE, 0);
- gtk_widget_show(tw->bt_close);
-
- g_signal_connect(tw->bt_close, "clicked", G_CALLBACK(text_window_cancel_button_cb), tw);
- gtk_widget_grab_default(tw->bt_close);
-
- gtk_container_add(GTK_CONTAINER(txt_scrollw), tw->txt);
- gtk_window_resize(GTK_WINDOW(tw->win),400,300);
- gtk_widget_show_all(tw->win);
-
- return tw;
-}
-
-
-static void text_window_clear(funnel_text_window_t* tw)
-{
- GtkTextBuffer *buf;
-
- if (! tw->win) return;
-
- buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(tw->txt));
-
- gtk_text_buffer_set_text(buf, "", 0);
-}
-
-
-static void text_window_append(funnel_text_window_t* tw, const char *str)
-{
- GtkWidget *txt;
- int nchars;
- GtkTextBuffer *buf;
- GtkTextIter iter;
-
- if (! tw->win) return;
-
- txt = tw->txt;
- nchars = (int) strlen(str);
-
-
- buf= gtk_text_view_get_buffer(GTK_TEXT_VIEW(txt));
-
- gtk_text_buffer_get_end_iter(buf, &iter);
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_override_font(GTK_WIDGET(txt), user_font_get_regular());
-#else
- gtk_widget_modify_font(GTK_WIDGET(txt), user_font_get_regular());
-#endif
- if (!g_utf8_validate(str, -1, NULL))
- printf("Invalid utf8 encoding: %s\n", str);
-
- gtk_text_buffer_insert(buf, &iter, str, nchars);
-}
-
-
-static void text_window_set_text(funnel_text_window_t* tw, const char* text)
-{
- if (! tw->win) return;
-
- text_window_clear(tw);
- text_window_append(tw, text);
-}
-
-
-static void text_window_prepend(funnel_text_window_t* tw, const char *str _U_) {
- GtkWidget *txt;
- int nchars;
- GtkTextBuffer *buf;
- GtkTextIter iter;
-
- if (! tw->win) return;
-
- txt = tw->txt;
- nchars = (int) strlen(str);
-
-
- buf= gtk_text_view_get_buffer(GTK_TEXT_VIEW(txt));
-
- gtk_text_buffer_get_start_iter(buf, &iter);
- #if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_override_font(GTK_WIDGET(txt), user_font_get_regular());
-#else
- gtk_widget_modify_font(GTK_WIDGET(txt), user_font_get_regular());
-#endif
- if (!g_utf8_validate(str, -1, NULL))
- printf("Invalid utf8 encoding: %s\n", str);
-
- gtk_text_buffer_insert(buf, &iter, str, nchars);
-}
-
-static const gchar* text_window_get_text(funnel_text_window_t* tw) {
- GtkWidget *txt;
- GtkTextBuffer *buf;
- GtkTextIter start;
- GtkTextIter end;
-
- if (! tw->win) return "";
-
- txt = tw->txt;
-
- buf= gtk_text_view_get_buffer(GTK_TEXT_VIEW(txt));
- gtk_text_buffer_get_start_iter(buf, &start);
- gtk_text_buffer_get_end_iter(buf, &end);
-
- return gtk_text_buffer_get_text(buf, &start, &end, FALSE);
-}
-
-
-
-static void text_window_set_close_cb(funnel_text_window_t* tw, text_win_close_cb_t cb, void* data) {
- tw->close_cb = cb;
- tw->close_data = data;
-}
-
-static void text_window_destroy(funnel_text_window_t* tw) {
- if (tw->win) {
- /*
- * the window is still there and its callbacks refer to this data structure
- * we need to change the callback so that they free tw.
- */
- g_signal_connect(tw->bt_close, "clicked", G_CALLBACK(unref_text_win_cancel_bt_cb), tw);
- g_signal_connect(tw->win, "delete-event", G_CALLBACK(text_window_unref_del_event_cb), tw);
- } else {
- guint i;
- /*
- * we have no window anymore a human user closed
- * the window already just free the container
- */
- for (i = 0; i < tw->buttons->len; i++) {
- funnel_bt_t* cbd = (funnel_bt_t *)g_ptr_array_index(tw->buttons,i);
- /* XXX a free cb should be passed somehow */
- if (cbd->data && cbd->free_data_fcn) cbd->free_data_fcn(cbd->data);
- if (cbd->free_fcn) cbd->free_fcn(cbd);
- }
- g_ptr_array_free(tw->buttons,TRUE);
- g_free(tw);
- }
-}
-
-static void text_window_set_editable(funnel_text_window_t* tw, gboolean editable){
- gtk_text_view_set_editable(GTK_TEXT_VIEW(tw->txt), editable);
- gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(tw->txt), editable);
-}
-
-static gboolean text_window_button_cb(GtkWidget *bt _U_, gpointer user_data)
-{
- funnel_bt_t* cbd = (funnel_bt_t *)user_data;
-
- if (cbd->func) {
- return cbd->func(cbd->tw,cbd->data);
- } else {
- return TRUE;
- }
-}
-
-static void text_window_add_button(funnel_text_window_t* tw, funnel_bt_t* cbd, const gchar* label) {
- GtkWidget *button;
-
- cbd->tw = tw;
- g_ptr_array_add(tw->buttons,cbd);
-
- button = gtk_button_new_with_label(label);
- gtk_widget_set_can_default(button, TRUE);
-
- gtk_box_pack_start(GTK_BOX(tw->button_hbox), button, FALSE, FALSE, 0);
-
- gtk_widget_show(button);
- g_signal_connect(button, "clicked", G_CALLBACK(text_window_button_cb), cbd);
-
-}
-
-
-struct _funnel_dlg_data {
- GtkWidget* win;
- GPtrArray* entries;
- funnel_dlg_cb_t dlg_cb;
- void* data;
-};
-
-static gboolean funnel_dlg_cb(GtkWidget *win _U_, gpointer user_data)
-{
- struct _funnel_dlg_data* dd = (struct _funnel_dlg_data *)user_data;
- guint i;
- guint len = dd->entries->len;
- GPtrArray* returns = g_ptr_array_new();
-
- for(i=0; i<len; i++) {
- GtkEntry* entry = (GtkEntry *)g_ptr_array_index(dd->entries,i);
- g_ptr_array_add(returns,g_strdup(gtk_entry_get_text(entry)));
- }
-
- g_ptr_array_add(returns,NULL);
-
- if (dd->dlg_cb)
- dd->dlg_cb((gchar**)returns->pdata,dd->data);
-
- window_destroy(GTK_WIDGET(dd->win));
-
- g_ptr_array_free(returns,FALSE);
-
- return TRUE;
-}
-
-static void funnel_cancel_btn_cb(GtkWidget *bt _U_, gpointer data) {
- GtkWidget* win = (GtkWidget *)data;
-
- window_destroy(GTK_WIDGET(win));
-}
-
-static void funnel_new_dialog(const gchar* title,
- const gchar** fieldnames,
- funnel_dlg_cb_t dlg_cb,
- void* data) {
- GtkWidget *win, *main_grid, *main_vb, *bbox, *bt_cancel, *bt_ok;
- guint i;
- const gchar* fieldname;
- struct _funnel_dlg_data* dd = (struct _funnel_dlg_data *)g_malloc(sizeof(struct _funnel_dlg_data));
-
- dd->entries = g_ptr_array_new();
- dd->dlg_cb = dlg_cb;
- dd->data = data;
-
- win = dlg_window_new(title);
-
- dd->win = win;
-
- for (i=0; fieldnames[i]; i++);
- gtk_window_resize(GTK_WINDOW(win),400,10*(i+2));
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 5, FALSE);
- gtk_container_add(GTK_CONTAINER(win), main_vb);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 6);
-
- main_grid = ws_gtk_grid_new();
- gtk_box_pack_start(GTK_BOX(main_vb), main_grid, FALSE, FALSE, 0);
- ws_gtk_grid_set_row_spacing(GTK_GRID(main_grid), 10);
- ws_gtk_grid_set_column_spacing(GTK_GRID(main_grid), 15);
-
- for (i = 0; (fieldname = fieldnames[i]) ; i++) {
- GtkWidget *entry, *label;
-
- label = gtk_label_new(fieldname);
- gtk_misc_set_alignment(GTK_MISC(label), 1.0f, 0.5f);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), label, 0, i+1, 1, 1);
- gtk_widget_show(label);
-
- entry = gtk_entry_new();
- g_ptr_array_add(dd->entries,entry);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), entry, 1, i+1, 1, 1);
- gtk_widget_show(entry);
- }
-
- bbox = dlg_button_row_new(GTK_STOCK_CANCEL,GTK_STOCK_OK, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 0);
-
- bt_ok = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- g_signal_connect(bt_ok, "clicked", G_CALLBACK(funnel_dlg_cb), dd);
- gtk_widget_grab_default(bt_ok);
-
- bt_cancel = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- g_signal_connect(bt_cancel, "clicked", G_CALLBACK(funnel_cancel_btn_cb), win);
- gtk_widget_grab_default(bt_cancel);
-
- gtk_widget_show(main_grid);
- gtk_widget_show(main_vb);
- gtk_widget_show(win);
-}
-
-static const gchar * funnel_get_filter(funnel_ops_id_t *ops_id _U_ _U_) {
- return gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget));
-}
-
-static void funnel_set_filter(funnel_ops_id_t *ops_id _U_, const char* filter_string) {
- gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), filter_string);
-}
-
-static void funnel_set_color_filter_slot(guint8 filt_nr, const gchar* filter_string) {
- gchar *err_msg = NULL;
- if (!color_filters_set_tmp(filt_nr, (gchar *)filter_string, FALSE, &err_msg)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg);
- g_free(err_msg);
- }
-}
-
-static void funnel_apply_filter(funnel_ops_id_t *ops_id _U_) {
- const char* filter_string = gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget));
- main_filter_packets(&cfile, filter_string, FALSE);
-}
-
-/* XXX: finish this */
-static void funnel_logger(const gchar *log_domain _U_,
- GLogLevelFlags log_level _U_,
- const gchar *message,
- gpointer user_data _U_) {
- fputs(message,stderr);
-}
-
-static void funnel_retap_packets(funnel_ops_id_t *ops_id _U_) {
- cf_retap_packets(&cfile);
-}
-
-static gboolean funnel_open_file(funnel_ops_id_t *ops_id _U_, const char* fname, const char* filter, char** err_str) {
- int err = 0;
- dfilter_t *rfcode = NULL;
-
- *err_str = NULL;
-
- switch (cfile.state) {
- case FILE_CLOSED:
- case FILE_READ_DONE:
- case FILE_READ_ABORTED:
- break;
- case FILE_READ_IN_PROGRESS:
- *err_str = g_strdup("file read in progress");
- return FALSE;
- }
-
- if (filter) {
- if (!dfilter_compile(filter, &rfcode, err_str)) {
- return FALSE;
- }
- }
-
- /* This closes the current file if it succeeds. */
- if (cf_open(&cfile, fname, WTAP_TYPE_AUTO, FALSE, &err) != CF_OK) {
- *err_str = g_strdup(g_strerror(err));
- dfilter_free(rfcode);
- return FALSE;
- }
-
- cfile.rfcode = rfcode;
-
- switch (cf_read(&cfile, FALSE)) {
- case CF_READ_OK:
- case CF_READ_ERROR:
- break;
- default:
- *err_str = g_strdup("problem while reading file");
- return FALSE;
- }
-
- return TRUE;
-}
-
-static struct progdlg* funnel_new_progress_window(funnel_ops_id_t *ops_id _U_, const gchar* label, const gchar* task, gboolean terminate_is_stop, gboolean *stop_flag) {
- return create_progress_dlg(top_level, label, task, terminate_is_stop, stop_flag);
-}
-
-static void funnel_update_progress(struct progdlg* win, float pr, const gchar* task) {
- update_progress_dlg(win, pr, task);
-}
-
-static void funnel_destroy_progress_window(struct progdlg* win) {
- destroy_progress_dlg(win);
-}
-
-static void funnel_reload_packets(funnel_ops_id_t *ops_id _U_) {
- if (cfile.state == FILE_READ_DONE) cf_reload(&cfile);
-}
-
-static const funnel_ops_t funnel_ops = {
- NULL, /* ops_id */
- new_text_window,
- text_window_set_text,
- text_window_append,
- text_window_prepend,
- text_window_clear,
- text_window_get_text,
- text_window_set_close_cb,
- text_window_set_editable,
- text_window_destroy,
- text_window_add_button,
- /*...,*/
- funnel_new_dialog,
- NULL,
- funnel_logger,
- funnel_retap_packets,
- copy_to_clipboard,
- funnel_get_filter,
- funnel_set_filter,
- funnel_set_color_filter_slot,
- funnel_open_file,
- funnel_reload_packets,
- NULL,
- funnel_apply_filter,
- browser_open_url,
- browser_open_data_file,
- funnel_new_progress_window,
- funnel_update_progress,
- funnel_destroy_progress_window
-};
-
-
-typedef struct _menu_cb_t {
- void (*callback)(gpointer);
- void* callback_data;
- gboolean retap;
-} menu_cb_t;
-
-static void our_menu_callback(void* unused _U_, gpointer data) {
- menu_cb_t* mcb = (menu_cb_t *)data;
- mcb->callback(mcb->callback_data);
- if (mcb->retap) cf_retap_packets(&cfile);
-}
-
-static void register_menu_cb(const char *name,
- register_stat_group_t group,
- void (*callback)(gpointer),
- gpointer callback_data,
- gboolean retap) {
-
- menu_cb_t* mcb = (menu_cb_t *)g_malloc(sizeof(menu_cb_t));
- const char *label = NULL, *str = NULL;
-
- mcb->callback = callback;
- mcb->callback_data = callback_data;
- mcb->retap = retap;
-
- str = strrchr(name,'/');
- if(str){
- label = str+1;
- }else{
- label = name;
- }
-
- register_menu_bar_menu_items(
- stat_group_name(group), /* GUI path to the place holder in the menu */
- name, /* Action name */
- NULL, /* Stock id */
- label, /* label */
- NULL, /* Accelerator */
- NULL, /* Tooltip */
- our_menu_callback, /* Callback */
- mcb, /* callback data */
- TRUE, /* enabled */
- NULL,
- NULL);
-}
-
-void initialize_funnel_ops(void) {
- funnel_set_funnel_ops(&funnel_ops);
-}
-
-void
-register_tap_listener_gtkfunnel(void)
-{
- funnel_register_all_menus(register_menu_cb);
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/goto_dlg.c b/ui/gtk/goto_dlg.c
deleted file mode 100644
index 65a5bd86f2..0000000000
--- a/ui/gtk/goto_dlg.c
+++ /dev/null
@@ -1,180 +0,0 @@
-/* goto_dlg.c
- * Routines for "go to packet" window
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-
-#include "config.h"
-
-#include <gtk/gtk.h>
-
-#include <stdlib.h>
-
-#include "../../globals.h"
-#include "ui/simple_dialog.h"
-
-#include "ui/gtk/goto_dlg.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/packet_list.h"
-
-/* Capture callback data keys */
-#define E_GOTO_FNUMBER_KEY "goto_fnumber_te"
-
-static void
-goto_frame_ok_cb(GtkWidget *ok_bt, gpointer parent_w);
-
-void
-goto_frame_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- GtkWidget *goto_frame_w, *main_vb, *fnumber_hb, *fnumber_lb, *fnumber_te,
- *bbox, *ok_bt, *cancel_bt, *help_bt;
-
- goto_frame_w = dlg_window_new("Wireshark: Go To Packet");
-
- /* Container for each row of widgets */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_container_add(GTK_CONTAINER(goto_frame_w), main_vb);
- gtk_widget_show(main_vb);
-
- /* Frame number row */
- fnumber_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX (main_vb), fnumber_hb, TRUE, TRUE, 0);
- gtk_widget_show(fnumber_hb);
-
- fnumber_lb = gtk_label_new("Packet number:");
- gtk_box_pack_start(GTK_BOX(fnumber_hb), fnumber_lb, FALSE, FALSE, 0);
- gtk_widget_show(fnumber_lb);
-
- fnumber_te = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(fnumber_hb), fnumber_te, FALSE, FALSE, 0);
- gtk_widget_show(fnumber_te);
-
- /* Button row: OK and cancel buttons */
- bbox = dlg_button_row_new(GTK_STOCK_JUMP_TO, GTK_STOCK_CANCEL, GTK_STOCK_HELP, NULL);
- gtk_box_pack_start(GTK_BOX (main_vb), bbox, TRUE, TRUE, 0);
-
- gtk_widget_show(bbox);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_JUMP_TO);
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(goto_frame_ok_cb), goto_frame_w);
-
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- window_set_cancel_button(goto_frame_w, cancel_bt, window_cancel_button_cb);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_GOTO_DIALOG);
-
- gtk_widget_grab_default(ok_bt);
-
- /* Catch the "activate" signal on the frame number text entry, so that
- if the user types Return there, we act as if the "OK" button
- had been selected, as happens if Return is typed if some widget
- that *doesn't* handle the Return key has the input focus. */
- dlg_set_activate(fnumber_te, ok_bt);
-
- /* Give the initial focus to the "Packet number" entry box. */
- gtk_widget_grab_focus(fnumber_te);
-
- /* Attach pointers to needed widgets to the capture prefs window/object */
- g_object_set_data(G_OBJECT(goto_frame_w), E_GOTO_FNUMBER_KEY, fnumber_te);
-
- g_signal_connect(goto_frame_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
-
- gtk_widget_show(goto_frame_w);
- window_present(goto_frame_w);
-}
-
-static void
-goto_frame_ok_cb(GtkWidget *ok_bt _U_, gpointer parent_w)
-{
- GtkWidget *fnumber_te;
- const gchar *fnumber_text;
- guint fnumber;
- char *p;
-
- fnumber_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_GOTO_FNUMBER_KEY);
-
- fnumber_text = gtk_entry_get_text(GTK_ENTRY(fnumber_te));
- fnumber = (guint) strtoul(fnumber_text, &p, 10);
- if (p == fnumber_text || *p != '\0') {
- /* Illegal number.
- XXX - what about negative numbers (which "strtoul()" allows)?
- Can we hack up signal handlers for the widget to make it
- reject attempts to type in characters other than digits?
- What about numbers > the maximum possible guint? */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "The packet number you entered isn't a valid number.");
- return;
- }
-
- if (cf_goto_frame(&cfile, fnumber)) {
- /* We succeeded in going to that frame; we're done. */
- window_destroy(GTK_WIDGET(parent_w));
- }
-}
-
-/*
- * Go to frame specified by currently selected protocol tree item.
- */
-void
-goto_framenum_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- cf_goto_framenum(&cfile);
-}
-
-void
-goto_top_frame_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- packet_list_select_first_row();
-}
-
-void
-goto_bottom_frame_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- packet_list_select_last_row();
-}
-
-void
-goto_next_frame_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- packet_list_next();
-}
-
-void
-goto_previous_frame_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- packet_list_prev();
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local Variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/goto_dlg.h b/ui/gtk/goto_dlg.h
deleted file mode 100644
index 20542a1b7c..0000000000
--- a/ui/gtk/goto_dlg.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* goto_dlg.h
- * Definitions for "go to frame" window
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __GOTO_DLG_H__
-#define __GOTO_DLG_H__
-
-/** @file
- * "Go To" dialog box and similar functions.
- * @ingroup dialog_group
- */
-
-/** User requested the "Go To" dialog box by menu or toolbar.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-extern void goto_frame_cb(GtkWidget *widget, gpointer data);
-
-/** User requested "Go To Corresponding Packet" by menu.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-extern void goto_framenum_cb(GtkWidget *widget, gpointer data);
-
-/** User requested "Go To First Packet" by menu or toolbar.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-extern void goto_top_frame_cb(GtkWidget *widget, gpointer data);
-
-/** User requested "Go To Last Packet" by menu or toolbar.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-extern void goto_bottom_frame_cb(GtkWidget *widget, gpointer data);
-
-/** User requested "Go To Next Packet" by menu or toolbar.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-extern void goto_next_frame_cb(GtkWidget *widget, gpointer data);
-
-/** User requested "Go To Previous Packet" by menu or toolbar.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-extern void goto_previous_frame_cb(GtkWidget *widget, gpointer data);
-
-#endif /* goto_dlg.h */
diff --git a/ui/gtk/graph_analysis.c b/ui/gtk/graph_analysis.c
deleted file mode 100644
index e85a044a87..0000000000
--- a/ui/gtk/graph_analysis.c
+++ /dev/null
@@ -1,1839 +0,0 @@
-/* graph_analysis.c
- * Graphic Analysis addition for Wireshark
- *
- * Copyright 2004, Verso Technologies Inc.
- * By Alejandro Vaquero <alejandrovaquero@yahoo.com>
- *
- * based on rtp_analysis.c and io_stat
- *
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-#include <math.h>
-
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-#if GTK_CHECK_VERSION(3,0,0)
-# include <gdk/gdkkeysyms-compat.h>
-#endif
-
-#include <epan/epan_dissect.h>
-#include <epan/tap.h>
-#include <epan/dissectors/packet-rtp.h>
-#include <epan/addr_resolv.h>
-#include <wsutil/filesystem.h>
-
-#include "ui/util.h"
-
-#include "ui/last_open_dir.h"
-#include "ui/recent.h"
-#include "ui/simple_dialog.h"
-#include "ui/alert_box.h"
-
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/file_dlg.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/graph_analysis.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-#include "ui/gtk/stock_icons.h"
-
-#include "globals.h"
-
-/****************************************************************************/
-
-#define MAX_LABEL 50
-#define MAX_COMMENT 100
-#define ITEM_HEIGHT 20
-#define NODE_WIDTH 100
-#define TOP_Y_BORDER 40
-#define BOTTOM_Y_BORDER 2
-#define COMMENT_WIDTH 400
-#define TIME_WIDTH 150
-#if !PANGO_VERSION_CHECK(1,6,0)
-#define MAX_FRAME_LABEL 20
-#endif
-
-/****************************************************************************/
-/* Reset the user_data structure */
-static void graph_analysis_reset(graph_analysis_data_t *user_data)
-{
- int i;
-
- user_data->graph_info->num_nodes = 0;
- user_data->num_items = 0;
- for (i=0; i<MAX_NUM_NODES; i++) {
- free_address(&user_data->graph_info->nodes[i]);
- }
-
- user_data->dlg.first_node = 0;
- user_data->dlg.first_item = 0;
- user_data->dlg.left_x_border = 0;
- user_data->dlg.selected_item = 0xFFFFFFFF; /*not item selected */
-}
-
-/****************************************************************************/
-/* Init the user_data structure */
-static void graph_analysis_init_dlg(graph_analysis_data_t *user_data)
-{
- int i;
-
- user_data->graph_info->num_nodes = 0;
- user_data->num_items = 0;
- user_data->on_destroy_user_data = NULL;
- user_data->data = NULL;
- for (i=0; i<MAX_NUM_NODES; i++) {
- clear_address(&user_data->graph_info->nodes[i]);
- }
-
- user_data->dlg.first_node = 0;
- user_data->dlg.first_item = 0;
- user_data->dlg.left_x_border = 0;
- user_data->dlg.selected_item = 0xFFFFFFFF; /*not item selected */
- /* init dialog_graph */
- user_data->dlg.needs_redraw = TRUE;
- user_data->dlg.draw_area_time = NULL;
- user_data->dlg.draw_area = NULL;
- user_data->dlg.draw_area_comments = NULL;
-#if GTK_CHECK_VERSION(2,22,0)
- user_data->dlg.surface_main = NULL;
- user_data->dlg.surface_time = NULL;
- user_data->dlg.surface_comments = NULL;
-#else
- user_data->dlg.pixmap_main = NULL;
- user_data->dlg.pixmap_time = NULL;
- user_data->dlg.pixmap_comments = NULL;
-#endif
- user_data->dlg.v_scrollbar = NULL;
- user_data->dlg.v_scrollbar_adjustment = NULL;
- user_data->dlg.hpane = NULL;
- user_data->dlg.surface_width = 350;
- user_data->dlg.surface_height = 400;
- user_data->dlg.first_node = 0;
- user_data->dlg.first_item = 0;
- user_data->dlg.left_x_border = 0;
- user_data->dlg.selected_item = 0xFFFFFFFF; /*not item selected */
- user_data->dlg.window = NULL;
- user_data->dlg.parent_w = NULL;
- user_data->dlg.inverse = FALSE;
- user_data->dlg.title = NULL;
-}
-
-/****************************************************************************/
-/* CALLBACKS */
-
-/****************************************************************************/
-/* close the dialog window */
-static void on_destroy(GtkWidget *win _U_, graph_analysis_data_t *user_data)
-{
- int i;
-
- for (i=0; i<MAX_NUM_NODES; i++) {
- free_address(&user_data->graph_info->nodes[i]);
- }
- user_data->dlg.window = NULL;
- g_free(user_data->dlg.title);
- user_data->dlg.title = NULL;
-
- if(user_data->on_destroy_user_data) {
- user_data->on_destroy_user_data(user_data->data);
- }
-}
-
-#define RIGHT_ARROW 1
-#define LEFT_ARROW 0
-#define WIDTH_ARROW 8
-#define HEIGHT_ARROW 6
-
-/****************************************************************************/
-#if GTK_CHECK_VERSION(2,22,0)
-static void draw_arrow(cairo_surface_t *surface, GdkRGBA *color, gint x, gint y, gboolean arrow_type)
-{
- cairo_t *cr;
-
- cr = cairo_create (surface);
- gdk_cairo_set_source_rgba (cr, color);
- if (arrow_type == LEFT_ARROW)
- {
- cairo_move_to (cr, x + WIDTH_ARROW, y);
- cairo_line_to (cr, x + WIDTH_ARROW, y + HEIGHT_ARROW);
- cairo_line_to (cr, x, y + HEIGHT_ARROW / 2.);
- }
- else if (arrow_type == RIGHT_ARROW)
- {
- cairo_move_to (cr, x, y);
- cairo_line_to (cr, x + WIDTH_ARROW, y + HEIGHT_ARROW / 2.);
- cairo_line_to (cr, x, y + HEIGHT_ARROW);
- }
- cairo_close_path (cr);
- cairo_fill (cr);
-
- cairo_destroy (cr);
-}
-#else
-static void draw_arrow(GdkDrawable *pixmap, GdkRGBA *color, gint x, gint y, gboolean arrow_type)
-{
- cairo_t *cr;
-
- if (GDK_IS_DRAWABLE(pixmap)) {
- cr = gdk_cairo_create (pixmap);
- gdk_cairo_set_source_rgba (cr, color);
- if (arrow_type == LEFT_ARROW)
- {
- cairo_move_to (cr, x + WIDTH_ARROW, y);
- cairo_line_to (cr, x + WIDTH_ARROW, y + HEIGHT_ARROW);
- cairo_line_to (cr, x, y + HEIGHT_ARROW / 2.);
- }
- else if (arrow_type == RIGHT_ARROW)
- {
- cairo_move_to (cr, x, y);
- cairo_line_to (cr, x + WIDTH_ARROW, y + HEIGHT_ARROW / 2.);
- cairo_line_to (cr, x, y + HEIGHT_ARROW);
- }
- cairo_close_path (cr);
- cairo_fill (cr);
-
- cairo_destroy (cr);
- }
-}
-#endif
-
-/****************************************************************************/
-/* save in a file */
-
-static char *
-gtk_save_graph_as_plain_text_file(graph_analysis_data_t *user_data)
-{
- GtkWidget *save_to_file_w;
- char *pathname;
-
- save_to_file_w = file_selection_new("Wireshark: Save graph to plain text file",
- GTK_WINDOW(user_data->dlg.window),
- FILE_SELECTION_SAVE);
- gtk_dialog_set_default_response(GTK_DIALOG(save_to_file_w),
- GTK_RESPONSE_ACCEPT);
-
- pathname = file_selection_run(save_to_file_w);
- if (pathname == NULL) {
- /* User cancelled or closed the dialog. */
- return NULL;
- }
-
- /* We've crosed the Rubicon; get rid of the dialog box. */
- window_destroy(save_to_file_w);
-
- return pathname;
-}
-
-/****************************************************************************/
-static void
-on_save_bt_clicked (GtkWidget *button _U_,
- graph_analysis_data_t *user_data)
-{
- char *pathname;
- FILE *outfile;
-
- /*
- * Loop until the user either selects a file or gives up.
- */
- for (;;) {
- pathname = gtk_save_graph_as_plain_text_file(user_data);
- if (pathname == NULL) {
- /* User gave up. */
- break;
- }
- outfile = ws_fopen(pathname, "w");
- if (outfile != NULL) {
- sequence_analysis_dump_to_file(outfile, user_data->graph_info, user_data->dlg.first_node);
- fclose (outfile);
- g_free(pathname);
- break;
- } else {
- open_failure_alert_box(pathname, errno, TRUE);
- }
- /* Dump failed; let the user select another file
- or give up. */
- g_free(pathname);
- }
-}
-
-/****************************************************************************/
-static void dialog_graph_draw(graph_analysis_data_t *user_data)
-{
- guint32 i, last_item, first_item, display_items;
- guint32 start_arrow, end_arrow, label_x, src_port_x, dst_port_x, arrow_width;
- guint32 current_item;
- guint32 left_x_border;
- guint32 right_x_border;
- guint32 top_y_border;
- guint32 bottom_y_border;
- seq_analysis_item_t *gai;
-
- PangoLayout *layout;
- PangoLayout *middle_layout;
- PangoLayout *small_layout;
- PangoFontDescription *middle_font_desc;
- gint middle_font_size;
- PangoFontDescription *small_font_desc;
- gint small_font_size;
-
- gint label_width, label_height;
- guint32 draw_width, draw_height;
- char label_string[MAX_COMMENT];
- GList *list;
- cairo_t *cr;
-
-#if 0
- GdkColor *color_p, *bg_color_p;
- GdkColor black_color = {0, 0, 0, 0};
- GdkColor white_color = {0, 0xffff, 0xffff, 0xffff};
- /* gray and soft gray colors */
- GdkColor grey_color0 = {0, 0x64ff, 0x64ff, 0x64ff};
- GdkColor grey_color1 = {0, 0x25ff, 0x25ff, 0x25ff};
-
- /* the first color is blue to highlight the selected item */
- static GdkColor background_color[MAX_NUM_COL_CONV+1] = {
- {0, 0x00FF, 0x00FF, 0xFFFF},
- {0, 0x90FF, 0xEEFF, 0x90FF},
- {0, 0xFFFF, 0xA0FF, 0x7AFF},
- {0, 0xFFFF, 0xB6FF, 0xC1FF},
- {0, 0xFAFF, 0xFAFF, 0xD2FF},
- {0, 0xFFFF, 0xFFFF, 0x33FF},
- {0, 0x66FF, 0xCDFF, 0xAAFF},
- {0, 0xE0FF, 0xFFFF, 0xFFFF},
- {0, 0xB0FF, 0xC4FF, 0xDEFF},
- {0, 0x87FF, 0xCEFF, 0xFAFF},
- {0, 0xD3FF, 0xD3FF, 0xD3FF}
- };
-
-#endif
- GdkRGBA *color_p, *bg_color_p;
-
- GdkRGBA black_color = {0.0, 0.0, 0.0, 1.0}; /* Black */
- GdkRGBA white_color = {1.0, 1.0, 1.0, 1.0 };
- /* gray and soft gray colors */
- GdkRGBA grey_color0 = {0.3945, 0.3945, 0.3945, 1.0};
- GdkRGBA grey_color1 = {0.1484, 0.1484, 0.1484, 1.0};
-
- GdkRGBA bg_color = {0.9137, 0.8901, 0.8705, 1.0};
-
- static GdkRGBA background_color[MAX_NUM_COL_CONV+1] = {
- /* Red, Green, Blue Alpha */
- {0.0039, 0.0039, 1.0000, 1.0},
- {0.5664, 0.9336, 0.5664, 1.0},
- {1.0000, 0.6289, 0.4805, 1.0},
- {1.0000, 0.7148, 0.7578, 1.0},
- {0.9805, 0.9805, 0.8242, 1.0},
- {1.0000, 1.0000, 0.2031, 1.0},
- {0.4023, 0.8046, 0.6680, 1.0},
- {0.8789, 1.0000, 1.0000, 1.0},
- {0.6914, 0.7695, 0.8710, 1.0},
- {0.5312, 0.8086, 0.9957, 1.0},
- {0.8281, 0.8281, 0.8281, 1.0}
- };
-
- /* Dashed line pattern */
- static const double dashed1[] = {5.0, 4.0};
- static int len1 = sizeof(dashed1) / sizeof(dashed1[0]);
-
- GtkAllocation draw_area_time_alloc, draw_area_alloc, draw_area_comments_alloc;
-
- if (!user_data->dlg.needs_redraw) {
- return;
- }
-
- user_data->dlg.needs_redraw = FALSE;
-
- if (g_queue_get_length(user_data->graph_info->items) < 1) {
- return;
- }
-
- gtk_widget_get_allocation(user_data->dlg.draw_area_time, &draw_area_time_alloc);
- gtk_widget_get_allocation(user_data->dlg.draw_area, &draw_area_alloc);
- gtk_widget_get_allocation(user_data->dlg.draw_area_comments, &draw_area_comments_alloc);
-
- /* Clear out old plot */
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.surface_time);
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_rectangle (cr, 0, 0, draw_area_time_alloc.width, draw_area_time_alloc.height);
- cairo_fill (cr);
- cairo_destroy (cr);
-
- cr = cairo_create (user_data->dlg.surface_main);
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_rectangle (cr, 0, 0, draw_area_alloc.width, draw_area_alloc.height);
- cairo_fill (cr);
- cairo_destroy (cr);
-
- cr = cairo_create (user_data->dlg.surface_comments);
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_rectangle (cr, 0, 0, draw_area_comments_alloc.width, draw_area_comments_alloc.height);
- cairo_fill (cr);
- cairo_destroy (cr);
-
-#else
- if ( GDK_IS_DRAWABLE(user_data->dlg.pixmap_time) ) {
- cr = gdk_cairo_create (user_data->dlg.pixmap_time);
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_rectangle (cr, 0, 0, draw_area_time_alloc.width, draw_area_time_alloc.height);
- cairo_fill (cr);
- cairo_destroy (cr);
- }
-
- if ( GDK_IS_DRAWABLE(user_data->dlg.pixmap_main) ) {
- cr = gdk_cairo_create (user_data->dlg.pixmap_main);
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_rectangle (cr, 0, 0, draw_area_alloc.width, draw_area_alloc.height);
- cairo_fill (cr);
- cairo_destroy (cr);
- }
-
- if ( GDK_IS_DRAWABLE(user_data->dlg.pixmap_comments) ) {
- cr = gdk_cairo_create (user_data->dlg.pixmap_comments);
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_rectangle (cr, 0, 0, draw_area_comments_alloc.width, draw_area_comments_alloc.height);
- cairo_fill (cr);
- cairo_destroy (cr);
- }
-#endif
- /* Calculate the y border */
- top_y_border = TOP_Y_BORDER; /* to display the node address */
- bottom_y_border = BOTTOM_Y_BORDER;
-
- draw_height = draw_area_alloc.height-top_y_border-bottom_y_border;
-
- first_item = user_data->dlg.first_item;
- display_items = draw_height/ITEM_HEIGHT;
-
- /* get the items to display and fill the matrix array */
- list = g_queue_peek_nth_link(user_data->graph_info->items, 0);
- current_item = 0;
- i = 0;
- while (list)
- {
- gai = (seq_analysis_item_t *)list->data;
- if (gai->display) {
- if (current_item>=display_items) break; /* the item is outside the display */
- if (i>=first_item) {
- user_data->dlg.items[current_item].frame_number = gai->frame_number;
- user_data->dlg.items[current_item].port_src = gai->port_src;
- user_data->dlg.items[current_item].port_dst = gai->port_dst;
- user_data->dlg.items[current_item].frame_label = gai->frame_label;
- user_data->dlg.items[current_item].time_str = gai->time_str;
- user_data->dlg.items[current_item].comment = gai->comment;
- user_data->dlg.items[current_item].conv_num = gai->conv_num;
-
- user_data->dlg.items[current_item].src_node = gai->src_node;
- user_data->dlg.items[current_item].dst_node = gai->dst_node;
- user_data->dlg.items[current_item].line_style = gai->line_style;
- current_item++;
- }
- i++;
- }
-
- list = g_list_next(list);
- }
- /* in case the window is resized we might have to move the top item */
- if ((first_item + display_items) > user_data->num_items) {
- if (display_items>user_data->num_items)
- first_item = 0;
- else
- first_item = user_data->num_items - display_items;
- }
-
- /* in case there are less items than possible displayed */
- display_items = current_item;
- last_item = first_item+display_items-1;
- user_data->dlg.last_item = last_item;
-
- /* Calculate the x borders */
- /* We use time from the last display item to calcultate the x left border */
-#if 0
- g_snprintf(label_string, MAX_LABEL, "%.3f", nstime_to_sec(&user_data->dlg.items[display_items-1].fd->rel_ts));
-#endif
- g_snprintf(label_string, MAX_LABEL, "%s", user_data->dlg.items[display_items-1].time_str);
- layout = gtk_widget_create_pango_layout(user_data->dlg.draw_area_time, label_string);
- middle_layout = gtk_widget_create_pango_layout(user_data->dlg.draw_area_time, label_string);
- small_layout = gtk_widget_create_pango_layout(user_data->dlg.draw_area_time, label_string);
-
- middle_font_desc = pango_font_description_copy(pango_context_get_font_description(pango_layout_get_context(middle_layout)));
- middle_font_size = pango_font_description_get_size(middle_font_desc);
- pango_font_description_set_size(middle_font_desc, (gint)(middle_font_size*0.8));
- pango_layout_set_font_description(middle_layout, middle_font_desc);
-
- small_font_desc = pango_font_description_copy(pango_context_get_font_description(pango_layout_get_context(small_layout)));
- small_font_size = pango_font_description_get_size(small_font_desc);
- pango_font_description_set_size(small_font_desc, (gint)(small_font_size*0.7));
- pango_layout_set_font_description(small_layout, small_font_desc);
-
- pango_layout_get_pixel_size(layout, &label_width, &label_height);
-
- /* resize the "time" draw area */
- left_x_border = 0;
- user_data->dlg.left_x_border = left_x_border;
-
- right_x_border = 0;
- draw_width = user_data->dlg.surface_width-right_x_border-left_x_border;
-
-#if GTK_CHECK_VERSION(2,22,0)
- /* Paint time title background */
- cr = cairo_create (user_data->dlg.surface_time);
- gdk_cairo_set_source_rgba (cr, &bg_color);
- cairo_rectangle (cr, 0, 0, draw_area_time_alloc.width, top_y_border);
- cairo_fill (cr);
- cairo_destroy (cr);
-
- /* Paint main title background */
- cr = cairo_create (user_data->dlg.surface_main);
- gdk_cairo_set_source_rgba (cr, &bg_color);
- cairo_rectangle (cr, 0, 0, draw_area_alloc.width, top_y_border);
- cairo_fill (cr);
- cairo_destroy (cr);
-
- /* Paint main comment background */
- cr = cairo_create (user_data->dlg.surface_comments);
- gdk_cairo_set_source_rgba (cr, &bg_color);
- cairo_rectangle (cr, 0, 0, draw_area_comments_alloc.width, top_y_border);
- cairo_fill (cr);
- cairo_destroy (cr);
-#else
- /* Paint time title background */
- if ( GDK_IS_DRAWABLE(user_data->dlg.pixmap_time) ) {
- cr = gdk_cairo_create (user_data->dlg.pixmap_time);
- gdk_cairo_set_source_rgba (cr, &bg_color);
- cairo_rectangle (cr, 0, 0, draw_area_time_alloc.width, top_y_border);
- cairo_fill (cr);
- cairo_destroy (cr);
-
- }
- /* Paint main title background */
- if ( GDK_IS_DRAWABLE(user_data->dlg.pixmap_main) ) {
- cr = gdk_cairo_create (user_data->dlg.pixmap_main);
- gdk_cairo_set_source_rgba (cr, &bg_color);
- cairo_rectangle (cr, 0, 0, draw_area_alloc.width, top_y_border);
- cairo_fill (cr);
- cairo_destroy (cr);
- }
-
- /* Paint main comment background */
- if ( GDK_IS_DRAWABLE(user_data->dlg.pixmap_comments) ) {
- cr = gdk_cairo_create (user_data->dlg.pixmap_comments);
- gdk_cairo_set_source_rgba (cr, &bg_color);
- cairo_rectangle (cr, 0, 0, draw_area_comments_alloc.width, top_y_border);
- cairo_fill (cr);
- cairo_destroy (cr);
- }
-
-#endif
- /* Draw the word "Time" on top of time column */
- g_snprintf(label_string, label_width, "%s", " Time");
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &label_width, &label_height);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.surface_time);
- cairo_move_to (cr, left_x_border, top_y_border/2-label_height/2);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
-#else
- if (GDK_IS_DRAWABLE(user_data->dlg.pixmap_time)) {
- cr = gdk_cairo_create (user_data->dlg.pixmap_time);
- cairo_move_to (cr, left_x_border, top_y_border/2-label_height/2);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
- }
-#endif
- /* Draw the word "Comment" on top of comment column */
- g_snprintf(label_string, label_width, "%s", "Comment");
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &label_width, &label_height);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.surface_comments);
- cairo_move_to (cr, MAX_COMMENT/2-label_width/2, top_y_border/2-label_height/2);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
-#else
- if (GDK_IS_DRAWABLE(user_data->dlg.pixmap_comments)) {
- cr = gdk_cairo_create (user_data->dlg.pixmap_comments);
- cairo_move_to (cr, MAX_COMMENT/2-label_width/2, top_y_border/2-label_height/2);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
- }
-#endif
- /* Paint the background items */
- for (current_item=0; current_item<display_items; current_item++) {
- /*select the color. if it is the selected item select blue color */
- if ( current_item+first_item == user_data->dlg.selected_item ) {
- bg_color_p = &background_color[0]; /* blue */
- } else {
- bg_color_p = &background_color[1+user_data->dlg.items[current_item].conv_num%MAX_NUM_COL_CONV];
- }
-#if GTK_CHECK_VERSION(2,22,0)
- /* Paint background */
- cr = cairo_create (user_data->dlg.surface_main);
- gdk_cairo_set_source_rgba (cr, bg_color_p);
- cairo_rectangle (cr, left_x_border, top_y_border+current_item*ITEM_HEIGHT, draw_width, ITEM_HEIGHT);
- cairo_fill (cr);
- cairo_destroy (cr);
-#else
- if (GDK_IS_DRAWABLE(user_data->dlg.pixmap_main)) {
- /* Paint background */
- cr = gdk_cairo_create (user_data->dlg.pixmap_main);
- gdk_cairo_set_source_rgba (cr, bg_color_p);
- cairo_rectangle (cr, left_x_border, top_y_border+current_item*ITEM_HEIGHT, draw_width, ITEM_HEIGHT);
- cairo_fill (cr);
- cairo_destroy (cr);
- }
-#endif
- }
- /* Draw the node names on top and the division lines */
- for (i=0; i<user_data->graph_info->num_nodes; i++) {
- char* addr_str;
-
- /* print the node identifiers */
- /* XXX we assign 5 pixels per character in the node identity */
- addr_str = address_to_display(NULL, &(user_data->graph_info->nodes[i]));
- g_strlcpy(label_string, addr_str, NODE_WIDTH/5);
- wmem_free(NULL, addr_str);
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &label_width, &label_height);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.surface_main);
- cairo_move_to (cr, left_x_border+NODE_WIDTH/2-label_width/2+NODE_WIDTH*i, top_y_border/2-((i&1)?0:label_height));
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
-#else
- if (GDK_IS_DRAWABLE(user_data->dlg.pixmap_main)) {
- cr = gdk_cairo_create (user_data->dlg.pixmap_main);
- cairo_move_to (cr, left_x_border+NODE_WIDTH/2-label_width/2+NODE_WIDTH*i, top_y_border/2-((i&1)?0:label_height));
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
- }
-#endif
-#if GTK_CHECK_VERSION(2,22,0)
- /* draw the node division lines */
- cr = cairo_create (user_data->dlg.surface_main);
- gdk_cairo_set_source_rgba (cr, &grey_color0);
- cairo_set_line_width (cr, 1.0);
- cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
- cairo_set_dash(cr, dashed1, len1, 0);
- cairo_move_to(cr, left_x_border+NODE_WIDTH/2+NODE_WIDTH*i, top_y_border);
- cairo_line_to(cr, (left_x_border+NODE_WIDTH/2+NODE_WIDTH*i), draw_area_alloc.height-bottom_y_border);
- cairo_stroke(cr);
- cairo_destroy(cr);
-#else
- /* draw the node division lines */
- if (GDK_IS_DRAWABLE(user_data->dlg.pixmap_main) ) {
- cr = gdk_cairo_create (user_data->dlg.pixmap_main);
- gdk_cairo_set_source_rgba (cr, &grey_color0);
- cairo_set_line_width (cr, 1.0);
- cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
- cairo_set_dash(cr, dashed1, len1, 0);
- cairo_move_to(cr, left_x_border+NODE_WIDTH/2+NODE_WIDTH*i, top_y_border);
- cairo_line_to(cr, (left_x_border+NODE_WIDTH/2+NODE_WIDTH*i), draw_area_alloc.height-bottom_y_border);
- cairo_stroke(cr);
- cairo_destroy(cr);
- }
-#endif
- }
-
- /* Draw the items */
- for (current_item=0; current_item<display_items; current_item++) {
-#if 0
- /* Draw the time */
- g_snprintf(label_string, MAX_LABEL, "%.3f", nstime_to_sec(&user_data->dlg.items[current_item].fd->rel_ts));
-#endif
- /* Draw the time */
- g_snprintf(label_string, MAX_LABEL, "%s", user_data->dlg.items[current_item].time_str);
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &label_width, &label_height);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.surface_time);
- cairo_move_to (cr, 3, top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT/2-label_height/2);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
-#else
- if (GDK_IS_DRAWABLE(user_data->dlg.pixmap_time)) {
- cr = gdk_cairo_create (user_data->dlg.pixmap_time);
- cairo_move_to (cr, 3, top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT/2-label_height/2);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
- }
-#endif
- /*draw the comments */
- g_snprintf(label_string, MAX_COMMENT, "%s", user_data->dlg.items[current_item].comment);
- pango_layout_set_text(middle_layout, label_string, -1);
- pango_layout_get_pixel_size(middle_layout, &label_width, &label_height);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.surface_comments);
- cairo_move_to (cr, 2, top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT/2-label_height/2);
- pango_cairo_show_layout (cr, middle_layout);
- cairo_destroy (cr);
- cr = NULL;
-#else
- if (GDK_IS_DRAWABLE(user_data->dlg.pixmap_comments)) {
- cr = gdk_cairo_create (user_data->dlg.pixmap_comments);
- cairo_move_to (cr, 2, top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT/2-label_height/2);
- pango_cairo_show_layout (cr, middle_layout);
- cairo_destroy (cr);
- cr = NULL;
- }
-#endif
- /* draw the arrow line */
- start_arrow = left_x_border+(user_data->dlg.items[current_item].src_node)*NODE_WIDTH+NODE_WIDTH/2;
- end_arrow = left_x_border+(user_data->dlg.items[current_item].dst_node)*NODE_WIDTH+NODE_WIDTH/2;
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.surface_main);
- if (user_data->dlg.items[current_item].line_style == 2) {
- /* draw a line thick */
- cairo_set_line_width (cr, 2.0);
- }else{
- cairo_set_line_width (cr, 1.0);
- }
- if ( current_item+first_item == user_data->dlg.selected_item ) {
- /* draw white line */
- cairo_set_source_rgb (cr, 1, 1, 1);
- }else{
- /* draw black line */
- cairo_set_source_rgb (cr, 0, 0, 0);
- }
- cairo_move_to(cr, start_arrow, (top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-7)+0.5);
- cairo_line_to(cr, end_arrow, (top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-7)+0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
-#else
- if (GDK_IS_DRAWABLE(user_data->dlg.pixmap_main) ) {
- cr = gdk_cairo_create (user_data->dlg.pixmap_main);
- if (user_data->dlg.items[current_item].line_style == 2) {
- /* draw a line thick */
- cairo_set_line_width (cr, 2.0);
- }else{
- cairo_set_line_width (cr, 1.0);
- }
- if ( current_item+first_item == user_data->dlg.selected_item ) {
- /* draw white line */
- cairo_set_source_rgb (cr, 1, 1, 1);
- }else{
- /* draw black line */
- cairo_set_source_rgb (cr, 0, 0, 0);
- }
- cairo_move_to(cr, start_arrow, (top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-7)+0.5);
- cairo_line_to(cr, end_arrow, (top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-7)+0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
- }
-#endif
- /* select colors */
- if ( current_item+first_item == user_data->dlg.selected_item ) {
- color_p = &white_color;
- } else {
- color_p = &black_color;
- }
- /* draw the arrow */
-#if GTK_CHECK_VERSION(2,22,0)
- if (start_arrow<end_arrow)
- draw_arrow(user_data->dlg.surface_main, color_p, end_arrow-WIDTH_ARROW, (top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-7)-(HEIGHT_ARROW/2), RIGHT_ARROW);
- else
- draw_arrow(user_data->dlg.surface_main, color_p, end_arrow, top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-7-(HEIGHT_ARROW/2), LEFT_ARROW);
-#else
- if (start_arrow<end_arrow)
- draw_arrow(user_data->dlg.pixmap_main, color_p, end_arrow-WIDTH_ARROW, (top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-7)-(HEIGHT_ARROW/2), RIGHT_ARROW);
- else
- draw_arrow(user_data->dlg.pixmap_main, color_p, end_arrow, top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-7-(HEIGHT_ARROW/2), LEFT_ARROW);
-#endif
- /* draw the frame comment */
- if (start_arrow<end_arrow) {
- arrow_width = end_arrow-start_arrow;
- label_x = arrow_width/2+start_arrow;
- }
- else {
- arrow_width = start_arrow-end_arrow;
- label_x = arrow_width/2+end_arrow;
- }
-#if PANGO_VERSION_CHECK(1,6,0)
- pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END);
- pango_layout_set_width(layout, arrow_width * PANGO_SCALE);
- pango_layout_set_text(layout, user_data->dlg.items[current_item].frame_label, -1);
-#else
- if (g_snprintf(label_string, MAX_FRAME_LABEL, "%s", user_data->dlg.items[current_item].frame_label) > MAX_FRAME_LABEL) {
- memcpy(&label_string[MAX_FRAME_LABEL-4], "...", 3);
- }
- pango_layout_set_text(layout, label_string, -1);
-#endif
- pango_layout_get_pixel_size(layout, &label_width, &label_height);
-
- if ((int)left_x_border > ((int)label_x-(int)label_width/2))
- label_x = left_x_border + label_width/2;
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.surface_main);
- gdk_cairo_set_source_rgba (cr, color_p);
- cairo_move_to (cr, label_x - label_width/2, top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT/2-label_height/2-3);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
-#else
- if (GDK_IS_DRAWABLE(user_data->dlg.pixmap_main)) {
- cr = gdk_cairo_create (user_data->dlg.pixmap_main);
- gdk_cairo_set_source_rgba (cr, color_p);
- cairo_move_to (cr, label_x - label_width/2, top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT/2-label_height/2-3);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
- }
-#endif
-#if PANGO_VERSION_CHECK(1,6,0)
- pango_layout_set_width(layout, -1);
-#endif
-
- /* draw the source port number */
- g_snprintf(label_string, MAX_LABEL, "(%i)", user_data->dlg.items[current_item].port_src);
- pango_layout_set_text(small_layout, label_string, -1);
- pango_layout_get_pixel_size(small_layout, &label_width, &label_height);
- if (start_arrow<end_arrow) {
- src_port_x = start_arrow - label_width - 2;
- }
- else {
- src_port_x = start_arrow + 2;
- }
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.surface_main);
- /* select color */
- if ( current_item+first_item == user_data->dlg.selected_item ) {
- gdk_cairo_set_source_rgba (cr, &grey_color1);
- } else {
- gdk_cairo_set_source_rgba (cr, &grey_color0);
- }
- gdk_cairo_set_source_rgba (cr, &grey_color0);
- cairo_move_to (cr, src_port_x, top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-2-label_height/2-2);
- pango_cairo_show_layout (cr, small_layout);
- cairo_destroy (cr);
-#else
- if (GDK_IS_DRAWABLE(user_data->dlg.pixmap_main)) {
- cr = gdk_cairo_create (user_data->dlg.pixmap_main);
- /* select color */
- if ( current_item+first_item == user_data->dlg.selected_item ) {
- gdk_cairo_set_source_rgba (cr, &grey_color1);
- } else {
- gdk_cairo_set_source_rgba (cr, &grey_color0);
- }
- gdk_cairo_set_source_rgba (cr, &grey_color0);
- cairo_move_to (cr, src_port_x, top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-2-label_height/2-2);
- pango_cairo_show_layout (cr, small_layout);
- cairo_destroy (cr);
- }
-#endif
- /* draw the destination port number */
- g_snprintf(label_string, MAX_LABEL, "(%i)", user_data->dlg.items[current_item].port_dst);
- pango_layout_set_text(small_layout, label_string, -1);
- pango_layout_get_pixel_size(small_layout, &label_width, &label_height);
- if (start_arrow<end_arrow) {
- dst_port_x = end_arrow + 2;
- }
- else {
- dst_port_x = end_arrow - label_width - 2;
- }
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.surface_main);
- /* select color */
- if ( current_item+first_item == user_data->dlg.selected_item ) {
- gdk_cairo_set_source_rgba (cr, &grey_color1);
- } else {
- gdk_cairo_set_source_rgba (cr, &grey_color0);
- }
- cairo_move_to (cr, dst_port_x, top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-2-label_height/2-2);
- pango_cairo_show_layout (cr, small_layout);
- cairo_destroy (cr);
-#else
- if (GDK_IS_DRAWABLE(user_data->dlg.pixmap_main)) {
- cr = gdk_cairo_create (user_data->dlg.pixmap_main);
- /* select color */
- if ( current_item+first_item == user_data->dlg.selected_item ) {
- gdk_cairo_set_source_rgba (cr, &grey_color1);
- } else {
- gdk_cairo_set_source_rgba (cr, &grey_color0);
- }
- cairo_move_to (cr, dst_port_x, top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT-2-label_height/2-2);
- pango_cairo_show_layout (cr, small_layout);
- cairo_destroy (cr);
- }
-#endif
- /* draw the div line of the selected item with soft gray*/
- if ( current_item+first_item == user_data->dlg.selected_item )
- for (i=0; i<user_data->graph_info->num_nodes; i++) {
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.surface_main);
- gdk_cairo_set_source_rgba (cr, &grey_color1);
- cairo_set_line_width (cr, 1.0);
- cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
- cairo_set_dash(cr, dashed1, len1, 0);
- cairo_move_to(cr, left_x_border+NODE_WIDTH/2+NODE_WIDTH*i, (user_data->dlg.selected_item-first_item)*ITEM_HEIGHT+TOP_Y_BORDER);
- cairo_line_to(cr, (left_x_border+NODE_WIDTH/2+NODE_WIDTH*i), (user_data->dlg.selected_item-first_item)*ITEM_HEIGHT+TOP_Y_BORDER+ITEM_HEIGHT);
- cairo_stroke(cr);
- cairo_destroy(cr);
-#else
- if (GDK_IS_DRAWABLE(user_data->dlg.pixmap_main) ) {
- cr = gdk_cairo_create (user_data->dlg.pixmap_main);
- gdk_cairo_set_source_rgba (cr, &grey_color1);
- cairo_set_line_width (cr, 1.0);
- cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
- cairo_set_dash(cr, dashed1, len1, 0);
- cairo_move_to(cr, left_x_border+NODE_WIDTH/2+NODE_WIDTH*i, (user_data->dlg.selected_item-first_item)*ITEM_HEIGHT+TOP_Y_BORDER);
- cairo_line_to(cr, (left_x_border+NODE_WIDTH/2+NODE_WIDTH*i), (user_data->dlg.selected_item-first_item)*ITEM_HEIGHT+TOP_Y_BORDER+ITEM_HEIGHT);
- cairo_stroke(cr);
- cairo_destroy(cr);
- }
-#endif
- }
- }
-
- g_object_unref(G_OBJECT(layout));
-
- /* refresh the draw areas */
- if (gtk_widget_is_drawable(user_data->dlg.draw_area_time) ) {
- cr = gdk_cairo_create (gtk_widget_get_window(user_data->dlg.draw_area_time));
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, user_data->dlg.surface_time, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, user_data->dlg.pixmap_time, 0, 0);
-#endif
- cairo_rectangle (cr, 0, 0, draw_area_time_alloc.width, draw_area_time_alloc.height);
- cairo_fill (cr);
- cairo_destroy (cr);
- cr = NULL;
- }
-
- if (gtk_widget_is_drawable(user_data->dlg.draw_area) ) {
- cr = gdk_cairo_create (gtk_widget_get_window(user_data->dlg.draw_area));
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, user_data->dlg.surface_main, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, user_data->dlg.pixmap_main, 0, 0);
-#endif
- cairo_rectangle (cr, 0, 0, draw_area_alloc.width, draw_area_alloc.height);
- cairo_fill (cr);
- cairo_destroy (cr);
- cr = NULL;
- }
-
- if (gtk_widget_is_drawable(user_data->dlg.draw_area_comments) ) {
- cr = gdk_cairo_create (gtk_widget_get_window(user_data->dlg.draw_area_comments));
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, user_data->dlg.surface_comments, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, user_data->dlg.pixmap_comments, 0, 0);
-#endif
- cairo_rectangle (cr, 0, 0, draw_area_comments_alloc.width, draw_area_comments_alloc.height);
- cairo_fill (cr);
- cairo_destroy (cr);
- cr = NULL;
- }
-
- /* update the v_scrollbar */
- gtk_adjustment_set_upper(user_data->dlg.v_scrollbar_adjustment, (gdouble) user_data->num_items-1);
- gtk_adjustment_set_step_increment(user_data->dlg.v_scrollbar_adjustment, 1);
- gtk_adjustment_set_page_increment(user_data->dlg.v_scrollbar_adjustment, (gdouble) (last_item-first_item));
- gtk_adjustment_set_page_size(user_data->dlg.v_scrollbar_adjustment, (gdouble) (last_item-first_item));
- gtk_adjustment_set_value(user_data->dlg.v_scrollbar_adjustment, (gdouble) first_item);
-
- gtk_adjustment_changed(user_data->dlg.v_scrollbar_adjustment);
- gtk_adjustment_value_changed(user_data->dlg.v_scrollbar_adjustment);
-}
-
-/****************************************************************************/
-static void dialog_graph_redraw(graph_analysis_data_t *user_data)
-{
- user_data->dlg.needs_redraw = TRUE;
- dialog_graph_draw(user_data);
-}
-
-/****************************************************************************/
-static gboolean button_press_event(GtkWidget *widget _U_, GdkEventButton *event, gpointer data)
-{
- graph_analysis_data_t *user_data = (graph_analysis_data_t *)data;
- guint32 item;
-
- if (event->type != GDK_BUTTON_PRESS) return TRUE;
-
- if (event->y<TOP_Y_BORDER) return TRUE;
-
- /* get the item clicked */
- item = ((guint32)event->y - TOP_Y_BORDER) / ITEM_HEIGHT;
- if (item > (user_data->dlg.last_item - user_data->dlg.first_item)) return TRUE;
- user_data->dlg.selected_item = item + user_data->dlg.first_item;
-
- user_data->dlg.needs_redraw = TRUE;
- dialog_graph_draw(user_data);
-
- cf_goto_frame(&cfile, user_data->dlg.items[item].frame_number);
-
- return TRUE;
-}
-
-
-
-/****************************************************************************/
-static gboolean key_press_event(GtkWidget *widget _U_, GdkEventKey *event, gpointer data)
-{
- graph_analysis_data_t *user_data = (graph_analysis_data_t *)data;
-
- /* if there is nothing selected, just return */
- if (user_data->dlg.selected_item == 0xFFFFFFFF) return TRUE;
-
- /* Up arrow */
- if (event->keyval == GDK_Up) {
- if (user_data->dlg.selected_item == 0) return TRUE;
- user_data->dlg.selected_item--;
- if ( (user_data->dlg.selected_item<user_data->dlg.first_item) || (user_data->dlg.selected_item>user_data->dlg.first_item+gtk_adjustment_get_page_size(user_data->dlg.v_scrollbar_adjustment)) )
- user_data->dlg.first_item = user_data->dlg.selected_item;
- /* Down arrow */
- } else if (event->keyval == GDK_Down) {
- if (user_data->dlg.selected_item == user_data->num_items-1) return TRUE;
- user_data->dlg.selected_item++;
- if ( (user_data->dlg.selected_item<user_data->dlg.first_item) || (user_data->dlg.selected_item>user_data->dlg.first_item+gtk_adjustment_get_page_size(user_data->dlg.v_scrollbar_adjustment)) )
- user_data->dlg.first_item = (guint32)user_data->dlg.selected_item-(guint32)gtk_adjustment_get_page_size(user_data->dlg.v_scrollbar_adjustment);
- } else if (event->keyval == GDK_Left) {
- if (user_data->dlg.first_node == 0) return TRUE;
- user_data->dlg.first_node--;
- } else return TRUE;
-
- user_data->dlg.needs_redraw = TRUE;
- dialog_graph_draw(user_data);
-
- cf_goto_frame(&cfile, user_data->dlg.items[user_data->dlg.selected_item-user_data->dlg.first_item].frame_number);
-
- return TRUE;
-}
-
-
-
-/****************************************************************************/
-static gboolean draw_area_draw(GtkWidget *widget, cairo_t *cr, gpointer data)
-{
- graph_analysis_data_t *user_data = (graph_analysis_data_t *)data;
- GtkAllocation allocation;
-
- gtk_widget_get_allocation (widget, &allocation);
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, user_data->dlg.surface_main, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, user_data->dlg.pixmap_main, 0, 0);
-#endif
- cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
- cairo_fill (cr);
-
-
- return FALSE;
-}
-#if !GTK_CHECK_VERSION(3,0,0)
-/****************************************************************************/
-static gboolean expose_event(GtkWidget *widget, GdkEventExpose *event _U_, gpointer data)
-{
- GtkAllocation allocation;
- graph_analysis_data_t *user_data = (graph_analysis_data_t *)data;
- cairo_t *cr = gdk_cairo_create (gtk_widget_get_window(widget));
-
-
- if (gtk_widget_is_drawable(widget)) {
- gtk_widget_get_allocation (widget, &allocation);
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, user_data->dlg.surface_main, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, user_data->dlg.pixmap_main, 0, 0);
-#endif
- cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
- cairo_fill (cr);
-
- cairo_destroy (cr);
- }
-
- return FALSE;
-}
-#endif
-
-static gboolean
-draw_area_scrolled(GtkAdjustment *adjustment _U_, gpointer data)
-{
- graph_analysis_data_t *user_data = (graph_analysis_data_t *)data;
- cairo_t *cr = gdk_cairo_create (gtk_widget_get_window(user_data->dlg.draw_area));
-
-
- draw_area_draw(user_data->dlg.draw_area, cr, data);
-
- return TRUE;
-}
-
-/****************************************************************************/
-static gboolean
-mouse_scrolled(GtkWidget *widget _U_, GdkEventScroll *event, gpointer data)
-{
- graph_analysis_data_t *user_data = (graph_analysis_data_t *)data;
- GtkWidget *scroll_window;
- GtkAdjustment *adjustment;
- gdouble v_scroll_items;
- GtkAllocation draw_area_alloc, scroll_window_alloc;
-
- if (event->direction == GDK_SCROLL_UP) {
- adjustment = user_data->dlg.v_scrollbar_adjustment;
- v_scroll_items = pow(gtk_adjustment_get_page_size(adjustment), 2.0/3.0);
- if ((gtk_adjustment_get_value(adjustment) - v_scroll_items) <= 0.0) {
- gtk_adjustment_set_value(adjustment, 0.0);
- }
- else {
- gtk_adjustment_set_value(adjustment, gtk_adjustment_get_value(adjustment) - v_scroll_items);
- }
- }
-
- else if (event->direction == GDK_SCROLL_DOWN) {
- adjustment = user_data->dlg.v_scrollbar_adjustment;
- v_scroll_items = pow (gtk_adjustment_get_page_size(adjustment), 2.0/3.0);
- if ((gtk_adjustment_get_value(adjustment) + v_scroll_items) >= (user_data->num_items - gtk_adjustment_get_page_size(adjustment) - 1)) {
- gtk_adjustment_set_value(adjustment, (user_data->num_items - gtk_adjustment_get_page_size(adjustment) - 1));
- }
- else {
- gtk_adjustment_set_value(adjustment, gtk_adjustment_get_value(adjustment) + v_scroll_items);
- }
- }
-
- else if (event->direction == GDK_SCROLL_LEFT) {
- if (widget == user_data->dlg.scroll_window) {
- scroll_window = user_data->dlg.scroll_window;
- }
- else if (widget == user_data->dlg.scroll_window_comments) {
- scroll_window = user_data->dlg.scroll_window_comments;
- }
- else return TRUE;
- adjustment = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(scroll_window));
- if ((gtk_adjustment_get_value(adjustment) - gtk_adjustment_get_step_increment(adjustment)) <= 0.0) {
- gtk_adjustment_set_value(adjustment, 0.0);
- }
- else {
- gtk_adjustment_set_value(adjustment, gtk_adjustment_get_value(adjustment) - gtk_adjustment_get_step_increment(adjustment));
- }
- gtk_scrolled_window_set_hadjustment(GTK_SCROLLED_WINDOW(scroll_window), adjustment);
- }
-
- else if (event->direction == GDK_SCROLL_RIGHT) {
- if (widget == user_data->dlg.scroll_window) {
- scroll_window = user_data->dlg.scroll_window;
- gtk_widget_get_allocation(user_data->dlg.draw_area, &draw_area_alloc);
- gtk_widget_get_allocation(user_data->dlg.scroll_window, &scroll_window_alloc);
- }
- else if (widget == user_data->dlg.scroll_window_comments) {
- scroll_window = user_data->dlg.scroll_window_comments;
- gtk_widget_get_allocation(user_data->dlg.draw_area_comments, &draw_area_alloc);
- gtk_widget_get_allocation(user_data->dlg.scroll_window_comments, &scroll_window_alloc);
- }
- else return TRUE;
- adjustment = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(scroll_window));
- if ((gtk_adjustment_get_value(adjustment) + gtk_adjustment_get_step_increment(adjustment)) >= (draw_area_alloc.width - scroll_window_alloc.width)) {
- gtk_adjustment_set_value(adjustment, (draw_area_alloc.width - scroll_window_alloc.width));
- }
- else {
- gtk_adjustment_set_value(adjustment, gtk_adjustment_get_value(adjustment) + gtk_adjustment_get_step_increment(adjustment));
- }
- gtk_scrolled_window_set_hadjustment(GTK_SCROLLED_WINDOW(scroll_window), adjustment);
- }
- return TRUE;
-}
-
-/****************************************************************************/
-static gboolean draw_comments(GtkWidget *widget, cairo_t *cr, gpointer data)
-{
- graph_analysis_data_t *user_data = (graph_analysis_data_t *)data;
- GtkAllocation allocation;
-
- gtk_widget_get_allocation (widget, &allocation);
-
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, user_data->dlg.surface_comments, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, user_data->dlg.pixmap_comments, 0, 0);
-#endif
- cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
- cairo_fill (cr);
-
-
- return FALSE;
-}
-#if !GTK_CHECK_VERSION(3,0,0)
-/****************************************************************************/
-static gboolean expose_event_comments(GtkWidget *widget, GdkEventExpose *event _U_, gpointer data)
-{
- GtkAllocation allocation;
- graph_analysis_data_t *user_data = (graph_analysis_data_t *)data;
- cairo_t *cr = gdk_cairo_create (gtk_widget_get_window(widget));
-
- if (gtk_widget_is_drawable(widget)) {
- gtk_widget_get_allocation (widget, &allocation);
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, user_data->dlg.surface_comments, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, user_data->dlg.pixmap_comments, 0, 0);
-#endif
- cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
- cairo_fill (cr);
-
- cairo_destroy (cr);
- }
-
- return FALSE;
-}
-#endif
-
-static gboolean
-comments_area_scrolled(GtkAdjustment *adjustment _U_, gpointer data)
-{
- graph_analysis_data_t *user_data = (graph_analysis_data_t *)data;
- cairo_t *cr = gdk_cairo_create (gtk_widget_get_window(user_data->dlg.draw_area_comments));
-
-
- draw_comments(user_data->dlg.draw_area_comments, cr, data);
-
- return TRUE;
-}
-
-#if GTK_CHECK_VERSION(3,0,0)
-/****************************************************************************/
-static gboolean draw_time(GtkWidget *widget, cairo_t *cr, gpointer data)
-{
- graph_analysis_data_t *user_data = (graph_analysis_data_t *)data;
- GtkAllocation allocation;
-
- gtk_widget_get_allocation (widget, &allocation);
-
- cairo_set_source_surface (cr, user_data->dlg.surface_time, 0, 0);
- cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
- cairo_fill (cr);
-
- return FALSE;
-}
-#else
-/****************************************************************************/
-static gboolean expose_event_time(GtkWidget *widget, GdkEventExpose *event _U_, gpointer data)
-{
- GtkAllocation allocation;
- graph_analysis_data_t *user_data = (graph_analysis_data_t *)data;
- cairo_t *cr = gdk_cairo_create (gtk_widget_get_window(widget));
-
- if (gtk_widget_is_drawable(widget) ) {
- gtk_widget_get_allocation (widget, &allocation);
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, user_data->dlg.surface_time, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, user_data->dlg.pixmap_time, 0, 0);
-#endif
- cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
- cairo_fill (cr);
-
- cairo_destroy (cr);
- }
-
- return FALSE;
-}
-#endif
-/****************************************************************************/
-static gboolean configure_event(GtkWidget *widget, GdkEventConfigure *event _U_, gpointer data)
-{
- graph_analysis_data_t *user_data = (graph_analysis_data_t *)data;
- GtkAllocation widget_alloc;
- cairo_t *cr;
-
-#if GTK_CHECK_VERSION(2,22,0)
- if(user_data->dlg.surface_main) {
- cairo_surface_destroy (user_data->dlg.surface_main);
- user_data->dlg.surface_main = NULL;
- }
-#else
- if(user_data->dlg.pixmap_main) {
- g_object_unref(user_data->dlg.pixmap_main);
- user_data->dlg.pixmap_main = NULL;
- }
-#endif
- gtk_widget_get_allocation(widget, &widget_alloc);
-
-#if GTK_CHECK_VERSION(2,22,0)
- user_data->dlg.surface_main = gdk_window_create_similar_surface (gtk_widget_get_window(widget),
- CAIRO_CONTENT_COLOR,
- widget_alloc.width,
- widget_alloc.height);
-
- cr = cairo_create (user_data->dlg.surface_main);
- cairo_rectangle (cr, 0, 0, widget_alloc.width, widget_alloc.height);
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_fill (cr);
- cairo_destroy (cr);
- cr = NULL;
-#else
- user_data->dlg.pixmap_main = gdk_pixmap_new(gtk_widget_get_window(widget),
- widget_alloc.width,
- widget_alloc.height,
- -1);
- if ( GDK_IS_DRAWABLE(user_data->dlg.pixmap_main) ) {
- cr = gdk_cairo_create (user_data->dlg.pixmap_main);
- cairo_rectangle (cr, 0, 0, widget_alloc.width, widget_alloc.height);
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_fill (cr);
- cairo_destroy (cr);
- cr = NULL;
- }
-#endif
-
- dialog_graph_redraw(user_data);
-
- return TRUE;
-}
-
-/****************************************************************************/
-static gboolean configure_event_comments(GtkWidget *widget, GdkEventConfigure *event _U_, gpointer data)
-{
- graph_analysis_data_t *user_data = (graph_analysis_data_t *)data;
- GtkAllocation widget_alloc;
- cairo_t *cr;
-
- gtk_widget_get_allocation(widget, &widget_alloc);
-
-#if GTK_CHECK_VERSION(2,22,0)
- if(user_data->dlg.surface_comments) {
- cairo_surface_destroy (user_data->dlg.surface_comments);
- user_data->dlg.surface_comments = NULL;
- }
-#else
- if(user_data->dlg.pixmap_comments) {
- g_object_unref(user_data->dlg.pixmap_comments);
- user_data->dlg.pixmap_comments = NULL;
- }
-#endif
-
-#if GTK_CHECK_VERSION(2,22,0)
- user_data->dlg.surface_comments = gdk_window_create_similar_surface (gtk_widget_get_window(widget),
- CAIRO_CONTENT_COLOR,
- widget_alloc.width,
- widget_alloc.height);
-
- cr = cairo_create (user_data->dlg.surface_comments);
- cairo_rectangle (cr, 0, 0, widget_alloc.width, widget_alloc.height);
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_fill (cr);
- cairo_destroy (cr);
- cr = NULL;
-#else
- user_data->dlg.pixmap_comments = gdk_pixmap_new(gtk_widget_get_window(widget),
- widget_alloc.width,
- widget_alloc.height,
- -1);
-
- if ( GDK_IS_DRAWABLE(user_data->dlg.pixmap_main) ) {
- cr = gdk_cairo_create (user_data->dlg.pixmap_comments);
- cairo_rectangle (cr, 0, 0, widget_alloc.width, widget_alloc.height);
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_fill (cr);
- cairo_destroy (cr);
- cr = NULL;
- }
-#endif
- dialog_graph_redraw(user_data);
- return TRUE;
-}
-
-/****************************************************************************/
-static gboolean configure_event_time(GtkWidget *widget, GdkEventConfigure *event _U_, gpointer data)
-{
- graph_analysis_data_t *user_data = (graph_analysis_data_t *)data;
- GtkAllocation widget_alloc;
- cairo_t *cr;
-
- gtk_widget_get_allocation(widget, &widget_alloc);
-
-#if GTK_CHECK_VERSION(2,22,0)
- if(user_data->dlg.surface_time) {
- cairo_surface_destroy (user_data->dlg.surface_time);
- user_data->dlg.surface_time = NULL;
- }
-#else
- if(user_data->dlg.pixmap_time) {
- g_object_unref(user_data->dlg.pixmap_time);
- user_data->dlg.pixmap_time = NULL;
- }
-#endif
-#if GTK_CHECK_VERSION(2,22,0)
- user_data->dlg.surface_time = gdk_window_create_similar_surface(gtk_widget_get_window(widget),
- CAIRO_CONTENT_COLOR,
- widget_alloc.width,
- widget_alloc.height);
-
- cr = cairo_create (user_data->dlg.surface_time);
- cairo_rectangle (cr, 0, 0, widget_alloc.width, widget_alloc.height);
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_fill (cr);
- cairo_destroy (cr);
- cr = NULL;
-#else
- user_data->dlg.pixmap_time = gdk_pixmap_new(gtk_widget_get_window(widget),
- widget_alloc.width,
- widget_alloc.height,
- -1);
-
- if ( GDK_IS_DRAWABLE(user_data->dlg.pixmap_time) ) {
- cr = gdk_cairo_create (user_data->dlg.pixmap_time);
- cairo_rectangle (cr, 0, 0, widget_alloc.width, widget_alloc.height);
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_fill (cr);
- cairo_destroy (cr);
- cr = NULL;
- }
-#endif
-
- dialog_graph_redraw(user_data);
-
- return TRUE;
-}
-
-/****************************************************************************/
-static gboolean pane_callback(GtkWidget *widget _U_, GParamSpec *pspec _U_, gpointer data)
-{
- graph_analysis_data_t *user_data = (graph_analysis_data_t *)data;
- GtkAllocation draw_area_comments_alloc, draw_area_alloc;
- cairo_t *cr;
-
- /* If we want to limit minimum and maximum size of graph window, we can include this code. */
-#if 0
- if (gtk_paned_get_position(GTK_PANED(user_data->dlg.hpane)) > user_data->dlg.surface_width)
- gtk_paned_set_position(GTK_PANED(user_data->dlg.hpane), user_data->dlg.surface_width);
- else if (gtk_paned_get_position(GTK_PANED(user_data->dlg.hpane)) < NODE_WIDTH*2)
- gtk_paned_set_position(GTK_PANED(user_data->dlg.hpane), NODE_WIDTH*2);
-#endif
-
- /* repaint the comment area because when moving the pane position there are times that the expose_event_comments is not called */
-
- gtk_widget_get_allocation(user_data->dlg.draw_area_comments, &draw_area_comments_alloc);
-
- if (gtk_widget_is_drawable(user_data->dlg.draw_area_comments)) {
- cr = gdk_cairo_create (gtk_widget_get_window(user_data->dlg.draw_area_comments));
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, user_data->dlg.surface_comments, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, user_data->dlg.pixmap_comments, 0, 0);
-#endif
- cairo_rectangle (cr, 0, 0, draw_area_comments_alloc.width, draw_area_comments_alloc.height);
- cairo_fill (cr);
- cairo_destroy (cr);
- }
- /* repaint the draw area because when moving the pane position there are times that the
- expose_event_comments is not called */
- gtk_widget_get_allocation(user_data->dlg.draw_area, &draw_area_alloc);
-
- if (gtk_widget_is_drawable(user_data->dlg.draw_area)) {
- cr = gdk_cairo_create(gtk_widget_get_window(user_data->dlg.draw_area));
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, user_data->dlg.surface_main, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, user_data->dlg.pixmap_main, 0, 0);
-#endif
- cairo_rectangle (cr, 0, 0, draw_area_alloc.width, draw_area_alloc.height);
- cairo_fill (cr);
- cairo_destroy (cr);
- }
-
-
- return TRUE;
-}
-
-/****************************************************************************/
-static void v_scrollbar_changed(GtkWidget *widget _U_, gpointer data)
-{
- graph_analysis_data_t *user_data = (graph_analysis_data_t *)data;
-
- if ((user_data->dlg.first_item+gtk_adjustment_get_page_size(user_data->dlg.v_scrollbar_adjustment)+1 == user_data->num_items)
- && (gtk_adjustment_get_value(user_data->dlg.v_scrollbar_adjustment) >= user_data->dlg.first_item ))
- return;
-
- if (user_data->dlg.first_item == gtk_adjustment_get_value(user_data->dlg.v_scrollbar_adjustment))
- return;
-
- user_data->dlg.first_item = (guint32) gtk_adjustment_get_value(user_data->dlg.v_scrollbar_adjustment);
-
- dialog_graph_redraw(user_data);
-
- return;
-}
-
-/****************************************************************************/
-static void create_draw_area(graph_analysis_data_t *user_data, GtkWidget *box)
-{
- GtkWidget *hbox;
- GtkWidget *hpane_l;
- GtkWidget *viewport;
- GtkWidget *viewport_time;
- GtkWidget *viewport_comments;
- GtkWidget *scroll_vbox;
- GtkWidget *frame_box;
- GtkRequisition scroll_requisition;
- GtkWidget *frame;
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_widget_show(hbox);
-
- /* create "time" draw area */
- user_data->dlg.draw_area_time = gtk_drawing_area_new();
- gtk_widget_set_size_request(user_data->dlg.draw_area_time, TIME_WIDTH, user_data->dlg.surface_height);
- /* creating time scroll window to enable mouse scroll */
- user_data->dlg.scroll_window_time = gtk_scrolled_window_new(NULL, NULL);
- gtk_widget_set_size_request(user_data->dlg.scroll_window_time, TIME_WIDTH, user_data->dlg.surface_height);
-
- /* create "comments" draw area */
- user_data->dlg.draw_area_comments = gtk_drawing_area_new();
- gtk_widget_set_size_request(user_data->dlg.draw_area_comments, COMMENT_WIDTH, user_data->dlg.surface_height);
- user_data->dlg.scroll_window_comments = gtk_scrolled_window_new(NULL, NULL);
- gtk_widget_set_size_request(user_data->dlg.scroll_window_comments, (gint)(COMMENT_WIDTH/1.5), user_data->dlg.surface_height);
- /*
- * Set the scrollbar policy for the horizontal and vertical scrollbars
- * The policy determines when the scrollbar should appear
- */
-
- /* we only want mouse scroll from this window */
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (user_data->dlg.scroll_window_time),
- GTK_POLICY_NEVER, /* Policy for horizontal bar. */
- GTK_POLICY_NEVER); /* Policy for vertical bar */
-
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (user_data->dlg.scroll_window_comments),
- GTK_POLICY_ALWAYS, /* Policy for horizontal bar. */
- GTK_POLICY_NEVER); /* Policy for vertical bar */
-
- /* Changes the type of shadow drawn around the contents of scrolled_window. */
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(user_data->dlg.scroll_window_time),
- GTK_SHADOW_ETCHED_IN);
-
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(user_data->dlg.scroll_window_comments),
- GTK_SHADOW_ETCHED_IN);
-
- g_signal_connect(gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(user_data->dlg.scroll_window_comments)),
- "value-changed", G_CALLBACK(comments_area_scrolled), user_data);
-
- viewport_time = gtk_viewport_new(gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(user_data->dlg.scroll_window_time)),
- gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(user_data->dlg.scroll_window_time)));
- viewport_comments = gtk_viewport_new(gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(user_data->dlg.scroll_window_comments)),
- gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(user_data->dlg.scroll_window_comments)));
- gtk_container_add(GTK_CONTAINER(viewport_time), user_data->dlg.draw_area_time);
- gtk_container_add(GTK_CONTAINER(user_data->dlg.scroll_window_time), viewport_time);
- gtk_container_add(GTK_CONTAINER(viewport_comments), user_data->dlg.draw_area_comments);
- gtk_container_add(GTK_CONTAINER(user_data->dlg.scroll_window_comments), viewport_comments);
- gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport_comments), GTK_SHADOW_NONE);
- gtk_widget_add_events (user_data->dlg.draw_area_comments, GDK_BUTTON_PRESS_MASK);
-
- /* create main Graph draw area */
- user_data->dlg.draw_area = gtk_drawing_area_new();
- /* allow a little extra space (2*NODE_WIDTH) for wide labels */
- user_data->dlg.surface_width = user_data->graph_info->num_nodes * NODE_WIDTH + 2*NODE_WIDTH;
- gtk_widget_set_size_request(user_data->dlg.draw_area, user_data->dlg.surface_width, user_data->dlg.surface_height);
- user_data->dlg.scroll_window = gtk_scrolled_window_new(NULL, NULL);
- if ( user_data->graph_info->num_nodes < 6)
- gtk_widget_set_size_request(user_data->dlg.scroll_window, NODE_WIDTH*user_data->graph_info->num_nodes, user_data->dlg.surface_height);
- else
- gtk_widget_set_size_request(user_data->dlg.scroll_window, NODE_WIDTH*5, user_data->dlg.surface_height);
-
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(user_data->dlg.scroll_window),
- GTK_POLICY_ALWAYS,
- GTK_POLICY_NEVER);
-
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(user_data->dlg.scroll_window),
- GTK_SHADOW_ETCHED_IN);
-
- g_signal_connect(gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(user_data->dlg.scroll_window)),
- "value-changed", G_CALLBACK(draw_area_scrolled), user_data);
-
- g_signal_connect(user_data->dlg.scroll_window, "scroll_event", G_CALLBACK(mouse_scrolled), user_data);
- g_signal_connect(user_data->dlg.scroll_window_time, "scroll_event", G_CALLBACK(mouse_scrolled), user_data);
- g_signal_connect(user_data->dlg.scroll_window_comments, "scroll_event", G_CALLBACK(mouse_scrolled), user_data);
-
- viewport = gtk_viewport_new(gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(user_data->dlg.scroll_window)),
- gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(user_data->dlg.scroll_window)));
- gtk_container_add(GTK_CONTAINER(viewport), user_data->dlg.draw_area);
- gtk_container_add(GTK_CONTAINER(user_data->dlg.scroll_window), viewport);
- gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport_time), GTK_SHADOW_NONE);
- gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE);
- gtk_widget_set_can_focus(user_data->dlg.draw_area, TRUE);
- gtk_widget_grab_focus(user_data->dlg.draw_area);
-
- /* signals needed to handle backing pixmap */
-#if GTK_CHECK_VERSION(3,0,0)
- g_signal_connect(user_data->dlg.draw_area, "draw", G_CALLBACK(draw_area_draw), user_data);
-#else
- g_signal_connect(user_data->dlg.draw_area, "expose_event", G_CALLBACK(expose_event), user_data);
-#endif
- g_signal_connect(user_data->dlg.draw_area, "configure_event", G_CALLBACK(configure_event), user_data);
-
- /* signals needed to handle backing pixmap comments */
-#if GTK_CHECK_VERSION(3,0,0)
- g_signal_connect(user_data->dlg.draw_area_comments, "draw", G_CALLBACK(draw_comments), user_data);
-#else
- g_signal_connect(user_data->dlg.draw_area_comments, "expose_event", G_CALLBACK(expose_event_comments), user_data);
-#endif
- g_signal_connect(user_data->dlg.draw_area_comments, "configure_event", G_CALLBACK(configure_event_comments), user_data);
-
- /* signals needed to handle backing pixmap time */
-#if GTK_CHECK_VERSION(3,0,0)
- g_signal_connect(user_data->dlg.draw_area_time, "draw", G_CALLBACK(draw_time), user_data);
-#else
- g_signal_connect(user_data->dlg.draw_area_time, "expose_event", G_CALLBACK(expose_event_time), user_data);
-#endif
- g_signal_connect(user_data->dlg.draw_area_time, "configure_event", G_CALLBACK(configure_event_time), user_data);
-
- gtk_widget_add_events (user_data->dlg.draw_area, GDK_BUTTON_PRESS_MASK);
- g_signal_connect(user_data->dlg.draw_area, "button_press_event", G_CALLBACK(button_press_event), user_data);
- g_signal_connect(user_data->dlg.draw_area, "key_press_event", G_CALLBACK(key_press_event), user_data);
-
- gtk_widget_show(user_data->dlg.draw_area_time);
- gtk_widget_show(viewport_time);
- gtk_widget_show(user_data->dlg.draw_area);
- gtk_widget_show(viewport);
- gtk_widget_show(user_data->dlg.draw_area_comments);
- gtk_widget_show(viewport_comments);
-
- gtk_widget_show(user_data->dlg.scroll_window);
- gtk_widget_show(user_data->dlg.scroll_window_time);
- gtk_widget_show(user_data->dlg.scroll_window_comments);
-
- user_data->dlg.hpane = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_paned_pack1(GTK_PANED (user_data->dlg.hpane), user_data->dlg.scroll_window, FALSE, TRUE);
- gtk_paned_pack2(GTK_PANED (user_data->dlg.hpane), user_data->dlg.scroll_window_comments, TRUE, TRUE);
- g_signal_connect(user_data->dlg.hpane, "notify::position", G_CALLBACK(pane_callback), user_data);
- gtk_widget_show(user_data->dlg.hpane);
-
- /* Allow the hbox with time to expand (TRUE, TRUE) */
- hpane_l = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_paned_pack1(GTK_PANED (hpane_l), user_data->dlg.scroll_window_time, FALSE, TRUE);
- gtk_paned_pack2(GTK_PANED (hpane_l), user_data->dlg.hpane, TRUE, TRUE);
- g_signal_connect(hpane_l, "notify::position", G_CALLBACK(pane_callback), user_data);
- gtk_widget_show(hpane_l);
-
- gtk_box_pack_start(GTK_BOX(hbox), hpane_l, TRUE, TRUE, 0);
-
- /* Create the scroll_vbox to include the vertical scroll and a box at the bottom */
- scroll_vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_widget_show(scroll_vbox);
-
- /* create the associated v_scrollbar */
- user_data->dlg.v_scrollbar_adjustment = (GtkAdjustment *)gtk_adjustment_new(0, 0, 0, 0, 0, 0);
- user_data->dlg.v_scrollbar = gtk_scrollbar_new(GTK_ORIENTATION_VERTICAL, user_data->dlg.v_scrollbar_adjustment);
- gtk_widget_show(user_data->dlg.v_scrollbar);
- gtk_box_pack_start(GTK_BOX(scroll_vbox), user_data->dlg.v_scrollbar, TRUE, TRUE, 0);
- g_signal_connect(user_data->dlg.v_scrollbar_adjustment, "value_changed",
- G_CALLBACK(v_scrollbar_changed), user_data);
-
- frame_box = gtk_frame_new(NULL);
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_get_preferred_size(user_data->dlg.v_scrollbar, &scroll_requisition, NULL);
-#else
- gtk_widget_size_request(user_data->dlg.v_scrollbar, &scroll_requisition);
-#endif
- gtk_widget_set_size_request(frame_box, 1, scroll_requisition.width+2);
- gtk_frame_set_shadow_type(GTK_FRAME(frame_box), GTK_SHADOW_NONE);
- gtk_widget_show(frame_box);
- gtk_box_pack_end(GTK_BOX(scroll_vbox), frame_box, FALSE, FALSE, 0);
- gtk_box_pack_end(GTK_BOX(hbox), scroll_vbox, FALSE, FALSE, 3);
-
- /* Frame around the main area */
- frame = gtk_frame_new(NULL);
- gtk_widget_show(frame);
- gtk_container_add(GTK_CONTAINER(frame), hbox);
- gtk_container_set_border_width(GTK_CONTAINER(hbox), 3);
-
- /*gtk_box_pack_start(GTK_BOX(box), hbox, TRUE, TRUE, 15);*/
- /*gtk_box_pack_start(GTK_BOX(box), frame, TRUE, TRUE, 15);*/
- gtk_box_pack_start(GTK_BOX(box), frame, TRUE, TRUE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(box), 10);
-}
-/****************************************************************************/
-/* PUBLIC */
-/****************************************************************************/
-
-
-/****************************************************************************/
-static void dialog_graph_create_window(graph_analysis_data_t *user_data)
-{
- GtkWidget *vbox;
- GtkWidget *hbuttonbox;
- GtkWidget *bt_close;
- GtkWidget *bt_save;
- gchar *title_name_ptr;
- gchar *win_name;
-
- title_name_ptr = cf_get_display_name(&cfile);
- win_name = g_strdup_printf("%s - Graph Analysis", title_name_ptr);
- g_free(title_name_ptr);
-
- /* create the main window */
- user_data->dlg.window = dlg_window_new((user_data->dlg.title)?user_data->dlg.title:win_name);
- gtk_window_set_destroy_with_parent(GTK_WINDOW(user_data->dlg.window), TRUE);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(user_data->dlg.window), vbox);
- gtk_widget_show(vbox);
-
- create_draw_area(user_data, vbox);
-
- /* button row */
- hbuttonbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_start (GTK_BOX (vbox), hbuttonbox, FALSE, FALSE, 10);
- gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox), GTK_BUTTONBOX_SPREAD);
- gtk_box_set_spacing (GTK_BOX (hbuttonbox), 30);
- gtk_widget_show(hbuttonbox);
-
- bt_save = ws_gtk_button_new_from_stock(GTK_STOCK_SAVE_AS);
- gtk_box_pack_start(GTK_BOX(hbuttonbox), bt_save, TRUE, TRUE, 0);
- gtk_widget_show(bt_save);
- g_signal_connect(bt_save, "clicked", G_CALLBACK(on_save_bt_clicked), user_data);
- gtk_widget_set_tooltip_text(bt_save, "Save an ASCII representation of the graph to a file");
-
- bt_close = ws_gtk_button_new_from_stock(GTK_STOCK_CLOSE);
- gtk_box_pack_start(GTK_BOX(hbuttonbox), bt_close, TRUE, TRUE, 0);
- gtk_widget_set_can_default(bt_close, TRUE);
- gtk_widget_show(bt_close);
- gtk_widget_set_tooltip_text(bt_close, "Close this dialog");
- window_set_cancel_button(user_data->dlg.window, bt_close, window_cancel_button_cb);
-
- g_signal_connect(user_data->dlg.window, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(user_data->dlg.window, "destroy", G_CALLBACK(on_destroy), user_data);
-
- gtk_widget_show(user_data->dlg.window);
- window_present(user_data->dlg.window);
-
- /* Destroy our graph window with our parent if the caller specified the parent */
- if(user_data->dlg.parent_w) {
- gtk_window_set_transient_for(GTK_WINDOW(user_data->dlg.window),
- GTK_WINDOW(user_data->dlg.parent_w));
- /* Destruction of this child window */
- gtk_window_set_destroy_with_parent(GTK_WINDOW(user_data->dlg.window), TRUE);
- }
- g_free(win_name);
-}
-
-/****************************************************************************/
-graph_analysis_data_t *graph_analysis_init(seq_analysis_info_t *sainfo)
-{
- graph_analysis_data_t *user_data;
- /* init */
- user_data = g_new0(graph_analysis_data_t,1);
- user_data->graph_info = sainfo;
-
- /* init user_data */
- graph_analysis_init_dlg(user_data);
-
- return user_data;
-}
-/****************************************************************************/
-/* PUBLIC */
-/****************************************************************************/
-
-/****************************************************************************/
-void graph_analysis_create(graph_analysis_data_t *user_data)
-{
- /* reset the data */
- graph_analysis_reset(user_data);
-
- /* get nodes (each node is an address) */
- user_data->num_items = sequence_analysis_get_nodes(user_data->graph_info);
-
- /* create the graph windows */
- dialog_graph_create_window(user_data);
-
- /* redraw the graph */
- dialog_graph_redraw(user_data);
-
- return;
-}
-
-/****************************************************************************/
-void graph_analysis_update(graph_analysis_data_t *user_data)
-{
- /* reset the data */
- graph_analysis_reset(user_data);
-
- /* get nodes (each node is an address) */
- user_data->num_items = sequence_analysis_get_nodes(user_data->graph_info);
-
- user_data->dlg.surface_width = user_data->graph_info->num_nodes * NODE_WIDTH;
- gtk_widget_set_size_request(user_data->dlg.draw_area, user_data->dlg.surface_width, user_data->dlg.surface_height);
- if (user_data->graph_info->num_nodes < 6)
- gtk_widget_set_size_request(user_data->dlg.scroll_window, NODE_WIDTH*user_data->graph_info->num_nodes, user_data->dlg.surface_height);
- else
- gtk_widget_set_size_request(user_data->dlg.scroll_window, NODE_WIDTH*5, user_data->dlg.surface_height);
-
- /* redraw the graph */
- dialog_graph_redraw(user_data);
-
- window_present(user_data->dlg.window);
- return;
-}
-
-
-/****************************************************************************/
-void graph_analysis_redraw(graph_analysis_data_t *user_data)
-{
- /* get nodes (each node is an address) */
- user_data->num_items = sequence_analysis_get_nodes(user_data->graph_info);
-
- user_data->dlg.surface_width = user_data->graph_info->num_nodes * NODE_WIDTH;
- gtk_widget_set_size_request(user_data->dlg.draw_area, user_data->dlg.surface_width, user_data->dlg.surface_height);
- if (user_data->graph_info->num_nodes < 6)
- gtk_widget_set_size_request(user_data->dlg.scroll_window, NODE_WIDTH*user_data->graph_info->num_nodes, user_data->dlg.surface_height);
- else
- gtk_widget_set_size_request(user_data->dlg.scroll_window, NODE_WIDTH*5, user_data->dlg.surface_height);
-
-
- /* redraw the graph */
- dialog_graph_redraw(user_data);
-
- window_present(user_data->dlg.window);
- return;
-}
-
-/*
- * 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/gtk/graph_analysis.h b/ui/gtk/graph_analysis.h
deleted file mode 100644
index a715ed1944..0000000000
--- a/ui/gtk/graph_analysis.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/* graph_analysis.h
- * Graphic Analysis addition for Wireshark
- *
- * Copyright 2004, Verso Technologies Inc.
- * By Alejandro Vaquero <alejandrovaquero@yahoo.com>
- *
- * based on rtp_analysis.c and io_stat
- *
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __GRAPH_ANALYSIS_H__
-#define __GRAPH_ANALYSIS_H__
-
-#include <glib.h>
-#include <gtk/gtk.h>
-#include <epan/address.h>
-#include <epan/sequence_analysis.h>
-
-/** max number of nodes to display, each node will be an IP address */
-#define MAX_NUM_COL_CONV 10
-#define NUM_DISPLAY_ITEMS 1000
-
-typedef struct _display_items {
- guint32 frame_number; /**< frame number */
- guint16 port_src;
- guint16 port_dst;
- gchar *frame_label; /**< the label on top of the arrow */
- gchar *time_str; /**< timestamp */
- gchar *comment; /**< a comment that appears at the right of the graph */
- guint16 conv_num; /**< the conversation number, each conversation will be colored */
- guint16 src_node; /**< this is used by graph_analysis.c to identify the node */
- guint16 dst_node; /**< a node is an IP address that will be displayed in columns */
- guint16 line_style; /**< the arrow line width in pixels*/
-} display_items_t;
-
-typedef struct _graph_analysis_dialog_data_t {
- GtkWidget *window;
- GtkWidget *parent_w;
- gboolean needs_redraw;
- gboolean inverse; /**< set the nodes in reverse mode as "dst <---- src" instead of "src ----> dst"*/
- gint selected_row;
- GtkWidget *draw_area_time;
- GtkWidget *draw_area;
- GtkWidget *draw_area_comments;
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_surface_t *surface_time;
- cairo_surface_t *surface_main;
- cairo_surface_t *surface_comments;
- cairo_surface_t *surface_tile_select;
-#else
- GdkPixmap *pixmap_time;
- GdkPixmap *pixmap_main;
- GdkPixmap *pixmap_comments;
- GdkPixmap *pixmap_tile_select;
-#endif
- GtkWidget *scroll_window;
- GtkWidget *scroll_window_time; /**< to enable mouse scroll from this area */
- GtkWidget *scroll_window_comments; /**< to enable mouse scroll from this area */
- GtkWidget *v_scrollbar;
- GtkAdjustment *v_scrollbar_adjustment;
- GtkWidget *hpane;
- int surface_width;
- int surface_height;
- guint16 first_node; /**< the first node on the left to show in the screen */
- guint32 first_item; /**< the first item (row) to show from the top */
- guint32 last_item; /**< the last item displayed (for correct mouse scroll handling) */
- guint32 selected_item; /**< the selected item */
- display_items_t items[NUM_DISPLAY_ITEMS];
- guint32 left_x_border;
- char *title; /**< Graph analysis window's title */
-} graph_analysis_dialog_data_t;
-
-typedef void (*destroy_user_data_cb)(void *data);
-
-/** structure that holds general information and the dialog */
-typedef struct _graph_analysis_data_t {
- /**> graphic data */
- seq_analysis_info_t *graph_info;
-
- /**> dialog associated data */
- graph_analysis_dialog_data_t dlg;
- guint32 num_items;
- destroy_user_data_cb on_destroy_user_data; /**< callback info for destroy */
- void *data; /**< data to be passed when on destroy */
-} graph_analysis_data_t;
-
-graph_analysis_data_t* graph_analysis_init(seq_analysis_info_t *sainfo);
-void graph_analysis_create(graph_analysis_data_t* user_data);
-void graph_analysis_update(graph_analysis_data_t* user_data);
-void graph_analysis_redraw(graph_analysis_data_t* user_data);
-
-
-#endif /* __GRAPH_ANALYSIS_H__ */
diff --git a/ui/gtk/gsm_map_summary.c b/ui/gtk/gsm_map_summary.c
deleted file mode 100644
index e258889731..0000000000
--- a/ui/gtk/gsm_map_summary.c
+++ /dev/null
@@ -1,429 +0,0 @@
-/* gsm_map_summary.c
- * Routines for GSM MAP Statictics summary window
- *
- * Copyright 2004, Michael Lum <mlum [AT] telostech.com>
- * In association with Telos Technology Inc.
- *
- * Modified from summary_dlg.c
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/packet.h>
-#include <epan/tap.h>
-#include <epan/asn1.h>
-#include <epan/dissectors/packet-gsm_map.h>
-
-#include "globals.h"
-
-#include "ui/simple_dialog.h"
-#include "ui/summary.h"
-
-#include <epan/stat_tap_ui.h>
-#include "ui/gtk/gui_stat_menu.h"
-
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_utils.h"
-
-/** Gsm map statistic data */
-typedef struct _gsm_map_stat_t {
- int opr_code[GSM_MAP_MAX_NUM_OPR_CODES];
- int size[GSM_MAP_MAX_NUM_OPR_CODES];
-
- int opr_code_rr[GSM_MAP_MAX_NUM_OPR_CODES];
- int size_rr[GSM_MAP_MAX_NUM_OPR_CODES];
-} gsm_map_stat_t;
-
-gsm_map_stat_t gsm_map_stat;
-
-#define SUM_STR_MAX 1024
-
-void register_tap_listener_gtk_gsm_map_summary(void);
-
-static void
-add_string_to_box(gchar *str, GtkWidget *box)
-{
- GtkWidget *lb;
- lb = gtk_label_new(str);
- gtk_misc_set_alignment(GTK_MISC(lb), 0.0f, 0.5f);
- gtk_box_pack_start(GTK_BOX(box), lb,FALSE,FALSE, 0);
- gtk_widget_show(lb);
-}
-
-void gsm_map_stat_gtk_sum_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- summary_tally summary;
- GtkWidget *sum_open_w,
- *main_vb, *file_fr, *data_fr, *file_box,
- *data_box, *bbox, *close_bt,
- *invoke_fr, *invoke_box,
- *rr_fr, *rr_box,
- *tot_fr, *tot_box;
-
- gchar string_buff[SUM_STR_MAX];
- double seconds;
- int i;
- int tot_invokes, tot_rr;
- double tot_invokes_size, tot_rr_size;
-
- if (cfile.state == FILE_CLOSED) {
- return;
- }
-
- /* initialize the tally */
- summary_fill_in(&cfile, &summary);
-
- /* initial computations */
- seconds = summary.stop_time - summary.start_time;
-
- sum_open_w = dlg_window_new("GSM MAP Statistics: Summary"); /* transient_for top_level */
- gtk_window_set_destroy_with_parent (GTK_WINDOW(sum_open_w), TRUE);
-
- /* Container for each row of widgets */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_container_add(GTK_CONTAINER(sum_open_w), main_vb);
- gtk_widget_show(main_vb);
-
- /* File frame */
- file_fr = gtk_frame_new("File");
- gtk_box_pack_start(GTK_BOX (main_vb), file_fr, TRUE, TRUE, 0);
- gtk_widget_show(file_fr);
-
- file_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_add(GTK_CONTAINER(file_fr), file_box);
- gtk_widget_show(file_box);
-
- /* filename */
- g_snprintf(string_buff, SUM_STR_MAX, "Name: %s", ((summary.filename) ? summary.filename : "None"));
- add_string_to_box(string_buff, file_box);
-
- /* length */
- g_snprintf(string_buff, SUM_STR_MAX, "Length: %" G_GINT64_MODIFIER "d", summary.file_length);
- add_string_to_box(string_buff, file_box);
-
- /* format */
- g_snprintf(string_buff, SUM_STR_MAX, "Format: %s", wtap_file_type_subtype_string(summary.file_type));
- add_string_to_box(string_buff, file_box);
-
- if (summary.snap != 0) {
- /* snapshot length */
- g_snprintf(string_buff, SUM_STR_MAX, "Snapshot length: %u", summary.snap);
- add_string_to_box(string_buff, file_box);
- }
-
- /* Data frame */
- data_fr = gtk_frame_new("Data");
- gtk_box_pack_start(GTK_BOX (main_vb), data_fr, TRUE, TRUE, 0);
- gtk_widget_show(data_fr);
-
- data_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_add(GTK_CONTAINER(data_fr), data_box);
- gtk_widget_show(data_box);
-
- /*
- * We must have no un-time-stamped packets (i.e., the number of
- * time-stamped packets must be the same as the number of packets),
- * and at least two time-stamped packets, in order for the elapsed
- * time to be valid.
- */
- if (summary.packet_count_ts == summary.packet_count &&
- summary.packet_count_ts >= 2) {
- /* seconds */
- g_snprintf(string_buff, SUM_STR_MAX, "Elapsed time: %.3f seconds", summary.elapsed_time);
- add_string_to_box(string_buff, data_box);
-
- g_snprintf(string_buff, SUM_STR_MAX, "Between first and last packet: %.3f seconds", seconds);
- add_string_to_box(string_buff, data_box);
- }
-
- /* Packet count */
- g_snprintf(string_buff, SUM_STR_MAX, "Packet count: %i", summary.packet_count);
- add_string_to_box(string_buff, data_box);
-
- tot_invokes = 0;
- tot_invokes_size = 0;
- for (i=0; i < GSM_MAP_MAX_NUM_OPR_CODES; i++)
- {
- tot_invokes += gsm_map_stat.opr_code[i];
- tot_invokes_size += gsm_map_stat.size[i];
- }
-
- tot_rr = 0;
- tot_rr_size = 0;
- for (i=0; i < GSM_MAP_MAX_NUM_OPR_CODES; i++)
- {
- tot_rr += gsm_map_stat.opr_code_rr[i];
- tot_rr_size += gsm_map_stat.size_rr[i];
- }
-
- /* Invoke frame */
- invoke_fr = gtk_frame_new("Invokes");
- gtk_box_pack_start(GTK_BOX (main_vb), invoke_fr, TRUE, TRUE, 0);
- gtk_widget_show(invoke_fr);
-
- invoke_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_add(GTK_CONTAINER(invoke_fr), invoke_box);
- gtk_widget_show(invoke_box);
-
- /* Total number of invokes */
- g_snprintf(string_buff, SUM_STR_MAX, "Total number of Invokes: %u", tot_invokes);
- add_string_to_box(string_buff, invoke_box);
-
- /*
- * We must have no un-time-stamped packets (i.e., the number of
- * time-stamped packets must be the same as the number of packets),
- * and at least two time-stamped packets, in order for the elapsed
- * time to be valid.
- */
- if (summary.packet_count_ts == summary.packet_count &&
- summary.packet_count_ts >= 2) {
- /* Total number of invokes per second */
- if (seconds)
- g_snprintf(string_buff, SUM_STR_MAX, "Total number of Invokes per second: %.2f", tot_invokes/seconds);
- else
- g_snprintf(string_buff, SUM_STR_MAX, "Total number of Invokes per second: N/A");
- add_string_to_box(string_buff, invoke_box);
- }
-
- /* Total size of invokes */
- g_snprintf(string_buff, SUM_STR_MAX, "Total number of bytes for Invokes: %.0f", tot_invokes_size);
- add_string_to_box(string_buff, invoke_box);
-
- /* Average size of invokes */
- if (tot_invokes)
- g_snprintf(string_buff, SUM_STR_MAX, "Average number of bytes per Invoke: %.2f", tot_invokes_size/tot_invokes);
- else
- g_snprintf(string_buff, SUM_STR_MAX, "Average number of bytes per Invoke: N/A");
- add_string_to_box(string_buff, invoke_box);
-
- /*
- * We must have no un-time-stamped packets (i.e., the number of
- * time-stamped packets must be the same as the number of packets),
- * and at least two time-stamped packets, in order for the elapsed
- * time to be valid.
- */
- if (summary.packet_count_ts == summary.packet_count &&
- summary.packet_count_ts >= 2) {
- /* Average size of invokes per second */
- if (seconds)
- g_snprintf(string_buff, SUM_STR_MAX, "Average number of bytes per second: %.2f", tot_invokes_size/seconds);
- else
- g_snprintf(string_buff, SUM_STR_MAX, "Average number of bytes per second: N/A");
- add_string_to_box(string_buff, invoke_box);
- }
-
- /* Return Results frame */
- rr_fr = gtk_frame_new("Return Results");
- gtk_box_pack_start(GTK_BOX (main_vb), rr_fr, TRUE, TRUE, 0);
- gtk_widget_show(rr_fr);
-
- rr_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_add(GTK_CONTAINER(rr_fr), rr_box);
- gtk_widget_show(rr_box);
-
- /* Total number of return results */
- g_snprintf(string_buff, SUM_STR_MAX, "Total number of Return Results: %u", tot_rr);
- add_string_to_box(string_buff, rr_box);
-
- /*
- * We must have no un-time-stamped packets (i.e., the number of
- * time-stamped packets must be the same as the number of packets),
- * and at least two time-stamped packets, in order for the elapsed
- * time to be valid.
- */
- if (summary.packet_count_ts == summary.packet_count &&
- summary.packet_count_ts >= 2) {
- /* Total number of return results per second */
- if (seconds)
- g_snprintf(string_buff, SUM_STR_MAX, "Total number of Return Results per second: %.2f", tot_rr/seconds);
- else
- g_snprintf(string_buff, SUM_STR_MAX, "Total number of Return Results per second: N/A");
- add_string_to_box(string_buff, rr_box);
- }
-
- /* Total size of return results */
- g_snprintf(string_buff, SUM_STR_MAX, "Total number of bytes for Return Results: %.0f", tot_rr_size);
- add_string_to_box(string_buff, rr_box);
-
- /* Average size of return results */
- if (tot_rr)
- g_snprintf(string_buff, SUM_STR_MAX, "Average number of bytes per Return Result: %.2f", tot_rr_size/tot_rr);
- else
- g_snprintf(string_buff, SUM_STR_MAX, "Average number of bytes per Return Result: N/A");
- add_string_to_box(string_buff, rr_box);
-
- /*
- * We must have no un-time-stamped packets (i.e., the number of
- * time-stamped packets must be the same as the number of packets),
- * and at least two time-stamped packets, in order for the elapsed
- * time to be valid.
- */
- if (summary.packet_count_ts == summary.packet_count &&
- summary.packet_count_ts >= 2) {
- /* Average size of return results per second */
- if (seconds)
- g_snprintf(string_buff, SUM_STR_MAX, "Average number of bytes per second: %.2f", tot_rr_size/seconds);
- else
- g_snprintf(string_buff, SUM_STR_MAX, "Average number of bytes per second: N/A");
- add_string_to_box(string_buff, rr_box);
- }
-
- /* Totals frame */
- tot_fr = gtk_frame_new("Totals");
- gtk_box_pack_start(GTK_BOX (main_vb), tot_fr, TRUE, TRUE, 0);
- gtk_widget_show(tot_fr);
-
- tot_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_add(GTK_CONTAINER(tot_fr), tot_box);
- gtk_widget_show(tot_box);
-
- /* Total number of return results */
- g_snprintf(string_buff, SUM_STR_MAX, "Total number of GSM MAP messages: %u", tot_invokes + tot_rr);
- add_string_to_box(string_buff, tot_box);
-
- /*
- * We must have no un-time-stamped packets (i.e., the number of
- * time-stamped packets must be the same as the number of packets),
- * and at least two time-stamped packets, in order for the elapsed
- * time to be valid.
- */
- if (summary.packet_count_ts == summary.packet_count &&
- summary.packet_count_ts >= 2) {
- if (seconds)
- g_snprintf(string_buff, SUM_STR_MAX, "Total number of GSM MAP messages per second: %.2f",
- (tot_invokes + tot_rr)/seconds);
- else
- g_snprintf(string_buff, SUM_STR_MAX, "Total number of GSM MAP messages per second: N/A");
- add_string_to_box(string_buff, tot_box);
- }
-
- g_snprintf(string_buff, SUM_STR_MAX, "Total number of bytes for GSM MAP messages: %.0f", tot_invokes_size + tot_rr_size);
- add_string_to_box(string_buff, tot_box);
-
- if (tot_invokes + tot_rr)
- g_snprintf(string_buff, SUM_STR_MAX, "Average number of bytes per GSM MAP messages: %.2f",
- (tot_invokes_size + tot_rr_size)/(tot_invokes + tot_rr));
- else
- g_snprintf(string_buff, SUM_STR_MAX, "Average number of bytes per GSM MAP messages: N/A");
- add_string_to_box(string_buff, tot_box);
-
- /*
- * We must have no un-time-stamped packets (i.e., the number of
- * time-stamped packets must be the same as the number of packets),
- * and at least two time-stamped packets, in order for the elapsed
- * time to be valid.
- */
- if (summary.packet_count_ts == summary.packet_count &&
- summary.packet_count_ts >= 2) {
- if (seconds)
- g_snprintf(string_buff, SUM_STR_MAX, "Average number of bytes second: %.2f",
- (tot_invokes_size + tot_rr_size)/seconds);
- else
- g_snprintf(string_buff, SUM_STR_MAX, "Average number of bytes second: N/A");
- add_string_to_box(string_buff, tot_box);
- }
-
- /* Button row. */
- bbox = dlg_button_row_new(GTK_STOCK_CLOSE, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, TRUE, TRUE, 0);
- gtk_widget_show(bbox);
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(sum_open_w, close_bt, window_cancel_button_cb);
-
- g_signal_connect(sum_open_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
-
- gtk_widget_show(sum_open_w);
- window_present(sum_open_w);
-}
-
-static void
-gsm_map_summary_reset(void *tapdata)
-{
- gsm_map_stat_t *stat_p = (gsm_map_stat_t *)tapdata;
-
- memset(stat_p, 0, sizeof(gsm_map_stat_t));
-}
-
-
-static gboolean
-gsm_map_summary_packet(
- void *tapdata,
- packet_info *pinfo _U_,
- epan_dissect_t *edt _U_,
- const void *data)
-{
- gsm_map_stat_t *stat_p = (gsm_map_stat_t *)tapdata;
- const gsm_map_tap_rec_t *data_p = (const gsm_map_tap_rec_t *)data;
-
- if (data_p->invoke)
- {
- stat_p->opr_code[data_p->opcode]++;
- stat_p->size[data_p->opcode] += data_p->size;
- }
- else
- {
- stat_p->opr_code_rr[data_p->opcode]++;
- stat_p->size_rr[data_p->opcode] += data_p->size;
- }
-
- return(FALSE); /* We have no draw callback */
-}
-
-void
-register_tap_listener_gtk_gsm_map_summary(void)
-{
- GString *err_p;
-
- memset((void *) &gsm_map_stat, 0, sizeof(gsm_map_stat_t));
-
- err_p =
- register_tap_listener("gsm_map", &gsm_map_stat, NULL, 0,
- gsm_map_summary_reset,
- gsm_map_summary_packet,
- NULL);
-
- if (err_p != NULL)
- {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_p->str);
- g_string_free(err_p, TRUE);
-
- exit(1);
- }
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local Variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/gtk_iface_monitor.c b/ui/gtk/gtk_iface_monitor.c
deleted file mode 100644
index fe465182da..0000000000
--- a/ui/gtk/gtk_iface_monitor.c
+++ /dev/null
@@ -1,127 +0,0 @@
-/* gtk_iface_monitor.c
- * interface monitor by Pontus Fuchs <pontus.fuchs@gmail.com>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#ifdef HAVE_LIBPCAP
-
-#include <string.h>
-
-#include <glib.h>
-
-#include <caputils/iface_monitor.h>
-
-#include "capture_opts.h"
-
-#include "ui/capture_globals.h"
-#include "ui/iface_lists.h"
-
-#include "ui/gtk/capture_dlg.h"
-#include "ui/gtk/gtk_iface_monitor.h"
-
-GIOChannel *iface_mon_channel;
-
-static void
-gtk_iface_mon_event_cb(const char *iface, int up)
-{
- int present = 0;
- guint ifs, j;
- interface_t device;
- interface_options interface_opts;
-
- for (ifs = 0; ifs < global_capture_opts.all_ifaces->len; ifs++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, ifs);
- if (strcmp(device.name, iface) == 0) {
- present = 1;
- if (!up) {
- /*
- * Interface went down or disappeared; remove all instances
- * of it from the current list of interfaces selected
- * for capturing.
- */
- for (j = 0; j < global_capture_opts.ifaces->len; j++) {
- interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, j);
- if (strcmp(interface_opts.name, device.name) == 0) {
- g_array_remove_index(global_capture_opts.ifaces, j);
- }
- }
- }
- }
- }
-
- if (present == up)
- return;
-
- /*
- * We've been told that there's a new interface or that an old
- * interface is gone; reload the list and refresh all places
- * that are displaying the list.
- */
- refresh_local_interface_lists();
-}
-
-static gboolean
-gtk_iface_mon_event(GIOChannel *source _U_, GIOCondition condition _U_, gpointer data _U_)
-{
- iface_mon_event();
- return TRUE;
-}
-
-int
-gtk_iface_mon_start(void)
-{
- int sock, err;
- err = iface_mon_start(&gtk_iface_mon_event_cb);
- if (err)
- return err;
- sock = iface_mon_get_sock();
-
- iface_mon_channel = g_io_channel_unix_new(sock);
- g_io_channel_set_encoding(iface_mon_channel, NULL, NULL);
- g_io_add_watch(iface_mon_channel,
- (GIOCondition)(G_IO_IN|G_IO_ERR|G_IO_HUP),
- &gtk_iface_mon_event,
- NULL);
- return 0;
-}
-
-int
-gtk_iface_mon_stop(void)
-{
- iface_mon_stop();
- return 0;
-}
-
-#endif /* HAVE_LIBPCAP */
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/gtk_iface_monitor.h b/ui/gtk/gtk_iface_monitor.h
deleted file mode 100644
index f6f5d989fb..0000000000
--- a/ui/gtk/gtk_iface_monitor.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* gtk_iface_monitor.h
- * interface monitor by Pontus Fuchs <pontus.fuchs@gmail.com>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef GTK_IFACE_MONITOR_H
-#define GTK_IFACE_MONITOR_H
-
-#ifdef HAVE_LIBPCAP
-
-int
-gtk_iface_mon_start(void);
-
-int
-gtk_iface_mon_stop(void);
-
-#endif /* HAVE_LIBPCAP */
-
-#endif
diff --git a/ui/gtk/gtkglobals.h b/ui/gtk/gtkglobals.h
deleted file mode 100644
index e2fac873d7..0000000000
--- a/ui/gtk/gtkglobals.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* gtkglobals.h
- * GTK-related Global defines, etc.
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __GTKGLOBALS_H__
-#define __GTKGLOBALS_H__
-
-/** @mainpage GTK subsystem
- *
- * @section intro Introduction
- *
- * Wireshark uses GTK (the Gimp ToolKit) as its user interface toolkit.
- *
- * See Modules for a list of submodules.
- *
- */
-
-/** @file
- * GTK global definitions. For example a pointer to the main application window.
- */
-
-#include <capchild/capture_session.h>
-#include <capture_info.h>
-
-/** Application window. */
-extern GtkWidget *top_level;
-
-/** Tree view (packet details) pane. */
-extern GtkWidget *tree_view_gbl;
-
-/** Byte notebook (packet bytes) pane. */
-extern GtkWidget *byte_nb_ptr_gbl;
-
-/** The filter text entry in the filter toolbar. */
-extern GtkWidget *main_display_filter_widget;
-
-extern capture_session global_capture_session;
-
-extern info_data_t global_info_data;
-
-#endif
diff --git a/ui/gtk/gui_stat_menu.h b/ui/gtk/gui_stat_menu.h
deleted file mode 100644
index 03beef2a2d..0000000000
--- a/ui/gtk/gui_stat_menu.h
+++ /dev/null
@@ -1,185 +0,0 @@
-/* gui_stat_menu.h
- * GTK+-specific menu definitions for use by stats
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __GTK_STAT_MENU_H__
-#define __GTK_STAT_MENU_H__
-
-#include <epan/proto.h>
-#include <epan/conv_id.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/** @file
- * Add a new menu item for a stat.
- */
-
-const char *
-stat_group_name(register_stat_group_t group);
-
-/**
- * XXX TODO: Rewrite me
- * NOTE comments refere to old menus.c implementation.
- *
- * Same as register_stat_menu_item() but with optional stock item.
- *
- * @param gui_path the path to gui
- *
- * @param name the menu label
- *
- * @param stock_id the stock_id (icon) to show, or NULL
- *
- * @param label the label
- *
- * @param accelerator the accelerator key
- *
- * @param tooltip the tooltip menu
- *
- * @param callback gets called when the menu item is selected; it should do
- * the work of creating the stat window.
- *
- * @param callback_data data for callback function
- *
- * @param enabled enable or not the bar menu
- *
- * @param selected_packet_enabled gets called by set_menus_for_selected_packet();
- * it's passed a pointer to the "frame_data" structure for the current frame,
- * if any, and to the "epan_dissect_t" structure for that frame, if any, and
- * should return TRUE if the stat will work now (which might depend on whether
- * a frame is selected and, if one is, on the frame) and FALSE if not.
- *
- * @param selected_tree_row_enabled gets called by
- * set_menus_for_selected_tree_row(); it's passed a pointer to the
- * "field_info" structure for the currently selected field, if any,
- * and should return TRUE if the stat will work now (which might depend on
- * whether a tree row is selected and, if one is, on the tree row) and
- * FALSE if not.
- */
-void register_menu_bar_menu_items(
- const char *gui_path,
- const char *name,
- const gchar *stock_id,
- const char *label,
- const char *accelerator,
- const gchar *tooltip,
- gpointer callback,
- gpointer callback_data,
- gboolean enabled,
- gboolean (*selected_packet_enabled)(frame_data *, struct epan_dissect *, gpointer callback_data),
- gboolean (*selected_tree_row_enabled)(field_info *, gpointer callback_data));
-
-void eth_endpoints_cb(GtkAction *action, gpointer user_data);
-void fc_endpoints_cb(GtkAction *action, gpointer user_data);
-void fddi_endpoints_cb(GtkAction *action, gpointer user_data);
-void ip_endpoints_cb(GtkAction *action, gpointer user_data);
-void ipv6_endpoints_cb(GtkAction *action, gpointer user_data);
-void ipx_endpoints_cb(GtkAction *action, gpointer user_data);
-void jxta_conversation_cb(GtkAction *action, gpointer user_data);
-void ncp_endpoints_cb(GtkAction *action, gpointer user_data);
-void rsvp_endpoints_cb(GtkAction *action, gpointer user_data);
-void sctp_conversation_cb(GtkAction *action, gpointer user_data);
-void tcpip_conversation_cb(GtkAction *action, gpointer user_data);
-void tr_conversation_cb(GtkAction *action, gpointer user_data);
-void udpip_conversation_cb(GtkAction *action, gpointer user_data);
-void usb_endpoints_cb(GtkAction *action, gpointer user_data);
-void wlan_endpoints_cb(GtkAction *action, gpointer user_data);
-
-void gtk_eth_hostlist_cb(GtkAction *action, gpointer user_data);
-void gtk_fc_hostlist_cb(GtkAction *action, gpointer user_data);
-void gtk_fddi_hostlist_cb(GtkAction *action, gpointer user_data);
-void gtk_ip_hostlist_cb(GtkAction *action, gpointer user_data);
-void gtk_ipv6_hostlist_cb(GtkAction *action, gpointer user_data);
-void gtk_ipx_hostlist_cb(GtkAction *action, gpointer user_data);
-void gtk_jxta_hostlist_cb(GtkAction *action, gpointer user_data);
-void gtk_ncp_hostlist_cb(GtkAction *action, gpointer user_data);
-void gtk_rsvp_hostlist_cb(GtkAction *action, gpointer user_data);
-void gtk_sctp_hostlist_cb(GtkAction *action, gpointer user_data);
-void gtk_tcpip_hostlist_cb(GtkAction *action, gpointer user_data);
-void gtk_tr_hostlist_cb(GtkAction *action, gpointer user_data);
-void gtk_udpip_hostlist_cb(GtkAction *action, gpointer user_data);
-void gtk_usb_hostlist_cb(GtkAction *action, gpointer user_data);
-void gtk_wlan_hostlist_cb(GtkAction *action, gpointer user_data);
-
-void gtk_rpcstat_cb(GtkAction *action, gpointer user_data);
-void gtk_comparestat_cb(GtkAction *action, gpointer user_data);
-
-void flow_graph_launch(GtkAction *action, gpointer user_data);
-
-void iax2_analysis_cb(GtkAction *action, gpointer user_data);
-void mtp3_stat_gtk_cb(GtkAction *action, gpointer user_data);
-void mtp3_sum_gtk_sum_cb(GtkAction *action, gpointer user_data);
-void rtp_analysis_cb(GtkAction *action, gpointer user_data);
-void rtpstream_launch(GtkAction *action, gpointer user_data);
-void sctp_analyse_start(GtkAction *action, gpointer user_data);
-void sctp_stat_start(GtkAction *action, gpointer user_data);
-
-void gui_iostat_cb(GtkAction *action, gpointer user_data);
-
-void voip_calls_launch(GtkAction *action, gpointer user_data);
-void voip_flows_launch(GtkAction *action, gpointer user_data);
-
-void ansi_a_stat_gtk_bsmap_cb(GtkAction *action, gpointer user_data);
-void ansi_a_stat_gtk_dtap_cb(GtkAction *action, gpointer user_data);
-void ansi_map_stat_gtk_cb(GtkAction *action, gpointer user_data);
-
-void gsm_a_stat_gtk_bssmap_cb(GtkAction *action, gpointer user_data);
-void gsm_a_stat_gtk_dtap_mm_cb(GtkAction *action, gpointer user_data);
-void gsm_a_stat_gtk_dtap_rr_cb(GtkAction *action, gpointer user_data);
-void gsm_a_stat_gtk_dtap_cc_cb(GtkAction *action, gpointer user_data);
-void gsm_a_stat_gtk_dtap_gmm_cb(GtkAction *action, gpointer user_data);
-void gsm_a_stat_gtk_dtap_sms_cb(GtkAction *action, gpointer user_data);
-void gsm_a_stat_gtk_dtap_sm_cb(GtkAction *action, gpointer user_data);
-void gsm_a_stat_gtk_dtap_ss_cb(GtkAction *action, gpointer user_data);
-void gsm_a_stat_gtk_dtap_tp_cb(GtkAction *action, gpointer user_data);
-void gsm_a_stat_gtk_sacch_rr_cb(GtkAction *action, gpointer user_data);
-
-void gsm_map_stat_gtk_cb(GtkAction *action, gpointer user_data);
-void gsm_map_stat_gtk_sum_cb(GtkAction *action, gpointer user_data);
-
-void gtk_dcerpcstat_cb(GtkAction *action, gpointer user_data);
-void rlc_lte_graph_cb(GtkAction *action, gpointer user_data);
-
-void rlc_lte_graph_known_channel_launch(guint16 ueid, guint8 rlcMode,
- guint16 channelType, guint16 channelId,
- guint8 direction);
-
-void gtk_stats_tree_cb(GtkAction *action, gpointer user_data);
-
-void tcp_graph_cb(GtkAction *action, gpointer user_data);
-void tcp_graph_known_stream_launch(address *src_address, guint16 src_port,
- address *dst_address, guint16 dst_port,
- conv_id_t stream);
-
-
-void gtk_rpcprogs_cb(GtkWidget *w, gpointer data);
-void mcaststream_launch(GtkAction *action, gpointer user_data);
-void wlanstat_launch(GtkAction *action, gpointer user_data);
-
-/** Adds a callback to be executed when the menubar is ready to have menus and items added to it */
-void ws_add_build_menubar_items_callback(gpointer callback);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __GTK_STAT_MENU_H__ */
diff --git a/ui/gtk/gui_stat_util.c b/ui/gtk/gui_stat_util.c
deleted file mode 100644
index ea555038d2..0000000000
--- a/ui/gtk/gui_stat_util.c
+++ /dev/null
@@ -1,128 +0,0 @@
-/* gui_stat_util.c
- * gui functions used by stats
- * Copyright 2003 Lars Roland
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-
-#include "ui/gtk/gui_stat_util.h"
-#include <epan/stat_tap_ui.h>
-
-/* init a main window for stats, set title and display used filter in window */
-
-void
-init_main_stat_window(GtkWidget *window, GtkWidget *mainbox, const char *title, const char *filter)
-{
- GtkWidget *main_label;
- GtkWidget *filter_label;
- char *filter_string;
-
- gtk_window_set_title(GTK_WINDOW(window), title);
-
- gtk_container_add(GTK_CONTAINER(window), mainbox);
- gtk_container_set_border_width(GTK_CONTAINER(mainbox), 10);
- gtk_widget_show(mainbox);
-
- main_label = gtk_label_new(title);
- gtk_box_pack_start(GTK_BOX(mainbox), main_label, FALSE, FALSE, 0);
- gtk_widget_show(main_label);
-
- filter_string = g_strdup_printf("Filter: %s", filter ? filter : "");
- filter_label = gtk_label_new(filter_string);
- g_free(filter_string);
- gtk_label_set_line_wrap(GTK_LABEL(filter_label), TRUE);
- gtk_box_pack_start(GTK_BOX(mainbox), filter_label, FALSE, FALSE, 0);
- gtk_widget_show(filter_label);
-}
-
-/* create a table, using a scrollable GtkTreeView */
-
-GtkTreeView *
-create_stat_table(GtkWidget *scrolled_window, GtkWidget *vbox, int columns, const stat_column *headers)
-{
- GtkTreeView *table;
- GtkListStore *store;
- GtkWidget *tree;
- GtkTreeViewColumn *column;
- GtkTreeSelection *sel;
- GtkCellRenderer *renderer;
- GType *types;
- int i;
-
- if (columns <= 0)
- return NULL;
-
- types = (GType *)g_malloc(columns *sizeof(GType));
- for (i = 0; i < columns; i++)
- types[i] = headers[i].type;
-
- store = gtk_list_store_newv (columns, types);
- g_free(types);
-
- /* create table */
- tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
-
- table = GTK_TREE_VIEW(tree);
- g_object_unref (G_OBJECT (store));
-
- gtk_tree_view_set_headers_clickable(table, FALSE);
-
- for (i = 0; i < columns; i++) {
- renderer = gtk_cell_renderer_text_new ();
- if (headers[i].align == TAP_ALIGN_RIGHT) {
- /* right align */
- g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
- }
- g_object_set(renderer, "ypad", 0, NULL);
- column = gtk_tree_view_column_new_with_attributes (headers[i].title, renderer, "text",
- i, NULL);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_append_column (table, column);
- gtk_tree_view_column_set_sort_column_id(column, i);
- }
- gtk_container_add(GTK_CONTAINER(scrolled_window), GTK_WIDGET (table));
- gtk_box_pack_start(GTK_BOX(vbox), scrolled_window, TRUE, TRUE, 0);
-
- /* configure TreeView */
- gtk_tree_view_set_rules_hint(table, TRUE);
- gtk_tree_view_set_headers_clickable(table, TRUE);
-
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(table));
- gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
-
- gtk_widget_show(scrolled_window);
-
- return table;
-}
-
-/*
- * Editor modelines - http://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/gtk/gui_stat_util.h b/ui/gtk/gui_stat_util.h
deleted file mode 100644
index 4f929bf1c2..0000000000
--- a/ui/gtk/gui_stat_util.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* gui_stat_util.h
- * gui functions used by stats
- * Copyright 2003 Lars Roland
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __GTK_STAT_UTIL_H__
-#define __GTK_STAT_UTIL_H__
-
-#include <gtk/gtk.h>
-
-
-/** @file
- * Utilities for statistics.
- */
-
-/** Columns definition
- */
-typedef struct {
- GType type; /* column type */
- gint align; /* alignement */
- const char *title; /* column title */
-} stat_column;
-
-/** Init a window for stats, set title and display used filter in window.
- *
- * @param window the window
- * @param mainbox the vbox for the window
- * @param title the title for the window
- * @param filter the filter string
- */
-extern void init_main_stat_window(GtkWidget *window, GtkWidget *mainbox, const char *title, const char *filter);
-
-/** Create a stats table, using GtkListStore and GtkTreeView.
- *
- * @param scrolled_window the scrolled window
- * @param vbox the vbox for the window
- * @param columns number of columns
- * @param headers columns title and type, G_TYPE_POINTER is illegal, there's no default cell renderer for it
- */
-extern GtkTreeView *create_stat_table(GtkWidget *scrolled_window, GtkWidget *vbox, int columns, const stat_column *headers);
-
-#endif /* __GUI_STAT_UTIL_H__ */
diff --git a/ui/gtk/gui_utils.c b/ui/gtk/gui_utils.c
deleted file mode 100644
index 7cd432b367..0000000000
--- a/ui/gtk/gui_utils.c
+++ /dev/null
@@ -1,2097 +0,0 @@
-/* gui_utils.c
- * UI utility routines, some GTK+-specific (declared in gtk/gui_utils.h)
- * and some with GUI-independent APIs, with this file containing the GTK+
- * implementations of them (declared in ws_ui_util.h)
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <locale.h>
-
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-#if GTK_CHECK_VERSION(3,0,0)
-# include <gdk/gdkkeysyms-compat.h>
-#endif
-
-#include <epan/prefs.h>
-#include "epan/epan.h"
-
-#include <epan/packet_info.h>
-
-#include "../../globals.h"
-
-#include "ui/recent.h"
-#include "ui/ws_ui_util.h"
-
-#include <wsutil/file_util.h>
-
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/font_utils.h"
-#include "ui/gtk/color_utils.h"
-#include "ui/gtk/old-gtk-compat.h"
-#ifndef HAVE_GDK_GRESOURCE
-#include "ui/gtk/pixbuf-csource.h"
-#endif
-
-#ifdef _WIN32
-#include <windows.h>
-#endif
-
-#define WINDOW_GEOM_KEY "window_geom"
-#define WINDOW_DECORATION_SIZE 50
-
-/* Set our window icon. The GDK documentation doesn't provide any
- actual documentation for gdk_window_set_icon(), so we'll steal
- libgimp/gimpdialog.c:gimp_dialog_realize_callback() from the Gimp
- sources and assume it's safe.
-
- XXX - The current icon size is fixed at 16x16 pixels, which looks fine
- with kwm (KDE 1.x's window manager), Sawfish (the "default" window
- manager for GNOME?), and under Windows with Exceed putting X windows
- on the Windows desktop, using Exceed as the window manager, as those
- window managers put a 16x16 icon on the title bar.
-
- The window managers in some windowing environments (e.g. dtwm in CDE)
- and some stand-alone window managers have larger icon sizes (many window
- managers put the window icon on the desktop, in the Windows 3.x style,
- rather than in the titlebar, in the Windows 4.x style), so we need to
- find a way to size our icon appropriately.
-
- The X11 Inter-Client Communications Conventions Manual, Version 1.1,
- in X11R5, specifies that "a window manager that wishes to place
- constraints on the sizes of icon pixmaps and/or windows should
- place a property called WM_ICON_SIZE on the root"; that property
- contains minimum width and height, maximum width and height, and
- width and height increment values. "XGetIconSizes()" retrieves
- that property; unfortunately, I've yet to find a window manager
- that sets it on the root window (kwm, AfterStep, and Exceed don't
- appear to set it).
-
- The X Desktop Group's Window Manager Standard specifies, in the section
- on Application Window Properties, an _NET_WM_ICON property, presumably
- set by the window manager, which is an array of possible icon sizes
- for the client. There's no API in GTK+ 1.2[.x] for this; there may
- eventually be one either in GTK+ 2.0 or GNOME 2.0.
-
- Some window managers can be configured to take the window name
- specified by the WM_NAME property of a window or the resource
- or class name specified by the WM_CLASS property and base the
- choice of icon for the window on one of those; WM_CLASS for
- Wireshark's windows has a resource name of "wireshark" and a class
- name of "Wireshark". However, the way that's done is window-manager-
- specific, and there's no way to determine what size a particular
- window manager would want, so there's no way to automate this as
- part of the installation of Wireshark.
- */
-static void
-window_icon_realize_cb(GtkWidget *win,
- gpointer data _U_)
-{
-#ifndef _WIN32
- GList *ws_icon_list = NULL;
- GdkPixbuf *icon16, *icon32, *icon48, *icon64;
-
-#ifdef HAVE_GDK_GRESOURCE
- icon16 = ws_gdk_pixbuf_new_from_resource("/org/wireshark/image/wsicon16.png");
- icon32 = ws_gdk_pixbuf_new_from_resource("/org/wireshark/image/wsicon32.png");
- icon48 = ws_gdk_pixbuf_new_from_resource("/org/wireshark/image/wsicon48.png");
- icon64 = ws_gdk_pixbuf_new_from_resource("/org/wireshark/image/wsicon64.png");
-#else
- icon16 = gdk_pixbuf_new_from_inline(-1, wsicon_16_pb_data, FALSE, NULL);
- icon32 = gdk_pixbuf_new_from_inline(-1, wsicon_32_pb_data, FALSE, NULL);
- icon48 = gdk_pixbuf_new_from_inline(-1, wsicon_48_pb_data, FALSE, NULL);
- icon64 = gdk_pixbuf_new_from_inline(-1, wsicon_64_pb_data, FALSE, NULL);
-#endif
- ws_icon_list = g_list_append(ws_icon_list, icon16);
- ws_icon_list = g_list_append(ws_icon_list, icon32);
- ws_icon_list = g_list_append(ws_icon_list, icon48);
- ws_icon_list = g_list_append(ws_icon_list, icon64);
-
- gtk_window_set_icon_list(GTK_WINDOW(win), ws_icon_list);
-
- g_list_foreach(ws_icon_list, (GFunc)g_object_unref, NULL);
- g_list_free(ws_icon_list);
-
- /* set icon by name, this allows us to use even SVG icon if it is present */
- gtk_window_set_icon_name(GTK_WINDOW(win), "wireshark");
-#endif
-}
-
-
-/* Create a new window, of the specified type, with the specified title
- (if any) and the Wireshark icon. */
-GtkWidget *
-window_new(GtkWindowType type,
- const gchar *title)
-{
- GtkWidget *win;
-
- win = gtk_window_new(type);
- if (title != NULL)
- gtk_window_set_title(GTK_WINDOW(win), title);
- g_signal_connect(win, "realize", G_CALLBACK(window_icon_realize_cb), NULL);
-
- /* XXX - which one is the correct default policy? or use a preference for this? */
- /* GTK_WIN_POS_NONE, GTK_WIN_POS_CENTER or GTK_WIN_POS_MOUSE */
- /* a lot of people dislike GTK_WIN_POS_MOUSE */
-
- /* set the initial position (must be done, before show is called!) */
- gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_NONE);
-
- if (top_level) {
- GdkScreen *default_screen;
- gint x, y, n;
-
- /* Ideally, new windows would open on the same monitor where the main
- * window is located, but this doesn't happen when the main window is
- * not located on the primary monitor. So, if there's more than 1
- * monitor and Wireshark's main window isn't located on the primary
- * one, attempt to improve the situation by at least displaying the new
- * window somewhere on the same monitor, even if it won't be positioned
- * the same way as it would be when it's on the primary monitor. Don't
- * attempt to influence the placement on the primary monitor though,
- * because that's probably the preferred placement strategy. But how
- * to make window placement behave the same way on any monitor?
- */
- default_screen = gdk_screen_get_default();
- n = gdk_screen_get_n_monitors(default_screen);
- if (n > 1) {
- gtk_window_get_position(GTK_WINDOW(top_level), &x, &y);
- n = gdk_screen_get_monitor_at_point(default_screen, x, y);
- if (n > 0)
- gtk_window_move(GTK_WINDOW(win), x + 40, y + 30);
- }
- }
-
- return win;
-}
-
-
-/* Same as window_new(), but will keep its geometry values (size, position, ...).
- * Be sure to use window_present() and window_destroy() appropriately! */
-GtkWidget *
-window_new_with_geom(GtkWindowType type,
- const gchar *title,
- const gchar *geom_name,
- GtkWindowPosition pos)
-{
- window_geometry_t geom;
- GtkWidget *win = window_new(type, title);
-
- g_object_set_data(G_OBJECT(win), WINDOW_GEOM_KEY, (gpointer)g_strdup(geom_name));
-
- /* do we have a previously saved size and position of this window? */
- if(geom_name) {
- /* It's a good idea to set the position and size of the window already here,
- * as it's still invisible and won't "flicker the screen" while initially resizing. */
- if(window_geom_load(geom_name, &geom)) {
- /* XXX - use prefs to select which values to set? */
- geom.set_pos = TRUE;
- geom.set_size = TRUE;
- geom.set_maximized = FALSE; /* don't maximize until window is shown */
- window_set_geometry(win, &geom);
- } else if (pos != GTK_WIN_POS_NONE) {
-#ifdef _WIN32
- /* Testing using GTK+ 2.24.10 shows that
- * GTK_WIN_POS_CENTER_ON_PARENT doesn't seem to work on Windows, so
- * use the next best thing. Is this a problem for all OS's though,
- * or just Windows? Unknown. (Tested with Windows XP SP3 32-bit)
- */
- if (pos == GTK_WIN_POS_CENTER_ON_PARENT)
- pos = GTK_WIN_POS_CENTER;
-#endif
- gtk_window_set_position(GTK_WINDOW(win), pos);
- }
- }
-
- return win;
-}
-
-
-/* Create a new window for a splash screen; it's a main window, without decoration,
- positioned in the center of the screen. */
-GtkWidget *
-splash_window_new(void)
-{
- GtkWidget *win;
-
- win = window_new(GTK_WINDOW_TOPLEVEL, "Wireshark");
- gtk_window_set_decorated(GTK_WINDOW(win), FALSE);
-
- /* set the initial position (must be done, before show is called!) */
- gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER);
-
- return win;
-}
-
-
-/* Present the created window on the screen. */
-void
-window_present(GtkWidget *win)
-{
- window_geometry_t geom;
- const gchar *name;
-
- /* present this window */
- gtk_window_present(GTK_WINDOW(win));
-
- /* do we have a previously saved size and position of this window? */
- name = (const gchar *)g_object_get_data(G_OBJECT(win), WINDOW_GEOM_KEY);
- if(name) {
- if(window_geom_load(name, &geom)) {
- /* XXX - use prefs to select which values to set? */
- geom.set_pos = TRUE;
- geom.set_size = TRUE;
- geom.set_maximized = TRUE;
- window_set_geometry(win, &geom);
- }
- }
-}
-
-
-static gboolean
-window_key_press_cb(GtkWidget *widget,
- GdkEventKey *event,
- gpointer cancel_button)
-{
- g_return_val_if_fail(widget != NULL, FALSE);
- g_return_val_if_fail(event != NULL, FALSE);
-
- if (event->keyval == GDK_Escape) {
- gtk_widget_activate(GTK_WIDGET(cancel_button));
- return TRUE;
- }
-
- return FALSE;
-}
-
-
-/* Set the "key_press_event" signal for a top-level dialog window to
- call a routine to activate the "Cancel" button for a dialog box if
- the key being pressed is the <Esc> key.
-
- XXX - there should be a GTK+ widget that'll do that for you, and
- let you specify a "Cancel" button. It should also not impose
- a requirement that there be a separator in the dialog box, as
- the GtkDialog widget does; the visual convention that there's
- such a separator between the rest of the dialog boxes and buttons
- such as "OK" and "Cancel" is, for better or worse, not universal
- (not even in GTK+ - look at the GtkFileSelection dialog!). */
-static void
-window_set_cancel(GtkWidget *widget,
- GtkWidget *cancel_button)
-{
- g_signal_connect(widget, "key_press_event", G_CALLBACK(window_key_press_cb), cancel_button);
-}
-
-
-/* set the actions needed for the cancel "Close"/"Ok"/"Cancel" button that closes the window */
-void
-window_set_cancel_button(GtkWidget *win,
- GtkWidget *bt,
- window_cancel_button_fct cb)
-{
- if(cb)
- g_signal_connect(bt, "clicked", G_CALLBACK(cb), win);
-
- gtk_widget_grab_default(bt);
-
- window_set_cancel(win, bt);
-}
-
-
-/* default callback handler for cancel button "clicked" signal */
-void
-window_cancel_button_cb(GtkWidget *w _U_,
- gpointer data)
-{
- window_destroy(GTK_WIDGET(data));
-}
-
-
-/* default callback handler: the window managers X of the window was clicked (delete_event) */
-gboolean
-window_delete_event_cb(GtkWidget *win,
- GdkEvent *event _U_,
- gpointer user_data _U_)
-{
- window_destroy(win);
-
- /* event handled, don't do anything else */
- return TRUE;
-}
-
-
-/* get the geometry of a window from window_new() */
-void
-window_get_geometry(GtkWidget *widget,
- window_geometry_t *geom)
-{
- GdkWindowState state;
- GdkWindow *widget_window;
-
- /* Try to grab our geometry.
-
- GTK+ provides two routines to get a window's position relative
- to the X root window. If I understand the documentation correctly,
- gdk_window_get_deskrelative_origin applies mainly to Enlightenment
- and gdk_window_get_root_origin applies for all other WMs.
-
- The code below tries both routines, and picks the one that returns
- the upper-left-most coordinates.
-
- More info at:
-
- http://mail.gnome.org/archives/gtk-devel-list/2001-March/msg00289.html
- http://www.gtk.org/faq/#AEN606
-
- As gdk_window_get_deskrelative_origin() is deprecated it has been removed 2011-07-24.
- */
-
- memset(geom, 0, sizeof(window_geometry_t));
-
- widget_window = gtk_widget_get_window(widget);
-
- gdk_window_get_root_origin(widget_window,
- &geom->x,
- &geom->y);
-
- /* XXX - Is this the "approved" method? */
-#if GTK_CHECK_VERSION(2,24,0)
- geom->width = gdk_window_get_width(widget_window);
- geom->height = gdk_window_get_height(widget_window);
-#else
- ws_gdk_drawable_get_size(widget_window,
- &geom->width,
- &geom->height);
-#endif
- state = gdk_window_get_state(widget_window);
- geom->maximized = ((state & GDK_WINDOW_STATE_MAXIMIZED) != 0);
-}
-
-
-#ifdef _WIN32
-/* Ensure Wireshark isn't obscured by the system taskbar (or other desktop toolbars).
- * Resolves https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=3034 */
-static void
-window_adjust_if_obscured(window_geometry_t *geom)
-{
- MONITORINFO MonitorInfo;
- HMONITOR hMonitor;
- POINT pt, vs;
- DWORD dwFlags = MONITOR_DEFAULTTONEAREST; /* MONITOR_DEFAULTTOPRIMARY? */
-
- /*
- * Get the virtual screen's top-left coordinates so we can reliably
- * determine which monitor we're dealing with. See also:
- * http://msdn.microsoft.com/en-us/library/windows/desktop/dd145136%28v=vs.85%29.aspx
- */
- vs.x = GetSystemMetrics(SM_XVIRTUALSCREEN);
- vs.y = GetSystemMetrics(SM_YVIRTUALSCREEN);
- pt.x = geom->x + vs.x;
- pt.y = geom->y + vs.y;
- MonitorInfo.cbSize = sizeof(MONITORINFO);
- hMonitor = MonitorFromPoint(pt, dwFlags);
- if (GetMonitorInfo(hMonitor, &MonitorInfo)) {
- if (pt.x < MonitorInfo.rcWork.left)
- geom->x += MonitorInfo.rcWork.left - pt.x;
- if (pt.y < MonitorInfo.rcWork.top)
- geom->y += MonitorInfo.rcWork.top - pt.y;
- }
-}
-#endif
-
-/* detect broken GNOME shell fullscreen described in #11303 */
-static gboolean
-broken_gnome_fullscreen(void) {
- return (0 == g_strcmp0(g_getenv("XDG_CURRENT_DESKTOP"), "GNOME") &&
- (0 == g_strcmp0(g_getenv("GDMSESSION"), "gnome-shell") ||
- 0 == g_strcmp0(g_getenv("GDMSESSION"), "gnome-classic") ||
- 0 == g_strcmp0(g_getenv("GDMSESSION"), "gnome")));
-}
-
-/* set the geometry of a window from window_new() */
-void
-window_set_geometry(GtkWidget *widget,
- window_geometry_t *geom)
-{
- GdkScreen *default_screen;
- GdkRectangle viewable_area;
- gint monitor_num;
-
- /* vertical offset to be set for fixing #11303, it makes room for window */
- /* titlebar */
- const gint y_offset = (geom->set_maximized &&
- geom->maximized &&
- broken_gnome_fullscreen())?WINDOW_DECORATION_SIZE:0;
-
- /* as we now have the geometry from the recent file, set it */
- /* if the window was minimized, x and y are -32000 (at least on Win32) */
- if (geom->set_pos && geom->x != -32000 && geom->y != -32000) {
- /* Per Wireshark bug #553, GTK has a problem on MS Windows
- * where the upper-left corner of the window may appear off
- * screen when when a single desktop spans multiple monitors
- * of different resolutions and positions relative to each
- * other.
- *
- * If the requested (x,y) position isn't within the monitor's
- * viewable area, change it to the viewable area's (x,y). */
- default_screen = gdk_screen_get_default();
- monitor_num = gdk_screen_get_monitor_at_point(default_screen,
- geom->x, geom->y);
- gdk_screen_get_monitor_geometry(default_screen, monitor_num,
- &viewable_area);
- if(geom->x < viewable_area.x || geom->x > (viewable_area.x + viewable_area.width))
- geom->x = viewable_area.x;
-
- if(geom->y < viewable_area.y || geom->y > (viewable_area.y + viewable_area.height))
- geom->y = viewable_area.y;
-
- #ifdef _WIN32
- window_adjust_if_obscured(geom);
- #endif
-
- gtk_window_move(GTK_WINDOW(widget),
- geom->x,
- geom->y + y_offset);
- }
-
- if (geom->set_size) {
- gtk_window_resize(GTK_WINDOW(widget),
- /*gtk_widget_set_size_request(widget,*/
- geom->width,
- geom->height - y_offset);
- }
-
- if(geom->set_maximized) {
- if (geom->maximized) {
- gdk_window_maximize(gtk_widget_get_window(widget));
- } else {
- gdk_window_unmaximize(gtk_widget_get_window(widget));
- }
- }
-}
-
-void
-window_destroy(GtkWidget *win)
-{
- window_geometry_t geom;
- const gchar *name;
-
- if (!win)
- return;
-
- /* get_geometry must be done *before* destroy is running, as the window geometry
- * cannot be retrieved at destroy time (so don't use event "destroy" for this) */
- /* ...and don't do this at all, if we currently have no GdkWindow (e.g. if the
- * GtkWidget is hidden) */
- if(gtk_widget_get_has_window(win) && gtk_widget_get_visible(win)) {
- window_get_geometry(win, &geom);
-
- name = (const gchar *)g_object_get_data(G_OBJECT(win), WINDOW_GEOM_KEY);
- if(name) {
- window_geom_save(name, &geom);
- g_free((gpointer)name);
- }
- }
-
- gtk_widget_destroy(win);
-}
-
-static GtkWidget *
-_gtk_image_new_from_pixbuf_unref(GdkPixbuf *pixbuf) {
- GtkWidget *widget;
-
- widget = gtk_image_new_from_pixbuf(pixbuf);
- g_object_unref(pixbuf);
- return widget;
-}
-
-/* convert an xpm to a GtkWidget */
-GtkWidget *
-xpm_to_widget(const char **xpm) {
- GdkPixbuf *pixbuf;
-
- pixbuf = gdk_pixbuf_new_from_xpm_data(xpm);
- return _gtk_image_new_from_pixbuf_unref(pixbuf);
-}
-
-/* Convert an pixbuf GResource to a GtkWidget */
-GtkWidget *
-#ifdef HAVE_GDK_GRESOURCE
-pixbuf_to_widget(const char *pb_path) {
-#else
-pixbuf_to_widget(const guint8 *pb_data) {
-#endif
- GdkPixbuf *pixbuf;
-
-#ifdef HAVE_GDK_GRESOURCE
- pixbuf = ws_gdk_pixbuf_new_from_resource(pb_path);
-#else
- pixbuf = gdk_pixbuf_new_from_inline(-1, pb_data, FALSE, NULL);
-#endif
- return _gtk_image_new_from_pixbuf_unref(pixbuf);
-}
-
-/*
- * Alert box for an invalid display filter expression.
- * Assumes "dfilter_error_msg" has been set by "dfilter_compile()" to the
- * error message for the filter.
- *
- * XXX - should this have a "Help" button that pops up the display filter
- * help?
- */
-void
-bad_dfilter_alert_box(GtkWidget *parent,
- const char *dftext,
- gchar *err_msg)
-{
- GtkWidget *msg_dialog;
-
- msg_dialog = gtk_message_dialog_new(GTK_WINDOW(parent),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_OK,
- "The filter expression \"%s\" isn't a valid display filter. (%s)",
- dftext, err_msg);
- gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(msg_dialog),
- "See the help for a description of the display filter syntax.");
- gtk_dialog_run(GTK_DIALOG(msg_dialog));
- gtk_widget_destroy(msg_dialog);
-}
-
-/* update the main window */
-void
-main_window_update(void)
-{
- while (gtk_events_pending())
- gtk_main_iteration();
-}
-
-void exit_application(int status)
-{
- exit(status);
-}
-
-#ifdef HAVE_LIBPCAP
-
-/* quit a nested main window */
-void
-main_window_nested_quit(void)
-{
- if (gtk_main_level() > 0)
- gtk_main_quit();
-}
-
-/* quit the main window */
-void
-main_window_quit(void)
-{
- gtk_main_quit();
-}
-
-typedef struct pipe_input_tag {
- gint source;
- gpointer user_data;
- ws_process_id *child_process;
- pipe_input_cb_t input_cb;
- guint pipe_input_id;
-#ifdef _WIN32
-#else
- GIOChannel *channel;
-#endif
-} pipe_input_t;
-
-
-#ifdef _WIN32
-/* The timer has expired, see if there's stuff to read from the pipe,
- if so, do the callback */
-static gboolean
-pipe_timer_cb(gpointer data)
-{
- HANDLE handle;
- DWORD avail = 0;
- gboolean result;
- DWORD childstatus;
- pipe_input_t *pipe_input = data;
- gint iterations = 0;
-
-
- /* try to read data from the pipe only 5 times, to avoid blocking */
- while(iterations < 5) {
- /*g_log(NULL, G_LOG_LEVEL_DEBUG, "pipe_timer_cb: new iteration");*/
-
- /* Oddly enough although Named pipes don't work on win9x,
- PeekNamedPipe does !!! */
- handle = (HANDLE)_get_osfhandle(pipe_input->source);
- result = PeekNamedPipe(handle, NULL, 0, NULL, &avail, NULL);
-
- /* Get the child process exit status */
- GetExitCodeProcess((HANDLE)*(pipe_input->child_process), &childstatus);
-
- /* If the Peek returned an error, or there are bytes to be read
- or the childwatcher thread has terminated then call the normal
- callback */
- if (!result || avail > 0 || childstatus != STILL_ACTIVE) {
-
- /*g_log(NULL, G_LOG_LEVEL_DEBUG, "pipe_timer_cb: data avail");*/
-
- if(pipe_input->pipe_input_id != 0) {
- /*g_log(NULL, G_LOG_LEVEL_DEBUG, "pipe_timer_cb: stop timer");*/
- /* avoid reentrancy problems and stack overflow */
- g_source_remove(pipe_input->pipe_input_id);
- pipe_input->pipe_input_id = 0;
- }
-
- /* And call the real handler */
- if (!pipe_input->input_cb(pipe_input->source, pipe_input->user_data)) {
- g_log(NULL, G_LOG_LEVEL_DEBUG, "pipe_timer_cb: input pipe closed, iterations: %u", iterations);
- /* pipe closed, return false so that the old timer is not run again */
- return FALSE;
- }
- }
- else {
- /*g_log(NULL, G_LOG_LEVEL_DEBUG, "pipe_timer_cb: no data avail");*/
- /* No data, stop now */
- break;
- }
-
- iterations++;
- }
-
- if(pipe_input->pipe_input_id == 0) {
- /* restore pipe handler */
- pipe_input->pipe_input_id = g_timeout_add(200, pipe_timer_cb, data);
- /*g_log(NULL, G_LOG_LEVEL_DEBUG, "pipe_timer_cb: finished with iterations: %u, new timer", iterations);*/
-
- /* Return false so that the old timer is not run again */
- return FALSE;
- } else {
- /*g_log(NULL, G_LOG_LEVEL_DEBUG, "pipe_timer_cb: finished with iterations: %u, old timer", iterations);*/
-
- /* we didn't stopped the old timer, so let it run */
- return TRUE;
- }
-}
-
-#else /* _WIN32 */
-
-/* There's stuff to read from the sync pipe, meaning the child has sent
- us a message, or the sync pipe has closed, meaning the child has
- closed it (perhaps because it exited). */
-static gboolean
-pipe_input_cb(GIOChannel *source _U_,
- GIOCondition condition _U_,
- gpointer data)
-{
- pipe_input_t *pipe_input = (pipe_input_t *)data;
-
-
- /* avoid reentrancy problems and stack overflow */
- g_source_remove(pipe_input->pipe_input_id);
-
- if (pipe_input->input_cb(pipe_input->source, pipe_input->user_data)) {
- /* restore pipe handler */
- pipe_input->pipe_input_id = g_io_add_watch_full(pipe_input->channel,
- G_PRIORITY_HIGH,
- (GIOCondition)(G_IO_IN|G_IO_ERR|G_IO_HUP),
- pipe_input_cb,
- pipe_input,
- NULL);
- }
- return TRUE;
-}
-#endif
-
-void
-pipe_input_set_handler(gint source,
- gpointer user_data,
- ws_process_id *child_process,
- pipe_input_cb_t input_cb)
-{
- static pipe_input_t pipe_input;
-
- pipe_input.source = source;
- pipe_input.child_process = child_process;
- pipe_input.user_data = user_data;
- pipe_input.input_cb = input_cb;
-
-#ifdef _WIN32
- /* Tricky to use pipes in win9x, as no concept of wait. NT can
- do this but that doesn't cover all win32 platforms. GTK can do
- this but doesn't seem to work over processes. Attempt to do
- something similar here, start a timer and check for data on every
- timeout. */
- /*g_log(NULL, G_LOG_LEVEL_DEBUG, "pipe_input_set_handler: new");*/
- pipe_input.pipe_input_id = g_timeout_add(200, pipe_timer_cb, &pipe_input);
-#else
- pipe_input.channel = g_io_channel_unix_new(source);
- g_io_channel_set_encoding(pipe_input.channel, NULL, NULL);
- pipe_input.pipe_input_id = g_io_add_watch_full(pipe_input.channel,
- G_PRIORITY_HIGH,
- (GIOCondition)(G_IO_IN|G_IO_ERR|G_IO_HUP),
- pipe_input_cb,
- &pipe_input,
- NULL);
-#endif
-}
-
-
-#endif /* HAVE_LIBPCAP */
-
-/* Given a pointer to a GtkWidget for a top-level window, raise it and
- de-iconify it. This routine is used if the user has done something to
- ask that a window of a certain type be popped up when there can be only
- one such window and such a window has already been popped up - we
- pop up the existing one rather than creating a new one.
-
- XXX - we should request that it be given the input focus, too. Alas,
- GDK has nothing to do that, e.g. by calling "XSetInputFocus()" in a
- window in X. Besides, using "XSetInputFocus()" doesn't work anyway,
- apparently due to the way GTK+/GDK manages the input focus.
-
- The X Desktop Group's Window Manager Standard specifies, in the section
- on Root Window Properties, an _NET_ACTIVE_WINDOW client message that
- can be sent to the root window, containing the window ID of the
- window to activate; I infer that this might be the way to give the
- window the input focus - I assume that means it's also de-iconified,
- but I wouldn't assume it'd raise it.
-
- XXX - will this do the right thing on window systems other than X? */
-void
-reactivate_window(GtkWidget *win)
-{
- GdkWindow *win_window;
-
- win_window = gtk_widget_get_window(win);
-
- gdk_window_show(win_window);
- gdk_window_raise(win_window);
-}
-
-/* List of all GtkScrolledWindows, so we can globally set the scrollbar
- placement of all of them. */
-static GList *scrolled_windows;
-
-static void setup_scrolled_window(GtkWidget *scrollw);
-static void forget_scrolled_window(GtkWidget *scrollw, gpointer data);
-
-/* Create a GtkScrolledWindow, set its scrollbar placement appropriately,
- and remember it. */
-GtkWidget *
-scrolled_window_new(GtkAdjustment *hadjustment,
- GtkAdjustment *vadjustment)
-{
- GtkWidget *scrollw;
-
- scrollw = gtk_scrolled_window_new(hadjustment, vadjustment);
- setup_scrolled_window(scrollw);
- return scrollw;
-}
-
-/* Set a GtkScrolledWindow's scrollbar placement and add it to the list
- of GtkScrolledWindows. */
-static void
-setup_scrolled_window(GtkWidget *scrollw)
-{
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollw),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-#if GTK_CHECK_VERSION(3,16,0)
- gtk_scrolled_window_set_overlay_scrolling(GTK_SCROLLED_WINDOW(scrollw), FALSE);
-#endif /* OVERLAY_SCROLLING */
-
- scrolled_windows = g_list_append(scrolled_windows, scrollw);
-
- /* Catch the "destroy" event on the widget, so that we remove it from
- the list when it's destroyed. */
- g_signal_connect(scrollw, "destroy", G_CALLBACK(forget_scrolled_window), NULL);
-}
-
-/* Remove a GtkScrolledWindow from the list of GtkScrolledWindows. */
-static void
-forget_scrolled_window(GtkWidget *scrollw,
- gpointer data _U_)
-{
- scrolled_windows = g_list_remove(scrolled_windows, scrollw);
-}
-
-/* List of all CTrees/TreeViews, so we can globally set the line and
- * expander style of all of them. */
-static GList *trees;
-
-static void setup_tree(GtkWidget *tree);
-static void forget_tree(GtkWidget *tree, gpointer data);
-static void set_tree_styles(GtkWidget *tree);
-static gboolean tree_view_key_pressed_cb(GtkWidget *tree, GdkEventKey *event, gpointer user_data _U_);
-
-/* Create a Tree, give it the right styles, and remember it. */
-GtkWidget *
-tree_view_new(GtkTreeModel *model)
-{
- GtkWidget *tree;
-
- tree = gtk_tree_view_new_with_model(model);
- setup_tree(tree);
- return tree;
-}
-
-/* Set a Tree's styles and add it to the list of Trees. */
-static void
-setup_tree(GtkWidget *tree)
-{
- set_tree_styles(tree);
-
- trees = g_list_append(trees, tree);
-
- /* Catch the "destroy" event on the widget, so that we remove it from
- the list when it's destroyed. */
- g_signal_connect(tree, "destroy", G_CALLBACK(forget_tree), NULL);
- g_signal_connect(tree, "key-press-event", G_CALLBACK(tree_view_key_pressed_cb), NULL );
-}
-
-/* Remove a Tree from the list of Trees. */
-static void
-forget_tree(GtkWidget *tree,
- gpointer data _U_)
-{
- trees = g_list_remove(trees, tree);
-}
-
-/* Set the styles of a Tree based upon user preferences. */
-static void
-set_tree_styles(GtkWidget *tree)
-{
- g_assert(prefs.gui_altern_colors >= 0 && prefs.gui_altern_colors <= 1);
- gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree),
- prefs.gui_altern_colors);
-}
-
-static void
-set_tree_styles_cb(gpointer data,
- gpointer user_data _U_)
-{
- set_tree_styles((GtkWidget *)data);
-}
-
-/* Set the styles of all Trees based upon style values. */
-void
-set_tree_styles_all(void)
-{
- g_list_foreach(trees, set_tree_styles_cb, NULL);
-}
-
-/* Move the currently-selected item in a list store up or down one position. */
-gboolean
-tree_view_list_store_move_selection(GtkTreeView *tree,
- gboolean move_up)
-{
- GtkTreeIter from, to;
- GtkTreeModel *model;
- GtkTreeSelection *sel;
- GtkTreePath *path_from, *path_to;
-
- sel = gtk_tree_view_get_selection(tree);
- if (!gtk_tree_selection_get_selected(sel, &model, &from)) {
- return FALSE;
- }
-
- path_from = gtk_tree_model_get_path(model, &from);
- if (!path_from) {
- return FALSE;
- }
-
- path_to = gtk_tree_path_copy(path_from);
- /* XXX - Why does one return void and the other return a gboolean? */
- if (move_up) {
- gtk_tree_path_prev(path_to);
- } else {
- gtk_tree_path_next(path_to);
- }
-
- if (gtk_tree_path_compare(path_from, path_to) == 0) {
- gtk_tree_path_free(path_from);
- gtk_tree_path_free(path_to);
- return FALSE;
- }
-
- gtk_tree_model_get_iter(model, &to, path_to);
- gtk_list_store_swap(GTK_LIST_STORE(model), &from, &to);
- gtk_tree_path_free(path_from);
- gtk_tree_path_free(path_to);
- return TRUE;
-}
-
-/* Find the selected row number in a list store. */
-gint
-tree_view_list_store_get_selected_row(GtkTreeView *tree) {
- GtkTreeIter iter;
- GtkTreeModel *model;
- GtkTreeSelection *sel;
- GtkTreePath *path;
- gchar *path_str;
- gint row;
-
- sel = gtk_tree_view_get_selection(tree);
- if (!gtk_tree_selection_get_selected(sel, &model, &iter)) {
- return -1;
- }
-
- path = gtk_tree_model_get_path(model, &iter);
- if (!path) {
- return FALSE;
- }
-
- path_str = gtk_tree_path_to_string(path);
- gtk_tree_path_free(path);
-
- row = (gint)strtol(path_str, NULL, 10);
- g_free(path_str);
-
- return row;
-}
-
-/* append a row to the simple list */
-/* use it like: simple_list_append(list, 0, "first", 1, "second", -1) */
-void
-simple_list_append(GtkWidget *list,
- ...)
-{
- va_list ap;
-
- GtkTreeIter iter;
- GtkListStore *store;
-
- va_start(ap, list);
- store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(list)));
- gtk_list_store_append(store, &iter);
- gtk_list_store_set_valist(store, &iter, ap);
- va_end(ap);
-}
-
-/* create a simple list widget */
-GtkWidget *
-simple_list_new(gint cols,
- const gchar **titles) {
- GtkWidget *plugins_list;
- int i;
- GtkListStore *store;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
-
-
- g_assert(cols <= 10);
- store = gtk_list_store_new(cols,
- G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
- G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
- plugins_list = tree_view_new(GTK_TREE_MODEL(store));
- g_object_unref(G_OBJECT(store));
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(plugins_list), (titles != NULL));
- for(i=0; i<cols; i++) {
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes(titles ? titles[i] : "", renderer,
- "text", i, NULL);
- gtk_tree_view_column_set_sort_column_id(column, i);
- gtk_tree_view_append_column(GTK_TREE_VIEW(plugins_list), column);
- }
-
- return plugins_list;
-}
-
-void
-render_as_url(GtkCellRenderer *cell)
-{
- g_object_set(cell, "foreground", "blue", NULL);
- g_object_set(cell, "foreground-set", TRUE, NULL);
-
- g_object_set(cell, "underline", PANGO_UNDERLINE_SINGLE, NULL);
- g_object_set(cell, "underline-set", TRUE, NULL);
-}
-
-void
-simple_list_url_col(GtkWidget *list,
- gint col)
-{
- GtkTreeViewColumn *ul_column;
- GList *renderers_list;
- GtkCellRenderer *ul_renderer;
-
- /* make the column look like a link ... */
- ul_column = gtk_tree_view_get_column(GTK_TREE_VIEW(list), col);
-
- renderers_list = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(ul_column));
-
- if(renderers_list != NULL) {
- /* it is simple list - there should be only one renderer */
- ul_renderer = (GtkCellRenderer*)renderers_list->data;
-
- render_as_url(ul_renderer);
-
- g_list_free(renderers_list);
- }
-
-}
-
-void
-copy_to_clipboard(GString *str)
-{
- GtkClipboard *cb;
-
- cb = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); /* Get the default clipboard */
- gtk_clipboard_set_text(cb, str->str, -1); /* Copy the byte data into the clipboard */
-}
-
-
-typedef struct _copy_binary_t {
- guint8 *data;
- int len;
-} copy_binary_t;
-
-static copy_binary_t *
-create_copy_binary_t(const guint8 *data,
- int len)
-{
- copy_binary_t* copy_data;
-
- g_assert(len > 0);
- copy_data = g_new(copy_binary_t,1);
- copy_data->data = g_new(guint8,len);
- copy_data->len = len;
- memcpy(copy_data->data,data,len * sizeof(guint8));
- return copy_data;
-}
-
-static void
-destroy_copy_binary_t(copy_binary_t *copy_data) {
- g_free(copy_data->data);
- g_free(copy_data);
-}
-
-static void
-copy_binary_free_cb(GtkClipboard *clipboard _U_,
- gpointer user_data_or_owner)
-{
- destroy_copy_binary_t((copy_binary_t*)user_data_or_owner);
-}
-
-static void
-copy_binary_get_cb(GtkClipboard *clipboard _U_,
- GtkSelectionData *selection_data,
- guint info _U_,
- gpointer user_data_or_owner)
-{
- copy_binary_t* copy_data;
-
- copy_data = (copy_binary_t*)user_data_or_owner;
-
- /* Just do a dumb set as binary data */
- gtk_selection_data_set(selection_data, GDK_NONE, 8, copy_data->data, copy_data->len);
-}
-
-void
-copy_binary_to_clipboard(const guint8 *data_p,
- int len)
-{
- static GtkTargetEntry target_entry[] = {
- {"application/octet-stream", 0, 0}};
- /* XXX - this is not understood by most applications,
- * but can be pasted into the better hex editors - is
- * there something better that we can do?
- */
-
- GtkClipboard *cb;
- copy_binary_t *copy_data;
- gboolean ret;
-
- if(len <= 0) {
- return; /* XXX would it be better to clear the clipboard? */
- }
- cb = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); /* Get the default clipboard */
- copy_data = create_copy_binary_t(data_p,len);
-
- ret = gtk_clipboard_set_with_data(cb,target_entry,1,
- copy_binary_get_cb, copy_binary_free_cb,copy_data);
-
- if(!ret) {
- destroy_copy_binary_t(copy_data);
- }
-}
-
-/*
- * Create a new window title string with user-defined title preference.
- * (Or ignore it if unspecified).
- */
-gchar *
-create_user_window_title(const gchar *caption)
-{
- /* fail-safe */
- if (caption == NULL)
- return g_strdup("");
-
- /* no user-defined title specified */
- if ((prefs.gui_window_title == NULL) || (*prefs.gui_window_title == '\0'))
- return g_strdup(caption);
-
- return g_strdup_printf("%s [%s]", caption, prefs.gui_window_title);
-}
-
-/*
- * Set the title of a window based on a supplied caption and the
- * display name for the capture file.
- *
- * XXX - should this include the user preference as well?
- */
-void
-set_window_title(GtkWidget *win,
- const gchar *caption)
-{
- char *title;
- char *display_name;
-
- display_name = cf_get_display_name(&cfile);
- title = g_strdup_printf("%s: %s", caption, display_name);
- g_free(display_name);
- gtk_window_set_title(GTK_WINDOW(win), title);
- g_free(title);
-}
-
-/*
- * Collapse row and his children
- */
-static void
-tree_collapse_row_with_children(GtkTreeView *tree_view, GtkTreeModel *model, GtkTreePath *path,
- GtkTreeIter *iter)
-{
- GtkTreeIter child;
-
- if (gtk_tree_view_row_expanded(tree_view, path)) {
- if (gtk_tree_model_iter_children(model, &child, iter)) {
- gtk_tree_path_down(path);
-
- do {
-
- if (gtk_tree_view_row_expanded(tree_view, path)) {
- tree_collapse_row_with_children(tree_view, model, path, &child);
- }
-
- gtk_tree_path_next(path);
- } while (gtk_tree_model_iter_next(model, &child));
-
- gtk_tree_path_up(path);
-
- gtk_tree_view_collapse_row(tree_view, path);
- }
- }
-}
-
-void
-tree_collapse_path_all(GtkTreeView *tree_view, GtkTreePath *path)
-{
- GtkTreeIter iter;
- GtkTreeModel *model;
-
- model = gtk_tree_view_get_model(tree_view);
- gtk_tree_model_get_iter(model, &iter, path);
-
- tree_collapse_row_with_children(tree_view, model, path, &iter);
-}
-
-/*
- * This callback is invoked when keyboard focus is within either
- * the packetlist view or the detail view. The keystrokes processed
- * within this callback are attempting to modify the detail view.
- * Within the detail view we special case the Left Arrow, Backspace
- * and Enter keys depending on the state of the expander (if any)
- * for the item in focus.
- *
- * Returning FALSE allows processing of the original key_press_event
- * by other callbacks. Left/Right scrolling of the packetlist
- * view and expanding/collapsing of the detail view lists is
- * handled by the default GtkTreeView key-press-event call back.
- *
- * XXX - Would an improved version of this callback test to see which
- * of the two GtkTreeView lists has focus? Left/Right scrolling of
- * the packetlist is currently not optimal. It will take several
- * right or left keypress events before the packetlist responds.
- * The problem appears to be that the focus is on a particular cell
- * within the highlighted row cell (like a spreadsheet). Scrolling
- * of the view right or left will not occur until the focus is
- * moved to a cell off the left or right edge of the packet list
- * view. Also TAB/SHIFT-TAB events can move keyboard focus to
- * the packetlist header where there is currently visual hint
- * a header cell has focus.
- */
-static gboolean
-tree_view_key_pressed_cb(GtkWidget *tree,
- GdkEventKey *event,
- gpointer user_data _U_)
-{
- GtkTreeSelection *selection;
- GtkTreeIter iter;
- GtkTreeIter parent;
- GtkTreeModel *model;
- GtkTreePath *path;
- gboolean expanded, expandable;
- int rc = FALSE;
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
- if(!selection) {
- return FALSE;
- }
-
- if(!gtk_tree_selection_get_selected(selection, &model, &iter)) {
- return FALSE;
- }
-
- path = gtk_tree_model_get_path(model, &iter);
- if(!path) {
- return FALSE;
- }
-
- /* Always FALSE when we're in the packet list (at least until we add sub-packets) */
- expanded = gtk_tree_view_row_expanded(GTK_TREE_VIEW(tree), path);
- expandable = gtk_tree_model_iter_has_child(model, &iter);
-
- switch (event->keyval) {
- case GDK_Left:
- if(expanded) {
- /* Subtree is expanded. Collapse it. */
- if (event->state & GDK_SHIFT_MASK)
- {
- tree_collapse_row_with_children(GTK_TREE_VIEW(tree), model, path, &iter);
- }
- else
- gtk_tree_view_collapse_row(GTK_TREE_VIEW(tree), path);
- rc = TRUE;
- break;
- }
- /* else fall through */
- case GDK_BackSpace:
- if (!expanded) {
- /* subtree is already collapsed, jump to parent node */
- if(! gtk_tree_model_iter_parent(model, &parent, &iter)) {
- rc = FALSE;
- break;
- }
- gtk_tree_path_free(path);
- path = gtk_tree_model_get_path(model, &parent);
- if(!path) {
- return FALSE;
- }
- gtk_tree_view_set_cursor(GTK_TREE_VIEW(tree), path,
- NULL /* focus_column */,
- FALSE /* !start_editing */);
- rc = TRUE;
- break;
- }
- break;
- case GDK_Right:
- if (expandable) {
- /* We have a subtree. Try to expand it. */
- gtk_tree_view_expand_row(GTK_TREE_VIEW(tree), path, FALSE /* !open_all */);
- rc = TRUE;
- break;
- } else {
- rc = FALSE;
- break;
- }
- case GDK_Return:
- case GDK_KP_Enter:
- /* Reverse the current state. */
- if (expanded)
- gtk_tree_view_collapse_row(GTK_TREE_VIEW(tree), path);
- else
- gtk_tree_view_expand_row(GTK_TREE_VIEW(tree), path, FALSE /* !open_all */);
- rc = TRUE;
- break;
- }
-
- if(path) {
- gtk_tree_path_free(path);
- }
- return rc;
-}
-
-void
-switch_to_fixed_col(GtkTreeView *view)
-{
- gint size;
- GtkTreeViewColumn *column;
- GList *columns, *list;
-
- columns = gtk_tree_view_get_columns(GTK_TREE_VIEW(view));
- list = columns;
- while(columns) {
- column = (GtkTreeViewColumn *)columns->data;
- size = gtk_tree_view_column_get_width(column);
- gtk_tree_view_column_set_sizing(column,GTK_TREE_VIEW_COLUMN_FIXED);
- if (size > gtk_tree_view_column_get_fixed_width(column))
- gtk_tree_view_column_set_fixed_width(column, size);
- columns = g_list_next(columns);
- }
- g_list_free(list);
-
- gtk_tree_view_set_fixed_height_mode(view, TRUE);
-}
-
-gint
-get_default_col_size(GtkWidget *view,
- const gchar *str)
-{
- PangoLayout *layout;
- gint col_width;
-
- layout = gtk_widget_create_pango_layout(view, str);
- pango_layout_get_pixel_size(layout,
- &col_width, /* width */
- NULL); /* height */
- g_object_unref(G_OBJECT(layout));
- /* Add a single character's width to get some spacing between columns */
- return col_width + (pango_font_description_get_size(user_font_get_regular()) / PANGO_SCALE);
-}
-
-
-/*
- * This function can be called from gtk_tree_view_column_set_cell_data_func()
- * the user data must be the column number.
- * Present floats with two decimals
- */
-void
-float_data_func(GtkTreeViewColumn *column _U_,
- GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer user_data)
-{
- gfloat float_val;
- gchar buf[20];
- char *savelocale;
-
- /* the col to get data from is in userdata */
- gint float_col = GPOINTER_TO_INT(user_data);
-
- gtk_tree_model_get(model, iter, float_col, &float_val, -1);
-
- /* save the current locale */
- savelocale = g_strdup(setlocale(LC_NUMERIC, NULL));
- /* switch to "C" locale to avoid problems with localized decimal separators
- * in g_snprintf("%f") functions
- */
- setlocale(LC_NUMERIC, "C");
-
- g_snprintf(buf, sizeof(buf), "%.2f", float_val);
- /* restore previous locale setting */
- setlocale(LC_NUMERIC, savelocale);
- g_free(savelocale);
-
- g_object_set(renderer, "text", buf, NULL);
-}
-
-/*
- * This function can be called from gtk_tree_view_column_set_cell_data_func()
- * the user data must be the column number.
- * Present value as hexadecimal.
- */
-void
-present_as_hex_func(GtkTreeViewColumn *column _U_,
- GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer user_data)
-{
- guint val;
- gchar buf[35];
-
- /* the col to get data from is in userdata */
- gint col = GPOINTER_TO_INT(user_data);
-
- gtk_tree_model_get(model, iter, col, &val, -1);
-
- g_snprintf(buf, sizeof(buf), "0x%02x", val);
-
- g_object_set(renderer, "text", buf, NULL);
-}
-
-void
-u64_data_func(GtkTreeViewColumn *column _U_,
- GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer user_data)
-{
- guint64 val;
- int i = 0;
- gchar *bp;
- gchar buf[35];
-
- /* the col to get data from is in userdata */
- gint col = GPOINTER_TO_INT(user_data);
-
- gtk_tree_model_get(model, iter, col, &val, -1);
-
- bp = &buf[34];
- *bp = 0;
- do {
- *--bp = (gchar)(val % 10) +'0';
- if (!(++i % 3)) {
- *--bp = ' ';
- }
- } while ((val /= 10) != 0 && bp > buf);
- g_object_set(renderer, "text", bp, NULL);
-}
-
-/*
- * This function can be called from gtk_tree_view_column_set_cell_data_func()
- * The user data must be the column number.
- * Renders the const static string whose pointer is stored.
- */
-void
-str_ptr_data_func(GtkTreeViewColumn *column _U_,
- GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer user_data)
-{
- const gchar *str = NULL;
-
- /* The col to get data from is in userdata */
- gint data_column = GPOINTER_TO_INT(user_data);
-
- gtk_tree_model_get(model, iter, data_column, &str, -1);
- /* XXX should we check that str is non NULL and print a warning or do assert? */
-
- g_object_set(renderer, "text", str, NULL);
-}
-
-gint
-str_ptr_sort_func(GtkTreeModel *model,
- GtkTreeIter *a,
- GtkTreeIter *b,
- gpointer user_data)
-{
- const gchar *str_a = NULL;
- const gchar *str_b = NULL;
- gint ret = 0;
-
- /* The col to get data from is in userdata */
- gint data_column = GPOINTER_TO_INT(user_data);
-
- gtk_tree_model_get(model, a, data_column, &str_a, -1);
- gtk_tree_model_get(model, b, data_column, &str_b, -1);
-
- if (str_a == str_b) {
- /* it's worth testing because a lot of rows point to the same data */
- return 0;
- }
- else if (str_a == NULL || str_b == NULL) {
- ret = (str_a == NULL) ? -1 : 1;
- }
- else {
- ret = g_ascii_strcasecmp(str_a,str_b);
- }
- return ret;
-}
-
-/** --------------------------------------------------
- * ws_combo_box_text_and_pointer convenience functions
- * (Code adapted from GtkComboBox.c)
- */
-
-/**
- * ws_combo_box_new_text_and_pointer_full:
- *
- * Convenience function which constructs a new "text and pointer" combo box, which
- * is a #GtkComboBox just displaying strings and storing a pointer associated with
- * each combo_box entry; The pointer can be retrieved when an entry is selected.
- * Also: optionally returns the cell renderer for the combo box.
- * If you use this function to create a text_and_pointer combo_box,
- * you should only manipulate its data source with the
- * following convenience functions:
- * ws_combo_box_append_text_and_pointer()
- * ws_combo_box_append_text_and_pointer_full()
- *
- * @param cell_p pointer to return the 'GtkCellRenderer *' for the combo box (or NULL).
- * @return A pointer to a new text_and_pointer combo_box.
- */
-
-/* Note:
- * GtkComboBox style property: "appears-as-list":
- * Default: 0: ie: displays as menus
- * Wireshark Windows gtkrc: 1: ie: displays as lists (treeview)
- */
-GtkWidget *
-ws_combo_box_new_text_and_pointer_full(GtkCellRenderer **cell_p) {
- GtkWidget *combo_box;
- GtkCellRenderer *cell;
- GtkTreeStore *store;
-
- /* The Tree store for the GtkComboBox has 3 columns:
- 0: text string for display in GtkComboBox list;
- 1: pointer (data) associated with the entry;
- 2: True/False depending upon whether this entry is selectable ("sensitive" attribute).
- */
-
- store = gtk_tree_store_new(3, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN);
- combo_box = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store));
- g_object_unref(store);
- cell = gtk_cell_renderer_text_new();
- gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo_box), cell, TRUE);
- gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo_box), cell,
- "text", 0, "sensitive", 2,
- NULL);
- if (cell_p != NULL) {
- *cell_p = cell;
- }
- return combo_box;
-}
-
-/**
- * ws_combo_box_new_text_and_pointer:
- *
- * Convenience function which constructs a new "text and pointer" combo box, which
- * is a #GtkComboBox just displaying strings and storing a pointer associated with
- * each combo_box entry; The pointer can be retrieved when an entry is selected.
- * If you use this function to create a text_and_pointer combo_box,
- * you should only manipulate its data source with the
- * following convenience functions:
- * ws_combo_box_append_text_and_pointer()
- * ws_combo_box_append_text_and_pointer_full()
- *
- * @return A pointer to a new text_and_pointer combo_box.
- */
-
-GtkWidget *
-ws_combo_box_new_text_and_pointer(void) {
- return ws_combo_box_new_text_and_pointer_full(NULL);
-}
-
-
-/**
- * ws_combo_box_clear_text_and_pointer:
- * @param combo_box A #GtkComboBox constructed using ws_combo_box_new_text_and_pointer()
- *
- * Clears all the text_and_pointer entries in the text_and_pointer combo_box.
- * Note: A "changed" signal will be emitted after the clear if there was
- * an active (selected) entry before the clear.
- * You should use this function only with combo boxes constructed with
- * ws_combo_box_new_text_and_pointer().
- */
-void
-ws_combo_box_clear_text_and_pointer(GtkComboBox *combo_box)
-{
- gtk_tree_store_clear(GTK_TREE_STORE(gtk_combo_box_get_model(combo_box)));
-}
-
-/**
- * ws_combo_box_append_text_and_pointer_full:
- * @param combo_box A #GtkComboBox constructed using ws_combo_box_new_text_and_pointer()
- * @param parent_iter Parent row for apending; NULL if appending to tree top-level;
- * @param text A string to be displayed as an entry in the dropdown list of the combo_box
- * @param ptr A pointer to be associated with this entry of the combo_box
- * @param sensitive TRUE/FALSE to set sensitivity of the entry
- * @return A GtkTreeIter pointing to the appended GtkVomboBox entry.
- *
- * Appends text and ptr to the list of strings and pointers stored in combo_box.
- * The text and ptr can be appended to any existing level of the tree_store.
- * The sensitivity of the row will be set as requested.
- * Note that you can only use this function with combo boxes constructed with
- * ws_combo_box_new_text_and_pointer().
- */
-GtkTreeIter
-ws_combo_box_append_text_and_pointer_full(GtkComboBox *combo_box,
- GtkTreeIter *parent_iter,
- const gchar *text,
- gconstpointer ptr,
- gboolean sensitive)
-{
- GtkTreeIter iter;
- GtkTreeStore *store;
-
- store = GTK_TREE_STORE(gtk_combo_box_get_model(combo_box));
-
- gtk_tree_store_append(store, &iter, parent_iter);
- gtk_tree_store_set(store, &iter, 0, text, 1, ptr, 2, sensitive, -1);
-
- return iter;
-}
-
-/**
- * ws_combo_box_append_text_and_pointer:
- * @param combo_box A #GtkComboBox constructed using ws_combo_box_new_text_and_pointer()
- * @param text A string to be displayed as an entry in the dropdown list of the combo_box
- * @param ptr A pointer to be associated with this entry of the combo_box
- * @return A GtkTreeIter pointing to the appended GtkComboBox entry.
- *
- * Appends text and ptr to the list of strings and pointers stored in combo_box. Note that
- * you can only use this function with combo boxes constructed with
- * ws_combo_box_new_text_and_pointer().
- */
-GtkTreeIter
-ws_combo_box_append_text_and_pointer(GtkComboBox *combo_box,
- const gchar *text,
- gconstpointer ptr)
-{
- return ws_combo_box_append_text_and_pointer_full(combo_box, NULL, text, ptr, TRUE);
-}
-
-
-/**
- * ws_combo_box_get_active_pointer:
- * @param combo_box A #GtkComboBox constructed using ws_combo_box_new_text_and_pointer()
- * @param ptr A pointer to a location in which to store the pointer associated with the active entry
- * @return TRUE if an entry is selected (i.e: an active entry exists); FALSE otherwise
- *
- * You can only use this function with combo boxes constructed with
- * ws_combo_box_new_text_and_pointer().
- */
-gboolean
-ws_combo_box_get_active_pointer(GtkComboBox *combo_box,
- gpointer *ptr)
-{
- GtkTreeStore *store;
- GtkTreeIter iter;
-
- *ptr = NULL;
-
- if (gtk_combo_box_get_active_iter(combo_box, &iter)) {
- store = GTK_TREE_STORE(gtk_combo_box_get_model(combo_box));
- gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
- 1, ptr, -1);
- return TRUE;
- }
- return FALSE;
-}
-
-/**
- * ws_combo_box_get_active:
- * @param combo_box A #GtkComboBox constructed using ws_combo_box_new_text_and_pointer()
- * @return Index of the active entry; -1 if no entry is selected;
- * Note: If the active item is not an immediate child of root of the tree then
- * the index returned is that of the top-level for the acftive entry.
- */
-gint
-ws_combo_box_get_active(GtkComboBox *combo_box)
-{
- return gtk_combo_box_get_active(combo_box);
-}
-
-/**
- * ws_combo_box_set_active:
- * @param combo_box A #GtkComboBox constructed using ws_combo_box_new_text_and_pointer()
- * @param idx of the entry which is to be set as active (ie: selected).
- * Index refers to the immediate children of the tree.
- */
-void
-ws_combo_box_set_active(GtkComboBox *combo_box,
- gint idx)
-{
- gtk_combo_box_set_active(combo_box, idx);
-}
-
-/**
- * ws_combo_box_set_active_iter:
- * @param combo_box A #GtkComboBox constructed using ws_combo_box_new_text_and_pointer()
- * @param iter of the entry which is to be set as active (ie: selected).
- */
-void
-ws_combo_box_set_active_iter(GtkComboBox *combo_box, GtkTreeIter *iter)
-{
- gtk_combo_box_set_active_iter(combo_box, iter);
-}
-
-
-/* Copy functions from GTK 3.0 to be used if GTK version is 2.22 or 2.24 to be able save Graphs to file */
-#if GTK_CHECK_VERSION(2,22,0)
-#if !GTK_CHECK_VERSION(3,0,0)
-static cairo_format_t
-gdk_cairo_format_for_content(cairo_content_t content)
-{
- switch (content)
- {
- case CAIRO_CONTENT_COLOR:
- return CAIRO_FORMAT_RGB24;
- case CAIRO_CONTENT_ALPHA:
- return CAIRO_FORMAT_A8;
- case CAIRO_CONTENT_COLOR_ALPHA:
- default:
- return CAIRO_FORMAT_ARGB32;
- }
-}
-
-static cairo_surface_t *
-gdk_cairo_surface_coerce_to_image(cairo_surface_t *surface,
- cairo_content_t content,
- int src_x,
- int src_y,
- int width,
- int height)
-{
- cairo_surface_t *copy;
- cairo_t *cr;
-
- copy = cairo_image_surface_create(gdk_cairo_format_for_content(content),
- width,
- height);
-
- cr = cairo_create(copy);
- cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
- cairo_set_source_surface(cr, surface, -src_x, -src_y);
- cairo_paint(cr);
- cairo_destroy(cr);
-
- return copy;
-}
-
-static void
-convert_alpha(guchar *dest_data,
- int dest_stride,
- guchar *src_data,
- int src_stride,
- int src_x,
- int src_y,
- int width,
- int height)
-{
- int x, y;
-
- src_data += src_stride * src_y + src_x * 4;
-
- for (y = 0; y < height; y++) {
- guint32 *src = (guint32 *)src_data;
-
- for (x = 0; x < width; x++) {
- guint alpha = src[x] >> 24;
-
- if (alpha == 0)
- {
- dest_data[x * 4 + 0] = 0;
- dest_data[x * 4 + 1] = 0;
- dest_data[x * 4 + 2] = 0;
- }
- else
- {
- dest_data[x * 4 + 0] = (((src[x] & 0xff0000) >> 16) * 255 + alpha / 2) / alpha;
- dest_data[x * 4 + 1] = (((src[x] & 0x00ff00) >> 8) * 255 + alpha / 2) / alpha;
- dest_data[x * 4 + 2] = (((src[x] & 0x0000ff) >> 0) * 255 + alpha / 2) / alpha;
- }
- dest_data[x * 4 + 3] = alpha;
- }
-
- src_data += src_stride;
- dest_data += dest_stride;
- }
-}
-
-static void
-convert_no_alpha(guchar *dest_data,
- int dest_stride,
- guchar *src_data,
- int src_stride,
- int src_x,
- int src_y,
- int width,
- int height)
-{
- int x, y;
-
- src_data += src_stride * src_y + src_x * 4;
-
- for (y = 0; y < height; y++) {
- guint32 *src = (guint32 *)src_data;
-
- for (x = 0; x < width; x++) {
- dest_data[x * 3 + 0] = src[x] >> 16;
- dest_data[x * 3 + 1] = src[x] >> 8;
- dest_data[x * 3 + 2] = src[x];
- }
-
- src_data += src_stride;
- dest_data += dest_stride;
- }
-}
-
-/**
- * gdk_pixbuf_get_from_surface:
- * @surface: surface to copy from
- * @src_x: Source X coordinate within @surface
- * @src_y: Source Y coordinate within @surface
- * @width: Width in pixels of region to get
- * @height: Height in pixels of region to get
- *
- * Transfers image data from a #cairo_surface_t and converts it to an RGB(A)
- * representation inside a #GdkPixbuf. This allows you to efficiently read
- * individual pixels from cairo surfaces. For #GdkWindows, use
- * gdk_pixbuf_get_from_window() instead.
- *
- * This function will create an RGB pixbuf with 8 bits per channel.
- * The pixbuf will contain an alpha channel if the @surface contains one.
- *
- * Return value: (transfer full): A newly-created pixbuf with a reference
- * count of 1, or %NULL on error
- */
-GdkPixbuf *
-gdk_pixbuf_get_from_surface(cairo_surface_t *surface,
- gint src_x,
- gint src_y,
- gint width,
- gint height)
-{
- cairo_content_t content;
- GdkPixbuf *dest;
-
- /* General sanity checks */
- g_return_val_if_fail(surface != NULL, NULL);
- g_return_val_if_fail(width > 0 && height > 0, NULL);
-
- content = (cairo_content_t)(cairo_surface_get_content(surface) | CAIRO_CONTENT_COLOR);
- dest = gdk_pixbuf_new(GDK_COLORSPACE_RGB,
- !!(content & CAIRO_CONTENT_ALPHA),
- 8,
- width, height);
-
- surface = gdk_cairo_surface_coerce_to_image(surface, content,
- src_x, src_y,
- width, height);
- cairo_surface_flush(surface);
- if (cairo_surface_status(surface) || dest == NULL)
- {
- cairo_surface_destroy(surface);
- return NULL;
- }
-
- if (gdk_pixbuf_get_has_alpha(dest))
- convert_alpha(gdk_pixbuf_get_pixels(dest),
- gdk_pixbuf_get_rowstride(dest),
- cairo_image_surface_get_data(surface),
- cairo_image_surface_get_stride(surface),
- 0, 0,
- width, height);
- else
- convert_no_alpha(gdk_pixbuf_get_pixels(dest),
- gdk_pixbuf_get_rowstride(dest),
- cairo_image_surface_get_data(surface),
- cairo_image_surface_get_stride(surface),
- 0, 0,
- width, height);
-
- cairo_surface_destroy(surface);
- return dest;
-}
-#endif /* !GTK_CHECK_VERSION(3,0,0) */
-#endif /* GTK_CHECK_VERSION(2,22,0) */
-
-
-GtkWidget *
-ws_gtk_box_new(GtkOrientation orientation,
- gint spacing,
- gboolean homogeneous)
-{
-#if !GTK_CHECK_VERSION(3,0,0)
- if (orientation == GTK_ORIENTATION_HORIZONTAL)
- return ws_gtk_hbox_new(homogeneous, spacing);
- else
- return ws_gtk_vbox_new(homogeneous, spacing);
-#else
- GtkWidget *widget;
-
- widget = gtk_box_new(orientation, spacing);
- gtk_box_set_homogeneous(GTK_BOX(widget), homogeneous);
-
- return widget;
-#endif /* GTK_CHECK_VERSION(3,0,0) */
-}
-
-#if !GTK_CHECK_VERSION(3,0,0)
-GtkWidget *
-gtk_button_box_new(GtkOrientation orientation)
-{
- if (orientation == GTK_ORIENTATION_HORIZONTAL) {
- return ws_gtk_hbutton_box_new();
- } else {
- return gtk_vbutton_box_new();
- }
-}
-
-GtkWidget *
-gtk_scrollbar_new(GtkOrientation orientation,
- GtkAdjustment *adjustment)
-{
- if (orientation == GTK_ORIENTATION_HORIZONTAL) {
- return gtk_hscrollbar_new(adjustment);
- } else {
- return gtk_vscrollbar_new(adjustment);
- }
-}
-
-GtkWidget *
-gtk_paned_new(GtkOrientation orientation)
-{
- if(orientation == GTK_ORIENTATION_HORIZONTAL) {
- return gtk_hpaned_new();
- } else {
- return gtk_vpaned_new();
- }
-}
-
-GtkWidget *
-gtk_separator_new(GtkOrientation orientation)
-{
- if (orientation == GTK_ORIENTATION_HORIZONTAL) {
- return gtk_hseparator_new();
- } else {
- return gtk_vseparator_new();
- }
-}
-#endif /* GTK_CHECK_VERSION(3,0,0) */
-
-GtkWidget *
-frame_new(const gchar *title) {
- GtkWidget *frame, *frame_lb;
- GString *mu_title = g_string_new("");
-
- frame = gtk_frame_new(NULL);
- gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_NONE);
- if (title) {
-#if defined(_WIN32) || defined(__APPLE__)
- g_string_printf(mu_title, "%s", title);
-#else
- g_string_printf(mu_title, "<b>%s</b>", title);
-#endif
- frame_lb = gtk_label_new(NULL);
- gtk_label_set_markup(GTK_LABEL(frame_lb), mu_title->str);
- gtk_frame_set_label_widget(GTK_FRAME(frame), frame_lb);
- }
- g_string_free(mu_title, TRUE);
-
- return frame;
-}
-
-
-/* ---------------------------------
- * ws_gtk_grid...() wrappers
- * See gui_utils.h
- */
-
-#if !GTK_CHECK_VERSION(3,0,0)
-#else /* GTK3 */
-
-void
-ws_gtk_grid_attach_defaults(GtkGrid *grid, GtkWidget *child, gint left, gint top, gint width, gint height)
-{
- /* Use defaults for [x|y]options and [x|y]padding which match those for gtk_table_attach_defaults() */
- ws_gtk_grid_attach_extended(grid, child, left, top, width, height,
- (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
-}
-
-void
-ws_gtk_grid_attach_extended(GtkGrid *grid, GtkWidget *child,
- gint left, gint top, gint width, gint height,
- GtkAttachOptions xoptions, GtkAttachOptions yoptions,
- guint xpadding, guint ypadding)
-{
- gtk_grid_attach(grid, child, left, top, width, height);
-
- /* XXX: On Gtk3, there's Some trickyness about EXPAND which I probably don't
- * really understand.
- * It seems that:
- * Default for EXPAND is "not set".
- * In this case "computed expand" based on any child(ren) of this widget will
- * affect this widget.
- * If EXPAND is set (either TRUE or FALSE) then the value overrides any effect
- * from children.
- */
-
- /* Note: widget defaults are FALSE */
- if (xoptions & GTK_EXPAND)
- gtk_widget_set_hexpand(child, TRUE);
- if (yoptions & GTK_EXPAND)
- gtk_widget_set_vexpand(child, TRUE);
-
- /* Note: widget default is GTK_FILL */
- /* XXX: Is an 'align' ignored if the corresponding 'fill; is FALSE ? */
- /* XXX: don't set FILL(since is dedault) but just clear if not set ?? */
- /* ToDo: review effect of explicit set/clear vs explict clear only */
- gtk_widget_set_halign(child, (xoptions & GTK_FILL) ? GTK_ALIGN_FILL : GTK_ALIGN_CENTER);
- gtk_widget_set_valign(child, (yoptions & GTK_FILL) ? GTK_ALIGN_FILL : GTK_ALIGN_CENTER);
-
- if (xpadding != 0) {
- gtk_widget_set_margin_left(child, xpadding);
- gtk_widget_set_margin_right(child, xpadding);
- }
- if (ypadding != 0) {
- gtk_widget_set_margin_top(child, ypadding);
- gtk_widget_set_margin_bottom(child, ypadding);
- }
-}
-
-void
-ws_gtk_grid_set_homogeneous(GtkGrid *grid, gboolean homogeneous)
-{
- gtk_grid_set_row_homogeneous(grid, homogeneous);
- gtk_grid_set_column_homogeneous(grid, homogeneous);
-}
-#endif /* !GTK_CHECK_VERSION(3,0,0) */
-
-/*
- * Wrap gdk_cairo_set_source_color() with the GTK 3 equivalent
- * to be used in GTK2
- */
-#if !GTK_CHECK_VERSION(3,0,0)
-void
-gdk_cairo_set_source_rgba(cairo_t *cr, const GdkRGBA *rgba)
-{
- GdkColor color;
-
- gdkRGBAcolor_to_GdkColor(&color, rgba);
-
- gdk_cairo_set_source_color(cr, &color);
-
-}
-#endif /* GTK_CHECK_VERSION(3,0,0) */
-
-#ifdef HAVE_GDK_GRESOURCE
-GdkPixbuf *
-ws_gdk_pixbuf_new_from_resource(const char *path)
-{
- GdkPixbuf *pixbuf;
- GError *err = NULL;
-
- pixbuf = gdk_pixbuf_new_from_resource(path, &err);
- g_assert_no_error(err);
- return pixbuf;
-}
-#endif /* HAVE_GDK_GRESOURCE */
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/gui_utils.h b/ui/gtk/gui_utils.h
deleted file mode 100644
index b94d10e12a..0000000000
--- a/ui/gtk/gui_utils.h
+++ /dev/null
@@ -1,682 +0,0 @@
-/* gui_utils.h
- * Declarations of GTK+-specific UI utility routines
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __GUI_UTILS_H__
-#define __GUI_UTILS_H__
-
-#include "ui/ws_ui_util.h"
-
-/** @defgroup windows_group Windows
- *
- * There are the following toplevel windows:
- *
- * - @ref main_window_group
- * - Statistic Windows (several different statistic windows)
- *
- * See: @ref howto_window_page for details.
- *
- */
-
-/** @page howto_window_page How to develop a window / dialog
- *
- * Windows and dialogs are related to each other. Dialogs are special kind of windows, but they behave
- * slightly different. A dialog sticks on its parent window; A normal window will be much more independent
- * from its parent window. Dialogs should be used to ask or tell the user something, while windows should
- * show data which is independent of the main window.
- * Dialogs are created by calling dlg_window_new() which in turn will call window_new().
- * After that, dialogs can be developed the same way as windows; all window related functions in gui_utils.h
- * can be used for both.
- *
- * @section window_create Create a window
- *
- * A typical window / dialog will be created by the following calls:
- *
- * - window_new() will create a new window with default position and size,
- * use dlg_window_new() if you need a dialog (transient to the main window)
- * - gtk_window_set_default_size() will set the default size of the window. Only
- * needed, if the initial size is not appropriate, e.g. when a scrolled_window_new() is used.
- * - g_signal_connect(my_win, "destroy", my_destroy_cb, NULL) will create a callback if some cleanup
- * needs to be done after the window is destroyed, e.g. free up memory, or set the window pointer
- * of a singleton window (only one instance allowed, e.g. about dialog) back to zero
- * - create and fill in the content and button widgets
- * - gtk_widget_show_all() shows all the widgets in the window
- * - window_present() will present the window on screen and
- * (if available) set previously saved position and size
- *
- * @section window_events Events
- *
- * The following events are usually interesting:
- *
- * - "delete_event": the window manager's "X" (e.g. upper right edge) of the window
- * was clicked; the default handler will call gtk_widget_destroy()
- * - "destroy": everything is already gone; only cleanup of left over resources
- * can/should be done now
- *
- * @section window_hints Hints
- *
- * If you want to save size and position, be sure to call window_destroy() instead of only
- * gtk_widget_destroy(), so you will probably have to g_signal_connect() to the "delete_event"!
- *
- * Don't use gtk_widget_set_size_request() to set the size of a window;
- * use gtk_window_set_default_size() for that purpose!
- *
- * Be sure to call window_present() / window_destroy() appropriately, if you
- * want to have size and position of the window handled by ui_util.
- *
- */
-
-/** @file
- * Utilities for Windows and other user interface functions. See: @ref howto_window_page for details.
- * @ingroup dialog_group
- * @ingroup windows_group
- */
-
-/** @name Window Functions
- * @todo Move these window functions to a new file win_utils.h?
- * @{ */
-
-/** Create a new window with the Wireshark icon.
- * If you want to create a dialog, use dlg_window_new() instead.
- *
- * @param type window type, typical GTK_WINDOW_TOPLEVEL
- * @param title the title for the new window
- * @return the newly created window
- */
-extern GtkWidget *window_new(GtkWindowType type, const gchar *title);
-
-/** Same as window_new(), but will keep its geometry values (size, position, ...).
- * Be sure to use window_present() and window_destroy() appropriately!
- *
- * @param type window type, typical GTK_WINDOW_TOPLEVEL
- * @param title the title for the new window
- * @param geom_name the name to distinguish this window; will also be used for the recent file (don't use special chars)
- * @param pos the initial position of the window if a previously saved geometry was not saved or found.
- * If the initial position does not matter, specify GTK_WIN_POS_NONE.
- * @return the newly created window
- */
-extern GtkWidget *window_new_with_geom(GtkWindowType type, const gchar *title, const gchar *geom_name, GtkWindowPosition pos);
-
-/** Create a new splash window, with no icon or title bar.
- *
- * @return the newly created window
- */
-extern GtkWidget *splash_window_new(void);
-
-/** Present the created window on the top of the screen. This will put the window on top and
- * (if available) set previously saved position and size.
- *
- * @param win the window from window_new()
- */
-extern void window_present(GtkWidget *win);
-
-/** callback function for window_set_cancel_button() */
-typedef void (*window_cancel_button_fct) (GtkWidget *w, gpointer data);
-
-/** Register the default cancel button "Cancel"/"Close"/"Ok" of this window.
- * This will set the callback function for this button, grab this button as the default one and
- * set the "ESC" key handler to call the callback function if key is pressed.
- *
- * @param win the window from window_new()
- * @param bt the default button of this window
- * @param cb callback function to be called, when this button is pressed
- */
-extern void window_set_cancel_button(GtkWidget *win, GtkWidget *bt, window_cancel_button_fct cb);
-
-/** Remember the current window position / size and then destroy the window.
- * It's important to call this instead of gtk_widget_destroy() when using window_new_with_geom().
- *
- * @param win the window from window_new()
- */
-extern void window_destroy(GtkWidget *win);
-
-/** Default callback handler for cancel button "clicked" signal.
- * Use this for window_set_cancel_button(), if no user specific functionality required,
- * will simply call window_destroy()
- */
-extern void window_cancel_button_cb(GtkWidget *w _U_, gpointer data);
-
-/** Default callback handler if the window manager's X of the window was clicked (delete_event).
- * Use this for g_signal_connect(), if no user specific functionality required,
- * will simply call window_destroy()
- */
-extern gboolean window_delete_event_cb(GtkWidget *win, GdkEvent *event _U_, gpointer user_data _U_);
-
-/** Get the geometry of a window.
- *
- * @param win the window from window_new()
- * @param geom the current geometry values of the window; the set_xy values will not be used
- * @todo if main uses the window_new_with_geom() to save size and such, make this function static
- */
-extern void window_get_geometry(GtkWidget *win, window_geometry_t *geom);
-
-/** Set the geometry of a window.
- *
- * @param win the window from window_new()
- * @param geom the new geometry values of the window
- * @todo if main uses the window_new_with_geom() to save size and such, make this function static
- */
-extern void window_set_geometry(GtkWidget *win, window_geometry_t *geom);
-
-/** Raise a top-level window and de-iconify it.
- * This routine is used if the user has done something to
- * ask that a window of a certain type be popped up when there can be only
- * one such window and such a window has already been popped up - we
- * pop up the existing one rather than creating a new one.
- *
- * @param win the window from window_new() to be reactivated
- */
-extern void reactivate_window(GtkWidget *win);
-
-/** @} */
-
-/** Alert box for an invalid display filter expression.
- *
- * @param parent parent window from which the display filter came
- * @param dftext text of the display filter
- * @param err_msg text of the error message for the filter
- */
-extern void bad_dfilter_alert_box(GtkWidget *parent, const char *dftext, gchar *err_msg);
-
-/** Create a GtkScrolledWindow, set its scrollbar placement appropriately,
- * and remember it.
- *
- * @param hadjustment horizontal adjustment
- * @param vadjustment vertical adjustment
- * @return the new scrolled window
- */
-extern GtkWidget *scrolled_window_new(GtkAdjustment *hadjustment,
- GtkAdjustment *vadjustment);
-
-/** Create a GtkTreeView, give it the right styles, and remember it.
- *
- * @param model The model (the data) of this tree view.
- */
-extern GtkWidget *tree_view_new(GtkTreeModel *model);
-
-/** Move the currently-selected item in a list store up or down one position.
- *
- * @param tree GtkTreeView using a GtkListStore.
- * @param move_up TRUE to move the selected item up or FALSE to move it down.
- * @return TRUE if successful, FALSE otherwise.
- */
-extern gboolean tree_view_list_store_move_selection(GtkTreeView *tree, gboolean move_up);
-
-/** Find the selected row in a list store.
- *
- * @param tree GtkTreeView using a GtkListStore.
- * @return The selected row number or -1 if no row is selected.
- */
-extern gint tree_view_list_store_get_selected_row(GtkTreeView *tree);
-
-/** Create a simple list widget.
- *
- * @param cols number of columns
- * @param titles the titles of all columns
- * @return the new simple list widget
- */
-extern GtkWidget *simple_list_new(gint cols, const gchar **titles);
-/** Append a row to the simple list.
- *
- * @param list the list from simple_list_new()
- * @param ... row and title, finished by -1 (e.g.: 0, "first", 1, "second", -1).
- */
-extern void simple_list_append(GtkWidget *list, ...);
-
-/*** Make a column look like a url
- *
- * @param list the list from simple_list_new()
- * @param col the column to make the values lookk like urls
- */
-extern void simple_list_url_col(GtkWidget *list, gint col);
-
-/*** Make a cell underline to look like links
- *
- * @param cell the cell renderer that will show the text as a link
- */
-
-extern void render_as_url(GtkCellRenderer *cell);
-
-/** Set the styles of all Trees based upon user preferences. */
-extern void set_tree_styles_all(void);
-
-/** Convert an xpm picture into a GtkWidget showing it.
- * Beware: Wireshark's main window must already be visible!
- *
- * @param xpm the character array containing the picture
- * @return a newly created GtkWidget showing the picture
- */
-extern GtkWidget *xpm_to_widget(const char ** xpm);
-
-#if 0
-/** Convert an xpm picture into a GtkWidget showing it.
- * Beware: the given parent window must already be visible!
- *
- * @param parent the parent window of to widget to be generated
- * @param xpm the character array containing the picture
- * @return a newly created GtkWidget showing the picture
- */
-extern GtkWidget *xpm_to_widget_from_parent(GtkWidget *parent, const char ** xpm);
-#endif
-
-#ifdef HAVE_GDK_GRESOURCE
-/** Convert pixbuf data to a GtkWidget
- *
- * @param pb_path GResource pixbuf path.
- */
-extern GtkWidget *pixbuf_to_widget(const char *pb_path);
-
-#define PIXBUF_TO_WIDGET(pb, path) \
- pixbuf_to_widget(path)
-#else
- /** Convert an pixbuf data to a GtkWidget
- *
- * @param pb_data Inline pixbuf data. This should be created with "gdk-pixbuf-csource --raw"
- */
-extern GtkWidget *pixbuf_to_widget(const guint8 * pb_data);
-
-#define PIXBUF_TO_WIDGET(pb, path) \
- pixbuf_to_widget(pb)
-#endif /* HAVE_GDK_GRESOURCE */
-
-/** Copy a GString to the clipboard.
- *
- * @param str GString that is to be copied to the clipboard.
- */
-extern void copy_to_clipboard(GString *str);
-
-/** Copy an array of bytes to the clipboard.
- * Copies as mime-type application/octet-stream in GTK 2.
- *
- * @param data_p Pointer to data to be copied.
- * @param len Number of bytes in the data to be copied.
- */
-extern void copy_binary_to_clipboard(const guint8* data_p, int len);
-
-/** Create a new window title that includes user-defined preference string.
- *
- * @param caption string you want included in title (appended to user-defined string)
- * @return a newly created title string including user-defined preference (if specified)
- */
-extern gchar *create_user_window_title(const gchar *caption);
-
-/** Set the title of a window based on a supplied caption and the
- * display name for the capture file.
- *
- * @param win the window whose title is to be set
- * @param caption caption string for the window
- */
-extern void set_window_title(GtkWidget *win, const gchar *caption);
-
-/** Collapses tree item and his expanded children
- *
- * @param tree_view A GtkTreeView
- * @param path Path to the field
- */
-extern void tree_collapse_path_all(GtkTreeView *tree_view, GtkTreePath *path);
-
-/** Renders a float with two decimals precission, called from gtk_tree_view_column_set_cell_data_func().
- * the user data must be the column number.
- * Present floats with two decimals
- *
- * @param column A GtkTreeColumn
- * @param renderer The GtkCellRenderer that is being rendered by tree_column
- * @param model The GtkTreeModel being rendered
- * @param iter A GtkTreeIter of the current row rendered
- * @param user_data must be the column number to fetch the data from
- */
-void float_data_func (GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data);
-
-/** Renders a unsinged integer as a hexadecimal value, called from gtk_tree_view_column_set_cell_data_func()
- * The user data must be the column number.
- * Present value as hexadecimal.
- * @param column A GtkTreeColumn
- * @param renderer The GtkCellRenderer that is being rendered by tree_column
- * @param model The GtkTreeModel being rendered
- * @param iter A GtkTreeIter of the current row rendered
- * @param user_data must be the column number to fetch the data from
- */
-void present_as_hex_func (GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data);
-
-/** Renders an unsigned 64 bits integer with space as thousand separator, called from gtk_tree_view_column_set_cell_data_func()
- * The user data must be the column number.
- * Present value as hexadecimal.
- * @param column A GtkTreeColumn
- * @param renderer The GtkCellRenderer that is being rendered by tree_column
- * @param model The GtkTreeModel being rendered
- * @param iter A GtkTreeIter of the current row rendered
- * @param user_data must be the column number to fetch the data from
- */
-void u64_data_func (GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data);
-
-/** This function can be called from gtk_tree_view_column_set_cell_data_func()
- * the user data must be the column number.
- * Present value as hexadecimal.
- * @param column A GtkTreeColumn
- * @param renderer The GtkCellRenderer that is being rendered by tree_column
- * @param model The GtkTreeModel being rendered
- * @param iter A GtkTreeIter of the current row rendered
- * @param user_data must be the column number to fetch the data from
- */
-void str_ptr_data_func(GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data);
-
-/** This function can be called from gtk_tree_sortable_set_sort_func()
- * the user data must be the column number.
- * Used together with str_ptr_data_func to sort the corresponding column.
- * @param model The GtkTreeModel the comparison is within
- * @param a A GtkTreeIter in model
- * @param b Another GtkTreeIter in model
- * @param user_data must be the column number to fetch the data from
- */
-
-gint str_ptr_sort_func(GtkTreeModel *model,
- GtkTreeIter *a,
- GtkTreeIter *b,
- gpointer user_data);
-
-/** Switch a GtkTReeView to fixed columns (speed optimization)
- * @param view A GtkTreeView
- */
-void switch_to_fixed_col(GtkTreeView *view);
-
-/** Return the size in pixels of a string displayed with the GtkWidget's font.
- * @param view A GtkWidget
- * @param str UTF8 string
- */
-gint get_default_col_size(GtkWidget *view, const gchar *str);
-
-
-/** --------------------------------------------------
- * ws_combo_box_text_and_pointer convenience functions
- * (Code adapted from GtkComboBox.c)
- */
-
-/**
- * ws_combo_box_new_text_and_pointer_full:
- *
- * Convenience function which constructs a new "text and pointer" combo box, which
- * is a #GtkComboBox just displaying strings and storing a pointer associated with
- * each combo_box entry; The pointer can be retrieved when an entry is selected.
- * Also: optionally returns the cell renderer for the combo box.
- * If you use this function to create a text_and_pointer combo_box,
- * you should only manipulate its data source with the
- * following convenience functions:
- * ws_combo_box_append_text_and_pointer()
- * ws_combo_box_append_text_and_pointer_full()
- *
- * @param cell_p pointer to return the 'GtkCellRenderer *' for the combo box (or NULL).
- * @return A pointer to a new text_and_pointer combo_box.
- */
-GtkWidget *ws_combo_box_new_text_and_pointer_full(GtkCellRenderer **cell_p);
-
-/**
- * ws_combo_box_new_text_and_pointer:
- *
- * Convenience function which constructs a new "text and pointer" combo box, which
- * is a #GtkComboBox just displaying strings and storing a pointer associated with
- * each combo_box entry; The pointer can be retrieved when an entry is selected.
- * If you use this function to create a text_and_pointer combo_box,
- * you should only manipulate its data source with the
- * following convenience functions:
- * ws_combo_box_append_text_and_pointer()
- * ws_combo_box_append_text_and_pointer_full()
- *
- * @return A pointer to a new text_and_pointer combo_box.
- */
-GtkWidget *ws_combo_box_new_text_and_pointer(void);
-
-/**
- * ws_combo_box_clear_text_and_pointer:
- * @param combo_box A #GtkComboBox constructed using ws_combo_box_new_text_and_pointer()
- *
- * Clears all the text_and_pointer entries in the text_and_pointer combo_box.
- * Note: A "changed" signal will be emitted after the clear if there was
- * an active (selected) entry before the clear.
- * You should use this function only with combo boxes constructed with
- * ws_combo_box_new_text_and_pointer().
- */
-void ws_combo_box_clear_text_and_pointer(GtkComboBox *combo_box);
-
-/**
- * ws_combo_box_append_text_and_pointer_full:
- * @param combo_box A #GtkComboBox constructed using ws_combo_box_new_text_and_pointer()
- * @param parent_iter Parent row for apending; NULL if appending to tree top-level;
- * @param text A string to be displayed as an entry in the dropdown list of the combo_box
- * @param ptr A pointer to be associated with this entry of the combo_box
- * @param sensitive TRUE/FALSE to set sensitivity of the entry
- * @return A GtkTreeIter pointing to the appended GtkVomboBox entry.
- *
- * Appends text and ptr to the list of strings and pointers stored in combo_box.
- * The text and ptr can be appended to any existing level of the tree_store.
- * The sensitivity of the row will be set as requested.
- * Note that you can only use this function with combo boxes constructed with
- * ws_combo_box_new_text_and_pointer().
- */
-GtkTreeIter
-ws_combo_box_append_text_and_pointer_full(GtkComboBox *combo_box,
- GtkTreeIter *parent_iter,
- const gchar *text,
- gconstpointer ptr,
- gboolean sensitive);
-
-/**
- * ws_combo_box_append_text_and_pointer:
- * @param combo_box A #GtkComboBox constructed using ws_combo_box_new_text_and_pointer()
- * @param text A string to be displayed as an entry in the dropdown list of the combo_box
- * @param ptr A pointer to be associated with this entry of the combo_box
- * @return A GtkTreeIter pointing to the appended GtkComboBox entry.
- *
- * Appends text and ptr to the list of strings and pointers stored in combo_box. Note that
- * you can only use this function with combo boxes constructed with
- * ws_combo_box_new_text_and_pointer().
- */
-GtkTreeIter
-ws_combo_box_append_text_and_pointer(GtkComboBox *combo_box,
- const gchar *text,
- gconstpointer ptr);
-
-/**
- * ws_combo_box_get_active_pointer:
- * @param combo_box A #GtkComboBox constructed using ws_combo_box_new_text_and_pointer()
- * @param ptr A pointer to a location in which to store the pointer associated with the active entry
- * @return TRUE if an entry is selected (i.e: an active entry exists); FALSE otherwise
- *
- * You can only use this function with combo boxes constructed with
- * ws_combo_box_new_text_and_pointer().
- */
-gboolean ws_combo_box_get_active_pointer(GtkComboBox *combo_box, gpointer *ptr);
-
-/**
- * ws_combo_box_get_active:
- * @param combo_box A #GtkComboBox constructed using ws_combo_box_new_text_and_pointer()
- * @return Index of the active entry; -1 if no entry is selected;
- * Note: If the active item is not an immediate child of root of the tree then
- * the index returned is that of the top-level for the acftive entry.
- */
-gint ws_combo_box_get_active(GtkComboBox *combo_box);
-
-/**
- * ws_combo_box_set_active:
- * @param combo_box A #GtkComboBox constructed using ws_combo_box_new_text_and_pointer()
- * @param idx Index of the entry which is to be set as active (ie: selected).
- * Index refers to the immediate children of the tree.
- */
-void ws_combo_box_set_active(GtkComboBox *combo_box, gint idx);
-
-/**
- * ws_combo_box_set_active_iter:
- * @param combo_box A #GtkComboBox constructed using ws_combo_box_new_text_and_pointer()
- * @param iter of the entry which is to be set as active (ie: selected).
- */
-void
-ws_combo_box_set_active_iter(GtkComboBox *combo_box, GtkTreeIter *iter);
-
-#ifdef HAVE_GDK_GRESOURCE
-/**
- * ws_gdk_pixbuf_new_from_resource:
- * @param path A GResource path
- * @return The GdkPixbuf object
- */
-GdkPixbuf *
-ws_gdk_pixbuf_new_from_resource(const char *path);
-#endif /* HAVE_GDK_GRESOURCE */
-
-#if GTK_CHECK_VERSION(2,22,0)
-#if !GTK_CHECK_VERSION(3,0,0)
-GdkPixbuf *gdk_pixbuf_get_from_surface (cairo_surface_t *surface,
- gint src_x,
- gint src_y,
- gint width,
- gint height);
-#endif /* GTK_CHECK_VERSION(3,0,0) */
-#endif /* GTK_CHECK_VERSION(2,22,0) */
-
-/**
- * ws_gtk_box_new:
- * @param orientation the box's orientation
- * @param spacing the number of pixels to put between children
- * @param homogeneous a boolean value, TRUE to create equal allotments, FALSE for variable allotments
- */
-GtkWidget * ws_gtk_box_new(GtkOrientation orientation, gint spacing, gboolean homogeneous);
-
-#if !GTK_CHECK_VERSION(3,0,0)
-typedef struct {
- gdouble red;
- gdouble green;
- gdouble blue;
- gdouble alpha;
-} GdkRGBA;
-
-GtkWidget * gtk_button_box_new(GtkOrientation orientation);
-GtkWidget * gtk_scrollbar_new(GtkOrientation orientation, GtkAdjustment *adjustment);
-GtkWidget * gtk_paned_new(GtkOrientation orientation);
-GtkWidget * gtk_separator_new (GtkOrientation orientation);
-void gdk_cairo_set_source_rgba(cairo_t *cr, const GdkRGBA *rgba);
-#endif /* GTK_CHECK_VERSION(3,0,0) */
-
-/** Create a new frame with no border and a bold title on appropriate platforms.
- *
- * @param title The title for the new frame
- * @return The newly created window
- */
-extern GtkWidget *frame_new(const gchar *title);
-
-
-/* GtkTable is deprecated in Gtk3 ...
- *
- * ws_gtk_grid...() wrapper functions & macros matching basic GtkGrid functions
- * have been created which can be used both on Gtk2 and Gtk3.
- *
- * The functionality provided matches the fairly simple Wireshatk
- * Gtk2 GtkTable usage and is intended to replace same.
- *
- * The ws_gtk_grid...() functionality is implemented as follows:
- * Gtk2: macros which effect calls to GtkTable functions
- * (with GTK_GRID typedef'd as GTK_TABLE & etc).
- * Gtk3: wrapper functions and macros which effect calls to gtk_grid...()
- * and other Gtk3 functions as needed.
- *
- * The args to the ws_gtk_grid...() functions are identical to the corresponding
- * Gtk3 gtk_grid...() functions (other than ws_gtk_attach_defaults() and
- * ws_gtk_attach_extended() which have no gtk_grid...() equivalent).
- *
- * ws_gtk_grid_new() ;; gtk_table_new()
- *
- * ws_gtk_grid_attach() ;; gtk_table_attach( , , , , , ,0, 0, 0, 0)
- * ;; that is: same as gtk_grid_attach()
- * ;; Gt2/Gtk3: [h|v]expand = FALSE; (FILL ignored)
- *
- * ws_gtk_grid_attach_defaults() ;; gtk_table_attach_defaults()
- * ;; Gtk3: sets GTK_EXPAND/GTK_FILL as default;
- * ;; That is, the defaults used by gtk_table_attach_defaults()
- * ws_gtk_grid_attach_extended() ;; gtk_table_attach()
- * ;; Essentially gtk_grid_attach() with eadditional args
- * ;; to specify 'options' and 'padding' [as used in gtk_table_attach()];
- * ;; Gtk3: sets GTK_EXPAND/GTK_FILL & margins on child widgit
- * ;; as specified.
- * ;; (See below for declaration).
- * ws_gtk_grid_set_homogeneous() ;; gtk_table_set_homogeneous()
- * ;; Gtk3 grid: sets both 'row-homogeneous' and 'column-homogeneous'
- * ws_gtk_set_row_spacing() ;; gtk_table_set_row_spacings()
- * ws_gtk_set_column_spacing() ;; gtk_table_set_col_spacings()
- *
- * Example: Existing Wireshark Gtk2 code:
- * gtk_table_attach_defaults(GTK_TABLE(foo_tb), child, col, col+1, row, row+1)
- *
- * should be converted to:
- * ws_gtk_grid_attach_defaults(GTK_GRID(foo_grid), child, col, row, 1, 1);
- */
-
-#if !GTK_CHECK_VERSION(3,0,0)
-
-typedef GtkTable GtkGrid;
-#define GTK_GRID(x) GTK_TABLE(x)
-
-#define ws_gtk_grid_new() \
- gtk_table_new(0, 0, FALSE)
-
-#define ws_gtk_grid_attach(grid, child, left, top, width, height) \
- gtk_table_attach(grid, child, left, left+width, top, top+height, (GtkAttachOptions)0, (GtkAttachOptions)0, 0, 0)
-
-#define ws_gtk_grid_attach_defaults(grid, child, left, top, width, height) \
- gtk_table_attach_defaults(grid, child, left, left+width, top, top+height)
-
-#define ws_gtk_grid_attach_extended(grid, child, left, top, width, height, xoptions, yoptions, xpadding, ypadding) \
- gtk_table_attach(grid, child, left, left+width, top, top+height, xoptions, yoptions, xpadding, ypadding)
-
-#define ws_gtk_grid_set_homogeneous(grid, homogeneous) \
- gtk_table_set_homogeneous(grid, homogeneous)
-
-#define ws_gtk_grid_set_row_spacing(grid, spacing) \
- gtk_table_set_row_spacings(grid, spacing)
-
-#define ws_gtk_grid_set_column_spacing(grid, spacing) \
- gtk_table_set_col_spacings(grid, spacing)
-
-
-#else
-#define ws_gtk_grid_new() \
- gtk_grid_new()
-
-
-#define ws_gtk_grid_attach(grid, child, left, top, width, height) \
- gtk_grid_attach(grid, child, left, top, width, height)
-
-extern void ws_gtk_grid_attach_defaults(GtkGrid *grid, GtkWidget *child,
- gint left, gint top, gint width, gint height);
-
-extern void ws_gtk_grid_attach_extended(GtkGrid *grid, GtkWidget *child,
- gint left, gint top, gint width, gint height,
- GtkAttachOptions xoptions, GtkAttachOptions yoptions,
- guint xpadding, guint ypadding);
-
-extern void ws_gtk_grid_set_homogeneous(GtkGrid *grid, gboolean homogeneous);
-
-#define ws_gtk_grid_set_row_spacing(grid, spacing) \
- gtk_grid_set_row_spacing(grid, spacing)
-
-#define ws_gtk_grid_set_column_spacing(grid, spacing) \
- gtk_grid_set_column_spacing(grid, spacing)
-
-#endif /* GTK_CHECK_VERSION(3,0,0) */
-
-
-#endif /* __GUI_UTIL_H__ */
diff --git a/ui/gtk/help_dlg.c b/ui/gtk/help_dlg.c
deleted file mode 100644
index c02d878ac5..0000000000
--- a/ui/gtk/help_dlg.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/* help_dlg.c
- *
- * Laurent Deniel <laurent.deniel@free.fr>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 2000 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-#include <errno.h>
-
-#include <gtk/gtk.h>
-
-
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/text_page_utils.h"
-#include "ui/gtk/webbrowser.h"
-
-
-#define HELP_DIR "help"
-#define NOTEBOOK_KEY "notebook_key"
-
-/*
- * Keep a static pointer to the current "Help" window, if any, so that
- * if somebody tries to do "Help->Help" while there's already a
- * "Help" window up, we just pop up the existing one, rather than
- * creating a new one.
-*/
-static GtkWidget *help_w = NULL;
-
-/*
- * Keep a list of text widgets and corresponding file names as well
- * (for text format changes).
- */
-typedef struct {
- char *topic;
- char *pathname;
- GtkWidget *page;
-} help_page_t;
-
-static GSList *help_text_pages = NULL;
-
-
-/**
- * Redraw all help pages, to use a new font.
- */
-void help_redraw(void)
-{
- GSList *help_page_ent;
- help_page_t *help_page;
-
- if (help_w != NULL) {
- for (help_page_ent = help_text_pages; help_page_ent != NULL;
- help_page_ent = g_slist_next(help_page_ent))
- {
- help_page = (help_page_t *)help_page_ent->data;
- text_page_redraw(help_page->page, help_page->pathname);
- }
- }
-}
-
-void
-topic_action(topic_action_e action)
-{
- char *url;
-
- url = topic_action_url(action);
-
- if(url != NULL) {
- browser_open_url(url);
- g_free(url);
- }
-}
-
-void
-topic_cb(GtkWidget *w _U_, topic_action_e action)
-{
- topic_action(action);
-}
-
-gboolean
-topic_menu_cb(GtkWidget *w _U_, GdkEventButton *event _U_, gpointer user_data)
-{
- topic_action((topic_action_e)GPOINTER_TO_INT(user_data));
- return TRUE;
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/help_dlg.h b/ui/gtk/help_dlg.h
deleted file mode 100644
index f921728250..0000000000
--- a/ui/gtk/help_dlg.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* help_dlg.h
- *
- * Laurent Deniel <laurent.deniel@free.fr>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 2000 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- */
-
-#ifndef __HELP_DLG_H__
-#define __HELP_DLG_H__
-
-#include "ui/help_url.h"
-#include "ws_attributes.h"
-
-/** @file
- * "Help" dialog box.
- * @ingroup dialog_group
- */
-
-
-/** Open a specific topic (create a "Help" dialog box or open a webpage).
- *
- * @param widget parent widget (unused)
- * @param topic the topic to display
- */
-void topic_cb(GtkWidget *widget, topic_action_e topic);
-
-/** Open a specific topic called from a menu item.
- *
- * @param widget parent widget (unused)
- * @param event A GdkEventButton *event
- * @param user_data the topic to display
- * @return TRUE
- */
-gboolean topic_menu_cb(GtkWidget *widget _U_, GdkEventButton *event _U_, gpointer user_data);
-
-/** Redraw all the help dialog text widgets, to use a new font. */
-void help_redraw(void);
-
-#endif
diff --git a/ui/gtk/hostlist_table.c b/ui/gtk/hostlist_table.c
deleted file mode 100644
index 7c86b15e5c..0000000000
--- a/ui/gtk/hostlist_table.c
+++ /dev/null
@@ -1,1281 +0,0 @@
-/* hostlist_table.c 2004 Ian Schorr
- * modified from endpoint_talkers_table.c 2003 Ronnie Sahlberg
- * Helper routines common to all host list taps.
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-#include <stdlib.h>
-#include <math.h>
-#include <locale.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/addr_resolv.h>
-#ifdef HAVE_GEOIP
-#include <GeoIP.h>
-#include "epan/geoip_db.h"
-#include "wsutil/pint.h"
-#endif
-
-#include "ui/simple_dialog.h"
-#include "ui/alert_box.h"
-#include <wsutil/utf8_entities.h>
-
-#include "ui/gtk/hostlist_table.h"
-#include "ui/gtk/filter_utils.h"
-#include "ui/gtk/gtkglobals.h"
-
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/main.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-#include "globals.h"
-
-#define HOST_PTR_KEY "hostlist-pointer"
-#define NB_PAGES_KEY "notebook-pages"
-#define HL_DLG_HEIGHT 550
-
-#define CMP_INT(i1, i2) \
- if ((i1) > (i2)) \
- return 1; \
- else if ((i1) < (i2)) \
- return -1; \
- else \
- return 0;
-
-#define COL_STR_LEN 32
-
-static void
-reset_host_table_data(hostlist_table *hosts)
-{
- char *display_name;
- char title[256];
- GString *error_string;
- const char *filter;
- GtkListStore *store;
-
- if (hosts->use_dfilter) {
- filter = gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget));
- } else {
- filter = hosts->filter;
- }
- error_string = set_tap_dfilter (&hosts->hash, filter);
- if (error_string) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
- g_string_free(error_string, TRUE);
- return;
- }
-
-
- if(hosts->page_lb) {
- display_name = cf_get_display_name(&cfile);
- g_snprintf(title, sizeof(title), "Endpoints: %s", display_name);
- g_free(display_name);
- gtk_window_set_title(GTK_WINDOW(hosts->win), title);
- g_snprintf(title, sizeof(title), "%s", hosts->name);
- gtk_label_set_text(GTK_LABEL(hosts->page_lb), title);
- gtk_widget_set_sensitive(hosts->page_lb, FALSE);
-
- if (hosts->use_dfilter) {
- if (filter && strlen(filter)) {
- g_snprintf(title, sizeof(title), "%s Endpoints - Filter: %s", hosts->name, filter);
- } else {
- g_snprintf(title, sizeof(title), "%s Endpoints - No Filter", hosts->name);
- }
- } else {
- g_snprintf(title, sizeof(title), "%s Endpoints", hosts->name);
- }
- gtk_label_set_text(GTK_LABEL(hosts->name_lb), title);
- } else {
- display_name = cf_get_display_name(&cfile);
- g_snprintf(title, sizeof(title), "%s Endpoints: %s", hosts->name, display_name);
- g_free(display_name);
- gtk_window_set_title(GTK_WINDOW(hosts->win), title);
- }
-
- /* remove all entries from the list */
- store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(hosts->table)));
- gtk_list_store_clear(store);
-
- /* delete all hosts */
- reset_hostlist_table_data(&hosts->hash);
-}
-
-static void
-reset_hostlist_table_data_cb(void *arg)
-{
- conv_hash_t *hash = (conv_hash_t*)arg;
-
- reset_host_table_data((hostlist_table *)hash->user_data);
-}
-
-static void
-hostlist_win_destroy_cb(GtkWindow *win _U_, gpointer data)
-{
- hostlist_table *hosts=(hostlist_table *)data;
-
- remove_tap_listener(&hosts->hash);
-
- reset_host_table_data(hosts);
- g_free(hosts);
-}
-
-static gint
-hostlist_sort_column(GtkTreeModel *model,
- GtkTreeIter *a,
- GtkTreeIter *b,
- gpointer user_data)
-
-{
- guint32 idx1, idx2;
- gint data_column = GPOINTER_TO_INT(user_data);
- hostlist_table *hl = (hostlist_table *)g_object_get_data(G_OBJECT(model), HOST_PTR_KEY);
- hostlist_talker_t *host1 = NULL;
- hostlist_talker_t *host2 = NULL;
-
- gtk_tree_model_get(model, a, ENDP_INDEX_COLUMN, &idx1, -1);
- gtk_tree_model_get(model, b, ENDP_INDEX_COLUMN, &idx2, -1);
-
- if (!hl || idx1 >= hl->hash.conv_array->len || idx2 >= hl->hash.conv_array->len)
- return 0;
-
- host1 = &g_array_index(hl->hash.conv_array, hostlist_talker_t, idx1);
- host2 = &g_array_index(hl->hash.conv_array, hostlist_talker_t, idx2);
-
- switch(data_column){
- case ENDP_COLUMN_ADDR: /* Address */
- return(cmp_address(&host1->myaddress, &host2->myaddress));
- case ENDP_COLUMN_PORT: /* (Port) */
- CMP_INT(host1->port, host2->port);
-#ifdef HAVE_GEOIP
- default:
- {
- gchar *text1, *text2;
- double loc1 = 0, loc2 = 0;
-
- gtk_tree_model_get(model, a, data_column, &text1, -1);
- gtk_tree_model_get(model, b, data_column, &text2, -1);
-
- if (text1) {
- loc1 = g_ascii_strtod(text1, NULL);
- g_free(text1);
- }
-
- if (text2) {
- loc2 = g_ascii_strtod(text2, NULL);
- g_free(text2);
- }
- CMP_INT(loc1, loc2);
- }
- break;
-#endif
- }
- g_assert_not_reached();
- return 0;
-}
-
-static void
-hostlist_select_filter_cb(GtkWidget *widget _U_, gpointer callback_data, guint callback_action)
-{
- guint idx;
- hostlist_table *hl=(hostlist_table *)callback_data;
- char *str;
- GtkTreeIter iter;
- GtkTreeModel *model;
- GtkTreeSelection *sel;
- hostlist_talker_t *host;
-
- sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(hl->table));
- if (!gtk_tree_selection_get_selected(sel, &model, &iter))
- return;
-
- gtk_tree_model_get (model, &iter,
- ENDP_INDEX_COLUMN, &idx,
- -1);
-
- if(idx>= hl->hash.conv_array->len){
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "No hostlist selected");
- return;
- }
- host = &g_array_index(hl->hash.conv_array, hostlist_talker_t, idx);
-
- str = get_hostlist_filter(host);
-
- apply_selected_filter (callback_action, str);
-
- g_free (str);
-}
-static gboolean
-hostlist_show_popup_menu_cb(void *widg _U_, GdkEvent *event, hostlist_table *et)
-{
- GdkEventButton *bevent = (GdkEventButton *)event;
-
- if(event->type==GDK_BUTTON_PRESS && bevent->button==3){
- gtk_menu_popup(GTK_MENU(et->menu), NULL, NULL, NULL, NULL,
- bevent->button, bevent->time);
- }
-
- return FALSE;
-}
-
-/* Action callbacks */
-static void
-apply_as_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- hostlist_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_SELECTED, 0));
-}
-static void
-apply_as_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- hostlist_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_NOT_SELECTED, 0));
-}
-static void
-apply_as_and_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- hostlist_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_AND_SELECTED, 0));
-}
-static void
-apply_as_or_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- hostlist_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_OR_SELECTED, 0));
-}
-static void
-apply_as_and_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- hostlist_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_AND_NOT_SELECTED, 0));
-}
-static void
-apply_as_or_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- hostlist_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_OR_NOT_SELECTED, 0));
-}
-
-static void
-prep_as_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- hostlist_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_SELECTED, 0));
-}
-static void
-prep_as_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- hostlist_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_NOT_SELECTED, 0));
-}
-static void
-prep_as_and_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- hostlist_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_AND_SELECTED, 0));
-}
-static void
-prep_as_or_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- hostlist_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_OR_SELECTED, 0));
-}
-static void
-prep_as_and_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- hostlist_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_AND_NOT_SELECTED, 0));
-}
-static void
-prep_as_or_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- hostlist_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_OR_NOT_SELECTED, 0));
-}
-
-static void
-find_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- hostlist_select_filter_cb( widget , user_data, CALLBACK_FIND_FRAME(ACTYPE_SELECTED, 0));
-}
-static void
-find_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- hostlist_select_filter_cb( widget , user_data, CALLBACK_FIND_FRAME(ACTYPE_NOT_SELECTED, 0));
-}
-static void
-find_prev_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- hostlist_select_filter_cb( widget , user_data, CALLBACK_FIND_PREVIOUS(ACTYPE_SELECTED, 0));
-}
-static void
-find_prev_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- hostlist_select_filter_cb( widget , user_data, CALLBACK_FIND_PREVIOUS(ACTYPE_NOT_SELECTED, 0));
-}
-static void
-find_next_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- hostlist_select_filter_cb( widget , user_data, CALLBACK_FIND_NEXT(ACTYPE_SELECTED, 0));
-}
-static void
-find_next_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- hostlist_select_filter_cb( widget , user_data, CALLBACK_FIND_NEXT(ACTYPE_NOT_SELECTED, 0));
-}
-static void
-color_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- hostlist_select_filter_cb( widget , user_data, CALLBACK_COLORIZE(ACTYPE_SELECTED, 0));
-}
-
-static const char *ui_desc_hostlist_table_popup =
-"<ui>\n"
-" <popup name='HostlistTableFilterPopup'>\n"
-" <menu action='/Apply as Filter'>\n"
-" <menuitem action='/Apply as Filter/Selected'/>\n"
-" <menuitem action='/Apply as Filter/Not Selected'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected'/>\n"
-" </menu>\n"
-" <menu action='/Prepare a Filter'>\n"
-" <menuitem action='/Prepare a Filter/Selected'/>\n"
-" <menuitem action='/Prepare a Filter/Not Selected'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected'/>\n"
-" </menu>\n"
-" <menu action='/Find Frame'>\n"
-" <menu action='/Find Frame/Find Frame'>\n"
-" <menuitem action='/Find Frame/Selected'/>\n"
-" <menuitem action='/Find Frame/Not Selected'/>\n"
-" </menu>\n"
-" <menu action='/Find Frame/Find Next'>\n"
-" <menuitem action='/Find Next/Selected'/>\n"
-" <menuitem action='/Find Next/Not Selected'/>\n"
-" </menu>\n"
-" <menu action='/Find Frame/Find Previous'>\n"
-" <menuitem action='/Find Previous/Selected'/>\n"
-" <menuitem action='/Find Previous/Not Selected'/>\n"
-" </menu>\n"
-" </menu>\n"
-" <menu action='/Colorize Procedure'>\n"
-" <menuitem action='/Colorize Procedure/Colorize Host Traffic'/>\n"
-" </menu>\n"
-" </popup>\n"
-"</ui>\n";
-
-/*
- * GtkActionEntry
- * typedef struct {
- * const gchar *name;
- * const gchar *stock_id;
- * const gchar *label;
- * const gchar *accelerator;
- * const gchar *tooltip;
- * GCallback callback;
- * } GtkActionEntry;
- * const gchar *name; The name of the action.
- * const gchar *stock_id; The stock id for the action, or the name of an icon from the icon theme.
- * const gchar *label; The label for the action. This field should typically be marked for translation,
- * see gtk_action_group_set_translation_domain().
- * If label is NULL, the label of the stock item with id stock_id is used.
- * const gchar *accelerator; The accelerator for the action, in the format understood by gtk_accelerator_parse().
- * const gchar *tooltip; The tooltip for the action. This field should typically be marked for translation,
- * see gtk_action_group_set_translation_domain().
- * GCallback callback; The function to call when the action is activated.
- *
- */
-static const GtkActionEntry service_resp_t_popup_entries[] = {
- { "/Apply as Filter", NULL, "Apply as Filter", NULL, NULL, NULL },
- { "/Prepare a Filter", NULL, "Prepare a Filter", NULL, NULL, NULL },
- { "/Find Frame", NULL, "Find Frame", NULL, NULL, NULL },
- { "/Find Frame/Find Frame", NULL, "Find Frame", NULL, NULL, NULL },
- { "/Find Frame/Find Next", NULL, "Find Next" , NULL, NULL, NULL },
- { "/Find Frame/Find Previous", NULL, "Find Previous", NULL, NULL, NULL },
- { "/Colorize Procedure", NULL, "Colorize Procedure", NULL, NULL, NULL },
- { "/Apply as Filter/Selected", NULL, "Selected", NULL, "Selected", G_CALLBACK(apply_as_selected_cb) },
- { "/Apply as Filter/Not Selected", NULL, "Not Selected", NULL, "Not Selected", G_CALLBACK(apply_as_not_selected_cb) },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and Selected", G_CALLBACK(apply_as_and_selected_cb) },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or Selected", G_CALLBACK(apply_as_or_selected_cb) },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and not Selected", G_CALLBACK(apply_as_and_not_selected_cb) },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or not Selected", G_CALLBACK(apply_as_or_not_selected_cb) },
- { "/Prepare a Filter/Selected", NULL, "Selected", NULL, "selcted", G_CALLBACK(prep_as_selected_cb) },
- { "/Prepare a Filter/Not Selected", NULL, "Not Selected", NULL, "Not Selected", G_CALLBACK(prep_as_not_selected_cb) },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and Selected", G_CALLBACK(prep_as_and_selected_cb) },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or Selected", G_CALLBACK(prep_as_or_selected_cb) },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and not Selected", G_CALLBACK(prep_as_and_not_selected_cb) },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or not Selected", G_CALLBACK(prep_as_or_not_selected_cb) },
- { "/Find Frame/Selected", NULL, "Selected", NULL, "Selected", G_CALLBACK(find_selected_cb) },
- { "/Find Frame/Not Selected", NULL, "Not Selected", NULL, "Not Selected", G_CALLBACK(find_not_selected_cb) },
- { "/Find Previous/Selected", NULL, "Selected", NULL, "Selected", G_CALLBACK(find_prev_selected_cb) },
- { "/Find Previous/Not Selected", NULL, "Not Selected", NULL, "Not Selected", G_CALLBACK(find_prev_not_selected_cb) },
- { "/Find Next/Selected", NULL, "Selected", NULL, "Selected", G_CALLBACK(find_next_selected_cb) },
- { "/Find Next/Not Selected", NULL, "Not Selected", NULL, "Not Selected", G_CALLBACK(find_next_not_selected_cb) },
- { "/Colorize Procedure/Colorize Host Traffic",NULL, "Colorize Host Traffic", NULL, "Colorize Host Traffic", G_CALLBACK(color_selected_cb) },
-};
-
-static void
-hostlist_create_popup_menu(hostlist_table *hl)
-{
- GtkUIManager *ui_manager;
- GtkActionGroup *action_group;
- GError *error = NULL;
-
- action_group = gtk_action_group_new ("HostlistTablePopupActionGroup");
- gtk_action_group_add_actions (action_group, /* the action group */
- service_resp_t_popup_entries, /* an array of action descriptions */
- G_N_ELEMENTS(service_resp_t_popup_entries),/* the number of entries */
- hl); /* data to pass to the action callbacks */
-
- ui_manager = gtk_ui_manager_new ();
- gtk_ui_manager_insert_action_group (ui_manager,
- action_group,
- 0); /* the position at which the group will be inserted */
- gtk_ui_manager_add_ui_from_string (ui_manager,ui_desc_hostlist_table_popup, -1, &error);
- if (error != NULL)
- {
- fprintf (stderr, "Warning: building hostlist table filter popup failed: %s\n",
- error->message);
- g_error_free (error);
- error = NULL;
- }
- hl->menu = gtk_ui_manager_get_widget(ui_manager, "/HostlistTableFilterPopup");
- g_signal_connect(hl->table, "button_press_event", G_CALLBACK(hostlist_show_popup_menu_cb), hl);
-}
-
-/* Refresh the address fields of all entries in the list */
-static void
-draw_hostlist_table_addresses(hostlist_table *hl)
-{
- guint idx;
- GtkListStore *store;
- GtkTreeIter iter;
- gboolean iter_valid;
-
- store = GTK_LIST_STORE(gtk_tree_view_get_model(hl->table));
- g_object_ref(store);
- gtk_tree_view_set_model(GTK_TREE_VIEW(hl->table), NULL);
- iter_valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter);
-
- while (iter_valid) {
- hostlist_talker_t *host;
- char *addr_str, *port_str;
-
- gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, ENDP_INDEX_COLUMN, &idx, -1);
- host = &g_array_index(hl->hash.conv_array, hostlist_talker_t, idx);
-
- addr_str = get_conversation_address(NULL, &host->myaddress, hl->resolve_names);
- port_str = get_conversation_port(NULL, host->port, host->etype, hl->resolve_names);
- gtk_list_store_set (store, &iter,
- ENDP_COLUMN_ADDR, addr_str,
- ENDP_COLUMN_PORT, port_str,
- -1);
-
- iter_valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
- wmem_free(NULL, addr_str);
- wmem_free(NULL, port_str);
- }
- gtk_tree_view_set_model(GTK_TREE_VIEW(hl->table), GTK_TREE_MODEL(store));
- g_object_unref(store);
-}
-
-
-static void
-draw_hostlist_table_data(hostlist_table *hl)
-{
- guint idx, new_idx;
- char title[256];
- GtkListStore *store;
- GtkTreeIter iter;
- gboolean iter_valid;
- gboolean first = TRUE;
-
- if (hl->page_lb) {
- if(hl->hash.conv_array && hl->hash.conv_array->len) {
- g_snprintf(title, sizeof(title), "%s: %u", hl->name, hl->hash.conv_array->len);
- } else {
- g_snprintf(title, sizeof(title), "%s", hl->name);
- }
- gtk_label_set_text(GTK_LABEL(hl->page_lb), title);
- gtk_widget_set_sensitive(hl->page_lb, hl->hash.conv_array && hl->hash.conv_array->len);
- } else {
- if(hl->hash.conv_array && hl->hash.conv_array->len) {
- g_snprintf(title, sizeof(title), "%s Endpoints: %u", hl->name, hl->hash.conv_array->len);
- } else {
- g_snprintf(title, sizeof(title), "%s Endpoints", hl->name);
- }
- gtk_label_set_text(GTK_LABEL(hl->name_lb), title);
- }
-
- store = GTK_LIST_STORE(gtk_tree_view_get_model(hl->table));
- iter_valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter);
- new_idx = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store), NULL);
-
- while (iter_valid || (hl->hash.conv_array && new_idx < hl->hash.conv_array->len)) {
- hostlist_talker_t *host;
-
- if (iter_valid) {
- gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, ENDP_INDEX_COLUMN, &idx, -1);
- } else {
- idx = new_idx;
- new_idx++;
- }
- if(!hl->hash.conv_array){ /* Already check on while loop but for avoid Clang Analyzer warnings */
- continue;
- }
-
- host = &g_array_index(hl->hash.conv_array, hostlist_talker_t, idx);
-
- if (!host->modified) {
- iter_valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
- continue;
- }
-
- if (first) {
- g_object_ref(store);
- gtk_tree_view_set_model(GTK_TREE_VIEW(hl->table), NULL);
-
- first = FALSE;
- }
- host->modified = FALSE;
- if (!iter_valid) {
- char *addr_str, *port_str;
-#ifdef HAVE_GEOIP
- char *geoip[ENDP_NUM_GEOIP_COLUMNS];
- guint j;
-
- if ((host->myaddress.type == AT_IPv4 || host->myaddress.type == AT_IPv6) && !hl->geoip_visible) {
- GList *columns, *list;
- GtkTreeViewColumn *column;
- columns = gtk_tree_view_get_columns(GTK_TREE_VIEW(hl->table));
- list = columns;
- while(columns) {
- const gchar *title_p;
- gint id;
-
- column = (GtkTreeViewColumn *)columns->data;
- title_p = gtk_tree_view_column_get_title(column);
- id = gtk_tree_view_column_get_sort_column_id(column);
- if (title_p[0] != 0 && id >= ENDP_COLUMN_GEOIP1) {
- gtk_tree_view_column_set_visible(column, TRUE);
- }
- columns = g_list_next(columns);
- }
- g_list_free(list);
- hl->geoip_visible = TRUE;
- }
-
- /* Filled in from the GeoIP config, if any */
- for (j = 0; j < ENDP_NUM_GEOIP_COLUMNS; j++) {
- if (host->myaddress.type == AT_IPv4 && j < geoip_db_num_dbs()) {
- guchar *name = geoip_db_lookup_ipv4(j, pntoh32(host->myaddress.data), "-");
- geoip[j] = g_strdup(name);
- wmem_free(NULL, name);
- } else if (host->myaddress.type == AT_IPv6 && j < geoip_db_num_dbs()) {
- guchar *name;
- const ws_in6_addr *addr = (const ws_in6_addr *) host->myaddress.data;
-
- name = geoip_db_lookup_ipv6(j, *addr, "-");
- geoip[j] = g_strdup(name);
- wmem_free(NULL, name);
- } else {
- geoip[j] = NULL;
- }
- }
-#endif /* HAVE_GEOIP */
-
- addr_str = get_conversation_address(NULL, &host->myaddress, hl->resolve_names);
- port_str = get_conversation_port(NULL, host->port, host->etype, hl->resolve_names);
- gtk_list_store_insert_with_values( store, &iter, G_MAXINT,
- ENDP_COLUMN_ADDR, addr_str,
- ENDP_COLUMN_PORT, port_str,
- ENDP_COLUMN_PACKETS, host->tx_frames+host->rx_frames,
- ENDP_COLUMN_BYTES, host->tx_bytes+host->rx_bytes,
- ENDP_COLUMN_PKT_AB, host->tx_frames,
- ENDP_COLUMN_BYTES_AB, host->tx_bytes,
- ENDP_COLUMN_PKT_BA, host->rx_frames,
- ENDP_COLUMN_BYTES_BA, host->rx_bytes,
-#ifdef HAVE_GEOIP
- ENDP_COLUMN_GEOIP1, geoip[0],
- ENDP_COLUMN_GEOIP2, geoip[1],
- ENDP_COLUMN_GEOIP3, geoip[2],
- ENDP_COLUMN_GEOIP4, geoip[3],
- ENDP_COLUMN_GEOIP5, geoip[4],
- ENDP_COLUMN_GEOIP6, geoip[5],
- ENDP_COLUMN_GEOIP7, geoip[6],
- ENDP_COLUMN_GEOIP8, geoip[7],
- ENDP_COLUMN_GEOIP9, geoip[8],
- ENDP_COLUMN_GEOIP10, geoip[9],
- ENDP_COLUMN_GEOIP11, geoip[10],
- ENDP_COLUMN_GEOIP12, geoip[11],
- ENDP_COLUMN_GEOIP13, geoip[12],
-#endif
- ENDP_INDEX_COLUMN, idx,
- -1);
- wmem_free(NULL, addr_str);
- wmem_free(NULL, port_str);
-#ifdef HAVE_GEOIP
- for (j = 0; j < ENDP_NUM_GEOIP_COLUMNS; j++)
- g_free(geoip[j]);
-#endif /* HAVE_GEOIP */
- }
- else {
- gtk_list_store_set (store, &iter,
- ENDP_COLUMN_PACKETS, host->tx_frames+host->rx_frames,
- ENDP_COLUMN_BYTES, host->tx_bytes+host->rx_bytes,
- ENDP_COLUMN_PKT_AB, host->tx_frames,
- ENDP_COLUMN_BYTES_AB, host->tx_bytes,
- ENDP_COLUMN_PKT_BA, host->rx_frames,
- ENDP_COLUMN_BYTES_BA, host->rx_bytes,
- -1);
- }
-
- iter_valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
- }
- if (!first) {
- if (!hl->fixed_col && hl->hash.conv_array && hl->hash.conv_array->len >= 1000) {
- /* finding the right size for a column isn't easy
- * let it run in autosize a little (1000 is arbitrary)
- * and then switch to fixed width.
- */
- hl->fixed_col = TRUE;
- switch_to_fixed_col(hl->table);
- }
-
- gtk_tree_view_set_model(GTK_TREE_VIEW(hl->table), GTK_TREE_MODEL(store));
- g_object_unref(store);
- }
-}
-
-static void
-draw_hostlist_table_data_cb(void *arg)
-{
- conv_hash_t *hash = (conv_hash_t*)arg;
-
- draw_hostlist_table_data((hostlist_table *)hash->user_data);
-}
-
-typedef struct {
- int nb_cols;
- gint columns_order[ENDP_NUM_COLUMNS+ENDP_NUM_GEOIP_COLUMNS];
- GString *CSV_str;
- hostlist_table *talkers;
-} csv_t;
-
-/* output in C locale */
-static gboolean
-csv_handle(GtkTreeModel *model, GtkTreePath *path _U_, GtkTreeIter *iter,
- gpointer data)
-{
- csv_t *csv = (csv_t *)data;
- gchar *table_text;
- int i;
- guint idx;
- guint64 value;
-
- gtk_tree_model_get(model, iter, ENDP_INDEX_COLUMN, &idx, -1);
-
- for (i=0; i< csv->nb_cols; i++) {
- if (i)
- g_string_append(csv->CSV_str, ",");
-
- switch(csv->columns_order[i]) {
- case ENDP_COLUMN_ADDR:
- case ENDP_COLUMN_PORT:
- gtk_tree_model_get(model, iter, csv->columns_order[i], &table_text, -1);
- if (table_text) {
- g_string_append_printf(csv->CSV_str, "\"%s\"", table_text);
- g_free(table_text);
- }
- break;
- case ENDP_COLUMN_PACKETS:
- case ENDP_COLUMN_BYTES:
- case ENDP_COLUMN_PKT_AB:
- case ENDP_COLUMN_BYTES_AB:
- case ENDP_COLUMN_PKT_BA:
- case ENDP_COLUMN_BYTES_BA:
- gtk_tree_model_get(model, iter, csv->columns_order[i], &value, -1);
- g_string_append_printf(csv->CSV_str, "\"%" G_GINT64_MODIFIER "u\"", value);
- break;
- default:
- gtk_tree_model_get(model, iter, csv->columns_order[i], &table_text, -1);
- if (table_text) {
- g_string_append_printf(csv->CSV_str, "\"%s\"", table_text);
- g_free(table_text);
- }
- break;
- }
- }
- g_string_append(csv->CSV_str,"\n");
-
- return FALSE;
-}
-
-static void
-copy_as_csv_cb(GtkWindow *copy_bt, gpointer data _U_)
-{
- GtkClipboard *cb;
- char *savelocale;
- GList *columns, *list;
- GtkTreeViewColumn *column;
- GtkListStore *store;
- csv_t csv;
-
- csv.talkers=(hostlist_table *)g_object_get_data(G_OBJECT(copy_bt), HOST_PTR_KEY);
- if (!csv.talkers)
- return;
-
- savelocale = g_strdup(setlocale(LC_NUMERIC, NULL));
- setlocale(LC_NUMERIC, "C");
- csv.CSV_str = g_string_new("");
-
- columns = gtk_tree_view_get_columns(GTK_TREE_VIEW(csv.talkers->table));
- list = columns;
- csv.nb_cols = 0;
- while(columns) {
- column = (GtkTreeViewColumn *)columns->data;
- if (gtk_tree_view_column_get_visible(column)) {
- csv.columns_order[csv.nb_cols] = gtk_tree_view_column_get_sort_column_id(column);
- if (csv.nb_cols)
- g_string_append(csv.CSV_str, ",");
- g_string_append_printf(csv.CSV_str, "\"%s\"", gtk_tree_view_column_get_title(column));
- csv.nb_cols++;
- }
- columns = g_list_next(columns);
- }
- g_list_free(list);
-
- g_string_append(csv.CSV_str,"\n");
- store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(csv.talkers->table)));
- gtk_tree_model_foreach(GTK_TREE_MODEL(store), csv_handle, &csv);
-
- /* Now that we have the CSV data, copy it into the default clipboard */
- cb = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); /* Get the default clipboard */
- gtk_clipboard_set_text(cb, csv.CSV_str->str, -1); /* Copy the CSV data into the clipboard */
- setlocale(LC_NUMERIC, savelocale);
- g_free(savelocale);
- g_string_free(csv.CSV_str, TRUE); /* Free the memory */
-}
-
-static gint default_col_size[ENDP_NUM_COLUMNS+ENDP_NUM_GEOIP_COLUMNS];
-
-static void
-init_default_col_size(GtkWidget *view)
-{
-
- default_col_size[ENDP_COLUMN_ADDR] = get_default_col_size(view, "00000000.000000000000");
- default_col_size[ENDP_COLUMN_PORT] = get_default_col_size(view, "000000");
- default_col_size[ENDP_COLUMN_PACKETS] = get_default_col_size(view, "00 000 000");
- default_col_size[ENDP_COLUMN_BYTES] = get_default_col_size(view, "0 000 000 000");
- default_col_size[ENDP_COLUMN_PKT_AB] = default_col_size[ENDP_COLUMN_PACKETS];
- default_col_size[ENDP_COLUMN_PKT_BA] = default_col_size[ENDP_COLUMN_PACKETS];
- default_col_size[ENDP_COLUMN_BYTES_AB] = default_col_size[ENDP_COLUMN_BYTES];
- default_col_size[ENDP_COLUMN_BYTES_BA] = default_col_size[ENDP_COLUMN_BYTES];
-#ifdef HAVE_GEOIP
- default_col_size[ENDP_COLUMN_GEOIP1] = default_col_size[ENDP_COLUMN_ADDR];
- default_col_size[ENDP_COLUMN_GEOIP2] = default_col_size[ENDP_COLUMN_GEOIP1];
- default_col_size[ENDP_COLUMN_GEOIP3] = default_col_size[ENDP_COLUMN_GEOIP1];
- default_col_size[ENDP_COLUMN_GEOIP4] = default_col_size[ENDP_COLUMN_GEOIP1];
- default_col_size[ENDP_COLUMN_GEOIP5] = default_col_size[ENDP_COLUMN_GEOIP1];
- default_col_size[ENDP_COLUMN_GEOIP6] = default_col_size[ENDP_COLUMN_GEOIP1];
- default_col_size[ENDP_COLUMN_GEOIP7] = default_col_size[ENDP_COLUMN_GEOIP1];
- default_col_size[ENDP_COLUMN_GEOIP8] = default_col_size[ENDP_COLUMN_GEOIP1];
- default_col_size[ENDP_COLUMN_GEOIP9] = default_col_size[ENDP_COLUMN_GEOIP1];
- default_col_size[ENDP_COLUMN_GEOIP10] = default_col_size[ENDP_COLUMN_GEOIP1];
- default_col_size[ENDP_COLUMN_GEOIP11] = default_col_size[ENDP_COLUMN_GEOIP1];
- default_col_size[ENDP_COLUMN_GEOIP12] = default_col_size[ENDP_COLUMN_GEOIP1];
- default_col_size[ENDP_COLUMN_GEOIP13] = default_col_size[ENDP_COLUMN_GEOIP1];
-
-#endif
-}
-
-static gboolean
-init_hostlist_table_page(hostlist_table *hosttable, GtkWidget *vbox, gboolean hide_ports, const char *table_name, const char *tap_name,
- const char *filter, tap_packet_cb packet_func)
-{
- guint i;
- GString *error_string;
- char title[256];
- GtkListStore *store;
- GtkWidget *tree;
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
- GtkTreeSortable *sortable;
- GtkTreeSelection *sel;
- static gboolean col_size = FALSE;
-
- for (i = 0; i < ENDP_NUM_COLUMNS; i++) {
- hosttable->default_titles[i] = endp_column_titles[i];
- }
-
-#ifdef HAVE_GEOIP
- for (i = 0; i < ENDP_NUM_GEOIP_COLUMNS; i++) {
- if (i < geoip_db_num_dbs()) {
- hosttable->default_titles[ENDP_NUM_COLUMNS + i] = geoip_db_name(i);
- } else {
- hosttable->default_titles[ENDP_NUM_COLUMNS + i] = "";
- }
- }
-#endif /* HAVE_GEOIP */
-
- if (strcmp(table_name, "NCP")==0) {
- hosttable->default_titles[1] = endp_conn_title;
- }
-
- hosttable->has_ports=!hide_ports;
- hosttable->resolve_names=TRUE;
- hosttable->page_lb = NULL;
- hosttable->fixed_col = FALSE;
- hosttable->geoip_visible = FALSE;
-
- g_snprintf(title, sizeof(title), "%s Endpoints", table_name);
- hosttable->name_lb = gtk_label_new(title);
- gtk_box_pack_start(GTK_BOX(vbox), hosttable->name_lb, FALSE, FALSE, 0);
-
- /* Create the store */
-
- store = gtk_list_store_new (ENDP_INDEX_COLUMN + 1, /* Total number of columns */
- G_TYPE_STRING, /* Address */
- G_TYPE_STRING, /* Port */
- G_TYPE_UINT64, /* Packets */
- G_TYPE_UINT64, /* Bytes */
- G_TYPE_UINT64, /* Packets A->B */
- G_TYPE_UINT64, /* Bytes A->B */
- G_TYPE_UINT64, /* Packets A<-B */
- G_TYPE_UINT64, /* Bytes A<-B */
-#ifdef HAVE_GEOIP
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
-#endif
- G_TYPE_UINT); /* Index */
-
- hosttable->scrolled_window=scrolled_window_new(NULL, NULL);
- gtk_box_pack_start(GTK_BOX(vbox), hosttable->scrolled_window, TRUE, TRUE, 0);
-
- tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
- hosttable->table = GTK_TREE_VIEW(tree);
- sortable = GTK_TREE_SORTABLE(store);
- g_object_unref (G_OBJECT (store));
-
- if (!col_size) {
- col_size = TRUE;
- init_default_col_size(GTK_WIDGET(hosttable->table));
- }
-
- g_object_set_data(G_OBJECT(store), HOST_PTR_KEY, hosttable);
- g_object_set_data(G_OBJECT(hosttable->table), HOST_PTR_KEY, hosttable);
-
- for (i = 0; i < ENDP_NUM_COLUMNS+ENDP_NUM_GEOIP_COLUMNS; i++) {
- renderer = gtk_cell_renderer_text_new ();
- g_object_set(renderer, "ypad", 0, NULL);
- switch(i) {
- case ENDP_COLUMN_ADDR: /* address and port */
- case ENDP_COLUMN_PORT:
- column = gtk_tree_view_column_new_with_attributes (hosttable->default_titles[i], renderer, "text",
- i, NULL);
- if(hide_ports && i == ENDP_COLUMN_PORT){
- /* hide srcport and dstport if we don't use ports */
- gtk_tree_view_column_set_visible(column, FALSE);
- }
- gtk_tree_sortable_set_sort_func(sortable, i, hostlist_sort_column, GINT_TO_POINTER(i), NULL);
- break;
- case ENDP_COLUMN_PACKETS: /* counts */
- case ENDP_COLUMN_BYTES:
- case ENDP_COLUMN_PKT_AB:
- case ENDP_COLUMN_BYTES_AB:
- case ENDP_COLUMN_PKT_BA:
- case ENDP_COLUMN_BYTES_BA: /* right align numbers */
- g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
- column = gtk_tree_view_column_new_with_attributes (hosttable->default_titles[i], renderer, NULL);
- gtk_tree_view_column_set_cell_data_func(column, renderer, u64_data_func, GINT_TO_POINTER(i), NULL);
- break;
- default: /* GEOIP */
- column = gtk_tree_view_column_new_with_attributes (hosttable->default_titles[i], renderer, "text",
- i, NULL);
- gtk_tree_view_column_set_visible(column, FALSE);
-#ifdef HAVE_GEOIP
- if (i >= ENDP_NUM_COLUMNS && i - ENDP_NUM_COLUMNS < geoip_db_num_dbs()) {
- int goip_type = geoip_db_type(i - ENDP_NUM_COLUMNS);
- if (goip_type == WS_LON_FAKE_EDITION || goip_type == WS_LAT_FAKE_EDITION) {
- g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
- gtk_tree_sortable_set_sort_func(sortable, i, hostlist_sort_column, GINT_TO_POINTER(i), NULL);
- }
- }
-#endif
- break;
- }
- gtk_tree_view_column_set_sort_column_id(column, i);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_reorderable(column, TRUE);
- gtk_tree_view_column_set_min_width(column, 40);
- gtk_tree_view_column_set_fixed_width(column, default_col_size[i]);
- gtk_tree_view_append_column (hosttable->table, column);
-
-#if 0
- /* make total frames be the default sort order, too slow */
- if (i == PACKETS_COLUMN) {
- gtk_tree_view_column_clicked(column);
- }
-#endif
- }
-
- gtk_container_add(GTK_CONTAINER(hosttable->scrolled_window), (GtkWidget *)hosttable->table);
- gtk_tree_view_set_rules_hint(hosttable->table, TRUE);
- gtk_tree_view_set_headers_clickable(hosttable->table, TRUE);
- gtk_tree_view_set_reorderable (hosttable->table, TRUE);
-
- hosttable->hash.conv_array = NULL;
- hosttable->hash.hashtable = NULL;
- hosttable->hash.user_data = hosttable;
-
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(hosttable->table));
- gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
-
- /* create popup menu for this table */
- hostlist_create_popup_menu(hosttable);
-
- /* register the tap and rerun the taps on the packet list */
- error_string=register_tap_listener(tap_name, &hosttable->hash, filter, 0, reset_hostlist_table_data_cb, packet_func, draw_hostlist_table_data_cb);
- if(error_string){
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
- g_string_free(error_string, TRUE);
- g_free(hosttable);
- return FALSE;
- }
- return TRUE;
-}
-
-
-void
-init_hostlist_table(struct register_ct* ct, const char *filter)
-{
- hostlist_table *hosttable;
- char *display_name;
- char title[256];
- GtkWidget *vbox;
- GtkWidget *bbox;
- GtkWidget *close_bt, *help_bt;
- gboolean ret;
- GtkWidget *copy_bt;
- window_geometry_t tl_geom;
-
- hosttable=g_new0(hostlist_table,1);
-
- hosttable->name=proto_get_protocol_short_name(find_protocol_by_id(get_conversation_proto_id(ct)));
- hosttable->filter=filter;
- hosttable->use_dfilter=FALSE;
- display_name = cf_get_display_name(&cfile);
- g_snprintf(title, sizeof(title), "%s Endpoints: %s", hosttable->name, display_name);
- g_free(display_name);
- hosttable->win = dlg_window_new(title); /* transient_for top_level */
- gtk_window_set_destroy_with_parent (GTK_WINDOW(hosttable->win), TRUE);
-
- window_get_geometry(top_level, &tl_geom);
- gtk_window_set_default_size(GTK_WINDOW(hosttable->win), tl_geom.width * 8 / 10, HL_DLG_HEIGHT);
-
- vbox=ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_LABEL_SPACING, FALSE);
- gtk_container_add(GTK_CONTAINER(hosttable->win), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), DLG_OUTER_MARGIN);
-
- ret = init_hostlist_table_page(hosttable, vbox, get_conversation_hide_ports(ct), hosttable->name,
- proto_get_protocol_filter_name(get_conversation_proto_id(ct)), filter, get_hostlist_packet_func(ct));
- if(ret == FALSE) {
- g_free(hosttable);
- return;
- }
-
- /* Button row. */
- /* XXX - maybe we want to have a "Copy as CSV" stock button here? */
- /*copy_bt = gtk_button_new_with_label ("Copy content to clipboard as CSV");*/
- bbox = dlg_button_row_new(GTK_STOCK_CLOSE, GTK_STOCK_COPY, GTK_STOCK_HELP, NULL);
-
- gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(hosttable->win, close_bt, window_cancel_button_cb);
-
- copy_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_COPY);
- gtk_widget_set_tooltip_text(copy_bt, "Copy all statistical values of this page to the clipboard in CSV (Comma Separated Values) format.");
- g_object_set_data(G_OBJECT(copy_bt), HOST_PTR_KEY, hosttable);
- g_signal_connect(copy_bt, "clicked", G_CALLBACK(copy_as_csv_cb), NULL);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_STATS_ENDPOINTS_DIALOG);
-
- g_signal_connect(hosttable->win, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(hosttable->win, "destroy", G_CALLBACK(hostlist_win_destroy_cb), hosttable);
-
- gtk_widget_show_all(hosttable->win);
- window_present(hosttable->win);
-
- cf_retap_packets(&cfile);
- gdk_window_raise(gtk_widget_get_window(hosttable->win));
-}
-
-
-static void
-ct_nb_switch_page_cb(GtkNotebook *nb, gpointer *pg _U_, guint page, gpointer data)
-{
- GtkWidget *copy_bt = (GtkWidget *) data;
- void ** pages = (void **)g_object_get_data(G_OBJECT(nb), NB_PAGES_KEY);
-
- page++;
-
- if (pages && page > 0 && (int) page <= GPOINTER_TO_INT(pages[0]) && copy_bt) {
- g_object_set_data(G_OBJECT(copy_bt), HOST_PTR_KEY, pages[page]);
- }
-}
-
-static void
-hostlist_win_destroy_notebook_cb(GtkWindow *win _U_, gpointer data)
-{
- void ** pages = (void **)data;
- int page;
-
- /* first "page" contains the number of pages */
- for (page=1; page<=GPOINTER_TO_INT(pages[0]); page++) {
- hostlist_win_destroy_cb(NULL, pages[page]);
- }
- g_free(pages);
-}
-
-
-
-
-static hostlist_table *
-init_hostlist_notebook_page_cb(register_ct_t *table, const char *filter)
-{
- gboolean ret;
- GtkWidget *page_vbox;
- hostlist_table *hosttable;
-
- hosttable=g_new0(hostlist_table,1);
- hosttable->name=proto_get_protocol_short_name(find_protocol_by_id(get_conversation_proto_id(table)));
- hosttable->filter=filter;
- hosttable->use_dfilter=FALSE;
-
- page_vbox=ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- hosttable->win = page_vbox;
- gtk_container_set_border_width(GTK_CONTAINER(page_vbox), 6);
-
- ret = init_hostlist_table_page(hosttable, page_vbox, get_conversation_hide_ports(table), hosttable->name,
- proto_get_protocol_filter_name(get_conversation_proto_id(table)), filter, get_hostlist_packet_func(table));
- if(ret == FALSE) {
- g_free(hosttable);
- return NULL;
- }
-
- return hosttable;
-}
-
-static void
-hostlist_resolve_toggle_dest(GtkWidget *widget, gpointer data)
-{
- int page;
- void ** pages = (void **)data;
- gboolean resolve_names;
- hostlist_table *hosttable;
-
-
- resolve_names = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget));
-
- for (page=1; page<=GPOINTER_TO_INT(pages[0]); page++) {
- hosttable = (hostlist_table *)pages[page];
- hosttable->resolve_names = resolve_names;
- draw_hostlist_table_addresses(hosttable);
- }
-}
-
-
-static void
-hostlist_filter_toggle_dest(GtkWidget *widget, gpointer data)
-{
- int page;
- void ** pages = (void **)data;
- gboolean use_filter;
- hostlist_table *hosttable = NULL;
-
- use_filter = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget));
-
- for (page=1; page<=GPOINTER_TO_INT(pages[0]); page++) {
- hosttable = (hostlist_table *)pages[page];
- hosttable->use_dfilter = use_filter;
- reset_host_table_data(hosttable);
- }
-
- cf_retap_packets(&cfile);
- if (hosttable) {
- gdk_window_raise(gtk_widget_get_window(hosttable->win));
- }
-}
-
-typedef struct _init_host_page_data {
- int page;
- void ** pages;
- GtkWidget *nb;
- GtkWidget *win;
-} init_host_page_data;
-
-static gboolean
-init_host_page(const void *key _U_, void *value, void *userdata)
-{
- register_ct_t *table = (register_ct_t*)value;
- init_host_page_data* host_page_data = (init_host_page_data*)userdata;
-
- hostlist_table *hosttable;
- GtkWidget *page_lb;
-
- hosttable = init_hostlist_notebook_page_cb(table, NULL /*filter*/);
- if (hosttable) {
- g_object_set_data(G_OBJECT(hosttable->win), HOST_PTR_KEY, hosttable);
- page_lb = gtk_label_new("");
- gtk_notebook_append_page(GTK_NOTEBOOK(host_page_data->nb), hosttable->win, page_lb);
- hosttable->win = host_page_data->win;
- hosttable->page_lb = page_lb;
- host_page_data->pages[++host_page_data->page] = hosttable;
- }
-
- return FALSE;
-}
-
-void
-init_hostlist_notebook_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- char *display_name;
- char title[256];
- GtkWidget *vbox;
- GtkWidget *hbox;
- GtkWidget *bbox;
- GtkWidget *close_bt, *help_bt;
- GtkWidget *win;
- GtkWidget *resolv_cb;
- GtkWidget *filter_cb;
- void ** pages;
- GtkWidget *nb;
- GtkWidget *copy_bt;
- window_geometry_t tl_geom;
- init_host_page_data host_page_iter_data;
-
- pages = (void **)g_malloc(sizeof(void *) * (conversation_table_get_num() + 1));
-
- win = dlg_window_new("hostlist"); /* transient_for top_level */
- gtk_window_set_destroy_with_parent (GTK_WINDOW(win), TRUE);
-
- display_name = cf_get_display_name(&cfile);
- g_snprintf(title, sizeof(title), "Endpoints: %s", display_name);
- g_free(display_name);
- gtk_window_set_title(GTK_WINDOW(win), title);
-
- window_get_geometry(top_level, &tl_geom);
- gtk_window_set_default_size(GTK_WINDOW(win), tl_geom.width * 8 / 10, HL_DLG_HEIGHT);
-
- vbox=ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_LABEL_SPACING, FALSE);
- gtk_container_add(GTK_CONTAINER(win), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), DLG_OUTER_MARGIN);
-
- nb = gtk_notebook_new();
- gtk_box_pack_start(GTK_BOX(vbox), nb, TRUE, TRUE, 0);
- g_object_set_data(G_OBJECT(nb), NB_PAGES_KEY, pages);
-
- host_page_iter_data.page = 0;
- host_page_iter_data.pages = pages;
- host_page_iter_data.nb = nb;
- host_page_iter_data.win = win;
-
- conversation_table_iterate_tables(init_host_page, &host_page_iter_data);
-
- pages[0] = GINT_TO_POINTER(host_page_iter_data.page);
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_UNRELATED_SPACING, FALSE);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-
- resolv_cb = gtk_check_button_new_with_mnemonic("Name resolution");
- gtk_box_pack_start(GTK_BOX(hbox), resolv_cb, FALSE, FALSE, 0);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(resolv_cb), TRUE);
- gtk_widget_set_tooltip_text(resolv_cb,
- "Show results of name resolutions rather than the \"raw\" values. Please note: The corresponding name resolution must be enabled.");
-
- g_signal_connect(resolv_cb, "toggled", G_CALLBACK(hostlist_resolve_toggle_dest), pages);
-
- filter_cb = gtk_check_button_new_with_mnemonic("Limit to display filter");
- gtk_box_pack_start(GTK_BOX(hbox), filter_cb, FALSE, FALSE, 0);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(filter_cb), FALSE);
- gtk_widget_set_tooltip_text(filter_cb, "Limit the list to endpoints matching the current display filter.");
-
- g_signal_connect(filter_cb, "toggled", G_CALLBACK(hostlist_filter_toggle_dest), pages);
-
- /* Button row. */
- bbox = dlg_button_row_new(GTK_STOCK_CLOSE, GTK_STOCK_COPY, GTK_STOCK_HELP, NULL);
- gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
-
- /* Close */
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(win, close_bt, window_cancel_button_cb);
-
- /* Copy */
- copy_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_COPY);
- gtk_widget_set_tooltip_text(copy_bt, "Copy all statistical values of this page to the clipboard in CSV (Comma Separated Values) format.");
- g_signal_connect(copy_bt, "clicked", G_CALLBACK(copy_as_csv_cb), NULL);
- g_object_set_data(G_OBJECT(copy_bt), HOST_PTR_KEY, pages[host_page_iter_data.page]);
-
- g_signal_connect(nb, "switch-page", G_CALLBACK(ct_nb_switch_page_cb), copy_bt);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_STATS_ENDPOINTS_DIALOG);
-
- g_signal_connect(win, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(win, "destroy", G_CALLBACK(hostlist_win_destroy_notebook_cb), pages);
-
- gtk_widget_show_all(win);
- window_present(win);
-
- cf_retap_packets(&cfile);
- gdk_window_raise(gtk_widget_get_window(win));
-}
-
-void hostlist_endpoint_cb(register_ct_t* table)
-{
- char cmd_str[50];
-
- g_snprintf(cmd_str, 50, "%s,%s", HOSTLIST_TAP_PREFIX, proto_get_protocol_filter_name(get_conversation_proto_id(table)));
-
- dissector_hostlist_init(cmd_str, table);
-}
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/hostlist_table.h b/ui/gtk/hostlist_table.h
deleted file mode 100644
index 0aa929247e..0000000000
--- a/ui/gtk/hostlist_table.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/* hostlist_table.h 2004 Ian Schorr
- * modified from endpoint_talkers_table 2003 Ronnie Sahlberg
- * Helper routines common to all host talkers taps.
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __HOSTLIST_TABLE_H__
-#define __HOSTLIST_TABLE_H__
-
-#include <epan/conversation_table.h>
-#include <ui/traffic_table_ui.h>
-
-/** @file
- * Hostlist definitions.
- */
-
-#ifdef HAVE_GEOIP
-typedef enum {
- ENDP_COLUMN_GEOIP1 = ENDP_NUM_COLUMNS,
- ENDP_COLUMN_GEOIP2,
- ENDP_COLUMN_GEOIP3,
- ENDP_COLUMN_GEOIP4,
- ENDP_COLUMN_GEOIP5,
- ENDP_COLUMN_GEOIP6,
- ENDP_COLUMN_GEOIP7,
- ENDP_COLUMN_GEOIP8,
- ENDP_COLUMN_GEOIP9,
- ENDP_COLUMN_GEOIP10,
- ENDP_COLUMN_GEOIP11,
- ENDP_COLUMN_GEOIP12,
- ENDP_COLUMN_GEOIP13
-} geoip_column_type_e;
-#define ENDP_NUM_GEOIP_COLUMNS 13
-#else
-#define ENDP_NUM_GEOIP_COLUMNS 0
-#endif
-#define ENDP_INDEX_COLUMN (ENDP_NUM_COLUMNS+ENDP_NUM_GEOIP_COLUMNS)
-
-/** Hostlist widget */
-typedef struct _hostlist_table {
- const char *name; /**< the name of the table */
- const char *filter; /**< the filter used */
- gboolean use_dfilter; /**< use display filter */
- GtkWidget *win; /**< GTK window */
- GtkWidget *page_lb; /**< page label */
- GtkWidget *name_lb; /**< name label */
- GtkWidget *scrolled_window; /**< the scrolled window */
- GtkTreeView *table; /**< the GTK table */
- const char *default_titles[ENDP_NUM_COLUMNS+ENDP_NUM_GEOIP_COLUMNS]; /**< Column headers */
- GtkWidget *menu; /**< context menu */
- gboolean has_ports; /**< table has ports */
- conv_hash_t hash; /**< hostlist hash table */
- gboolean fixed_col; /**< if switched to fixed column */
- gboolean resolve_names; /**< resolve address names? */
- gboolean geoip_visible; /**< if geoip columns are visible */
-} hostlist_table;
-
-/** Init the hostlist table for the single hostlist window.
- *
- * @param ct the registered hostlist (conversation)
- * @param filter the optional filter name or NULL
- */
-extern void init_hostlist_table(struct register_ct* ct, const char *filter);
-
-/** Callback for "Endpoints" statistics item.
- *
- * @param w unused
- * @param d unused
- */
-extern void init_hostlist_notebook_cb(GtkWidget *w, gpointer d);
-
-/** Function called to instantiate the "GTK hostlist display"
- *
- * @param table conversation table to be created
- */
-extern void hostlist_endpoint_cb(register_ct_t* table);
-
-#endif /* __HOSTLIST_TABLE_H__ */
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/iax2_analysis.c b/ui/gtk/iax2_analysis.c
deleted file mode 100644
index aba8f495ec..0000000000
--- a/ui/gtk/iax2_analysis.c
+++ /dev/null
@@ -1,3678 +0,0 @@
-/* iax2_analysis.c
- * IAX2 analysis addition for Wireshark
- *
- * based on rtp_analysis.c
- * Copyright 2003, Alcatel Business Systems
- * By Lars Ruoff <lars.ruoff@gmx.net>
- *
- * based on tap_rtp.c
- * Copyright 2003, Iskratel, Ltd, Kranj
- * By Miha Jemec <m.jemec@iskratel.si>
- *
- * Graph. Copyright 2004, Verso Technology
- * By Alejandro Vaquero <alejandro.vaquero@verso.com>
- * Based on io_stat.c by Ronnie Sahlberg
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <math.h>
-#include <string.h>
-#include <locale.h>
-
-#include <gtk/gtk.h>
-
-#include <wsutil/file_util.h>
-#include <wsutil/g711.h>
-#include <wsutil/tempfile.h>
-#include <wsutil/pint.h>
-
-#include <epan/epan_dissect.h>
-#include <wsutil/filesystem.h>
-#include <epan/tap.h>
-#include <epan/tap-voip.h>
-#include <epan/dissectors/packet-iax2.h>
-#include <epan/iax2_codec_type.h>
-#include <epan/addr_resolv.h>
-#include <epan/stat_tap_ui.h>
-#include <epan/strutil.h>
-
-#include <epan/stat_groups.h>
-
-#include "ui/util.h"
-#include "ui/alert_box.h"
-#include "ui/last_open_dir.h"
-#include "ui/progress_dlg.h"
-#include "ui/simple_dialog.h"
-#include <wsutil/utf8_entities.h>
-
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/file_dlg.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/gui_stat_menu.h"
-#include "ui/gtk/main.h"
-#include "ui/tap-rtp-analysis.h"
-#include "ui/tap-iax2-analysis.h"
-#include "ui/rtp_stream.h"
-#include "ui/gtk/rtp_stream_dlg.h"
-#include "ui/gtk/old-gtk-compat.h"
-#include "ui/gtk/stock_icons.h"
-
-#include "frame_tvbuff.h"
-
-#include "globals.h"
-
-void register_tap_listener_iax2_analysis(void);
-
-enum
-{
- PACKET_COLUMN,
- DELTA_COLUMN,
- JITTER_COLUMN,
- IPBW_COLUMN,
- STATUS_COLUMN,
- DATE_COLUMN,
- LENGTH_COLUMN,
- FOREGROUND_COLOR_COL,
- BACKGROUND_COLOR_COL,
- N_COLUMN /* The number of columns */
-};
-
-/****************************************************************************/
-#define NUM_COLS 7
-#define NUM_GRAPH_ITEMS 100000
-#define MAX_YSCALE 16
-#define DEFAULT_YSCALE_INDEX 0 /* AUTO_MAX_YSCALE */
-#define AUTO_MAX_YSCALE 0
-#define MAX_GRAPHS 4
-#define GRAPH_FWD_JITTER 0
-#define GRAPH_FWD_DIFF 1
-#define GRAPH_REV_JITTER 2
-#define GRAPH_REV_DIFF 3
-static guint32 yscale_max[MAX_YSCALE] = {
- AUTO_MAX_YSCALE, 1000, 2000, 5000, 10000, 20000, 50000, 100000, 200000, 500000,
- 1000000, 2000000, 5000000, 10000000, 20000000, 50000000
-};
-
-#define MAX_PIXELS_PER_TICK 4
-#define DEFAULT_PIXELS_PER_TICK_INDEX 1
-static guint32 pixels_per_tick[MAX_PIXELS_PER_TICK] = {1, 2, 5, 10};
-static const char *graph_descr[4] = {
- "Fwd Jitter", "Fwd Difference", "Rvr Jitter", "Rvr Difference"
-};
-/* unit is in ms */
-#define MAX_TICK_VALUES 5
-#define DEFAULT_TICK_VALUE_INDEX 1
-static guint tick_interval_values[MAX_TICK_VALUES] = { 1, 10, 100, 1000, 10000 };
-typedef struct _dialog_graph_graph_item_t {
- guint32 value;
- guint32 flags;
-} dialog_graph_graph_item_t;
-
-typedef struct _dialog_graph_graph_t {
- struct _user_data_t *ud;
- dialog_graph_graph_item_t items[NUM_GRAPH_ITEMS];
- int plot_style;
- gboolean display;
- GtkWidget *display_button;
- int hf_index;
- GdkRGBA rgba_color;
- GdkColor color;
- gchar title[100];
-} dialog_graph_graph_t;
-
-
-typedef struct _dialog_graph_t {
- gboolean needs_redraw;
- gint32 interval; /* measurement interval in ms */
- guint32 last_interval;
- guint32 max_interval; /* XXX max_interval and num_items are redundant */
- guint32 num_items;
- double start_time;
-
- struct _dialog_graph_graph_t graph[MAX_GRAPHS];
- GtkWidget *window;
- GtkWidget *draw_area;
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_surface_t *surface;
-#else
- GdkPixmap *pixmap;
-#endif
- GtkAdjustment *scrollbar_adjustment;
- GtkWidget *scrollbar;
- int surface_width;
- int surface_height;
- int pixels_per_tick;
- int max_y_units;
-} dialog_graph_t;
-
-typedef struct _dialog_data_t {
- GtkWidget *window;
- GtkWidget *list_fwd;
- GtkTreeIter iter;
- GtkWidget *list_rev;
- GtkWidget *label_stats_fwd;
- GtkWidget *label_stats_rev;
- GtkWidget *selected_list;
- guint number_of_nok;
- GtkTreeSelection *selected_list_sel;
- gint selected_list_row;
- GtkWidget *notebook;
- GtkWidget *save_voice_as_w;
- GtkWidget *save_csv_as_w;
- gulong notebook_signal_id;
- dialog_graph_t dialog_graph;
-} dialog_data_t;
-
-#define OK_TEXT "[ Ok ]"
-
-/* type of error when saving voice in a file didn't succeed */
-typedef enum {
- TAP_RTP_WRONG_CODEC,
- TAP_RTP_WRONG_LENGTH,
- TAP_RTP_PADDING_ERROR,
- TAP_RTP_SHORT_FRAME,
- TAP_RTP_FILE_OPEN_ERROR,
- TAP_RTP_FILE_WRITE_ERROR,
- TAP_RTP_NO_DATA
-} error_type_t;
-
-typedef struct _tap_iax2_save_info_t {
- FILE *fp;
- guint32 count;
- error_type_t error_type;
- gboolean saved;
-} tap_iax2_save_info_t;
-
-
-/* structure that holds the information about the forward and reversed direction */
-struct _info_direction {
- tap_iax2_stat_t statinfo;
- tap_iax2_save_info_t saveinfo;
-};
-
-#define SILENCE_PCMU (guint8)0xFF
-#define SILENCE_PCMA (guint8)0x55
-
-/* structure that holds general information about the connection
-* and structures for both directions */
-typedef struct _user_data_t {
- /* tap associated data*/
- address ip_src_fwd;
- guint16 port_src_fwd;
- address ip_dst_fwd;
- guint16 port_dst_fwd;
- address ip_src_rev;
- guint16 port_src_rev;
- address ip_dst_rev;
- guint16 port_dst_rev;
-
- struct _info_direction forward;
- struct _info_direction reversed;
-
- char *f_tempname;
- char *r_tempname;
-
- /* dialog associated data */
- dialog_data_t dlg;
-
-} user_data_t;
-
-
-/* Column titles. */
-static const gchar *titles[7] = {
- "Packet",
- "Delta (ms)",
- "Jitter (ms)",
- "IP BW (kbps)",
- "Status",
- "Date",
- "Length"
-};
-
-#define SAVE_FORWARD_DIRECTION_MASK 0x01
-#define SAVE_REVERSE_DIRECTION_MASK 0x02
-#define SAVE_BOTH_DIRECTION_MASK (SAVE_FORWARD_DIRECTION_MASK|SAVE_REVERSE_DIRECTION_MASK)
-
-#define SAVE_NONE_FORMAT 0
-#define SAVE_WAV_FORMAT 1
-#define SAVE_AU_FORMAT 2
-#define SAVE_SW_FORMAT 3
-#define SAVE_RAW_FORMAT 4
-
-
-static void on_refresh_bt_clicked(GtkWidget *bt _U_, gpointer data);
-/****************************************************************************/
-static void
-enable_graph(dialog_graph_graph_t *dgg)
-{
-
- dgg->display = TRUE;
-
-}
-
-static void dialog_graph_reset(user_data_t* user_data);
-
-
-
-/****************************************************************************/
-/* TAP FUNCTIONS */
-
-/****************************************************************************/
-/* when there is a [re]reading of packet's */
-static void
-iax2_reset(void *user_data_arg)
-{
- user_data_t *user_data = (user_data_t *)user_data_arg;
- user_data->forward.statinfo.first_packet = TRUE;
- user_data->reversed.statinfo.first_packet = TRUE;
- user_data->forward.statinfo.max_delta = 0;
- user_data->reversed.statinfo.max_delta = 0;
- user_data->forward.statinfo.max_jitter = 0;
- user_data->reversed.statinfo.max_jitter = 0;
- user_data->forward.statinfo.mean_jitter = 0;
- user_data->reversed.statinfo.mean_jitter = 0;
- user_data->forward.statinfo.delta = 0;
- user_data->reversed.statinfo.delta = 0;
- user_data->forward.statinfo.diff = 0;
- user_data->reversed.statinfo.diff = 0;
- user_data->forward.statinfo.jitter = 0;
- user_data->reversed.statinfo.jitter = 0;
- user_data->forward.statinfo.bandwidth = 0;
- user_data->reversed.statinfo.bandwidth = 0;
- user_data->forward.statinfo.total_bytes = 0;
- user_data->reversed.statinfo.total_bytes = 0;
- user_data->forward.statinfo.bw_start_index = 0;
- user_data->reversed.statinfo.bw_start_index = 0;
- user_data->forward.statinfo.bw_index = 0;
- user_data->reversed.statinfo.bw_index = 0;
- user_data->forward.statinfo.timestamp = 0;
- user_data->reversed.statinfo.timestamp = 0;
- user_data->forward.statinfo.max_nr = 0;
- user_data->reversed.statinfo.max_nr = 0;
- user_data->forward.statinfo.total_nr = 0;
- user_data->reversed.statinfo.total_nr = 0;
- user_data->forward.statinfo.sequence = 0;
- user_data->reversed.statinfo.sequence = 0;
- user_data->forward.statinfo.start_seq_nr = 0;
- user_data->reversed.statinfo.start_seq_nr = 1; /* 1 is ok (for statistics in reversed direction) */
- user_data->forward.statinfo.stop_seq_nr = 0;
- user_data->reversed.statinfo.stop_seq_nr = 0;
- user_data->forward.statinfo.cycles = 0;
- user_data->reversed.statinfo.cycles = 0;
- user_data->forward.statinfo.under = FALSE;
- user_data->reversed.statinfo.under = FALSE;
- user_data->forward.statinfo.start_time = 0;
- user_data->reversed.statinfo.start_time = 0;
- user_data->forward.statinfo.time = 0;
- user_data->reversed.statinfo.time = 0;
- user_data->forward.statinfo.reg_pt = PT_UNDEFINED;
- user_data->reversed.statinfo.reg_pt = PT_UNDEFINED;
-
- user_data->forward.saveinfo.count = 0;
- user_data->reversed.saveinfo.count = 0;
- user_data->forward.saveinfo.saved = FALSE;
- user_data->reversed.saveinfo.saved = FALSE;
-
- /* clear the dialog box lists */
- gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(user_data->dlg.list_fwd))));
- gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(user_data->dlg.list_rev))));
-
- /* reset graph info */
- dialog_graph_reset(user_data);
-
-
- /* XXX check for error at fclose? */
- if (user_data->forward.saveinfo.fp != NULL)
- fclose(user_data->forward.saveinfo.fp);
- if (user_data->reversed.saveinfo.fp != NULL)
- fclose(user_data->reversed.saveinfo.fp);
- user_data->forward.saveinfo.fp = ws_fopen(user_data->f_tempname, "wb");
- if (user_data->forward.saveinfo.fp == NULL)
- user_data->forward.saveinfo.error_type = TAP_RTP_FILE_OPEN_ERROR;
- user_data->reversed.saveinfo.fp = ws_fopen(user_data->r_tempname, "wb");
- if (user_data->reversed.saveinfo.fp == NULL)
- user_data->reversed.saveinfo.error_type = TAP_RTP_FILE_OPEN_ERROR;
- return;
-}
-
-/****************************************************************************/
-static gboolean
-iax2_packet_add_graph(dialog_graph_graph_t *dgg, tap_iax2_stat_t *statinfo, packet_info *pinfo, guint32 value)
-{
- dialog_graph_graph_item_t *it;
- guint32 idx;
- double rtp_time;
-
- /* we sometimes get called when dgg is disabled.
- this is a bug since the tap listener should be removed first */
- if (!dgg->display) {
- return FALSE;
- }
-
- dgg->ud->dlg.dialog_graph.needs_redraw = TRUE;
-
- /*
- * Find which interval this is supposed to go in and store the
- * interval index as idx
- */
- if (dgg->ud->dlg.dialog_graph.start_time == -1) { /* it is the first */
- dgg->ud->dlg.dialog_graph.start_time = statinfo->start_time;
- }
- rtp_time = nstime_to_msec(&pinfo->rel_ts) - dgg->ud->dlg.dialog_graph.start_time;
- if (rtp_time < 0) {
- return FALSE;
- }
- idx = (guint32)(rtp_time)/dgg->ud->dlg.dialog_graph.interval;
-
- /* some sanity checks */
- if (idx >= NUM_GRAPH_ITEMS) {
- return FALSE;
- }
-
- /* update num_items */
- if (idx > dgg->ud->dlg.dialog_graph.num_items) {
- dgg->ud->dlg.dialog_graph.num_items = idx;
- dgg->ud->dlg.dialog_graph.max_interval = idx*dgg->ud->dlg.dialog_graph.interval;
- }
-
- /*
- * Find the appropriate dialog_graph_graph_item_t structure
- */
- it = &dgg->items[idx];
-
- /*
- * Use the max value to highlight RTP problems
- */
- if (value > it->value) {
- it->value = value;
- }
- it->flags = it->flags | statinfo->flags;
-
- return TRUE;
-}
-
-/****************************************************************************/
-/* here we can redraw the output */
-/* not used yet */
-static void
-iax2_draw(void *prs _U_)
-{
- return;
-}
-
-/* forward declarations */
-static void add_to_list(GtkWidget *list, user_data_t * user_data, guint32 number,
- double delta, double jitter, double bandwidth, gchar *status,
- gchar *timeStr, guint32 pkt_len,gchar *color_str, guint32 flags);
-
-static int iax2_packet_add_info(GtkWidget *list,user_data_t * user_data,
- tap_iax2_stat_t *statinfo, packet_info *pinfo,
- const struct _iax2_info_t *iax2info);
-
-static void iax2_packet_save_payload(tap_iax2_save_info_t *saveinfo,
- tap_iax2_stat_t *statinfo,
- packet_info *pinfo,
- const struct _iax2_info_t *iax2info);
-
-
-/****************************************************************************/
-/* whenever a IAX2 packet is seen by the tap listener */
-static gboolean
-iax2_packet(void *user_data_arg, packet_info *pinfo, epan_dissect_t *edt _U_, const void *iax2info_arg)
-{
- user_data_t *user_data = (user_data_t *)user_data_arg;
- const struct _iax2_info_t *iax2info = (const struct _iax2_info_t *)iax2info_arg;
-
- /* we ignore packets that are not displayed */
- if (pinfo->fd->flags.passed_dfilter == 0)
- return FALSE;
-
- /* we ignore packets that carry no data */
- if (iax2info->payload_len == 0)
- return FALSE;
-
- /* is it the forward direction? */
- else if ((cmp_address(&(user_data->ip_src_fwd), &(pinfo->net_src)) == 0)
- && (user_data->port_src_fwd == pinfo->srcport)
- && (cmp_address(&(user_data->ip_dst_fwd), &(pinfo->net_dst)) == 0)
- && (user_data->port_dst_fwd == pinfo->destport)) {
- iax2_packet_analyse(&(user_data->forward.statinfo), pinfo, iax2info);
- iax2_packet_add_graph(&(user_data->dlg.dialog_graph.graph[GRAPH_FWD_JITTER]),
- &(user_data->forward.statinfo),
- pinfo,
- (guint32)(user_data->forward.statinfo.jitter*1000000));
- iax2_packet_add_graph(&(user_data->dlg.dialog_graph.graph[GRAPH_FWD_DIFF]),
- &(user_data->forward.statinfo),
- pinfo,
- (guint32)(user_data->forward.statinfo.diff*1000000));
- iax2_packet_add_info(user_data->dlg.list_fwd, user_data,
- &(user_data->forward.statinfo), pinfo, iax2info);
- iax2_packet_save_payload(&(user_data->forward.saveinfo),
- &(user_data->forward.statinfo), pinfo, iax2info);
- }
- /* is it the reversed direction? */
- else if (cmp_address(&(user_data->ip_src_rev), &(pinfo->net_src)) == 0
- && user_data->port_src_rev == pinfo->srcport
- && cmp_address(&(user_data->ip_dst_rev), &(pinfo->net_dst)) == 0
- && user_data->port_dst_rev == pinfo->destport) {
- iax2_packet_analyse(&(user_data->reversed.statinfo), pinfo, iax2info);
- iax2_packet_add_graph(&(user_data->dlg.dialog_graph.graph[GRAPH_REV_JITTER]),
- &(user_data->reversed.statinfo),
- pinfo,
- (guint32)(user_data->reversed.statinfo.jitter*1000000));
- iax2_packet_add_graph(&(user_data->dlg.dialog_graph.graph[GRAPH_REV_DIFF]),
- &(user_data->reversed.statinfo),
- pinfo,
- (guint32)(user_data->reversed.statinfo.diff*1000000));
- iax2_packet_add_info(user_data->dlg.list_rev, user_data,
- &(user_data->reversed.statinfo), pinfo, iax2info);
- iax2_packet_save_payload(&(user_data->reversed.saveinfo),
- &(user_data->reversed.statinfo), pinfo, iax2info);
- }
-
- return FALSE;
-}
-
-
-#if 0
-static const GdkColor COLOR_DEFAULT = {0, 0xffff, 0xffff, 0xffff};
-static const GdkColor COLOR_ERROR = {0, 0xffff, 0xbfff, 0xbfff};
-static const GdkColor COLOR_WARNING = {0, 0xffff, 0xdfff, 0xbfff};
-static const GdkColor COLOR_CN = {0, 0xbfff, 0xbfff, 0xffff};
-static const GdkColor COLOR_FOREGROUND = {0, 0x0000, 0x0000, 0x0000};
-#endif
-
-/****************************************************************************/
-/* adds statistics information from the packet to the list */
-static int iax2_packet_add_info(GtkWidget *list, user_data_t * user_data,
- tap_iax2_stat_t *statinfo, packet_info *pinfo,
- const struct _iax2_info_t *iax2info _U_)
-{
- guint16 msecs;
- gchar timeStr[32];
- struct tm *tm_tmp;
- time_t then;
- gchar status[40];
- /* GdkColor color = COLOR_DEFAULT; */
- gchar color_str[14];
- then = pinfo->abs_ts.secs;
- msecs = (guint16)(pinfo->abs_ts.nsecs/1000000);
- tm_tmp = localtime(&then);
- if (tm_tmp != NULL) {
- /*
- * XXX - somewhat US-centric here.
- */
- g_snprintf(timeStr,sizeof(timeStr),"%02d/%02d/%04d %02d:%02d:%02d.%03d",
- tm_tmp->tm_mon + 1,
- tm_tmp->tm_mday,
- tm_tmp->tm_year + 1900,
- tm_tmp->tm_hour,
- tm_tmp->tm_min,
- tm_tmp->tm_sec,
- msecs);
- } else {
- g_snprintf(timeStr,sizeof(timeStr),"XX/XX/XXXX XX:XX:XX.XXX");
- }
-
- /* Default to using black on white text if nothing below overrides it */
- g_snprintf(color_str,sizeof(color_str),"#ffffffffffff");
-
- if (statinfo->flags & STAT_FLAG_WRONG_SEQ) {
- g_snprintf(status,sizeof(status),"Wrong sequence nr.");
- /* color = COLOR_ERROR; */
- g_snprintf(color_str,sizeof(color_str),"#ffffbfffbfff");
- }
- else if (statinfo->flags & STAT_FLAG_REG_PT_CHANGE) {
- g_snprintf(status,sizeof(status),"Payload changed to PT=%u", statinfo->pt);
- /* color = COLOR_WARNING; */
- g_snprintf(color_str,sizeof(color_str),"#ffffdfffbfff");
- }
- else if (statinfo->flags & STAT_FLAG_WRONG_TIMESTAMP) {
- g_snprintf(status,sizeof(status),"Incorrect timestamp");
- /* color = COLOR_WARNING; */
- g_snprintf(color_str,sizeof(color_str),"#ffffdfffbfff");
- }
- else if ((statinfo->flags & STAT_FLAG_PT_CHANGE)
- && !(statinfo->flags & STAT_FLAG_FIRST)
- && !(statinfo->flags & STAT_FLAG_PT_CN)
- && (statinfo->flags & STAT_FLAG_FOLLOW_PT_CN)
- && !(statinfo->flags & STAT_FLAG_MARKER)) {
- g_snprintf(status,sizeof(status),"Marker missing?");
- /* color = COLOR_WARNING; */
- g_snprintf(color_str,sizeof(color_str),"#ffffdfffbfff");
- }
- else {
- if (statinfo->flags & STAT_FLAG_MARKER) {
- /* color = COLOR_WARNING; */
- g_snprintf(color_str,sizeof(color_str),"#ffffdfffbfff");
- }
- g_snprintf(status,sizeof(status),OK_TEXT);
- }
- /* is this the first packet we got in this direction? */
- if (statinfo->flags & STAT_FLAG_FIRST) {
- add_to_list(list, user_data,
- pinfo->num,
- 0,
- 0,
- statinfo->bandwidth,
- status,
- timeStr, pinfo->fd->pkt_len,
- color_str,
- statinfo->flags);
- }
- else {
- add_to_list(list, user_data,
- pinfo->num,
- statinfo->delta*1000,
- statinfo->jitter*1000,
- statinfo->bandwidth,
- status,
- timeStr, pinfo->fd->pkt_len,
- color_str,
- statinfo->flags);
- }
- return 0;
-}
-
-#define MAX_SILENCE_TICKS 1000000
-/****************************************************************************/
-static void
-iax2_packet_save_payload(tap_iax2_save_info_t *saveinfo,
- tap_iax2_stat_t *statinfo,
- packet_info *pinfo,
- const struct _iax2_info_t *iax2info)
-{
- const guint8 *data;
- size_t nchars;
-
- /* is this the first packet we got in this direction? */
- if (statinfo->flags & STAT_FLAG_FIRST) {
- if (saveinfo->fp == NULL) {
- saveinfo->saved = FALSE;
- saveinfo->error_type = TAP_RTP_FILE_OPEN_ERROR;
- }
- else
- saveinfo->saved = TRUE;
- }
-
- /* save the voice information */
- /* if there was already an error, we quit */
- if (saveinfo->saved == FALSE)
- return;
-
- /* if the captured length and packet length aren't equal, we quit */
- if (pinfo->fd->pkt_len != pinfo->fd->cap_len) {
- saveinfo->saved = FALSE;
- saveinfo->error_type = TAP_RTP_WRONG_LENGTH;
- return;
- }
-
- if (iax2info->payload_len > 0) {
- data = iax2info->payload_data;
- nchars = fwrite(data, sizeof(unsigned char), iax2info->payload_len, saveinfo->fp);
- if (nchars != iax2info->payload_len) {
- /* Write error or short write */
- saveinfo->saved = FALSE;
- saveinfo->error_type = TAP_RTP_FILE_WRITE_ERROR;
- return;
- }
- saveinfo->count += iax2info->payload_len;
-
- if (fflush(saveinfo->fp) == EOF) {
- /* Write error */
- saveinfo->saved = FALSE;
- saveinfo->error_type = TAP_RTP_FILE_WRITE_ERROR;
- return;
- }
- saveinfo->saved = TRUE;
- return;
- }
-
- return;
-}
-
-
-/****************************************************************************/
-/* CALLBACKS */
-
-/****************************************************************************/
-
-/****************************************************************************/
-/* close the dialog window and remove the tap listener */
-static void
-on_iax2_window_destroy(GtkWidget *win _U_, gpointer data)
-{
- user_data_t *user_data = (user_data_t *)data;
-
- /* remove tap listener */
- remove_tap_listener(user_data);
-
- /* close and remove temporary files */
- if (user_data->forward.saveinfo.fp != NULL)
- fclose(user_data->forward.saveinfo.fp);
- if (user_data->reversed.saveinfo.fp != NULL)
- fclose(user_data->reversed.saveinfo.fp);
- /*XXX: test for error **/
- ws_remove(user_data->f_tempname);
- ws_remove(user_data->r_tempname);
-
-#if 0 /* XXX: GtkFileChooserDialog/gtk_dialog_run currently being used is effectively modal so this is not req'd */
- /* destroy save_csv_as window if open */
- if (user_data->dlg.save_csv_as_w != NULL)
- window_destroy(user_data->dlg.save_csv_as_w);
-
- /* destroy save_voice_as window if open */
- if (user_data->dlg.save_voice_as_w != NULL)
- window_destroy(user_data->dlg.save_voice_as_w);
-#endif
- /* destroy graph window if open */
- if (user_data->dlg.dialog_graph.window != NULL)
- window_destroy(user_data->dlg.dialog_graph.window);
-
-
- /* disable the "switch_page" signal in the dlg, otherwise will be called when the windows is destroy and cause an exception using GTK1*/
- /* XXX: Is this still true for GTK2 ??? */
- g_signal_handler_disconnect(user_data->dlg.notebook, user_data->dlg.notebook_signal_id);
-
- g_free(user_data->f_tempname);
- g_free(user_data->r_tempname);
- g_free(user_data);
-}
-
-
-/****************************************************************************/
-static void
-on_notebook_switch_page(GtkNotebook *notebook _U_,
- gpointer *page _U_,
- gint page_num,
- gpointer data)
-{
- user_data_t *user_data = (user_data_t *)data;
-
- user_data->dlg.selected_list =
- (page_num == 0) ? user_data->dlg.list_fwd : user_data->dlg.list_rev ;
-
- user_data->dlg.selected_list_row = 0;
-}
-
-/****************************************************************************/
-static void
-on_list_select_row(GtkTreeSelection *selection,
- gpointer data)
-{
- user_data_t *user_data = (user_data_t *)data;
-
- user_data->dlg.selected_list_sel = selection;
-}
-
-
-/****************************************************************************/
-static void
-dialog_graph_set_title(user_data_t* user_data)
-{
- char *title;
- char *src_fwd_addr, *dst_fwd_addr, *src_rev_addr, *dst_rev_addr;
-
- if (!user_data->dlg.dialog_graph.window) {
- return;
- }
-
- src_fwd_addr = address_to_display(NULL, &(user_data->ip_src_fwd));
- dst_fwd_addr = address_to_display(NULL, &(user_data->ip_dst_fwd));
- src_rev_addr = address_to_display(NULL, &(user_data->ip_src_rev));
- dst_rev_addr = address_to_display(NULL, &(user_data->ip_dst_rev));
- title = g_strdup_printf("IAX2 Graph Analysis Forward: %s:%u to %s:%u Reverse: %s:%u to %s:%u",
- src_fwd_addr,
- user_data->port_src_fwd,
- dst_fwd_addr,
- user_data->port_dst_fwd,
- src_rev_addr,
- user_data->port_src_rev,
- dst_rev_addr,
- user_data->port_dst_rev);
-
- gtk_window_set_title(GTK_WINDOW(user_data->dlg.dialog_graph.window), title);
- wmem_free(NULL, src_fwd_addr);
- wmem_free(NULL, dst_fwd_addr);
- wmem_free(NULL, src_rev_addr);
- wmem_free(NULL, dst_rev_addr);
- g_free(title);
-
-}
-
-
-/****************************************************************************/
-static void
-dialog_graph_reset(user_data_t* user_data)
-{
- int i, j;
- char *src_addr, *dst_addr;
-
- user_data->dlg.dialog_graph.needs_redraw = TRUE;
- for (i = 0; i < MAX_GRAPHS; i++) {
- for (j = 0; j < NUM_GRAPH_ITEMS; j++) {
- dialog_graph_graph_item_t *dggi;
- dggi = &user_data->dlg.dialog_graph.graph[i].items[j];
- dggi->value = 0;
- dggi->flags = 0;
- }
- }
- user_data->dlg.dialog_graph.last_interval = 0xffffffff;
- user_data->dlg.dialog_graph.max_interval = 0;
- user_data->dlg.dialog_graph.num_items = 0;
-
- /* create the color titles near the filter buttons */
- for (i = 0; i < MAX_GRAPHS; i++) {
- /* it is forward */
- if (i < 2) {
- src_addr = address_to_display(NULL, &(user_data->ip_src_fwd));
- dst_addr = address_to_display(NULL, &(user_data->ip_dst_fwd));
- g_snprintf(user_data->dlg.dialog_graph.graph[i].title,
- sizeof (user_data->dlg.dialog_graph.graph[0].title),
- "%s: %s:%u to %s:%u",
- graph_descr[i],
- src_addr,
- user_data->port_src_fwd,
- dst_addr,
- user_data->port_dst_fwd);
- /* it is reverse */
- } else {
- src_addr = address_to_display(NULL, &(user_data->ip_src_rev));
- dst_addr = address_to_display(NULL, &(user_data->ip_dst_rev));
- g_snprintf(user_data->dlg.dialog_graph.graph[i].title,
- sizeof(user_data->dlg.dialog_graph.graph[0].title),
- "%s: %s:%u to %s:%u",
- graph_descr[i],
- src_addr,
- user_data->port_src_rev,
- dst_addr,
- user_data->port_dst_rev);
- }
- wmem_free(NULL, src_addr);
- wmem_free(NULL, dst_addr);
- }
-
- dialog_graph_set_title(user_data);
-}
-
-/****************************************************************************/
-static guint32
-get_it_value(dialog_graph_graph_t *dgg, int idx)
-{
- dialog_graph_graph_item_t *it;
-
- it = &dgg->items[idx];
-
- return it->value;
-}
-
-/****************************************************************************/
-static void
-print_time_scale_string(char *buf, int buf_len, guint32 t)
-{
- if (t >= 10000000) {
- g_snprintf(buf, buf_len, "%ds",t/1000000);
- } else if (t >= 1000000) {
- g_snprintf(buf, buf_len, "%d.%03ds",t/1000000,(t%1000000)/1000);
- } else if (t >= 10000) {
- g_snprintf(buf, buf_len, "%dms",t/1000);
- } else if (t >= 1000) {
- g_snprintf(buf, buf_len, "%d.%03dms",t/1000,t%1000);
- } else {
- g_snprintf(buf, buf_len, "%dus",t);
- }
-}
-
-/****************************************************************************/
-static void
-dialog_graph_draw(user_data_t* user_data)
-{
- int i, lwidth;
- guint32 last_interval, first_interval, interval_delta, delta_multiplier;
- gint32 current_interval;
- guint32 left_x_border;
- guint32 right_x_border;
- guint32 top_y_border;
- guint32 bottom_y_border;
- PangoLayout *layout;
- int label_width, label_height;
- int label_width_mid, label_height_mid;
- guint32 draw_width, draw_height;
- char label_string[15];
- GtkAllocation widget_alloc;
- cairo_t *cr;
-
- /* new variables */
- guint32 num_time_intervals;
- guint32 max_value; /* max value of seen data */
- guint32 max_y; /* max value of the Y scale */
-
- if (!user_data->dlg.dialog_graph.needs_redraw) {
- return;
- }
- user_data->dlg.dialog_graph.needs_redraw = FALSE;
-
- /*
- * Find the length of the intervals we have data for
- * so we know how large arrays we need to malloc()
- */
- num_time_intervals = user_data->dlg.dialog_graph.num_items;
- /* if there isn't anything to do, just return */
- if (num_time_intervals == 0) {
- return;
- }
- num_time_intervals += 1;
- /* XXX move this check to _packet() */
- if (num_time_intervals > NUM_GRAPH_ITEMS) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "IAX2 Graph error. There are too many entries, bailing out");
- return;
- }
-
- /*
- * find the max value so we can autoscale the y axis
- */
- max_value = 0;
- for (i = 0; i < MAX_GRAPHS; i++) {
- int idx;
-
- if (!user_data->dlg.dialog_graph.graph[i].display) {
- continue;
- }
- for (idx = 0; (guint32) (idx) < num_time_intervals; idx++) {
- guint32 val;
-
- val = get_it_value(&user_data->dlg.dialog_graph.graph[i], idx);
-
- /* keep track of the max value we have encountered */
- if (val > max_value) {
- max_value = val;
- }
- }
- }
-
- /*
- * Clear out old plot
- */
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_set_source_rgb (cr, 1, 1, 1);
- gtk_widget_get_allocation(user_data->dlg.dialog_graph.draw_area, &widget_alloc);
- cairo_rectangle (cr,
- 0,
- 0,
- widget_alloc.width,
- widget_alloc.height);
- cairo_fill (cr);
- cairo_destroy (cr);
-
-
- /*
- * Calculate the y scale we should use
- */
- if (user_data->dlg.dialog_graph.max_y_units == AUTO_MAX_YSCALE) {
- max_y = yscale_max[MAX_YSCALE-1];
- for (i = MAX_YSCALE-1; i > 0; i--) {
- if (max_value < yscale_max[i]) {
- max_y = yscale_max[i];
- }
- }
- } else {
- /* the user had specified an explicit y scale to use */
- max_y = user_data->dlg.dialog_graph.max_y_units;
- }
-
- /*
- * Calculate size of borders surrounding the plot
- * The border on the right side needs to be adjusted depending
- * on the width of the text labels.
- */
- print_time_scale_string(label_string, sizeof(label_string), max_y);
- layout = gtk_widget_create_pango_layout(user_data->dlg.dialog_graph.draw_area, label_string);
- pango_layout_get_pixel_size(layout, &label_width, &label_height);
- print_time_scale_string(label_string, sizeof(label_string), max_y*5/10);
- layout = gtk_widget_create_pango_layout(user_data->dlg.dialog_graph.draw_area, label_string);
- pango_layout_get_pixel_size(layout, &label_width_mid, &label_height_mid);
- if (label_width_mid > label_width) {
- label_width = label_width_mid;
- label_height = label_height_mid;
- }
-
- left_x_border = 10;
- right_x_border = label_width+20;
- top_y_border = 10;
- bottom_y_border = label_height + 20;
-
-
- /*
- * Calculate the size of the drawing area for the actual plot
- */
- draw_width = user_data->dlg.dialog_graph.surface_width - right_x_border - left_x_border;
- draw_height = user_data->dlg.dialog_graph.surface_height - top_y_border - bottom_y_border;
-
-
- /*
- * Draw the y axis and labels
- * (we always draw the y scale with 11 ticks along the axis)
- */
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr, user_data->dlg.dialog_graph.surface_width - right_x_border+1.5, top_y_border+0.5);
- cairo_line_to(cr, user_data->dlg.dialog_graph.surface_width - right_x_border+1.5, user_data->dlg.dialog_graph.surface_height - bottom_y_border+0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
-
- for (i = 0; i <= 10; i++) {
- int xwidth;
-
- xwidth = 5;
- if (!(i%5)) {
- /* first, middle and last tick are slightly longer */
- xwidth = 10;
- }
- /* draw the tick */
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr,
- user_data->dlg.dialog_graph.surface_width - right_x_border+1.5,
- user_data->dlg.dialog_graph.surface_height - bottom_y_border - draw_height*i/10+0.5);
-
- cairo_line_to(cr,
- user_data->dlg.dialog_graph.surface_width - right_x_border+1.5 + xwidth,
- user_data->dlg.dialog_graph.surface_height - bottom_y_border - draw_height*i/10+0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
- /* draw the labels */
- if (i == 0) {
- print_time_scale_string(label_string, sizeof(label_string), (max_y*i/10));
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_move_to (cr,
- user_data->dlg.dialog_graph.surface_width - right_x_border+15 + label_width - lwidth,
- user_data->dlg.dialog_graph.surface_height - bottom_y_border - draw_height*i/10 - label_height/2);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
- }
- if (i == 5) {
- print_time_scale_string(label_string, sizeof(label_string), (max_y*i/10));
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_move_to (cr,
- user_data->dlg.dialog_graph.surface_width - right_x_border+15 + label_width - lwidth,
- user_data->dlg.dialog_graph.surface_height - bottom_y_border - draw_height*i/10 - label_height/2);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
- }
- if (i == 10) {
- print_time_scale_string(label_string, sizeof(label_string), (max_y*i/10));
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_move_to (cr,
- user_data->dlg.dialog_graph.surface_width - right_x_border+15 + label_width - lwidth,
- user_data->dlg.dialog_graph.surface_height - bottom_y_border - draw_height*i/10 - label_height/2);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
- }
- }
-
-
-
- /*
- * if we have not specified the last_interval via the gui,
- * then just pick the current end of the capture so that is scrolls
- * nicely when doing live captures
- */
- if (user_data->dlg.dialog_graph.last_interval == 0xffffffff) {
- last_interval = user_data->dlg.dialog_graph.max_interval;
- } else {
- last_interval = user_data->dlg.dialog_graph.last_interval;
- }
-
-/*XXX*/
- /* plot the x-scale */
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr,
- left_x_border+0.5,
- user_data->dlg.dialog_graph.surface_height - bottom_y_border+1.5);
- cairo_line_to(cr,
- user_data->dlg.dialog_graph.surface_width - right_x_border+1.5,
- user_data->dlg.dialog_graph.surface_height - bottom_y_border+1.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
-
- if ((last_interval/user_data->dlg.dialog_graph.interval) > draw_width/user_data->dlg.dialog_graph.pixels_per_tick+1) {
- first_interval = (last_interval/user_data->dlg.dialog_graph.interval)
- - draw_width/user_data->dlg.dialog_graph.pixels_per_tick+1;
- first_interval *= user_data->dlg.dialog_graph.interval;
- } else {
- first_interval = 0;
- }
-
- interval_delta = 1;
- delta_multiplier = 5;
- while (interval_delta < ((last_interval - first_interval)/10)) {
- interval_delta *= delta_multiplier;
- if (delta_multiplier == 5) {
- delta_multiplier = 2;
- } else {
- delta_multiplier = 5;
- }
- }
-
- for (current_interval = last_interval;
- current_interval > (gint32)first_interval;
- current_interval = current_interval - user_data->dlg.dialog_graph.interval) {
- int x, xlen;
-
- /* if pixels_per_tick is <5, only draw every 10 ticks */
- if ((user_data->dlg.dialog_graph.pixels_per_tick < 10)
- && (current_interval % (10 * user_data->dlg.dialog_graph.interval))) {
- continue;
- }
-
- if (current_interval%interval_delta) {
- xlen = 5;
- } else {
- xlen = 17;
- }
-
- x = draw_width + left_x_border
- - (((last_interval - current_interval)/user_data->dlg.dialog_graph.interval)
- * user_data->dlg.dialog_graph.pixels_per_tick);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr,
- x - 1 - user_data->dlg.dialog_graph.pixels_per_tick/2 + 0.5,
- user_data->dlg.dialog_graph.surface_height - bottom_y_border + 1.5);
- cairo_line_to(cr,
- x - 1 - user_data->dlg.dialog_graph.pixels_per_tick/2 + 0.5,
- user_data->dlg.dialog_graph.surface_height - bottom_y_border + xlen + 1.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
-
- if (xlen == 17) {
- if (user_data->dlg.dialog_graph.interval >= 1000) {
- g_snprintf(label_string, sizeof(label_string), "%ds", current_interval/1000);
- } else if (user_data->dlg.dialog_graph.interval >= 100) {
- g_snprintf(label_string, sizeof(label_string),
- "%d.%1ds", current_interval/1000,(current_interval/100)%10);
- } else if (user_data->dlg.dialog_graph.interval >= 10) {
- g_snprintf(label_string, sizeof(label_string),
- "%d.%2ds", current_interval/1000,(current_interval/10)%100);
- } else {
- g_snprintf(label_string, sizeof(label_string),
- "%d.%3ds", current_interval/1000,current_interval%1000);
- }
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_move_to (cr,
- x - 1 - user_data->dlg.dialog_graph.pixels_per_tick/2 - lwidth/2,
- user_data->dlg.dialog_graph.surface_height - bottom_y_border + 20);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
- }
-
- }
-
- /*
- * Draw "x" for Sequence Errors and "m" for Marks
- */
- /* Draw the labels Fwd and Rev */
- g_strlcpy(label_string, UTF8_LEFTWARDS_ARROW "Fwd",sizeof(label_string));
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_move_to (cr,
- user_data->dlg.dialog_graph.surface_width - right_x_border+33 - lwidth,
- user_data->dlg.dialog_graph.surface_height - bottom_y_border+3);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
-
- g_strlcpy(label_string, UTF8_LEFTWARDS_ARROW "Rev",sizeof(label_string));
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_move_to (cr,
- user_data->dlg.dialog_graph.surface_width - right_x_border+33 - lwidth,
- user_data->dlg.dialog_graph.surface_height - bottom_y_border+3+9);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
-
- /* Draw the marks */
- for (i = MAX_GRAPHS-1; i >= 0; i--) {
- guint32 interval;
- guint32 x_pos/*, prev_x_pos*/;
-
- /* XXX for fwd or rev, the flag info for jitter and diff is the same, and here I loop twice */
- if (!user_data->dlg.dialog_graph.graph[i].display) {
- continue;
- }
- /* initialize prev x/y to the low left corner of the graph */
- /* prev_x_pos=draw_width-1-user_data->dlg.dialog_graph.pixels_per_tick*((last_interval-first_interval)/user_data->dlg.dialog_graph.interval+1)+left_x_border; */
-
- for (interval = first_interval + user_data->dlg.dialog_graph.interval;
- interval <= last_interval;
- interval += user_data->dlg.dialog_graph.interval) {
- x_pos = draw_width - 1
- - (user_data->dlg.dialog_graph.pixels_per_tick
- * ((last_interval - interval)/user_data->dlg.dialog_graph.interval+1))
- + left_x_border;
-
- if (user_data->dlg.dialog_graph.graph[i].items[interval/user_data->dlg.dialog_graph.interval].flags
- & (STAT_FLAG_WRONG_SEQ|STAT_FLAG_MARKER)) {
- if (user_data->dlg.dialog_graph.graph[i].items[interval/user_data->dlg.dialog_graph.interval].flags
- & STAT_FLAG_WRONG_SEQ) {
- g_strlcpy(label_string, "x", sizeof(label_string));
- } else {
- g_strlcpy(label_string, "m", sizeof(label_string));
- }
-
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_move_to (cr,
- x_pos - 1 - lwidth/2,
- user_data->dlg.dialog_graph.surface_height - bottom_y_border+3+7*(i/2));
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
- }
-
- /* prev_x_pos = x_pos; */
- }
- }
-
- g_object_unref(G_OBJECT(layout));
-
- /*
- * Loop over all graphs and draw them
- */
- for(i = MAX_GRAPHS-1; i >= 0; i--) {
- guint32 interval;
- guint32 x_pos, y_pos, /*prev_x_pos,*/ prev_y_pos;
- if (!user_data->dlg.dialog_graph.graph[i].display) {
- continue;
- }
- /* initialize prev x/y to the low left corner of the graph */
- /* prev_x_pos=draw_width-1-user_data->dlg.dialog_graph.pixels_per_tick*((last_interval-first_interval)/user_data->dlg.dialog_graph.interval+1)+left_x_border; */
- prev_y_pos = draw_height-1 + top_y_border;
-
- for (interval = first_interval + user_data->dlg.dialog_graph.interval;
- interval <= last_interval;
- interval += user_data->dlg.dialog_graph.interval) {
- guint32 val;
- x_pos = draw_width - 1
- - (user_data->dlg.dialog_graph.pixels_per_tick
- * ((last_interval - interval)/user_data->dlg.dialog_graph.interval+1))
- + left_x_border;
- val = get_it_value(&user_data->dlg.dialog_graph.graph[i],
- interval/user_data->dlg.dialog_graph.interval);
- if (val > max_y) {
- y_pos = 0;
- } else {
- y_pos = draw_height-1 - (val*draw_height)/max_y + top_y_border;
- }
-
- /* don't need to draw anything if the segment
- * is entirely above the top of the graph
- */
- if ( (prev_y_pos == 0) && (y_pos == 0) ) {
- prev_y_pos = y_pos;
- /* prev_x_pos = x_pos; */
- continue;
- }
-
- if (val) {
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- gdk_cairo_set_source_rgba (cr, &user_data->dlg.dialog_graph.graph[i].rgba_color);
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr, x_pos+0.5, draw_height-1 + top_y_border+0.5);
- cairo_line_to(cr, x_pos+0.5, y_pos+0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
- }
-
- prev_y_pos = y_pos;
- /* prev_x_pos = x_pos; */
- }
- }
-
-
- cr = gdk_cairo_create (gtk_widget_get_window(user_data->dlg.dialog_graph.draw_area));
-
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, user_data->dlg.dialog_graph.surface, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, user_data->dlg.dialog_graph.pixmap, 0, 0);
-#endif
- cairo_rectangle (cr, 0, 0, user_data->dlg.dialog_graph.surface_width, user_data->dlg.dialog_graph.surface_height);
- cairo_fill (cr);
-
- cairo_destroy (cr);
-
-
- /* update the scrollbar */
- gtk_adjustment_set_upper(user_data->dlg.dialog_graph.scrollbar_adjustment,
- (gfloat) user_data->dlg.dialog_graph.max_interval);
- gtk_adjustment_set_step_increment(user_data->dlg.dialog_graph.scrollbar_adjustment,
- (gfloat) ((last_interval - first_interval)/10));
- gtk_adjustment_set_page_increment(user_data->dlg.dialog_graph.scrollbar_adjustment,
- (gfloat) (last_interval - first_interval));
- if ((last_interval - first_interval)*100 < user_data->dlg.dialog_graph.max_interval) {
- gtk_adjustment_set_page_size(user_data->dlg.dialog_graph.scrollbar_adjustment,
- (gfloat) (user_data->dlg.dialog_graph.max_interval/100));
- } else {
- gtk_adjustment_set_page_size(user_data->dlg.dialog_graph.scrollbar_adjustment,
- (gfloat) (last_interval - first_interval));
- }
- gtk_adjustment_set_value(user_data->dlg.dialog_graph.scrollbar_adjustment,
- last_interval
- - gtk_adjustment_get_page_size(user_data->dlg.dialog_graph.scrollbar_adjustment));
- gtk_adjustment_changed(user_data->dlg.dialog_graph.scrollbar_adjustment);
- gtk_adjustment_value_changed(user_data->dlg.dialog_graph.scrollbar_adjustment);
-
-}
-
-/****************************************************************************/
-static void
-dialog_graph_redraw(user_data_t* user_data)
-{
- user_data->dlg.dialog_graph.needs_redraw = TRUE;
- dialog_graph_draw(user_data);
-}
-
-/****************************************************************************/
-
-static void
-draw_area_destroy_cb(GtkWidget *widget _U_, gpointer data)
-{
- user_data_t *user_data = (user_data_t *)data;
-
- user_data->dlg.dialog_graph.window = NULL;
-}
-
-/****************************************************************************/
-#if GTK_CHECK_VERSION(3,0,0)
-static
-gboolean draw_area_draw(GtkWidget *widget, cairo_t *cr, gpointer data)
-{
- user_data_t *user_data = (user_data_t *)data;
- GtkAllocation allocation;
-
- gtk_widget_get_allocation (widget, &allocation);
-
- cairo_set_source_surface (cr, user_data->dlg.dialog_graph.surface, 0, 0);
- cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
- cairo_fill (cr);
-
- return FALSE;
-}
-#else
-static gboolean
-draw_area_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
-{
- user_data_t *user_data = (user_data_t *)data;
- cairo_t *cr = gdk_cairo_create (gtk_widget_get_window(widget));
-
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, user_data->dlg.dialog_graph.surface, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, user_data->dlg.dialog_graph.pixmap, 0, 0);
-#endif
- cairo_rectangle (cr, event->area.x, event->area.y, event->area.width, event->area.height);
- cairo_fill (cr);
-
- cairo_destroy (cr);
-
- return FALSE;
-}
-#endif
-/****************************************************************************/
-static gboolean
-draw_area_configure_event(GtkWidget *widget, GdkEventConfigure *event _U_, gpointer data)
-{
- user_data_t *user_data = (user_data_t *)data;
- GtkAllocation widget_alloc;
- cairo_t *cr;
-
-#if GTK_CHECK_VERSION(2,22,0)
- if (user_data->dlg.dialog_graph.surface) {
- g_object_unref(user_data->dlg.dialog_graph.surface);
- user_data->dlg.dialog_graph.surface = NULL;
- }
- gtk_widget_get_allocation(widget, &widget_alloc);
- user_data->dlg.dialog_graph.surface = gdk_window_create_similar_surface (gtk_widget_get_window(widget),
- CAIRO_CONTENT_COLOR,
- widget_alloc.width,
- widget_alloc.height);
-#else
- if (user_data->dlg.dialog_graph.pixmap) {
- g_object_unref(user_data->dlg.dialog_graph.pixmap);
- user_data->dlg.dialog_graph.pixmap = NULL;
- }
-
- gtk_widget_get_allocation(widget, &widget_alloc);
- user_data->dlg.dialog_graph.pixmap = gdk_pixmap_new(gtk_widget_get_window(widget),
- widget_alloc.width,
- widget_alloc.height,
- -1);
-#endif
- user_data->dlg.dialog_graph.surface_width = widget_alloc.width;
- user_data->dlg.dialog_graph.surface_height = widget_alloc.height;
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_rectangle (cr, 0, 0, widget_alloc.width, widget_alloc.height);
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_fill (cr);
- cairo_destroy (cr);
-
- dialog_graph_redraw(user_data);
- return TRUE;
-}
-
-/****************************************************************************/
-static void
-scrollbar_changed(GtkWidget *widget _U_, gpointer data)
-{
- user_data_t *user_data = (user_data_t *)data;
- guint32 mi;
-
- mi = (guint32) (gtk_adjustment_get_value(user_data->dlg.dialog_graph.scrollbar_adjustment)
- + gtk_adjustment_get_page_size(user_data->dlg.dialog_graph.scrollbar_adjustment));
- if (user_data->dlg.dialog_graph.last_interval == mi) {
- return;
- }
- if ( (user_data->dlg.dialog_graph.last_interval == 0xffffffff)
- && (mi == user_data->dlg.dialog_graph.max_interval) ) {
- return;
- }
-
- user_data->dlg.dialog_graph.last_interval = (mi/user_data->dlg.dialog_graph.interval)*user_data->dlg.dialog_graph.interval;
-
- dialog_graph_redraw(user_data);
- return;
-}
-
-/****************************************************************************/
-static void
-create_draw_area(user_data_t* user_data, GtkWidget *box)
-{
- user_data->dlg.dialog_graph.draw_area = gtk_drawing_area_new();
- g_signal_connect(user_data->dlg.dialog_graph.draw_area, "destroy", G_CALLBACK(draw_area_destroy_cb), user_data);
-
- gtk_widget_set_size_request(user_data->dlg.dialog_graph.draw_area, user_data->dlg.dialog_graph.surface_width, user_data->dlg.dialog_graph.surface_height);
-
- /* signals needed to handle backing pixmap */
-#if GTK_CHECK_VERSION(3,0,0)
- g_signal_connect(user_data->dlg.dialog_graph.draw_area, "draw", G_CALLBACK(draw_area_draw), user_data);
-#else
- g_signal_connect(user_data->dlg.dialog_graph.draw_area, "expose_event", G_CALLBACK(draw_area_expose_event), user_data);
-#endif
- g_signal_connect(user_data->dlg.dialog_graph.draw_area, "configure_event", G_CALLBACK(draw_area_configure_event), user_data);
-
- gtk_widget_show(user_data->dlg.dialog_graph.draw_area);
- gtk_box_pack_start(GTK_BOX(box), user_data->dlg.dialog_graph.draw_area, TRUE, TRUE, 0);
-
- /* create the associated scrollbar */
- user_data->dlg.dialog_graph.scrollbar_adjustment = (GtkAdjustment *)gtk_adjustment_new(0,0,0,0,0,0);
- user_data->dlg.dialog_graph.scrollbar = gtk_scrollbar_new(GTK_ORIENTATION_HORIZONTAL,user_data->dlg.dialog_graph.scrollbar_adjustment);
- gtk_widget_show(user_data->dlg.dialog_graph.scrollbar);
- gtk_box_pack_start(GTK_BOX(box), user_data->dlg.dialog_graph.scrollbar, FALSE, FALSE, 0);
- g_signal_connect(user_data->dlg.dialog_graph.scrollbar_adjustment, "value_changed", G_CALLBACK(scrollbar_changed), user_data);
-}
-
-/****************************************************************************/
-static void
-disable_graph(dialog_graph_graph_t *dgg)
-{
- if (dgg->display) {
- dgg->display = FALSE;
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dgg->display_button),
- FALSE);
- }
-}
-
-/****************************************************************************/
-static void
-filter_box_display_button_cb(GtkWidget *widget _U_, gpointer data)
-{
- dialog_graph_graph_t *dgg = (dialog_graph_graph_t *)data;
-
- /* this graph is not active, just update display and redraw */
- if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dgg->display_button))) {
- disable_graph(dgg);
- dialog_graph_redraw(dgg->ud);
- return;
- }
-
- enable_graph(dgg);
- cf_retap_packets(&cfile);
- dialog_graph_redraw(dgg->ud);
-
- return;
-}
-
-/****************************************************************************/
-static void
-create_filter_box(dialog_graph_graph_t *dgg, GtkWidget *box, int num)
-{
- GtkWidget *hbox;
- GtkWidget *label;
- char str[256];
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0);
-
- gtk_widget_show(hbox);
-
- g_snprintf(str, sizeof(str), "Graph %d", num);
- dgg->display_button = gtk_toggle_button_new_with_label(str);
- gtk_box_pack_start(GTK_BOX(hbox), dgg->display_button, FALSE, FALSE, 0);
- gtk_widget_show(dgg->display_button);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dgg->display_button), dgg->display);
- g_signal_connect(dgg->display_button, "toggled", G_CALLBACK(filter_box_display_button_cb), dgg);
-
- label = gtk_label_new(dgg->title);
- gtk_widget_show(label);
- gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_override_color(label, (GtkStateFlags)GTK_STATE_FLAG_NORMAL, &dgg->rgba_color);
- /* XXX gtk_widget_override_color() takes flags not state */
- gtk_widget_override_color(label, (GtkStateFlags)GTK_STATE_ACTIVE, &dgg->rgba_color);
- gtk_widget_override_color(label, (GtkStateFlags)GTK_STATE_PRELIGHT, &dgg->rgba_color);
- gtk_widget_override_color(label, (GtkStateFlags)GTK_STATE_SELECTED, &dgg->rgba_color);
- gtk_widget_override_color(label, (GtkStateFlags)GTK_STATE_INSENSITIVE, &dgg->rgba_color);
-#else
- gtk_widget_modify_fg(label, GTK_STATE_NORMAL, &dgg->color);
- gtk_widget_modify_fg(label, GTK_STATE_ACTIVE, &dgg->color);
- gtk_widget_modify_fg(label, GTK_STATE_PRELIGHT, &dgg->color);
- gtk_widget_modify_fg(label, GTK_STATE_SELECTED, &dgg->color);
- gtk_widget_modify_fg(label, GTK_STATE_INSENSITIVE, &dgg->color);
-#endif
- return;
-}
-
-/****************************************************************************/
-static void
-create_filter_area(user_data_t* user_data, GtkWidget *box)
-{
- GtkWidget *frame;
- GtkWidget *vbox;
- int i;
- GtkWidget *label;
-
- frame = gtk_frame_new("Graphs");
- gtk_box_pack_start(GTK_BOX(box), frame, TRUE, TRUE, 0);
- gtk_widget_show(frame);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 1, FALSE);
- gtk_container_add(GTK_CONTAINER(frame), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 3);
-
- gtk_widget_show(vbox);
-
- for (i = 0; i < MAX_GRAPHS; i++) {
- create_filter_box(&user_data->dlg.dialog_graph.graph[i], vbox, i+1);
- }
-
- label = gtk_label_new("Label: x = Wrong Seq. number m = Mark set");
- gtk_widget_show(label);
- gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
-
- return;
-}
-
-/****************************************************************************/
-static void
-yscale_select(GtkWidget *item, gpointer data)
-{
- int i;
- user_data_t *user_data = (user_data_t *)data;
-
- i = gtk_combo_box_get_active (GTK_COMBO_BOX(item));
-
- user_data->dlg.dialog_graph.max_y_units = yscale_max[i];
- dialog_graph_redraw(user_data);
-}
-
-/****************************************************************************/
-static void
-pixels_per_tick_select(GtkWidget *item, gpointer data)
-{
- int i;
- user_data_t *user_data = (user_data_t *)data;
-
- i = gtk_combo_box_get_active (GTK_COMBO_BOX(item));
-
- user_data->dlg.dialog_graph.pixels_per_tick = pixels_per_tick[i];
- dialog_graph_redraw(user_data);
-}
-
-/****************************************************************************/
-static void
-tick_interval_select(GtkWidget *item, gpointer data)
-{
- user_data_t *user_data = (user_data_t *)data;
- int i;
-
- i = gtk_combo_box_get_active (GTK_COMBO_BOX(item));
-
- user_data->dlg.dialog_graph.interval = tick_interval_values[i];
- cf_retap_packets(&cfile);
- dialog_graph_redraw(user_data);
-}
-
-/****************************************************************************/
-static GtkWidget *
-create_yscale_max_menu_items(user_data_t* user_data)
-{
- char str[15];
- GtkWidget *combo_box;
- int i;
-
- combo_box = gtk_combo_box_text_new();
-
- for (i = 0; i < MAX_YSCALE; i++) {
- if (yscale_max[i] == AUTO_MAX_YSCALE) {
- g_strlcpy(str,"Auto",sizeof(str));
- } else if (yscale_max[i] < 1000000) {
- g_snprintf(str, sizeof(str), "%u ms", yscale_max[i]/1000);
- } else {
- g_snprintf(str, sizeof(str), "%u s", yscale_max[i]/1000000);
- }
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), str);
- }
- gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), DEFAULT_YSCALE_INDEX);
- g_signal_connect(combo_box, "changed", G_CALLBACK(yscale_select), user_data);
-
- return combo_box;
-}
-
-/****************************************************************************/
-static GtkWidget *
-create_pixels_per_tick_menu_items(user_data_t *user_data)
-{
- char str[5];
- GtkWidget *combo_box;
- int i;
-
- combo_box = gtk_combo_box_text_new();
-
- for(i = 0; i < MAX_PIXELS_PER_TICK; i++) {
- g_snprintf(str, sizeof(str), "%u", pixels_per_tick[i]);
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), str);
- }
- gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), DEFAULT_PIXELS_PER_TICK_INDEX);
-
- g_signal_connect(combo_box, "changed", G_CALLBACK(pixels_per_tick_select), user_data);
-
- return combo_box;
-}
-
-/****************************************************************************/
-static GtkWidget *
-create_tick_interval_menu_items(user_data_t *user_data)
-{
- GtkWidget *combo_box;
- char str[15];
- int i;
-
- combo_box = gtk_combo_box_text_new();
-
- for(i = 0; i < MAX_TICK_VALUES; i++) {
- if (tick_interval_values[i] >= 1000) {
- g_snprintf(str, sizeof(str), "%u sec", tick_interval_values[i]/1000);
- } else if (tick_interval_values[i] >= 100) {
- g_snprintf(str, sizeof(str), "0.%1u sec", (tick_interval_values[i]/100)%10);
- } else if (tick_interval_values[i] >= 10) {
- g_snprintf(str, sizeof(str), "0.%02u sec", (tick_interval_values[i]/10)%10);
- } else {
- g_snprintf(str, sizeof(str), "0.%03u sec", (tick_interval_values[i])%10);
- }
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), str);
- }
- gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), DEFAULT_TICK_VALUE_INDEX);
- g_signal_connect(combo_box, "changed", G_CALLBACK(tick_interval_select), user_data);
-
- return combo_box;
-}
-
-/****************************************************************************/
-static void
-create_ctrl_menu(user_data_t* user_data, GtkWidget *box, const char *name, GtkWidget *(*func)(user_data_t* user_data))
-{
- GtkWidget *hbox;
- GtkWidget *label;
- GtkWidget *combo_box;
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0);
- gtk_widget_show(hbox);
-
- label = gtk_label_new(name);
- gtk_widget_show(label);
- gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-
- combo_box = (*func)(user_data);
- gtk_box_pack_end(GTK_BOX(hbox), combo_box, FALSE, FALSE, 0);
- gtk_widget_show(combo_box);
-}
-
-/****************************************************************************/
-static void
-create_ctrl_area(user_data_t* user_data, GtkWidget *box)
-{
- GtkWidget *frame_vbox;
- GtkWidget *frame;
- GtkWidget *vbox;
-
- frame_vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(box), frame_vbox, TRUE, TRUE, 0);
- gtk_widget_show(frame_vbox);
-
- frame = gtk_frame_new("X Axis");
- gtk_container_add(GTK_CONTAINER(frame_vbox), frame);
- gtk_widget_show(frame);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(frame), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 3);
-
- gtk_widget_show(vbox);
-
- create_ctrl_menu(user_data, vbox, "Tick interval:", create_tick_interval_menu_items);
- create_ctrl_menu(user_data, vbox, "Pixels per tick:", create_pixels_per_tick_menu_items);
-
- frame = gtk_frame_new("Y Axis");
- gtk_container_add(GTK_CONTAINER(frame_vbox), frame);
- gtk_widget_show(frame);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(frame), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 3);
-
- gtk_widget_show(vbox);
-
- create_ctrl_menu(user_data, vbox, "Scale:", create_yscale_max_menu_items);
-
- return;
-}
-
-/****************************************************************************/
-static void
-dialog_graph_init_window(user_data_t* user_data)
-{
- GtkWidget *vbox;
- GtkWidget *hbox;
- GtkWidget *bt_close;
-
- /* create the main window */
- user_data->dlg.dialog_graph.window = dlg_window_new("I/O Graphs"); /* transient_for top_level */
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(user_data->dlg.dialog_graph.window), vbox);
- gtk_widget_show(vbox);
-
- create_draw_area(user_data, vbox);
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
- gtk_container_set_border_width(GTK_CONTAINER(hbox), 3);
-
- gtk_widget_show(hbox);
-
- create_filter_area(user_data, hbox);
- create_ctrl_area(user_data, hbox);
-
- dialog_graph_set_title(user_data);
-
- hbox = dlg_button_row_new(GTK_STOCK_CLOSE, NULL);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
- gtk_widget_show(hbox);
-
- bt_close = (GtkWidget *)g_object_get_data(G_OBJECT(hbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(user_data->dlg.dialog_graph.window, bt_close, window_cancel_button_cb);
-
- g_signal_connect(user_data->dlg.dialog_graph.window, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
-
- gtk_widget_show(user_data->dlg.dialog_graph.window);
- window_present(user_data->dlg.dialog_graph.window);
-
-}
-
-
-/****************************************************************************/
-static void
-on_graph_bt_clicked(GtkWidget *bt _U_, gpointer data)
-{
- user_data_t *user_data = (user_data_t *)data;
-
- if (user_data->dlg.dialog_graph.window != NULL) {
- /* There's already a graph window; reactivate it. */
- reactivate_window(user_data->dlg.dialog_graph.window);
- return;
- }
-
- dialog_graph_init_window(user_data);
-
-}
-
-/****************************************************************************/
-static void
-on_goto_bt_clicked(GtkWidget *bt _U_, gpointer data)
-{
- user_data_t *user_data = (user_data_t *)data;
- GtkTreeIter iter;
- GtkTreeModel *model;
- GtkTreeSelection *selection;
- guint fnumber;
-
- selection = user_data->dlg.selected_list_sel;
-
- if (selection == NULL)
- return;
-
- if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
- gtk_tree_model_get (model, &iter, PACKET_COLUMN, &fnumber, -1);
- cf_goto_frame(&cfile, fnumber);
- }
-}
-
-
-static void draw_stat(user_data_t *user_data);
-
-/****************************************************************************/
-/* re-dissects all packets */
-static void
-on_refresh_bt_clicked(GtkWidget *bt _U_, gpointer data)
-{
- user_data_t *user_data = (user_data_t *)data;
- GString *error_string;
-
- /* remove tap listener */
- remove_tap_listener(user_data);
-
- /* register tap listener */
- error_string = register_tap_listener("IAX2", user_data, NULL, 0,
- iax2_reset, iax2_packet, iax2_draw);
- if (error_string != NULL) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
- g_string_free(error_string, TRUE);
- return;
- }
-
- /* retap all packets */
- cf_retap_packets(&cfile);
-
- /* draw statistics info */
- draw_stat(user_data);
-
-}
-
-/****************************************************************************/
-static void
-on_next_bt_clicked(GtkWidget *bt _U_, gpointer data)
-{
- user_data_t *user_data = (user_data_t *)data;
- GtkTreeIter iter;
- GtkTreeModel *model;
- gchar *text;
- GtkTreeSelection *selection;
- GtkTreePath *path;
-
- selection = user_data->dlg.selected_list_sel;
-
- if (selection == NULL)
- return;
-
-try_again:
- if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
- while (gtk_tree_model_iter_next (model,&iter)) {
- gtk_tree_model_get (model, &iter, STATUS_COLUMN, &text, -1);
- if (strcmp(text, OK_TEXT) != 0) {
- gtk_tree_selection_select_iter (selection, &iter);
- path = gtk_tree_model_get_path(model, &iter);
- gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW( user_data->dlg.selected_list),
- path,
- NULL, FALSE, 0, 0);
- gtk_tree_path_free(path);
- g_free (text);
- return;
- }
- g_free (text);
- }
- /* wrap around */
- if (user_data->dlg.number_of_nok > 1) {
- /* Get the first iter and select it before starting over */
- gtk_tree_model_get_iter_first(model, &iter);
- gtk_tree_selection_select_iter (selection, &iter);
- goto try_again;
- }
- }
-}
-
-/****************************************************************************/
-/* when we want to save the information */
-static gboolean
-save_csv_as_ok_cb(GtkWidget *w _U_, gpointer fc /*user_data_t *user_data*/)
-{
- gchar *g_dest;
- GtkWidget *rev, *forw, *both;
- user_data_t *user_data;
-
- GtkListStore *store;
- GtkTreeIter iter;
- GtkTreeModel *model;
- gboolean more_items = TRUE;
-
- /* To Hold data from the list row */
- guint packet; /* Packet */
- gfloat delta; /* Delta(ms) */
- gfloat jitter; /* Jitter(ms) */
- gfloat ipbw; /* IP BW(kbps) */
- char *status_str; /* Status */
- char *date_str; /* Date */
- guint length; /* Length */
-
- FILE *fp;
- int j;
-
- g_dest = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fc));
-
- /* Perhaps the user specified a directory instead of a file.
- * Check whether they did.
- */
- if (test_for_directory(g_dest) == EISDIR) {
- /* It's a directory - set the file selection box to display it. */
- set_last_open_dir(g_dest);
- g_free(g_dest);
- file_selection_set_current_folder((GtkWidget *)fc, get_last_open_dir());
- gtk_file_chooser_set_current_name((GtkFileChooser *)fc, "");
- return FALSE; /* run the dialog again */
- }
- rev = (GtkWidget*)g_object_get_data(G_OBJECT(fc), "reversed_rb");
- forw = (GtkWidget*)g_object_get_data(G_OBJECT(fc), "forward_rb");
- both = (GtkWidget*)g_object_get_data(G_OBJECT(fc), "both_rb");
- user_data = (user_data_t*)g_object_get_data(G_OBJECT(fc), "user_data");
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(forw))
- || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(both))) {
- fp = ws_fopen(g_dest, "w");
- if (fp == NULL) {
- open_failure_alert_box(g_dest, errno, TRUE);
- g_free(g_dest);
- return TRUE; /* we're done */
- }
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(both))) {
- fprintf(fp, "Forward\n");
- if (ferror(fp)) {
- write_failure_alert_box(g_dest, errno);
- fclose(fp);
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- }
-
- for(j = 0; j < NUM_COLS; j++) {
- if (j == 0) {
- fprintf(fp,"\"%s\"",titles[j]);
- } else {
- fprintf(fp,",\"%s\"",titles[j]);
- }
- }
- fprintf(fp,"\n");
- if (ferror(fp)) {
- write_failure_alert_box(g_dest, errno);
- fclose(fp);
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(user_data->dlg.list_fwd));
- store = GTK_LIST_STORE(model);
- if ( gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter) ) {
-
- while (more_items) {
- gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
- 0, &packet,
- 1, &delta,
- 2, &jitter,
- 3, &ipbw,
- 4, &status_str,
- 5, &date_str,
- 6, &length,
- -1);
- fprintf(fp, "\"%u\"",packet);
- fprintf(fp, ",\"%.2f\"", delta);
- fprintf(fp, ",\"%.2f\"", jitter);
- fprintf(fp, ",\"%.2f\"", ipbw);
- fprintf(fp, ",\"%s\"", status_str);
- fprintf(fp, ",\"%s\"", date_str);
- fprintf(fp, ",\"%u\"", length);
- fprintf(fp,"\n");
- g_free(status_str);
- g_free(date_str);
- if (ferror(fp)) {
- write_failure_alert_box(g_dest, errno);
- fclose(fp);
- g_free(g_dest);
- return TRUE; /* we're done */
- }
-
- more_items = gtk_tree_model_iter_next (model,&iter);
- }
- }
-
- if (fclose(fp) == EOF) {
- write_failure_alert_box(g_dest, errno);
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- }
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rev)) || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(both))) {
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(both))) {
- fp = ws_fopen(g_dest, "a");
- if (fp == NULL) {
- open_failure_alert_box(g_dest, errno, TRUE);
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- fprintf(fp, "\nReverse\n");
- if (ferror(fp)) {
- write_failure_alert_box(g_dest, errno);
- fclose(fp);
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- } else {
- fp = ws_fopen(g_dest, "w");
- if (fp == NULL) {
- open_failure_alert_box(g_dest, errno, TRUE);
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- }
- for(j = 0; j < NUM_COLS; j++) {
- if (j == 0) {
- fprintf(fp,"\"%s\"",titles[j]);
- } else {
- fprintf(fp,",\"%s\"",titles[j]);
- }
- }
- fprintf(fp,"\n");
- if (ferror(fp)) {
- write_failure_alert_box(g_dest, errno);
- fclose(fp);
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(user_data->dlg.list_rev));
- store = GTK_LIST_STORE(model);
- if ( gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter) ) {
-
- more_items = TRUE;
-
- while (more_items) {
- gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
- 0, &packet,
- 1, &delta,
- 2, &jitter,
- 3, &ipbw,
- 4, &status_str,
- 5, &date_str,
- 6, &length,
- -1);
- fprintf(fp, "\"%u\"",packet);
- fprintf(fp, ",\"%.2f\"", delta);
- fprintf(fp, ",\"%.2f\"", jitter);
- fprintf(fp, ",\"%.2f\"", ipbw);
- fprintf(fp, ",\"%s\"", status_str);
- fprintf(fp, ",\"%s\"", date_str);
- fprintf(fp, ",\"%u\"", length);
- fprintf(fp,"\n");
- g_free(status_str);
- g_free(date_str);
- if (ferror(fp)) {
- write_failure_alert_box(g_dest, errno);
- fclose(fp);
- g_free(g_dest);
- return TRUE; /* we're done */
- }
-
- more_items = gtk_tree_model_iter_next (model,&iter);
- }
- }
- if (fclose(fp) == EOF) {
- write_failure_alert_box(g_dest, errno);
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- }
- g_free(g_dest);
- return TRUE; /* we're done */
-}
-
-static void save_csv_as_destroy_cb(GtkWidget *win _U_, gpointer data)
-{
- user_data_t *user_data = (user_data_t *)data;
-
- user_data->dlg.save_csv_as_w = NULL;
-}
-
-/* when the user wants to save the csv information in a file */
-static void
-save_csv_as_cb(GtkWidget *bt _U_, gpointer data)
-{
- user_data_t *user_data = (user_data_t *)data;
- GtkWidget *vertb;
- GtkWidget *grid1;
- GtkWidget *label_format;
- GtkWidget *channels_label;
- GtkWidget *forward_rb;
- GtkWidget *reversed_rb;
- GtkWidget *both_rb;
-
-#if 0 /* XXX: GtkFileChooserDialog/gtk_dialog_run currently being used is effectively modal so this is not req'd */
- if (user_data->dlg.save_csv_as_w != NULL) {
- /* There's already a Save CSV info dialog box; reactivate it. */
- reactivate_window(user_data->dlg.save_csv_as_w);
- return;
- }
-#endif
- user_data->dlg.save_csv_as_w =
- gtk_file_chooser_dialog_new("Wireshark: Save Data As CSV",
- GTK_WINDOW(user_data->dlg.notebook),
- GTK_FILE_CHOOSER_ACTION_SAVE,
- GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- NULL);
- gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(user_data->dlg.save_csv_as_w), TRUE);
-
- /* Build our "extra widget" to be added to the file chooser widget */
- /* Container for each row of widgets */
- vertb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(vertb), 5);
- gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(user_data->dlg.save_csv_as_w), vertb);
- gtk_widget_show (vertb);
-
- grid1 = ws_gtk_grid_new ();
- gtk_widget_show (grid1);
- gtk_box_pack_start (GTK_BOX (vertb), grid1, FALSE, FALSE, 0);
- gtk_container_set_border_width (GTK_CONTAINER (grid1), 10);
- ws_gtk_grid_set_row_spacing (GTK_GRID (grid1), 20);
-
- label_format = gtk_label_new ("Format: Comma Separated Values");
- gtk_widget_show (label_format);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), label_format, 0, 0, 3, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label_format), 0, 0.5f);
-
- channels_label = gtk_label_new ("Channels: ");
- gtk_widget_show (channels_label);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), channels_label, 0, 1, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (channels_label), 0, 0.5f);
-
- forward_rb = gtk_radio_button_new_with_label (NULL, "forward ");
- gtk_widget_show (forward_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), forward_rb, 1, 1, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-
- reversed_rb = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(forward_rb), "reversed ");
- gtk_widget_show (reversed_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), reversed_rb, 2, 1, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-
- both_rb = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(forward_rb), "both");
- gtk_widget_show (both_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), both_rb, 3, 1, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(both_rb), TRUE);
-
- g_object_set_data(G_OBJECT(user_data->dlg.save_csv_as_w), "forward_rb", forward_rb);
- g_object_set_data(G_OBJECT(user_data->dlg.save_csv_as_w), "reversed_rb", reversed_rb);
- g_object_set_data(G_OBJECT(user_data->dlg.save_csv_as_w), "both_rb", both_rb);
- g_object_set_data(G_OBJECT(user_data->dlg.save_csv_as_w), "user_data", user_data);
-
- g_signal_connect(user_data->dlg.save_csv_as_w, "delete_event",
- G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(user_data->dlg.save_csv_as_w, "destroy",
- G_CALLBACK(save_csv_as_destroy_cb), user_data);
-
- gtk_widget_show(user_data->dlg.save_csv_as_w);
- window_present(user_data->dlg.save_csv_as_w);
-
- /* "Run" the GtkFileChooserDialog. */
- /* Upon exit: If "Accept" run the OK callback. */
- /* If the OK callback returns with a FALSE status, re-run the dialog.*/
- /* Destroy the window. */
- /* XXX: If the OK callback pops up an alert box (eg: for an error) it *must* */
- /* return with a TRUE status so that the dialog window will be destroyed. */
- /* Trying to re-run the dialog after popping up an alert box will not work */
- /* since the user will not be able to dismiss the alert box. */
- /* The (somewhat unfriendly) effect: the user must re-invoke the */
- /* GtkFileChooserDialog whenever the OK callback pops up an alert box. */
- /* */
- /* ToDo: use GtkFileChooserWidget in a dialog window instead of */
- /* GtkFileChooserDialog. */
- while (gtk_dialog_run(GTK_DIALOG(user_data->dlg.save_csv_as_w)) == GTK_RESPONSE_ACCEPT) {
- if (save_csv_as_ok_cb(NULL, user_data->dlg.save_csv_as_w)) {
- break; /* we're done */
- }
- }
- window_destroy(user_data->dlg.save_csv_as_w);
-}
-
-/****************************************************************************/
-static void save_voice_as_destroy_cb(GtkWidget *win _U_, gpointer data)
-{
- user_data_t *user_data = (user_data_t *)data;
-
- /* Note that we no longer have a Save voice info dialog box. */
- user_data->dlg.save_voice_as_w = NULL;
-}
-
-/****************************************************************************/
-/* here we save it into a file that user specified */
-/* XXX what about endians here? could go something wrong? */
-static gboolean copy_file(gchar *dest, gint channels, gint format, user_data_t *user_data)
-{
- int to_fd, forw_fd, rev_fd;
- size_t fread_cnt = 0, rread = 0, fwritten, rwritten;
- gchar f_pd[1] = {0};
- gchar r_pd[1] = {0};
- gint16 sample;
- gchar pd[4];
- guint32 f_write_silence = 0;
- guint32 r_write_silence = 0;
- progdlg_t *progbar;
- guint32 progbar_count, progbar_quantum, progbar_nextstep = 0, count = 0;
- gboolean stop_flag = FALSE;
- /*size_t nchars;*/
-
- forw_fd = ws_open(user_data->f_tempname, O_RDONLY | O_BINARY, 0000 /* no creation so don't matter */);
- if (forw_fd < 0)
- return FALSE;
- rev_fd = ws_open(user_data->r_tempname, O_RDONLY | O_BINARY, 0000 /* no creation so don't matter */);
- if (rev_fd < 0) {
- ws_close(forw_fd);
- return FALSE;
- }
-
- /* open file for saving */
- to_fd = ws_open(dest, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0644);
- if (to_fd < 0) {
- ws_close(forw_fd);
- ws_close(rev_fd);
- return FALSE;
- }
-
- progbar = create_progress_dlg(top_level, "Saving voice in a file", dest, TRUE, &stop_flag);
-
- if (format == SAVE_AU_FORMAT) /* au format */
- {
- /* First we write the .au header. XXX Hope this is endian independent */
- /* the magic word 0x2e736e64 == .snd */
- /* XXX: Should we be checking for write errors below ? */
- phton32(pd, 0x2e736e64);
- fwritten = ws_write(to_fd, pd, 4);
- if ((fwritten < 4) || (fread_cnt == (size_t)-1)) {
- ws_close(forw_fd);
- ws_close(rev_fd);
- ws_close(to_fd);
- destroy_progress_dlg(progbar);
- return FALSE;
- }
- /* header offset == 24 bytes */
- phton32(pd, 24);
- fwritten = ws_write(to_fd, pd, 4);
- if ((fwritten < 4) || (fread_cnt == (size_t)-1)) {
- ws_close(forw_fd);
- ws_close(rev_fd);
- ws_close(to_fd);
- destroy_progress_dlg(progbar);
- return FALSE;
- }
- /* total length, it is permited to set this to 0xffffffff */
- phton32(pd, 0xffffffff);
- fwritten = ws_write(to_fd, pd, 4);
- if ((fwritten < 4) || (fread_cnt == (size_t)-1)) {
- ws_close(forw_fd);
- ws_close(rev_fd);
- ws_close(to_fd);
- destroy_progress_dlg(progbar);
- return FALSE;
- }
- /* encoding format == 16-bit linear PCM */
- phton32(pd, 3);
- fwritten = ws_write(to_fd, pd, 4);
- if ((fwritten < 4) || (fread_cnt == (size_t)-1)) {
- ws_close(forw_fd);
- ws_close(rev_fd);
- ws_close(to_fd);
- destroy_progress_dlg(progbar);
- return FALSE;
- }
- /* sample rate == 8000 Hz */
- phton32(pd, 8000);
- fwritten = ws_write(to_fd, pd, 4);
- if ((fwritten < 4) || (fread_cnt == (size_t)-1)) {
- ws_close(forw_fd);
- ws_close(rev_fd);
- ws_close(to_fd);
- destroy_progress_dlg(progbar);
- return FALSE;
- }
- /* channels == 1 */
- phton32(pd, 1);
- fwritten = ws_write(to_fd, pd, 4);
- if ((fwritten < 4) || (fread_cnt == (size_t)-1)) {
- ws_close(forw_fd);
- ws_close(rev_fd);
- ws_close(to_fd);
- destroy_progress_dlg(progbar);
- return FALSE;
- }
-
- switch (channels) {
- /* only forward direction */
- case SAVE_FORWARD_DIRECTION_MASK: {
- progbar_count = user_data->forward.saveinfo.count;
- progbar_quantum = user_data->forward.saveinfo.count/100;
- while ((fread_cnt = ws_read(forw_fd, f_pd, 1)) > 0) {
- if (stop_flag)
- break;
- if ((count > progbar_nextstep) && (count <= progbar_count)) {
- update_progress_dlg(progbar,
- (gfloat) count/progbar_count, "Saving");
- progbar_nextstep = progbar_nextstep + progbar_quantum;
- }
- count++;
-
- if (user_data->forward.statinfo.pt == AST_FORMAT_ULAW) {
- sample = ulaw2linear(*f_pd);
- phton16(pd, sample);
- }
- else if (user_data->forward.statinfo.pt == AST_FORMAT_ALAW) {
- sample = alaw2linear(*f_pd);
- phton16(pd, sample);
- }
- else{
- ws_close(forw_fd);
- ws_close(rev_fd);
- ws_close(to_fd);
- destroy_progress_dlg(progbar);
- return FALSE;
- }
-
- fwritten = ws_write(to_fd, pd, 2);
- if ((fwritten < 2) || (fread_cnt == (size_t)-1)) {
- ws_close(forw_fd);
- ws_close(rev_fd);
- ws_close(to_fd);
- destroy_progress_dlg(progbar);
- return FALSE;
- }
- }
- break;
- }
- /* only reversed direction */
- case SAVE_REVERSE_DIRECTION_MASK: {
- progbar_count = user_data->reversed.saveinfo.count;
- progbar_quantum = user_data->reversed.saveinfo.count/100;
- while ((rread = ws_read(rev_fd, r_pd, 1)) > 0) {
- if (stop_flag)
- break;
- if ((count > progbar_nextstep) && (count <= progbar_count)) {
- update_progress_dlg(progbar,
- (gfloat) count/progbar_count, "Saving");
- progbar_nextstep = progbar_nextstep + progbar_quantum;
- }
- count++;
-
- if (user_data->reversed.statinfo.pt == AST_FORMAT_ULAW) {
- sample = ulaw2linear(*r_pd);
- phton16(pd, sample);
- }
- else if (user_data->reversed.statinfo.pt == AST_FORMAT_ALAW) {
- sample = alaw2linear(*r_pd);
- phton16(pd, sample);
- }
- else{
- ws_close(forw_fd);
- ws_close(rev_fd);
- ws_close(to_fd);
- destroy_progress_dlg(progbar);
- return FALSE;
- }
-
- rwritten = ws_write(to_fd, pd, 2);
- if ((rwritten < 2) || (rread == (size_t)-1)) {
- ws_close(forw_fd);
- ws_close(rev_fd);
- ws_close(to_fd);
- destroy_progress_dlg(progbar);
- return FALSE;
- }
- }
- break;
- }
- /* both directions */
- case SAVE_BOTH_DIRECTION_MASK: {
- (user_data->forward.saveinfo.count > user_data->reversed.saveinfo.count) ?
- (progbar_count = user_data->forward.saveinfo.count) :
- (progbar_count = user_data->reversed.saveinfo.count);
- progbar_quantum = progbar_count/100;
- /* since conversation in one way can start later than in the other one,
- * we have to write some silence information for one channel */
- if (user_data->forward.statinfo.start_time > user_data->reversed.statinfo.start_time) {
- f_write_silence = (guint32)
- ((user_data->forward.statinfo.start_time - user_data->reversed.statinfo.start_time)*8000);
- }
- else if (user_data->forward.statinfo.start_time < user_data->reversed.statinfo.start_time) {
- r_write_silence = (guint32)
- ((user_data->reversed.statinfo.start_time - user_data->forward.statinfo.start_time)*8000);
- }
- for(;;) {
- if (stop_flag)
- break;
- if ((count > progbar_nextstep) && (count <= progbar_count)) {
- update_progress_dlg(progbar,
- (gfloat) count/progbar_count, "Saving");
- progbar_nextstep = progbar_nextstep + progbar_quantum;
- }
- count++;
- if (f_write_silence > 0) {
- rread = ws_read(rev_fd, r_pd, 1);
- switch (user_data->forward.statinfo.reg_pt) {
- case AST_FORMAT_ULAW:
- *f_pd = SILENCE_PCMU;
- break;
- case AST_FORMAT_ALAW:
- *f_pd = SILENCE_PCMA;
- break;
- }
- fread_cnt = 1;
- f_write_silence--;
- }
- else if (r_write_silence > 0) {
- fread_cnt = ws_read(forw_fd, f_pd, 1);
- switch (user_data->reversed.statinfo.reg_pt) {
- case AST_FORMAT_ULAW:
- *r_pd = SILENCE_PCMU;
- break;
- case AST_FORMAT_ALAW:
- *r_pd = SILENCE_PCMA;
- break;
- }
- rread = 1;
- r_write_silence--;
- }
- else {
- fread_cnt = ws_read(forw_fd, f_pd, 1);
- rread = ws_read(rev_fd, r_pd, 1);
- }
- if ((rread == 0) && (fread_cnt == 0))
- break;
- if ((user_data->forward.statinfo.pt == AST_FORMAT_ULAW)
- && (user_data->reversed.statinfo.pt == AST_FORMAT_ULAW)) {
- sample = (ulaw2linear(*r_pd) + ulaw2linear(*f_pd)) / 2;
- phton16(pd, sample);
- }
- else if ((user_data->forward.statinfo.pt == AST_FORMAT_ALAW)
- && (user_data->reversed.statinfo.pt == AST_FORMAT_ALAW)) {
- sample = (alaw2linear(*r_pd) + alaw2linear(*f_pd)) / 2;
- phton16(pd, sample);
- }
- else
- {
- ws_close(forw_fd);
- ws_close(rev_fd);
- ws_close(to_fd);
- destroy_progress_dlg(progbar);
- return FALSE;
- }
-
-
- rwritten = ws_write(to_fd, pd, 2);
- if ((rwritten < 2) || (rread == (size_t)-1) || (fread_cnt == (size_t)-1)) {
- ws_close(forw_fd);
- ws_close(rev_fd);
- ws_close(to_fd);
- destroy_progress_dlg(progbar);
- return FALSE;
- }
- }
- }
- }
- }
- else if (format == SAVE_RAW_FORMAT) /* raw format */
- {
- int fd;
- switch (channels) {
- /* only forward direction */
- case SAVE_FORWARD_DIRECTION_MASK: {
- progbar_count = user_data->forward.saveinfo.count;
- progbar_quantum = user_data->forward.saveinfo.count/100;
- fd = forw_fd;
- break;
- }
- /* only reversed direction */
- case SAVE_REVERSE_DIRECTION_MASK: {
- progbar_count = user_data->reversed.saveinfo.count;
- progbar_quantum = user_data->reversed.saveinfo.count/100;
- fd = rev_fd;
- break;
- }
- default: {
- ws_close(forw_fd);
- ws_close(rev_fd);
- ws_close(to_fd);
- destroy_progress_dlg(progbar);
- return FALSE;
- }
- }
-
-
-
- /* XXX how do you just copy the file? */
- while ((rread = ws_read(fd, pd, 1)) > 0) {
- if (stop_flag)
- break;
- if ((count > progbar_nextstep) && (count <= progbar_count)) {
- update_progress_dlg(progbar,
- (gfloat) count/progbar_count, "Saving");
- progbar_nextstep = progbar_nextstep + progbar_quantum;
- }
- count++;
-
- rwritten = ws_write(to_fd, pd, 1);
-
- if ((rwritten < rread) || (rwritten == (size_t)-1) || (rread == (size_t)-1)) {
- ws_close(forw_fd);
- ws_close(rev_fd);
- ws_close(to_fd);
- destroy_progress_dlg(progbar);
- return FALSE;
- }
- }
- }
-
- destroy_progress_dlg(progbar);
- ws_close(forw_fd);
- ws_close(rev_fd);
- ws_close(to_fd);
- return TRUE;
-}
-
-
-/****************************************************************************/
-/* the user wants to save in a file */
-/* XXX support for different formats is currently commented out */
-static gboolean save_voice_as_ok_cb(GtkWidget *w _U_, gpointer fc)
-{
- gchar *g_dest;
- /*GtkWidget *wav, *sw;*/
- GtkWidget *au, *raw;
- GtkWidget *rev, *forw, *both;
- user_data_t *user_data;
- gint channels , format;
-
- g_dest = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fc));
-
- /* Perhaps the user specified a directory instead of a file.
- Check whether they did. */
- if (test_for_directory(g_dest) == EISDIR) {
- /* It's a directory - set the file selection box to display it. */
- set_last_open_dir(g_dest);
- file_selection_set_current_folder((GtkWidget *)fc, get_last_open_dir());
- gtk_file_chooser_set_current_name((GtkFileChooser *)fc, "");
- g_free(g_dest);
- return FALSE; /* run the dialog again */
- }
-
-#if 0
- wav = (GtkWidget *)g_object_get_data(G_OBJECT(fc), "wav_rb");
- sw = (GtkWidget *)g_object_get_data(G_OBJECT(fc), "sw_rb");
-#endif
- au = (GtkWidget *)g_object_get_data(G_OBJECT(fc), "au_rb");
- raw = (GtkWidget *)g_object_get_data(G_OBJECT(fc), "raw_rb");
- rev = (GtkWidget *)g_object_get_data(G_OBJECT(fc), "reversed_rb");
- forw = (GtkWidget *)g_object_get_data(G_OBJECT(fc), "forward_rb");
- both = (GtkWidget *)g_object_get_data(G_OBJECT(fc), "both_rb");
- user_data = (user_data_t *)g_object_get_data(G_OBJECT(fc), "user_data");
-
- /* XXX user clicks the ok button, but we know we can't save the voice info because f.e.
- * we don't support that codec. So we pop up a warning. Maybe it would be better to
- * disable the ok button or disable the buttons for direction if only one is not ok. The
- * problem is if we open the save voice dialog and then click the refresh button and maybe
- * the state changes, so we can't save anymore. In this case we should be able to update
- * the buttons. For now it is easier if we put the warning when the ok button is pressed.
- */
-
- /* we can not save in both directions */
- if ((user_data->forward.saveinfo.saved == FALSE)
- && (user_data->reversed.saveinfo.saved == FALSE)
- && (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (both)))) {
- /* there are many combinations here, we just exit when first matches */
- if ((user_data->forward.saveinfo.error_type == TAP_RTP_WRONG_CODEC) ||
- (user_data->reversed.saveinfo.error_type == TAP_RTP_WRONG_CODEC))
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save in a file: Unsupported codec.");
- else if ((user_data->forward.saveinfo.error_type == TAP_RTP_WRONG_LENGTH) ||
- (user_data->reversed.saveinfo.error_type == TAP_RTP_WRONG_LENGTH))
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save in a file: Wrong length of captured packets.");
- else if ((user_data->forward.saveinfo.error_type == TAP_RTP_SHORT_FRAME) ||
- (user_data->reversed.saveinfo.error_type == TAP_RTP_SHORT_FRAME))
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save in a file: Not all data in all packets was captured.");
- else
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save in a file: File I/O problem.");
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- /* we can not save forward direction */
- else if ((user_data->forward.saveinfo.saved == FALSE) && ((gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (forw))) ||
- (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (both))))) {
- if (user_data->forward.saveinfo.error_type == TAP_RTP_WRONG_CODEC)
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save forward direction in a file: Unsupported codec.");
- else if (user_data->forward.saveinfo.error_type == TAP_RTP_WRONG_LENGTH)
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save forward direction in a file: Wrong length of captured packets.");
- else if (user_data->forward.saveinfo.error_type == TAP_RTP_SHORT_FRAME)
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save forward direction in a file: Not all data in all packets was captured.");
- else
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save forward direction in a file: File I/O problem.");
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- /* we can not save reversed direction */
- else if ((user_data->reversed.saveinfo.saved == FALSE) && ((gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (rev))) ||
- (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (both))))) {
- if (user_data->reversed.saveinfo.error_type == TAP_RTP_WRONG_CODEC)
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save reversed direction in a file: Unsupported codec.");
- else if (user_data->reversed.saveinfo.error_type == TAP_RTP_WRONG_LENGTH)
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save reversed direction in a file: Wrong length of captured packets.");
- else if (user_data->reversed.saveinfo.error_type == TAP_RTP_SHORT_FRAME)
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save reversed direction in a file: Not all data in all packets was captured.");
- else if (user_data->reversed.saveinfo.error_type == TAP_RTP_NO_DATA)
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save reversed direction in a file: No IAX2 data.");
- else
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save reversed direction in a file: File I/O problem.");
- g_free(g_dest);
- return TRUE; /* we're done */
- }
-
-#if 0
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (wav)))
- format = SAVE_WAV_FORMAT;
- else
-#endif
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (au)))
- format = SAVE_AU_FORMAT;
-#if 0
- else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (sw)))
- format = SAVE_SW_FORMAT;
-#endif
- else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (raw)))
- format = SAVE_RAW_FORMAT;
- else
- format = SAVE_NONE_FORMAT;
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (rev)))
- channels = SAVE_REVERSE_DIRECTION_MASK;
- else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (both)))
- channels = SAVE_BOTH_DIRECTION_MASK;
- else
- channels = SAVE_FORWARD_DIRECTION_MASK;
-
- /* direction/format validity*/
- if (format == SAVE_AU_FORMAT)
- {
- /* make sure streams are alaw/ulaw */
- if ((channels & SAVE_FORWARD_DIRECTION_MASK)
- && (user_data->forward.statinfo.pt != AST_FORMAT_ALAW)
- && (user_data->forward.statinfo.pt != AST_FORMAT_ULAW)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save in a file: saving in au format supported only for alaw/ulaw streams");
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- if ((channels & SAVE_REVERSE_DIRECTION_MASK)
- && (user_data->reversed.statinfo.pt != AST_FORMAT_ALAW)
- && (user_data->reversed.statinfo.pt != AST_FORMAT_ULAW)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save in a file: saving in au format supported only for alaw/ulaw streams");
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- /* make sure pt's don't differ */
- if ((channels == SAVE_BOTH_DIRECTION_MASK) && (user_data->forward.statinfo.pt != user_data->reversed.statinfo.pt)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save in a file: Forward and reverse direction differ in type");
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- }
- else if (format == SAVE_RAW_FORMAT)
- {
- /* can't save raw in both directions */
- if (channels == SAVE_BOTH_DIRECTION_MASK) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save in a file: Unable to save raw data in both directions");
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- }
- else
- {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save in a file: Invalid save format");
- g_free(g_dest);
- return TRUE; /* we're done */
- }
-
- if (!copy_file(g_dest, channels, format, user_data)) {
- /* XXX - report the error type! */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "An error occurred while saving voice in a file.");
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- g_free(g_dest);
- return TRUE; /* we're done */
-}
-
-/****************************************************************************/
-/* when the user wants to save the voice information in a file */
-/* XXX support for different formats is currently commented out */
-static void save_voice_as_cb(GtkWidget *bt _U_, gpointer data)
-{
- user_data_t *user_data = (user_data_t *)data;
- GtkWidget *vertb;
- GtkWidget *grid1;
- GtkWidget *label_format;
- GtkWidget *channels_label;
- GtkWidget *forward_rb;
- GtkWidget *reversed_rb;
- GtkWidget *both_rb;
- /*GtkWidget *wav_rb; GtkWidget *sw_rb;*/
- GtkWidget *au_rb;
- GtkWidget *raw_rb;
-
- /* if we can't save in a file: wrong codec, cut packets or other errors */
- /* should the error arise here or later when you click ok button ?
- * if we do it here, then we must disable the refresh button, so we don't do it here */
-
-#if 0 /* XXX: GtkFileChooserDialog/gtk_dialog_run currently being used is effectively modal so this is not req'd */
- if (user_data->dlg.save_voice_as_w != NULL) {
- /* There's already a Save voice info dialog box; reactivate it. */
- reactivate_window(user_data->dlg.save_voice_as_w);
- return;
- }
-#endif
- /* XXX - use file_selection from dlg_utils instead! */
- user_data->dlg.save_voice_as_w =
- gtk_file_chooser_dialog_new("Wireshark: Save Payload As ...",
- GTK_WINDOW(user_data->dlg.notebook),
- GTK_FILE_CHOOSER_ACTION_SAVE,
- GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- NULL);
- gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(user_data->dlg.save_voice_as_w), TRUE);
-
- /* Container for each row of widgets */
- vertb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(vertb), 5);
- gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(user_data->dlg.save_voice_as_w), vertb);
- gtk_widget_show (vertb);
-
- grid1 = ws_gtk_grid_new ();
- gtk_widget_show (grid1);
- gtk_box_pack_start (GTK_BOX (vertb), grid1, FALSE, FALSE, 0);
- gtk_container_set_border_width (GTK_CONTAINER (grid1), 10);
- ws_gtk_grid_set_row_spacing (GTK_GRID (grid1), 20);
-
-#if 0
- label_format = gtk_label_new ("Format: .au (ulaw, 8 bit, 8000 Hz, mono) ");
- gtk_widget_show (label_format);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), label_format, 0, 0, 3, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-#endif
-
- label_format = gtk_label_new ("Format: ");
- gtk_widget_show (label_format);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), label_format, 0, 0, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-
- gtk_misc_set_alignment (GTK_MISC (label_format), 0, 0.5f);
-
- raw_rb = gtk_radio_button_new_with_label (NULL, ".raw");
- gtk_widget_show (raw_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), raw_rb, 1, 0, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-
-
- au_rb = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(raw_rb), ".au");
- gtk_widget_show (au_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), au_rb, 3, 0, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-
-#if 0
- /* we support .au - ulaw*/
- wav_rb = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(raw_rb), ".wav");
- gtk_widget_show (wav_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), wav_rb, 1, 0, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-
- sw_rb = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(raw_rb), "8 kHz, 16 bit ");
- gtk_widget_show (sw_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), sw_rb, 2, 0, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- au_rb = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(raw_rb), ".au");
- gtk_widget_show (au_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), au_rb, 3, 0, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-#endif
-
- channels_label = gtk_label_new ("Channels: ");
- gtk_widget_show (channels_label);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), channels_label, 0, 1, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (channels_label), 0, 0.5f);
-
- forward_rb = gtk_radio_button_new_with_label (NULL, "forward ");
- gtk_widget_show (forward_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), forward_rb, 1, 1, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-
- reversed_rb = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(forward_rb), "reversed ");
- gtk_widget_show (reversed_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), reversed_rb, 2, 1, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-
- both_rb = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(forward_rb), "both");
- gtk_widget_show (both_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), both_rb, 3, 1, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(forward_rb), TRUE);
-
-#if 0
- /* if one direction is nok we don't allow saving
- XXX this is not ok since the user can click the refresh button and cause changes
- but we can not update this window. So we move all the decision on the time the ok
- button is clicked */
- if (user_data->forward.saved == FALSE) {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(reversed_rb), TRUE);
- gtk_widget_set_sensitive(forward_rb, FALSE);
- gtk_widget_set_sensitive(both_rb, FALSE);
- }
- else if (user_data->reversed.saved == FALSE) {
- gtk_widget_set_sensitive(reversed_rb, FALSE);
- gtk_widget_set_sensitive(both_rb, FALSE);
- }
-#endif
-
- /*g_object_set_data(G_OBJECT(user_data->dlg.save_voice_as_w), "wav_rb", wav_rb);*/
- g_object_set_data(G_OBJECT(user_data->dlg.save_voice_as_w), "au_rb", au_rb);
- /*g_object_set_data(G_OBJECT(user_data->dlg.save_voice_as_w), "sw_rb", sw_rb);*/
- g_object_set_data(G_OBJECT(user_data->dlg.save_voice_as_w), "raw_rb", raw_rb);
- g_object_set_data(G_OBJECT(user_data->dlg.save_voice_as_w), "forward_rb", forward_rb);
- g_object_set_data(G_OBJECT(user_data->dlg.save_voice_as_w), "reversed_rb", reversed_rb);
- g_object_set_data(G_OBJECT(user_data->dlg.save_voice_as_w), "both_rb", both_rb);
- g_object_set_data(G_OBJECT(user_data->dlg.save_voice_as_w), "user_data", user_data);
-
- g_signal_connect(user_data->dlg.save_voice_as_w, "delete_event",
- G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(user_data->dlg.save_voice_as_w, "destroy",
- G_CALLBACK(save_voice_as_destroy_cb), user_data);
-
- gtk_widget_show(user_data->dlg.save_voice_as_w);
- window_present(user_data->dlg.save_voice_as_w);
-
- /* "Run" the GtkFileChooserDialog. */
- /* Upon exit: If "Accept" run the OK callback. */
- /* If the OK callback returns with a FALSE status, re-run the dialog.*/
- /* Destroy the window. */
- /* XXX: If the OK callback pops up an alert box (eg: for an error) it *must* */
- /* return with a TRUE status so that the dialog window will be destroyed. */
- /* Trying to re-run the dialog after popping up an alert box will not work */
- /* since the user will not be able to dismiss the alert box. */
- /* The (somewhat unfriendly) effect: the user must re-invoke the */
- /* GtkFileChooserDialog whenever the OK callback pops up an alert box. */
- /* */
- /* ToDo: use GtkFileChooserWidget in a dialog window instead of */
- /* GtkFileChooserDialog. */
- while (gtk_dialog_run(GTK_DIALOG(user_data->dlg.save_voice_as_w)) == GTK_RESPONSE_ACCEPT) {
- if (save_voice_as_ok_cb(NULL, user_data->dlg.save_voice_as_w)) {
- break; /* we're done */
- }
- }
- window_destroy(user_data->dlg.save_voice_as_w);
-}
-
-
-/****************************************************************************/
-/* when we are finished with redisection, we add the label for the statistic */
-static void
-draw_stat(user_data_t *user_data)
-{
- gchar label_max[200];
-
- g_snprintf(label_max, sizeof(label_max), "Total IAX2 packets = %u Max delta = %f sec at packet no. %u",
- user_data->forward.statinfo.total_nr,
- user_data->forward.statinfo.max_delta, user_data->forward.statinfo.max_nr);
-
- gtk_label_set_text(GTK_LABEL(user_data->dlg.label_stats_fwd), label_max);
-
- g_snprintf(label_max, sizeof(label_max), "Total IAX2 packets = %u Max delta = %f sec at packet no. %u",
- user_data->reversed.statinfo.total_nr,
- user_data->reversed.statinfo.max_delta, user_data->reversed.statinfo.max_nr);
-
- gtk_label_set_text(GTK_LABEL(user_data->dlg.label_stats_rev), label_max);
- gtk_label_set_selectable (GTK_LABEL(user_data->dlg.label_stats_rev),TRUE);
-
- return ;
-}
-
-
-
-/****************************************************************************/
-/* append a line to list */
-static void
-add_to_list(GtkWidget *list, user_data_t * user_data, guint32 number,
- double delta, double jitter, double bandwidth, gchar *status,
- gchar *timeStr, guint32 pkt_len, gchar *color_str, guint32 flags)
-{
- GtkListStore *list_store;
-
- if (strcmp(status, OK_TEXT) != 0) {
- user_data->dlg.number_of_nok++;
- }
-
- list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (list))); /* Get store */
-
- /* Creates a new row at position. iter will be changed to point to this new row.
- * If position is larger than the number of rows on the list, then the new row will be appended to the list.
- * The row will be filled with the values given to this function.
- * :
- * should generally be preferred when inserting rows in a sorted list store.
- */
- gtk_list_store_insert_with_values( list_store , &user_data->dlg.iter, G_MAXINT,
- PACKET_COLUMN, number,
- DELTA_COLUMN, delta,
- JITTER_COLUMN, jitter,
- IPBW_COLUMN, bandwidth,
- STATUS_COLUMN, (char *)status,
- DATE_COLUMN, (char *)timeStr,
- LENGTH_COLUMN, pkt_len,
- FOREGROUND_COLOR_COL, NULL,
- BACKGROUND_COLOR_COL, (char *)color_str,
- -1);
-
- if (flags & STAT_FLAG_FIRST) {
- /* Set first row as active */
- gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(list)), &user_data->dlg.iter);
- }
-}
-
-/****************************************************************************
- * Functions needed to present values from the list
- */
-
-/* Present floats with two decimals */
-static void
-iax2_float_data_func (GtkTreeViewColumn *column _U_,
- GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer user_data)
-{
- gfloat float_val;
- gchar buf[20];
- char *savelocale;
-
- /* the col to get data from is in userdata */
- gint float_col = GPOINTER_TO_INT(user_data);
-
- gtk_tree_model_get(model, iter, float_col, &float_val, -1);
-
- /* save the current locale */
- savelocale = g_strdup(setlocale(LC_NUMERIC, NULL));
- /* switch to "C" locale to avoid problems with localized decimal separators
- * in g_snprintf("%f") functions
- */
- setlocale(LC_NUMERIC, "C");
-
- g_snprintf(buf, sizeof(buf), "%.2f", float_val);
- /* restore previous locale setting */
- setlocale(LC_NUMERIC, savelocale);
- g_free(savelocale);
-
- g_object_set(renderer, "text", buf, NULL);
-}
-
-
-/* Create list */
-static
-GtkWidget*
-create_list(user_data_t* user_data)
-{
-
- GtkListStore *list_store;
- GtkWidget *list;
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
- GtkTreeSortable *sortable;
- GtkTreeView *list_view;
- GtkTreeSelection *selection;
-
- /* Create the store */
- list_store = gtk_list_store_new(N_COLUMN, /* Total number of columns XXX */
- G_TYPE_UINT, /* Packet */
- G_TYPE_FLOAT, /* Delta(ms) */
- G_TYPE_FLOAT, /* Jitter(ms) */
- G_TYPE_FLOAT, /* IP BW(kbps) */
- G_TYPE_STRING, /* Status */
- G_TYPE_STRING, /* Date */
- G_TYPE_UINT, /* Length */
- G_TYPE_STRING, /* Foreground color */
- G_TYPE_STRING); /* Background color */
-
- /* Create a view */
- list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
-
- list_view = GTK_TREE_VIEW(list);
- sortable = GTK_TREE_SORTABLE(list_store);
-
- /* Speed up the list display */
- gtk_tree_view_set_fixed_height_mode(list_view, TRUE);
-
- /* Setup the sortable columns */
- gtk_tree_sortable_set_sort_column_id(sortable, PACKET_COLUMN, GTK_SORT_ASCENDING);
- gtk_tree_view_set_headers_clickable(list_view, FALSE);
-
- /* The view now holds a reference. We can get rid of our own reference */
- g_object_unref (G_OBJECT (list_store));
-
- /*
- * Create the first column packet, associating the "text" attribute of the
- * cell_renderer to the first column of the model
- */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Packet", renderer,
- "text", PACKET_COLUMN,
- "foreground", FOREGROUND_COLOR_COL,
- "background", BACKGROUND_COLOR_COL,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, PACKET_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 100);
-
- /* Add the column to the view. */
- gtk_tree_view_append_column (list_view, column);
-
- /* Second column.. Delta(ms). */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Delta(ms)", renderer,
- "text", DELTA_COLUMN,
- "foreground", FOREGROUND_COLOR_COL,
- "background", BACKGROUND_COLOR_COL,
- NULL);
-
- gtk_tree_view_column_set_cell_data_func(column, renderer, iax2_float_data_func,
- GINT_TO_POINTER(DELTA_COLUMN), NULL);
-
- gtk_tree_view_column_set_sort_column_id(column, DELTA_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 100);
- gtk_tree_view_append_column (list_view, column);
-
- /* Third column.. Jitter(ms). */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Jitter(ms)", renderer,
- "text", JITTER_COLUMN,
- "foreground", FOREGROUND_COLOR_COL,
- "background", BACKGROUND_COLOR_COL,
- NULL);
-
- gtk_tree_view_column_set_cell_data_func(column, renderer, iax2_float_data_func,
- GINT_TO_POINTER(JITTER_COLUMN), NULL);
-
- gtk_tree_view_column_set_sort_column_id(column, JITTER_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 100);
- gtk_tree_view_append_column (list_view, column);
-
- /* Fourth column.. IP BW(kbps). */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("IP BW(kbps)", renderer,
- "text", IPBW_COLUMN,
- "foreground", FOREGROUND_COLOR_COL,
- "background", BACKGROUND_COLOR_COL,
- NULL);
-
- gtk_tree_view_column_set_cell_data_func(column, renderer, iax2_float_data_func,
- GINT_TO_POINTER(IPBW_COLUMN), NULL);
-
- gtk_tree_view_column_set_sort_column_id(column, IPBW_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 100);
- gtk_tree_view_append_column (list_view, column);
-
- /* Fifth column.. Status. */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ( "Status", renderer,
- "text", STATUS_COLUMN,
- "foreground", FOREGROUND_COLOR_COL,
- "background", BACKGROUND_COLOR_COL,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, STATUS_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 100);
- gtk_tree_view_append_column (list_view, column);
-
- /* Sixth column.. Length. */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Length", renderer,
- "text", LENGTH_COLUMN,
- "foreground", FOREGROUND_COLOR_COL,
- "background", BACKGROUND_COLOR_COL,
- NULL);
-
-
- gtk_tree_view_column_set_sort_column_id(column, LENGTH_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 100);
- gtk_tree_view_append_column (list_view, column);
-
- /* Now enable the sorting of each column */
- gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(list_view), TRUE);
- gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(list_view), TRUE);
-
- /* Setup the selection handler */
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
-
- g_signal_connect (G_OBJECT (selection), "changed", /* select_row */
- G_CALLBACK (on_list_select_row),
- user_data);
- return list;
-}
-
-
-
-/****************************************************************************/
-/* Create the dialog box with all widgets */
-static void
-create_iax2_dialog(user_data_t* user_data)
-{
- GtkWidget *window = NULL;
- GtkWidget *list_fwd;
- GtkWidget *list_rev;
- GtkWidget *label_stats_fwd;
- GtkWidget *label_stats_rev;
- GtkWidget *notebook;
-
- GtkWidget *main_vb, *page, *page_r;
- GtkWidget *label;
- GtkWidget *scrolled_window, *scrolled_window_r/*, *frame, *text, *label4, *page_help*/;
- GtkWidget *box4, *voice_bt, *refresh_bt, *goto_bt, *close_bt, *csv_bt, *next_bt;
- GtkWidget *graph_bt;
- gchar label_forward[150];
- gchar label_reverse[150];
-
- char *src_addr, *dst_addr;
-
- window = dlg_window_new("Wireshark: IAX2 Stream Analysis"); /* transient_for top_level */
- gtk_window_set_default_size(GTK_WINDOW(window), 700, 400);
-
- /* Container for each row of widgets */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 2, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 2);
- gtk_container_add(GTK_CONTAINER(window), main_vb);
- gtk_widget_show(main_vb);
-
- /* Notebooks... */
- src_addr = address_to_display(NULL, &(user_data->ip_src_fwd));
- dst_addr = address_to_display(NULL, &(user_data->ip_dst_fwd));
- g_snprintf(label_forward, sizeof(label_forward),
- "Analysing stream from %s port %u to %s port %u ",
- src_addr, user_data->port_src_fwd, dst_addr, user_data->port_dst_fwd);
- wmem_free(NULL, src_addr);
- wmem_free(NULL, dst_addr);
-
- src_addr = address_to_display(NULL, &(user_data->ip_src_rev));
- dst_addr = address_to_display(NULL, &(user_data->ip_dst_rev));
- g_snprintf(label_reverse, sizeof(label_reverse),
- "Analysing stream from %s port %u to %s port %u ",
- src_addr, user_data->port_src_rev, dst_addr, user_data->port_dst_rev);
- wmem_free(NULL, src_addr);
- wmem_free(NULL, dst_addr);
-
- /* Start a notebook for flipping between sets of changes */
- notebook = gtk_notebook_new();
- gtk_box_pack_start(GTK_BOX(main_vb), notebook, TRUE, TRUE, 0);
- g_object_set_data(G_OBJECT(window), "notebook", notebook);
-
- user_data->dlg.notebook_signal_id =
- g_signal_connect(notebook, "switch_page", G_CALLBACK(on_notebook_switch_page), user_data);
-
- /* page for forward connection */
- page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 8, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(page), 8);
-
- /* direction label */
- label = gtk_label_new(label_forward);
- gtk_box_pack_start(GTK_BOX(page), label, FALSE, FALSE, 0);
-
- /* place for some statistics */
- label_stats_fwd = gtk_label_new("\n");
- gtk_box_pack_end(GTK_BOX(page), label_stats_fwd, FALSE, FALSE, 0);
-
- /* scrolled window */
- scrolled_window = scrolled_window_new(NULL, NULL);
-
- /* packet list */
- list_fwd = create_list(user_data);
- gtk_widget_show(list_fwd);
- gtk_container_add(GTK_CONTAINER(scrolled_window), list_fwd);
- gtk_box_pack_start(GTK_BOX(page), scrolled_window, TRUE, TRUE, 0);
- gtk_widget_show(scrolled_window);
-
- /* tab */
- label = gtk_label_new(" Forward Direction ");
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page, label);
-
- /* same page for reversed connection */
- page_r = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 8, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(page_r), 8);
- label = gtk_label_new(label_reverse);
- gtk_box_pack_start(GTK_BOX(page_r), label, FALSE, FALSE, 0);
- label_stats_rev = gtk_label_new("\n");
- gtk_box_pack_end(GTK_BOX(page_r), label_stats_rev, FALSE, FALSE, 0);
-
- scrolled_window_r = scrolled_window_new(NULL, NULL);
-
- list_rev = create_list(user_data);
- gtk_widget_show(list_rev);
- gtk_container_add(GTK_CONTAINER(scrolled_window_r), list_rev);
- gtk_box_pack_start(GTK_BOX(page_r), scrolled_window_r, TRUE, TRUE, 0);
- gtk_widget_show(scrolled_window_r);
-
- label = gtk_label_new(" Reversed Direction ");
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_r, label);
-
-#if 0
- /* page for help&about or future */
- page_help = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5, FALSE);
- label = gtk_label_new(" Future ");
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_help, label);
- frame = gtk_frame_new("");
- text = gtk_label_new("\n\nMaybe some more statistics: delta and jitter distribution,...");
- gtk_label_set_justify(GTK_LABEL(text), GTK_JUSTIFY_LEFT);
- gtk_container_add(GTK_CONTAINER(frame), text);
- gtk_container_set_border_width(GTK_CONTAINER(frame), 20);
- gtk_box_pack_start(GTK_BOX(page_help), frame, TRUE, TRUE, 0);
-#endif
-
- /* show all notebooks */
- gtk_widget_show_all(notebook);
-
- /* buttons */
- box4 = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_start(GTK_BOX(main_vb), box4, FALSE, FALSE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(box4), 10);
- gtk_button_box_set_layout(GTK_BUTTON_BOX (box4), GTK_BUTTONBOX_EDGE);
- gtk_box_set_spacing(GTK_BOX (box4), 0);
- gtk_widget_show(box4);
-
- voice_bt = gtk_button_new_with_label("Save payload...");
- gtk_container_add(GTK_CONTAINER(box4), voice_bt);
- gtk_widget_show(voice_bt);
- g_signal_connect(voice_bt, "clicked", G_CALLBACK(save_voice_as_cb), user_data);
-
- csv_bt = gtk_button_new_with_label("Save as CSV...");
- gtk_container_add(GTK_CONTAINER(box4), csv_bt);
- gtk_widget_show(csv_bt);
- g_signal_connect(csv_bt, "clicked", G_CALLBACK(save_csv_as_cb), user_data);
-
- refresh_bt = ws_gtk_button_new_from_stock(GTK_STOCK_REFRESH);
- gtk_container_add(GTK_CONTAINER(box4), refresh_bt);
- gtk_widget_show(refresh_bt);
- g_signal_connect(refresh_bt, "clicked", G_CALLBACK(on_refresh_bt_clicked), user_data);
-
- goto_bt = ws_gtk_button_new_from_stock(GTK_STOCK_JUMP_TO);
- gtk_container_add(GTK_CONTAINER(box4), goto_bt);
- gtk_widget_show(goto_bt);
- g_signal_connect(goto_bt, "clicked", G_CALLBACK(on_goto_bt_clicked), user_data);
-
- graph_bt = gtk_button_new_with_label("Graph");
- gtk_container_add(GTK_CONTAINER(box4), graph_bt);
- gtk_widget_show(graph_bt);
- g_signal_connect(graph_bt, "clicked", G_CALLBACK(on_graph_bt_clicked), user_data);
-
- next_bt = gtk_button_new_with_label("Next non-Ok");
- gtk_container_add(GTK_CONTAINER(box4), next_bt);
- gtk_widget_show(next_bt);
- g_signal_connect(next_bt, "clicked", G_CALLBACK(on_next_bt_clicked), user_data);
-
- close_bt = ws_gtk_button_new_from_stock(GTK_STOCK_CLOSE);
- gtk_container_add(GTK_CONTAINER(box4), close_bt);
- gtk_widget_set_can_default(close_bt, TRUE);
- gtk_widget_show(close_bt);
- window_set_cancel_button(window, close_bt, window_cancel_button_cb);
-
- g_signal_connect(window, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(window, "destroy", G_CALLBACK(on_iax2_window_destroy), user_data);
-
- gtk_widget_show(window);
- window_present(window);
-
- /* some widget references need to be saved for outside use */
- user_data->dlg.window = window;
- user_data->dlg.list_fwd = list_fwd;
- user_data->dlg.list_rev = list_rev;
- user_data->dlg.label_stats_fwd = label_stats_fwd;
- user_data->dlg.label_stats_rev = label_stats_rev;
- user_data->dlg.notebook = notebook;
- user_data->dlg.selected_list = list_fwd;
- user_data->dlg.number_of_nok = 0;
-
- /*
- * select the initial row
- */
- gtk_widget_grab_focus(list_fwd);
-}
-
-/****************************************************************************/
-static void
-iax2_analysis(
- address *ip_src_fwd,
- guint16 port_src_fwd,
- address *ip_dst_fwd,
- guint16 port_dst_fwd,
- address *ip_src_rev,
- guint16 port_src_rev,
- address *ip_dst_rev,
- guint16 port_dst_rev
- )
-{
- user_data_t *user_data;
- int fd;
- int i;
- static GdkColor col[MAX_GRAPHS] = {
- {0, 0x0000, 0x0000, 0x0000},
- {0, 0xffff, 0x0000, 0x0000},
- {0, 0x0000, 0xffff, 0x0000},
- {0, 0x0000, 0x0000, 0xffff}
- };
- static GdkRGBA rgba_col[MAX_GRAPHS] = {
- {0.0, 0.0, 0.0, 1.0}, /* Black */
- {1.0, 0.0, 0.1, 1.0}, /* Red */
- {0.0, 1.0, 0.0, 1.0}, /* Green */
- {0.0, 0.0, 1.0, 1.0}, /* Blue */
- };
-
- char *tempname;
-
- /* init */
- user_data = (user_data_t *)g_malloc(sizeof(user_data_t));
-
- copy_address(&(user_data->ip_src_fwd), ip_src_fwd);
- user_data->port_src_fwd = port_src_fwd;
- copy_address(&(user_data->ip_dst_fwd), ip_dst_fwd);
- user_data->port_dst_fwd = port_dst_fwd;
- copy_address(&(user_data->ip_src_rev), ip_src_rev);
- user_data->port_src_rev = port_src_rev;
- copy_address(&(user_data->ip_dst_rev), ip_dst_rev);
- user_data->port_dst_rev = port_dst_rev;
-
-
- /* file names for storing sound data */
- fd = create_tempfile(&tempname, "wireshark_iax2_f", NULL);
- if (fd < 0) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't create temporary file for IAX2 analysis:\n%s.",
- g_strerror(errno));
- g_free(user_data);
- return;
- }
- user_data->f_tempname = g_strdup(tempname);
- ws_close(fd);
- fd = create_tempfile(&tempname, "wireshark_iax2_r", NULL);
- if (fd < 0) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't create temporary file for IAX2 analysis:\n%s.",
- g_strerror(errno));
- g_free(user_data->f_tempname);
- g_free(user_data);
- return;
- }
- user_data->r_tempname = g_strdup(tempname);
- ws_close(fd);
- user_data->forward.saveinfo.fp = NULL;
- user_data->reversed.saveinfo.fp = NULL;
- user_data->dlg.save_voice_as_w = NULL;
- user_data->dlg.save_csv_as_w = NULL;
- user_data->dlg.dialog_graph.window = NULL;
-
- /* init dialog_graph */
- user_data->dlg.dialog_graph.needs_redraw = TRUE;
- user_data->dlg.dialog_graph.interval = tick_interval_values[DEFAULT_TICK_VALUE_INDEX];
- user_data->dlg.dialog_graph.draw_area = NULL;
-#if GTK_CHECK_VERSION(2,22,0)
- user_data->dlg.dialog_graph.surface = NULL;
-#else
- user_data->dlg.dialog_graph.pixmap = NULL;
-#endif
- user_data->dlg.dialog_graph.scrollbar = NULL;
- user_data->dlg.dialog_graph.scrollbar_adjustment = NULL;
- user_data->dlg.dialog_graph.surface_width = 500;
- user_data->dlg.dialog_graph.surface_height = 200;
- user_data->dlg.dialog_graph.pixels_per_tick = pixels_per_tick[DEFAULT_PIXELS_PER_TICK_INDEX];
- user_data->dlg.dialog_graph.max_y_units = AUTO_MAX_YSCALE;
- user_data->dlg.dialog_graph.last_interval = 0xffffffff;
- user_data->dlg.dialog_graph.max_interval = 0;
- user_data->dlg.dialog_graph.num_items = 0;
- user_data->dlg.dialog_graph.start_time = -1;
-
- for(i = 0; i < MAX_GRAPHS; i++) {
- user_data->dlg.dialog_graph.graph[i].color.pixel = 0;
- user_data->dlg.dialog_graph.graph[i].color.red = col[i].red;
- user_data->dlg.dialog_graph.graph[i].color.green = col[i].green;
- user_data->dlg.dialog_graph.graph[i].color.blue = col[i].blue;
- user_data->dlg.dialog_graph.graph[i].rgba_color.red = rgba_col[i].red;
- user_data->dlg.dialog_graph.graph[i].rgba_color.green = rgba_col[i].green;
- user_data->dlg.dialog_graph.graph[i].rgba_color.blue = rgba_col[i].blue;
- user_data->dlg.dialog_graph.graph[i].rgba_color.alpha = rgba_col[i].alpha;
- user_data->dlg.dialog_graph.graph[i].display = TRUE;
- user_data->dlg.dialog_graph.graph[i].display_button = NULL;
- user_data->dlg.dialog_graph.graph[i].ud = user_data;
- }
-
- /* create the dialog box */
- create_iax2_dialog(user_data);
-
- /* proceed as if the Refresh button would have been pressed */
- on_refresh_bt_clicked(NULL, user_data);
-}
-
-/****************************************************************************/
-/* entry point from main menu */
-void iax2_analysis_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- address ip_src_fwd;
- guint16 port_src_fwd;
- address ip_dst_fwd;
- guint16 port_dst_fwd;
- address ip_src_rev;
- guint16 port_src_rev;
- address ip_dst_rev;
- guint16 port_dst_rev;
- /* unsigned int ptype; */
-
-#if 0
- /* Only accept Voice or MiniPacket packets */
- const gchar filter_text[] = "iax2.call && (ip || ipv6)";
-#else
- const gchar filter_text[] = "iax2 && (ip || ipv6)";
-#endif
- dfilter_t *sfcode;
- gchar *err_msg;
- capture_file *cf;
- frame_data *fdata;
- GList *strinfo_list;
- GList *filtered_list = NULL;
- guint nfound;
- epan_dissect_t edt;
- rtp_stream_info_t *strinfo;
-
- /* Try to compile the filter. */
- if (!dfilter_compile(filter_text, &sfcode, &err_msg)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg);
- g_free(err_msg);
- return;
- }
- /* we load the current file into cf variable */
- cf = &cfile;
- fdata = cf->current_frame;
-
- /* we are on the selected frame now */
- if (fdata == NULL)
- return; /* if we exit here it's an error */
-
- /* dissect the current record */
- if (!cf_read_record(cf, fdata))
- return; /* error reading the record */
- epan_dissect_init(&edt, cf->epan, TRUE, FALSE);
- epan_dissect_prime_with_dfilter(&edt, sfcode);
- epan_dissect_run(&edt, cf->cd_t, &cf->rec,
- frame_tvbuff_new_buffer(&cf->provider, fdata, &cf->buf),
- fdata, NULL);
-
- /* if it is not an iax2 packet, show an error dialog */
- if (!dfilter_apply_edt(sfcode, &edt)) {
- epan_dissect_cleanup(&edt);
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Please select an IAX2 packet.");
- return;
- }
-
- /* ok, it is a IAX2 frame, so let's get the ip and port values */
- copy_address(&(ip_src_fwd), &(edt.pi.src));
- copy_address(&(ip_dst_fwd), &(edt.pi.dst));
- port_src_fwd = edt.pi.srcport;
- port_dst_fwd = edt.pi.destport;
-
- /* assume the inverse ip/port combination for the reverse direction */
- copy_address(&(ip_src_rev), &(edt.pi.dst));
- copy_address(&(ip_dst_rev), &(edt.pi.src));
- port_src_rev = edt.pi.destport;
- port_dst_rev = edt.pi.srcport;
-
- /* Scan for rtpstream */
- rtpstream_scan(rtpstream_dlg_get_tapinfo(), &cfile, NULL);
- /* search for reversed direction in the global rtp streams list */
- nfound = 0;
- strinfo_list = g_list_first(rtpstream_dlg_get_tapinfo()->strinfo_list);
- while (strinfo_list)
- {
- strinfo = (rtp_stream_info_t*)(strinfo_list->data);
- if (addresses_equal(&(strinfo->src_addr),&(ip_src_fwd))
- && strinfo->src_port == port_src_fwd
- && addresses_equal(&(strinfo->dest_addr),&(ip_dst_fwd))
- && strinfo->dest_port == port_dst_fwd)
- {
- filtered_list = g_list_prepend(filtered_list, strinfo);
- }
-
- if (addresses_equal(&(strinfo->src_addr),&(ip_src_rev))
- && strinfo->src_port == port_src_rev
- && addresses_equal(&(strinfo->dest_addr),&(ip_dst_rev))
- && strinfo->dest_port == port_dst_rev)
- {
- ++nfound;
- filtered_list = g_list_append(filtered_list, strinfo);
- }
-
- strinfo_list = g_list_next(strinfo_list);
- }
-
- /* if more than one reverse streams found, we let the user choose the right one */
- if (nfound > 1) {
- rtpstream_dlg_show(filtered_list);
- return;
- }
- else {
- iax2_analysis(
- &ip_src_fwd,
- port_src_fwd,
- &ip_dst_fwd,
- port_dst_fwd,
- &ip_src_rev,
- port_src_rev,
- &ip_dst_rev,
- port_dst_rev
- );
- }
-}
-
-/****************************************************************************/
-static void
-iax2_analysis_init(const char *dummy _U_,void* userdata _U_)
-{
- iax2_analysis_cb(NULL, NULL);
-}
-
-/****************************************************************************/
-static stat_tap_ui iax2_analysis_ui = {
- REGISTER_STAT_GROUP_GENERIC,
- NULL,
- "IAX2", /* XXX - should be "iax2" */
- iax2_analysis_init,
- 0,
- NULL
-};
-
-void
-register_tap_listener_iax2_analysis(void)
-{
- register_stat_tap_ui(&iax2_analysis_ui,NULL);
-}
-
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 8
- * tab-width: 8
- * indent-tabs-mode: t
- * End:
- *
- * ex: set shiftwidth=8 tabstop=8 noexpandtab:
- * :indentSize=8:tabSize=8:noTabs=false:
- */
diff --git a/ui/gtk/io_stat.c b/ui/gtk/io_stat.c
deleted file mode 100644
index b4c54ce600..0000000000
--- a/ui/gtk/io_stat.c
+++ /dev/null
@@ -1,2197 +0,0 @@
-/* io_stat.c
- * io_stat 2002 Ronnie Sahlberg
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-
-#include "config.h"
-
-#include <string.h>
-#include <math.h>
-#include <gtk/gtk.h>
-
-#include <epan/epan_dissect.h>
-#include <epan/stat_tap_ui.h>
-#include <epan/tap.h>
-
-#include "ui/io_graph_item.h"
-#include "ui/simple_dialog.h"
-
-#include "ui/gtk/gui_stat_menu.h"
-#include "ui/gtk/old-gtk-compat.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/filter_dlg.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/pixmap_save.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/filter_autocomplete.h"
-#include "ui/main_statusbar.h"
-
-#include "globals.h"
-
-void register_tap_listener_gtk_iostat(void);
-
-#define MAX_GRAPHS 5
-
-#define MAX_YSCALE 28
-#define LOGARITHMIC_YSCALE 0
-#define AUTO_MAX_YSCALE 1
-#define DEFAULT_YSCALE_INDEX 1
-static guint32 yscale_max[MAX_YSCALE] = {LOGARITHMIC_YSCALE, AUTO_MAX_YSCALE, 10, 20,
- 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000,
- 50000, 100000, 200000, 500000, 1000000, 2000000,
- 5000000, 10000000, 20000000, 50000000, 100000000,
- 200000000, 500000000, 1000000000, 2000000000};
-
-#define NO_FILTER_ORDER 0
-#define MAX_MOVING_AVERAGE_ORDER 10
-static guint32 moving_average_orders[MAX_MOVING_AVERAGE_ORDER] = {NO_FILTER_ORDER, 4, 8, 16,
- 32, 64, 128, 256, 512, 1024};
-#define NO_FILTER 0
-#define MOVING_AVERAGE_FILTER 1
-#define GRAPH_NOFILTER 0
-#define GRAPH_FOLLOWFILTER 1
-
-#define MAX_PIXELS_PER_TICK 4
-#define DEFAULT_PIXELS_PER_TICK_INDEX 2
-static guint32 pixels_per_tick[MAX_PIXELS_PER_TICK] = {1, 2, 5, 10};
-
-
-#define DEFAULT_PLOT_STYLE 0
-#define PLOT_STYLE_LINE 0
-#define PLOT_STYLE_IMPULSE 1
-#define PLOT_STYLE_FILLED_BAR 2
-#define PLOT_STYLE_DOT 3
-#define MAX_PLOT_STYLES 4
-static const char *plot_style_name[MAX_PLOT_STYLES] = {
- "Line",
- "Impulse",
- "FBar",
- "Dot",
-};
-
-/*
- * XXX - "Count types" and "calc types" are combined in io_graph_item_unit_t
- * in io_graph_item_t. The Qt port treats these as a single Y Axis "value unit"
- * type. Should we do the same here?
- */
-#define DEFAULT_COUNT_TYPE 0
-#define COUNT_TYPE_FRAMES 0
-#define COUNT_TYPE_BYTES 1
-#define COUNT_TYPE_BITS 2
-#define COUNT_TYPE_ADVANCED 3
-#define MAX_COUNT_TYPES 4
-static const char *count_type_names[MAX_COUNT_TYPES] = {
- "Packets/Tick",
- "Bytes/Tick",
- "Bits/Tick",
- "Advanced..."};
-
-/* unit is in ms */
-#define MAX_TICK_VALUES 7
-#define DEFAULT_TICK_VALUE_INDEX 3
-static const guint tick_interval_values[MAX_TICK_VALUES] = { 1, 10, 100, 1000, 10000, 60000, 600000 };
-
-#define CALC_TYPE_SUM 0
-#define CALC_TYPE_COUNT_FRAMES 1
-#define CALC_TYPE_COUNT_FIELDS 2
-#define CALC_TYPE_MAX 3
-#define CALC_TYPE_MIN 4
-#define CALC_TYPE_AVG 5
-#define CALC_TYPE_LOAD 6
-#define MAX_CALC_TYPES 7
-#define DEFAULT_CALC_TYPE 0
-static const char *calc_type_names[MAX_CALC_TYPES] = {
- "SUM(*)",
- "COUNT FRAMES(*)",
- "COUNT FIELDS(*)",
- "MAX(*)",
- "MIN(*)",
- "AVG(*)",
- "LOAD(*)"};
-
-#define CALC_TYPE_TO_ITEM_UNIT(ct) ((io_graph_item_unit_t)(ct + IOG_ITEM_UNIT_CALC_SUM))
-
-/* Unused? */
-#if 0
-typedef struct _io_stat_calc_type_t {
- struct _io_stat_graph_t *gio;
- int calc_type;
-} io_stat_calc_type_t;
-#endif
-
-typedef struct _io_stat_graph_t {
- struct _io_stat_t *io;
- io_graph_item_t *items;
- int plot_style;
- gboolean display;
- GtkWidget *display_button;
- GtkWidget *filter_field;
- GtkWidget *advanced_buttons;
- int calc_type;
- int hf_index;
- GtkWidget *calc_field;
- GdkColor color;
- GdkRGBA rgba_color;
- construct_args_t *args;
- GtkWidget *filter_bt;
-
- gboolean follow_smooth;
- GtkWidget *follow_smooth_toggle;
-} io_stat_graph_t;
-
-
-typedef struct _io_stat_t {
- gsize space_items; /* space for items allocated */
- gboolean needs_redraw;
- guint32 interval; /* measurement interval in ms */
- guint32 last_interval; /* the last *displayed* interval */
- guint32 max_interval; /* the maximum interval based on the capture duration */
- guint32 num_items; /* total number of items in all intervals (zero relative) */
- guint32 left_x_border;
- guint32 right_x_border;
- gboolean view_as_time;
- nstime_t start_time;
-
- struct _io_stat_graph_t graphs[MAX_GRAPHS];
- GtkWidget *window;
- GtkWidget *draw_area;
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_surface_t *surface;
-#else
- GdkPixmap *pixmap;
-#endif
- GtkAdjustment *scrollbar_adjustment;
- GtkWidget *scrollbar;
-
- int surface_width;
- int surface_height;
- int pixels_per_tick;
- int max_y_units;
- int count_type;
-
- guint32 filter_order;
- int filter_type;
-} io_stat_t;
-
-
-static void init_io_stat_window(io_stat_t *io);
-static void filter_callback(GtkWidget *widget _U_, gpointer user_data);
-
-static void
-io_stat_set_title(io_stat_t *io)
-{
- if (!io->window) {
- return;
- }
- set_window_title(io->window, "Wireshark IO Graphs");
-}
-
-static void
-io_stat_reset(io_stat_t *io)
-{
- int i;
-
- io->needs_redraw = TRUE;
- for (i=0; i<MAX_GRAPHS; i++) {
- reset_io_graph_items(io->graphs[i].items, io->num_items);
- }
- io->last_interval = 0xffffffff;
- io->max_interval = 0;
- io->num_items = 0;
- io->start_time.secs = 0;
- io->start_time.nsecs = 0;
- io_stat_set_title(io);
-}
-
-static void
-tap_iostat_reset(void *g)
-{
- io_stat_graph_t *gio = (io_stat_graph_t *)g;
-
- io_stat_reset(gio->io);
-}
-
-static gboolean
-tap_iostat_packet(void *g, packet_info *pinfo, epan_dissect_t *edt, const void *dummy _U_)
-{
- io_stat_graph_t *graph = (io_stat_graph_t *)g;
- io_stat_t *io = graph->io;
- epan_dissect_t *adv_edt = NULL;
- unsigned int idx;
-
- /* we sometimes get called when the graph is disabled.
- this is a bug since the tap listener should be removed first */
- if (!graph->display) {
- return FALSE;
- }
-
- io->needs_redraw = TRUE;
-
- {
- int idx_signed;
- idx_signed = get_io_graph_index(pinfo, io->interval);
-
- /* some sanity checks */
- if (idx_signed < 0) {
- return FALSE;
- } else {
- idx = idx_signed;
- }
- }
-
- /* update num_items */
- if (idx + 1 > io->num_items) {
- if (idx + 1 > io->space_items) {
- /* reallocate graphs */
- static const gsize exp_inc_limit = 1000000;
- static const gsize step = 100000;
- const gsize new_size = (gsize)((idx < exp_inc_limit)?pow(2.0, log(idx + 1)/log(2.0) + 1):(idx + step));
- if (io->space_items == 0) {
- /* nothing allocated yet */
- int i;
- for (i = 0; i < MAX_GRAPHS; i++) {
- io->graphs[i].items = (io_graph_item_t *)g_malloc(sizeof(io->graphs[i].items[0]) * new_size);
- reset_io_graph_items(io->graphs[i].items, new_size);
- }
- } else {
- /* resize */
- int i;
- for (i = 0; i < MAX_GRAPHS; i++) {
- io->graphs[i].items = (io_graph_item_t *)g_realloc(io->graphs[i].items, sizeof(io->graphs[i].items[0]) * new_size);
- reset_io_graph_items(&io->graphs[i].items[io->space_items], new_size - io->space_items);
- }
- }
- io->space_items = new_size;
- }
- io->num_items = idx + 1;
- }
-
- /* set start time */
- if ((io->start_time.secs == 0) && (io->start_time.nsecs == 0)) {
- nstime_delta(&io->start_time, &pinfo->abs_ts, &pinfo->rel_ts);
- }
-
- /* For ADVANCED mode we need to keep track of some more stuff than just frame and byte counts */
- if (io->count_type == COUNT_TYPE_ADVANCED) {
- adv_edt = edt;
- }
-
- if (!update_io_graph_item(graph->items, idx, pinfo, adv_edt, graph->hf_index, CALC_TYPE_TO_ITEM_UNIT(graph->calc_type), io->interval)) {
- return FALSE;
- }
-
- return TRUE;
-}
-
-static guint64
-get_it_value(io_stat_t *io, int graph, int idx)
-{
- guint64 value = 0; /* FIXME: loss of precision, visible on the graph for small values */
- int adv_type;
- io_graph_item_t *it;
- guint32 interval;
-
- g_assert(graph < MAX_GRAPHS);
- if (((guint)idx > io->num_items + 1) || (0 == io->num_items)) {
- return 0;
- }
-
- it = &io->graphs[graph].items[idx];
-
- switch (io->count_type) {
- case COUNT_TYPE_FRAMES:
- return it->frames;
- case COUNT_TYPE_BYTES:
- return it->bytes;
- case COUNT_TYPE_BITS:
- return (it->bytes * 8);
- case COUNT_TYPE_ADVANCED:
- switch (io->graphs[graph].calc_type) {
- case CALC_TYPE_COUNT_FRAMES:
- return it->frames;
- case CALC_TYPE_COUNT_FIELDS:
- return it->fields;
- default:
- /* If it's COUNT_TYPE_ADVANCED but not one of the
- * generic ones we'll get it when we switch on the
- * adv_type below. */
- break;
- }
- break;
- }
-
- adv_type = proto_registrar_get_ftype(io->graphs[graph].hf_index);
- switch (adv_type) {
- case FT_UINT8:
- case FT_UINT16:
- case FT_UINT24:
- case FT_UINT32:
- case FT_UINT64:
- case FT_INT8:
- case FT_INT16:
- case FT_INT24:
- case FT_INT32:
- case FT_INT64:
- switch (io->graphs[graph].calc_type) {
- case CALC_TYPE_SUM:
- value = it->int_tot;
- break;
- case CALC_TYPE_MAX:
- value = it->int_max;
- break;
- case CALC_TYPE_MIN:
- value = it->int_min;
- break;
- case CALC_TYPE_AVG:
- if (it->fields) {
- value = it->int_tot/it->fields;
- } else {
- value = 0;
- }
- break;
- default:
- break;
- }
- break;
- case FT_FLOAT:
- switch (io->graphs[graph].calc_type) {
- case CALC_TYPE_SUM:
- value = (guint64)it->float_tot;
- break;
- case CALC_TYPE_MAX:
- value = (guint64)it->float_max;
- break;
- case CALC_TYPE_MIN:
- value = (guint64)it->float_min;
- break;
- case CALC_TYPE_AVG:
- if (it->fields) {
- value = (guint64)it->float_tot/it->fields;
- } else {
- value = 0;
- }
- break;
- default:
- break;
- }
- break;
- case FT_DOUBLE:
- switch (io->graphs[graph].calc_type) {
- case CALC_TYPE_SUM:
- value = (guint64)it->double_tot;
- break;
- case CALC_TYPE_MAX:
- value = (guint64)it->double_max;
- break;
- case CALC_TYPE_MIN:
- value = (guint64)it->double_min;
- break;
- case CALC_TYPE_AVG:
- if (it->fields) {
- value = (guint64)it->double_tot/it->fields;
- } else {
- value = 0;
- }
- break;
- default:
- break;
- }
- break;
- case FT_RELATIVE_TIME:
- switch (io->graphs[graph].calc_type) {
- case CALC_TYPE_MAX:
- value = (guint64) (it->time_max.secs*1000000 + it->time_max.nsecs/1000);
- break;
- case CALC_TYPE_MIN:
- value = (guint64) (it->time_min.secs*1000000 + it->time_min.nsecs/1000);
- break;
- case CALC_TYPE_SUM:
- value = (guint64) (it->time_tot.secs*1000000 + it->time_tot.nsecs/1000);
- break;
- case CALC_TYPE_AVG:
- if (it->fields) {
- guint64 t; /* time in us */
-
- t = it->time_tot.secs;
- t = t*1000000+it->time_tot.nsecs/1000;
- value = (guint64) (t/it->fields);
- } else {
- value = 0;
- }
- break;
- case CALC_TYPE_LOAD:
- if (idx == (int)io->num_items) {
- interval = (guint32)((cfile.elapsed_time.secs*1000) +
- ((cfile.elapsed_time.nsecs+500000)/1000000));
- interval -= (io->interval * idx);
- } else {
- interval = io->interval;
- }
- value = (guint64) ((it->time_tot.secs*1000000 + it->time_tot.nsecs/1000) / interval);
- break;
- default:
- break;
- }
- break;
- default:
- break;
- }
- return value;
-}
-
-static void
-print_time_scale_string(char *buf, int buf_len, guint32 t, guint32 t_max, gboolean log_flag)
-{
- if ((t_max >= 10000000) || (log_flag && (t_max >= 1000000))) {
- g_snprintf(buf, buf_len, "%ds", t/1000000);
- } else if (t_max >= 1000000) {
- g_snprintf(buf, buf_len, "%d.%1ds", t/1000000, (t%1000000)/100000);
- } else if ((t_max >= 10000) || (log_flag && (t_max >= 1000))) {
- g_snprintf(buf, buf_len, "%dms", t/1000);
- } else if (t_max >= 1000) {
- g_snprintf(buf, buf_len, "%d.%1dms", t/1000,(t%1000)/100);
- } else {
- g_snprintf(buf, buf_len, "%dus", t);
- }
-}
-
-static void
-print_interval_string(char *buf, int buf_len, guint32 interval, io_stat_t *io,
- gboolean ext)
-{
- if (io->view_as_time) {
- struct tm *tmp;
- time_t sec_val = interval/1000 + io->start_time.secs;
- gint32 nsec_val = interval%1000 + io->start_time.nsecs/1000000;
-
- if (nsec_val >= 1000) {
- sec_val++;
- nsec_val -= 1000;
- }
- tmp = localtime (&sec_val);
- if (tmp != NULL) {
- if (io->interval >= 1000) {
- g_snprintf(buf, buf_len, "%02d:%02d:%02d", tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
- } else if (io->interval >= 100) {
- g_snprintf(buf, buf_len, "%02d:%02d:%02d.%1d", tmp->tm_hour, tmp->tm_min, tmp->tm_sec, nsec_val/100);
- } else if (io->interval >= 10) {
- g_snprintf(buf, buf_len, "%02d:%02d:%02d.%02d", tmp->tm_hour, tmp->tm_min, tmp->tm_sec, nsec_val/10);
- } else {
- g_snprintf(buf, buf_len, "%02d:%02d:%02d.%03d", tmp->tm_hour, tmp->tm_min, tmp->tm_sec, nsec_val);
- }
- } else
- g_snprintf(buf, buf_len, "Time not representable");
- } else {
- if (!ext) {
- g_snprintf(buf, buf_len, "%d.%03d", interval/1000,interval%1000);
- } else if (io->interval >= 60000) {
- g_snprintf(buf, buf_len, "%dm", interval/60000);
- } else if (io->interval >= 1000) {
- g_snprintf(buf, buf_len, "%ds", interval/1000);
- } else if (io->interval >= 100) {
- g_snprintf(buf, buf_len, "%d.%1ds", interval/1000,(interval/100)%10);
- } else if (io->interval >= 10) {
- g_snprintf(buf, buf_len, "%d.%02ds", interval/1000,(interval/10)%100);
- } else {
- g_snprintf(buf, buf_len, "%d.%03ds", interval/1000,interval%1000);
- }
- }
-}
-
-static void
-io_stat_draw(io_stat_t *io)
-{
- int i, tics, ystart, ys;
- guint32 last_interval, first_interval, interval_delta;
- gint32 current_interval;
- guint32 top_y_border;
- guint32 bottom_y_border;
- PangoLayout *layout;
- int label_width, label_height;
- guint32 draw_width, draw_height;
- char label_string[45];
- GtkAllocation widget_alloc;
-
- /* new variables */
- guint64 max_value; /* max value of seen data */
- guint32 max_y; /* max value of the Y scale */
- gboolean draw_y_as_time;
- gboolean draw_y_as_load;
- cairo_t *cr;
-
- if (!io->needs_redraw) {
- return;
- }
- io->needs_redraw = FALSE;
- /*
- * Set max_interval to duration rounded to the nearest ms. Add the Tick Interval so the last
- * interval will be displayed. For example, if duration = 11.844 secs and 'Tick Interval' == 1,
- * max_interval = 12000; if 0.1, 11900; if 0.01, 11850; and if 0.001, 11845.
- */
- io->max_interval = (guint32)((cfile.elapsed_time.secs*1000) +
- ((cfile.elapsed_time.nsecs+500000)/1000000) +
- io->interval);
- io->max_interval = (io->max_interval / io->interval) * io->interval;
-
- /*
- * find the max value so we can autoscale the y axis
- */
- max_value = 0;
- for (i=0; i<MAX_GRAPHS; i++) {
- int idx;
-
- if (!io->graphs[i].display) {
- continue;
- }
- for (idx=0; (guint32)(idx) < io->num_items; idx++) {
- guint64 val;
-
- val = get_it_value(io, i, idx);
-
- /* keep track of the max value we have encountered */
- if (val>max_value) {
- max_value = val;
- }
- }
- }
-
- /*
- * Clear out old plot
- */
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (io->surface);
-#else
- cr = gdk_cairo_create (io->pixmap);
-#endif
- cairo_set_source_rgb (cr, 1, 1, 1);
- gtk_widget_get_allocation(io->draw_area, &widget_alloc);
- cairo_rectangle (cr, 0, 0, widget_alloc.width,widget_alloc.height);
- cairo_fill (cr);
- cairo_destroy (cr);
- /*
- * Calculate the y scale we should use
- */
- if (io->max_y_units == AUTO_MAX_YSCALE) {
- max_y = yscale_max[MAX_YSCALE-1];
- for (i=MAX_YSCALE-1; i>1; i--) {
- if (max_value < yscale_max[i]) {
- max_y = yscale_max[i];
- }
- }
- } else if (io->max_y_units == LOGARITHMIC_YSCALE) {
- max_y = 1000000000;
- for (i=1000000000; i>1; i/=10) {
- if (max_value<(guint32)i) {
- max_y = i;
- }
- }
- } else {
- /* the user had specified an explicit y scale to use */
- max_y = io->max_y_units;
- }
-
- /*
- * If we use ADVANCED and all the graphs are plotting
- * either MIN/MAX/AVG of an FT_RELATIVE_TIME field
- * then we will do some some special processing for the
- * labels for the Y axis below:
- * we will append the time unit " s" " ms" or " us"
- * and we will present the unit in decimal
- */
- draw_y_as_time = FALSE;
- draw_y_as_load = FALSE;
- if (io->count_type == COUNT_TYPE_ADVANCED) {
- draw_y_as_time = TRUE;
- for (i=0; i<MAX_GRAPHS; i++) {
- int adv_type;
-
- if (!io->graphs[i].display) {
- continue;
- }
- if (io->graphs[i].calc_type == CALC_TYPE_LOAD) {
- draw_y_as_load = TRUE;
- }
-
- adv_type = proto_registrar_get_ftype(io->graphs[i].hf_index);
- switch (adv_type) {
- case FT_RELATIVE_TIME:
- switch (io->graphs[i].calc_type) {
- case CALC_TYPE_SUM:
- case CALC_TYPE_MAX:
- case CALC_TYPE_MIN:
- case CALC_TYPE_AVG:
- break;
- default:
- draw_y_as_time = FALSE;
- }
- break;
- default:
- draw_y_as_time = FALSE;
- }
- }
- }
-
- /*
- * Calculate size of borders surrounding the plot
- * The border on the right side needs to be adjusted depending
- * on the width of the text labels. For simplicity we assume that the
- * top y scale label will be the widest one
- */
- if (draw_y_as_time) {
- if (io->max_y_units == LOGARITHMIC_YSCALE) {
- print_time_scale_string(label_string, sizeof(label_string), 100000, 100000, TRUE); /* 100 ms */
- } else {
- print_time_scale_string(label_string, sizeof(label_string), max_y, max_y, FALSE);
- }
- } else {
- g_snprintf(label_string, sizeof(label_string), "%d", max_y);
- }
- layout = gtk_widget_create_pango_layout(io->draw_area, label_string);
- pango_layout_get_pixel_size(layout, &label_width, &label_height);
-
- io->left_x_border = 10;
- io->right_x_border = label_width + 20;
- top_y_border = 10;
- bottom_y_border = label_height + 20;
-
- /*
- * Calculate the size of the drawing area for the actual plot
- */
- draw_width = io->surface_width-io->right_x_border - io->left_x_border;
- draw_height = io->surface_height-top_y_border - bottom_y_border;
-
- /* Draw the y axis and labels
- * (we always draw the y scale with 11 ticks along the axis)
- */
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (io->surface);
-#else
- cr = gdk_cairo_create (io->pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr, io->surface_width-io->right_x_border+1.5, top_y_border + 0.5);
- cairo_line_to(cr, io->surface_width-io->right_x_border+1.5, io->surface_height-bottom_y_border + 0.5);
- cairo_stroke(cr);
- if (io->max_y_units == LOGARITHMIC_YSCALE) {
- tics = (int)log10((double)max_y);
- ystart = draw_height/10;
- ys = -1;
- } else {
- tics = 10;
- ystart = ys = 0;
- }
-
- for (i=ys; i<=tics; i++) {
- int xwidth, lwidth, ypos;
-
- xwidth = 5;
- if (io->max_y_units == LOGARITHMIC_YSCALE) {
- if (i == ys) {
- /* position for the 0 value */
- ypos = io->surface_height-bottom_y_border;
- } else if (i == tics) {
- /* position for the top value, do not draw logarithmic tics above graph */
- ypos = io->surface_height-bottom_y_border-draw_height;
- } else {
- int j;
- /* draw the logarithmic tics */
- for (j=2; j<10; j++) {
- ypos = (int)(io->surface_height
- - bottom_y_border
- - (draw_height - ystart) * (i + log10((double)j))/tics
- - ystart);
- /* draw the tick */
- cairo_move_to(cr, io->surface_width-io->right_x_border+1.5, ypos+0.5);
- cairo_line_to(cr, io->surface_width-io->right_x_border+1.5+xwidth,ypos+0.5);
- cairo_stroke(cr);
- }
- ypos = io->surface_height-bottom_y_border-(draw_height-ystart)*i/tics-ystart;
- }
- /* all "main" logarithmic lines are slightly longer */
- xwidth = 10;
- } else {
- if (!(i%5)) {
- /* first, middle and last tick are slightly longer */
- xwidth = 10;
- }
- ypos = io->surface_height-bottom_y_border-draw_height*i/10;
- }
- /* draw the tick */
- cairo_move_to(cr, io->surface_width-io->right_x_border+1.5, ypos+0.5);
- cairo_line_to(cr, io->surface_width-io->right_x_border+1.5+xwidth,ypos+0.5);
- cairo_stroke(cr);
- /* draw the labels */
- if (xwidth == 10) {
- guint32 value;
- if (io->max_y_units == LOGARITHMIC_YSCALE) {
- value = (guint32)(max_y / pow(10,tics-i));
- if (draw_y_as_time) {
- print_time_scale_string(label_string, sizeof(label_string), value, value, TRUE);
- } else if (draw_y_as_load) {
- g_snprintf(label_string, sizeof(label_string), "%d.%1d", value/1000, (value/100)%10);
- } else {
- g_snprintf(label_string, sizeof(label_string), "%d", value);
- }
- } else {
- value = (max_y/10)*i;
- if (draw_y_as_time) {
- print_time_scale_string(label_string, sizeof(label_string), value, max_y, FALSE);
- } else if (draw_y_as_load) {
- g_snprintf(label_string, sizeof(label_string), "%d.%1d", value/1000, (value/100)%10);
- } else {
- g_snprintf(label_string, sizeof(label_string), "%d", value);
- }
- }
-
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-
- cairo_move_to (cr, io->surface_width-io->right_x_border+15+label_width-lwidth, ypos-label_height/2);
- pango_cairo_show_layout (cr, layout);
-
- }
- }
-
- /* If we have not specified the last_interval via the GUI, just pick the current end of the
- * capture so that it scrolls nicely when doing live captures.
- */
- if (io->last_interval == 0xffffffff) {
- last_interval = io->max_interval;
- } else {
- last_interval = io->last_interval;
- }
-
- /*XXX*/
- /* plot the x-scale */
- cairo_move_to(cr, io->left_x_border+0.5, io->surface_height-bottom_y_border+1.5);
- cairo_line_to(cr, io->surface_width-io->right_x_border+1.5,io->surface_height-bottom_y_border+1.5);
- cairo_stroke(cr);
- if ((last_interval/io->interval) >= draw_width/io->pixels_per_tick) {
- first_interval = (last_interval/io->interval)-draw_width/io->pixels_per_tick+1;
- first_interval *= io->interval;
- } else {
- first_interval = 0;
- }
-
- interval_delta = (100/io->pixels_per_tick)*io->interval;
- for (current_interval = last_interval;
- current_interval >= (gint32)first_interval;
- current_interval = current_interval-io->interval) {
- int x, xlen;
-
- /* if pixels_per_tick is 1 or 2, only draw every 10 ticks */
- /* if pixels_per_tick is 5, only draw every 5 ticks */
- if (((io->pixels_per_tick < 5) && (current_interval % (10*io->interval))) ||
- ((io->pixels_per_tick == 5) && (current_interval % (5*io->interval)))) {
- continue;
- }
-
- if (!(current_interval%interval_delta)) {
- xlen = 10;
- } else if (!(current_interval%(interval_delta/2))) {
- xlen = 8;
- } else {
- xlen = 5;
- }
- x = draw_width+io->left_x_border-((last_interval-current_interval)/io->interval)*io->pixels_per_tick;
- cairo_move_to(cr, x-1-io->pixels_per_tick/2+0.5, io->surface_height-bottom_y_border+1.5);
- cairo_line_to(cr, x-1-io->pixels_per_tick/2+0.5, io->surface_height-bottom_y_border+xlen+1.5);
- cairo_stroke(cr);
- if (xlen == 10) {
- int lwidth, x_pos;
- print_interval_string (label_string, sizeof(label_string), current_interval, io, TRUE);
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-
- if ((x-1-io->pixels_per_tick/2-lwidth/2) < 5) {
- x_pos = 5;
- } else if ((x-1-io->pixels_per_tick/2+lwidth/2) > (io->surface_width-5)) {
- x_pos = io->surface_width-lwidth-5;
- } else {
- x_pos = x-1-io->pixels_per_tick/2-lwidth/2;
- }
- cairo_move_to (cr, x_pos, io->surface_height-bottom_y_border+15);
- pango_cairo_show_layout (cr, layout);
- }
-
- }
- cairo_destroy (cr);
- cr = NULL;
- g_object_unref(G_OBJECT(layout));
-
- /*
- * Loop over all graphs and draw them
- */
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (io->surface);
-#else
- cr = gdk_cairo_create (io->pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
-
- for (i=MAX_GRAPHS-1; i>=0; i--) {
- guint64 val;
- guint32 interval, x_pos, y_pos, prev_x_pos, prev_y_pos;
- /* Moving average variables */
- guint32 mavg_in_average_count = 0, mavg_left = 0, mavg_right = 0;
- guint64 mavg_cumulated = 0;
- guint64 mavg_to_remove = 0, mavg_to_add = 0;
-
- if (!io->graphs[i].display) {
- continue;
- }
-
- if ((io->graphs[i].follow_smooth == GRAPH_FOLLOWFILTER) &&
- (io->filter_type == MOVING_AVERAGE_FILTER)) {
- /* "Warm-up phase" - calculate average on some data not displayed;
- just to make sure average on leftmost and rightmost displayed
- values is as reliable as possible
- */
- guint64 warmup_interval;
-
- if (first_interval/io->interval > io->filter_order/2) {
- warmup_interval = first_interval/io->interval - io->filter_order/2;
- warmup_interval *= io->interval;
- } else {
- warmup_interval = 0;
- }
- mavg_to_remove = warmup_interval;
- for (; warmup_interval < first_interval; warmup_interval += io->interval) {
- mavg_cumulated += get_it_value(io, i, (int)warmup_interval/io->interval);
- mavg_in_average_count++;
- mavg_left++;
- }
- mavg_cumulated += get_it_value(io, i, (int)warmup_interval/io->interval);
- mavg_in_average_count++;
- for (warmup_interval += io->interval;
- ((warmup_interval < (first_interval + (io->filter_order/2) * (guint64)io->interval)) &&
- (warmup_interval <= (io->num_items * (guint64)io->interval)));
- warmup_interval += io->interval) {
-
- mavg_cumulated += get_it_value(io, i, (int)warmup_interval / io->interval);
- mavg_in_average_count++;
- mavg_right++;
- }
- mavg_to_add = warmup_interval;
- }
-
- /* initialize prev x/y to the value of the first interval */
- prev_x_pos = draw_width-1 -
- io->pixels_per_tick * ((last_interval - first_interval) / io->interval) +
- io->left_x_border;
- val = get_it_value(io, i, first_interval / io->interval);
-
- if ((io->graphs[i].follow_smooth == GRAPH_FOLLOWFILTER) &&
- (io->filter_type == MOVING_AVERAGE_FILTER) &&
- (mavg_in_average_count > 0)) {
- val = mavg_cumulated / mavg_in_average_count;
- }
-
- if (val>max_y) {
- prev_y_pos = 0;
- } else if (io->max_y_units == LOGARITHMIC_YSCALE) {
- if (val == 0) {
- prev_y_pos = (guint32)(draw_height - 1 + top_y_border);
- } else {
- prev_y_pos = (guint32) (
- (draw_height - ystart)-1 -
- ((log10((double)((gint64)val)) * (draw_height - ystart)) / log10((double)max_y)) +
- top_y_border
- );
- }
- } else {
- prev_y_pos = (guint32)(draw_height-1-(val*draw_height)/max_y+top_y_border);
- }
-
- for (interval = first_interval;
- interval < last_interval;
- interval += io->interval) {
- x_pos = draw_width-1-io->pixels_per_tick*((last_interval-interval)/io->interval)+io->left_x_border;
-
- val = get_it_value(io, i, interval/io->interval);
- /* Moving average calculation */
- if ((io->graphs[i].follow_smooth == GRAPH_FOLLOWFILTER) &&
- (io->filter_type == MOVING_AVERAGE_FILTER)) {
- if (interval != first_interval) {
- mavg_left++;
- if (mavg_left > io->filter_order/2) {
- mavg_left--;
- mavg_in_average_count--;
- mavg_cumulated -= get_it_value(io, i, (int)mavg_to_remove/io->interval);
- mavg_to_remove += io->interval;
- }
- if (mavg_to_add<=(guint64)io->num_items*io->interval) {
- mavg_in_average_count++;
- mavg_cumulated += get_it_value(io, i, (int)mavg_to_add/io->interval);
- mavg_to_add += io->interval;
- } else {
- mavg_right--;
- }
- }
- if (mavg_in_average_count > 0) {
- val = mavg_cumulated / mavg_in_average_count;
- }
- }
-
- if (val>max_y) {
- y_pos = 0;
- } else if (io->max_y_units == LOGARITHMIC_YSCALE) {
- if (val == 0) {
- y_pos = (guint32)(draw_height-1+top_y_border);
- } else {
- y_pos = (guint32) (
- (draw_height - ystart) - 1 -
- (log10((double)(gint64)val) * (draw_height - ystart)) / log10((double)max_y) +
- top_y_border
- );
- }
- } else {
- y_pos = (guint32)(draw_height - 1 -
- ((val * draw_height) / max_y) +
- top_y_border);
- }
-
- switch (io->graphs[i].plot_style) {
- case PLOT_STYLE_LINE:
- /* Don't draw anything if the segment entirely above the top of the graph
- */
- if ( (prev_y_pos != 0) || (y_pos != 0) ) {
- cairo_move_to(cr, prev_x_pos+0.5, prev_y_pos+0.5);
- cairo_line_to(cr, x_pos+0.5, y_pos+0.5);
- gdk_cairo_set_source_rgba (cr, &io->graphs[i].rgba_color);
- cairo_stroke(cr);
- }
- break;
- case PLOT_STYLE_IMPULSE:
- if (val) {
- cairo_move_to(cr, x_pos+0.5, draw_height-1+top_y_border+0.5);
- cairo_line_to(cr, x_pos+0.5, y_pos+0.5);
- gdk_cairo_set_source_rgba (cr, &io->graphs[i].rgba_color);
- cairo_stroke(cr);
- }
- break;
- case PLOT_STYLE_FILLED_BAR:
- if (val) {
- cairo_rectangle (cr,
- x_pos-(gdouble)io->pixels_per_tick/2+0.5,
- y_pos+0.5,
- io->pixels_per_tick,
- draw_height-1+top_y_border-y_pos);
- gdk_cairo_set_source_rgba (cr, &io->graphs[i].rgba_color);
- cairo_fill (cr);
- }
- break;
- case PLOT_STYLE_DOT:
- if (val) {
- cairo_arc (cr,
- x_pos+0.5,
- y_pos+0.5,
- (gdouble)io->pixels_per_tick/2,
- 0,
- 2 * G_PI);
- gdk_cairo_set_source_rgba (cr, &io->graphs[i].rgba_color);
- cairo_fill (cr);
- }
- break;
- }
-
- prev_y_pos = y_pos;
- prev_x_pos = x_pos;
- }
- }
- cairo_destroy (cr);
-
- cr = gdk_cairo_create (gtk_widget_get_window(io->draw_area));
-
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, io->surface, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, io->pixmap, 0, 0);
-#endif
- cairo_rectangle (cr, 0, 0, io->surface_width, io->surface_height);
- cairo_fill (cr);
-
- cairo_destroy (cr);
-
- /* update the scrollbar */
- if (io->max_interval == 0) {
- gtk_adjustment_set_upper(io->scrollbar_adjustment, (gdouble) io->interval);
- gtk_adjustment_set_step_increment(io->scrollbar_adjustment, (gdouble) (io->interval/10));
- gtk_adjustment_set_page_increment(io->scrollbar_adjustment, (gdouble) io->interval);
- } else {
- gtk_adjustment_set_upper(io->scrollbar_adjustment, (gdouble) io->max_interval);
- gtk_adjustment_set_step_increment(io->scrollbar_adjustment, (gdouble) ((last_interval-first_interval)/10));
- gtk_adjustment_set_page_increment(io->scrollbar_adjustment, (gdouble) (last_interval-first_interval));
- }
- gtk_adjustment_set_page_size(io->scrollbar_adjustment, gtk_adjustment_get_page_increment(io->scrollbar_adjustment));
- gtk_adjustment_set_value(io->scrollbar_adjustment, (gdouble)first_interval);
- gtk_adjustment_changed(io->scrollbar_adjustment);
- gtk_adjustment_value_changed(io->scrollbar_adjustment);
-
-}
-
-static void
-io_stat_redraw(io_stat_t *io)
-{
- io->needs_redraw = TRUE;
- io_stat_draw(io);
-}
-
-static void
-tap_iostat_draw(void *g)
-{
- io_stat_graph_t *git = (io_stat_graph_t *)g;
-
- io_stat_draw(git->io);
-}
-
-/* ok we get called with both the filter and the field.
- make sure the field is part of the filter.
- (make sure and just append it)
- the field MUST be part of the filter or else we won't
- be able to pick up the field values after the edt tree has been
- pruned
-*/
-static GString *
-enable_graph(io_stat_graph_t *gio, const char *filter, const char *field)
-{
- GString *real_filter = NULL;
- GString *err_msg;
-
- gio->display = TRUE;
-
- if (filter) {
- /* skip all whitespaces */
- while (*filter) {
- if (*filter == ' ') {
- filter++;
- continue;
- }
- if (*filter == '\t') {
- filter++;
- continue;
- }
- break;
- }
- if (*filter) {
- real_filter = g_string_new("");
- g_string_printf(real_filter, "(%s)", filter);
- }
- }
- if (field) {
- /* skip all whitespaces */
- while (*field) {
- if (*field == ' ') {
- field++;
- continue;
- }
- if (*field == '\t') {
- field++;
- continue;
- }
- break;
- }
- if (*field) {
- if (real_filter) {
- g_string_append_printf(real_filter, " && (%s)", field);
- } else {
- real_filter = g_string_new(field);
- }
- }
- }
- err_msg = register_tap_listener("frame", gio, real_filter ? real_filter->str : NULL,
- TL_REQUIRES_PROTO_TREE, tap_iostat_reset, tap_iostat_packet,
- tap_iostat_draw);
- if (real_filter)
- g_string_free(real_filter, TRUE);
- return err_msg;
-}
-
-static void
-disable_graph(io_stat_graph_t *gio)
-{
- if (gio->display) {
- gio->display = FALSE;
- remove_tap_listener(gio);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gio->display_button),
- FALSE);
- }
-}
-
-static void
-iostat_init(const char *opt_arg _U_, void* userdata _U_)
-{
- io_stat_t *io;
- int i = 0;
- static GdkColor col[MAX_GRAPHS] = {
- {0, 0x0000, 0x0000, 0x0000}, /* Black */
- {0, 0xffff, 0x0000, 0x0000}, /* Red */
- {0, 0x0000, 0xffff, 0x0000}, /* Green */
- {0, 0x0000, 0x0000, 0xffff}, /* Blue */
- {0, 0xffff, 0x5000, 0xffff} /* Light brilliant magenta */
- };
-
- static GdkRGBA rgba_col[MAX_GRAPHS] = {
- {0.0, 0.0, 0.0, 1.0}, /* Black */
- {1.0, 0.0, 0.1, 1.0}, /* Red */
- {0.0, 1.0, 0.0, 1.0}, /* Green */
- {0.0, 0.0, 1.0, 1.0}, /* Blue */
- {1.0, 0.314, 1.0, 1.0} /* Light brilliant magenta */
- };
-
- GString *error_string;
-
- io = g_new(io_stat_t,1);
- io->needs_redraw = TRUE;
- io->interval = tick_interval_values[DEFAULT_TICK_VALUE_INDEX];
- io->window = NULL;
- io->draw_area = NULL;
-#if GTK_CHECK_VERSION(2,22,0)
- io->surface = NULL;
-#else
- io->pixmap = NULL;
-#endif
- io->scrollbar = NULL;
- io->scrollbar_adjustment = NULL;
- io->surface_width = 500;
- io->surface_height = 200;
- io->pixels_per_tick = pixels_per_tick[DEFAULT_PIXELS_PER_TICK_INDEX];
- io->max_y_units = AUTO_MAX_YSCALE;
- io->count_type = 0;
- io->last_interval = 0xffffffff;
- io->max_interval = 0;
- io->num_items = 0;
- io->space_items = 0;
- io->left_x_border = 0;
- io->right_x_border = 500;
- io->view_as_time = FALSE;
- io->start_time.secs = 0;
- io->start_time.nsecs = 0;
- io->filter_type = NO_FILTER;
-
- for (i=0; i<MAX_GRAPHS; i++) {
- io->graphs[i].plot_style = DEFAULT_PLOT_STYLE;
- io->graphs[i].color.pixel = col[i].pixel;
- io->graphs[i].color.red = col[i].red;
- io->graphs[i].color.green = col[i].green;
- io->graphs[i].color.blue = col[i].blue;
- io->graphs[i].rgba_color.red = rgba_col[i].red;
- io->graphs[i].rgba_color.green = rgba_col[i].green;
- io->graphs[i].rgba_color.blue = rgba_col[i].blue;
- io->graphs[i].rgba_color.alpha = rgba_col[i].alpha;
- io->graphs[i].display = 0;
- io->graphs[i].display_button = NULL;
- io->graphs[i].filter_field = NULL;
- io->graphs[i].advanced_buttons = NULL;
- io->graphs[i].io = io;
-
- io->graphs[i].args = g_new(construct_args_t,1);
- io->graphs[i].args->title = NULL;
- io->graphs[i].args->wants_apply_button = TRUE;
- io->graphs[i].args->activate_on_ok = TRUE;
- io->graphs[i].args->modal_and_transient = FALSE;
-
- io->graphs[i].filter_bt = NULL;
-
- io->graphs[i].follow_smooth = GRAPH_FOLLOWFILTER;
- }
- io_stat_reset(io);
-
- error_string = enable_graph(&io->graphs[0], NULL, NULL);
- /* Can't attach io_stat tap ! */
- g_assert(error_string == NULL);
-#if 0
- if (error_string) {
-
- fprintf(stderr, "wireshark: Can't attach io_stat tap: %s\n",
- error_string->str);
- g_string_free(error_string, TRUE);
- io->graphs[0].display = 0;
- io->graphs[0].display_button = NULL;
- io->graphs[0].filter_field = NULL;
- io->graphs[0].advanced_buttons = NULL;
- exit(10);
- }
-#endif
- /* build the GUI */
- init_io_stat_window(io);
-
- cf_retap_packets(&cfile);
- gdk_window_raise(gtk_widget_get_window(io->window));
- io_stat_redraw(io);
-}
-
-static void
-draw_area_destroy_cb(GtkWidget *widget _U_, gpointer user_data)
-{
- io_stat_t *io = (io_stat_t *)user_data;
- int i;
- GtkWidget *save_bt = (GtkWidget *)g_object_get_data(G_OBJECT(io->window), "save_bt");
- surface_info_t *surface_info = (surface_info_t *)g_object_get_data(G_OBJECT(save_bt), "surface-info");
-
- g_free(surface_info);
-
- for (i=0; i<MAX_GRAPHS; i++) {
- if (io->graphs[i].display) {
- remove_tap_listener(&io->graphs[i]);
-
- g_free( (gpointer) (io->graphs[i].args->title) );
- io->graphs[i].args->title = NULL;
-
- g_free(io->graphs[i].args);
- io->graphs[i].args = NULL;
- }
- g_free(io->graphs[i].items);
- }
- g_free(io);
-
- return;
-}
-
-static gboolean
-pixmap_clicked_event(GtkWidget *widget _U_, GdkEventButton *event, gpointer g)
-{
- io_stat_t *io = (io_stat_t *)g;
- io_stat_graph_t *graph;
- io_graph_item_t *it;
- guint32 draw_width, interval, last_interval;
- guint32 frame_num = 0;
- int i;
- gboolean load = FALSE, outstanding_call = FALSE;
-
- draw_width = io->surface_width - io->right_x_border - io->left_x_border;
-
- if ((event->x <= (draw_width + io->left_x_border + 1 - (draw_width/io->pixels_per_tick)*io->pixels_per_tick)) ||
- (event->x >= (draw_width + io->left_x_border - io->pixels_per_tick/2))) {
- /* Outside draw area */
- return FALSE;
- }
-
- /*
- * An interval in the IO Graph drawing area has been clicked. If left-clicked (button 1), the frame
- * with the first response in that interval or if left-clicked (button 3) the last is highlighted.
- */
-#if GTK_CHECK_VERSION(2,22,0)
- if (((event->button == 1) || (event->button == 3)) && (io->surface != NULL))
-#else
- if (((event->button == 1) || (event->button == 3)) && (io->pixmap != NULL))
-#endif
- {
- if (io->last_interval == 0xffffffff)
- last_interval = io->max_interval;
- else
- last_interval = io->last_interval;
-
- /* Get the interval that was clicked */
- if ((last_interval / io->interval) <
- ((draw_width + io->left_x_border - event->x -
- io->pixels_per_tick / 2 - 1) / io->pixels_per_tick)) {
- interval = 0;
- }
- else {
- interval = (guint32) (
- (last_interval / io->interval) -
- ((draw_width + io->left_x_border - event->x -
- io->pixels_per_tick / 2 - 1) / io->pixels_per_tick));
- }
-
- /* Determine the lowest or highest frame number depending on whether button 1 or 3 was clicked,
- * respectively, among the up to 5 currently displayed graphs. */
- for (i=0; i<MAX_GRAPHS; i++) {
- graph = &io->graphs[i];
- if (graph->display) {
- it = &graph->items[interval];
- if (event->button == 1) {
- if ((frame_num == 0) || (it->first_frame_in_invl < frame_num))
- frame_num = it->first_frame_in_invl;
- } else {
- if (it->last_frame_in_invl > frame_num)
- frame_num = it->last_frame_in_invl;
- }
- if (graph->calc_type == CALC_TYPE_LOAD) {
- load = TRUE;
- if (it->time_tot.secs + it->time_tot.nsecs > 0)
- outstanding_call = TRUE;
- }
- }
- }
-
- /* XXX - If the frame numbers of *calls* can somehow be determined, the first call or
- * response, whichever is first, and the last call or response, whichever is last,
- * could be highlighted. */
- if ((frame_num == 0) && load && outstanding_call) {
- statusbar_push_temporary_msg(
- "There is no response but at least one call is outstanding in this interval.");
- return FALSE;
- }
-
- if (frame_num != 0)
- cf_goto_frame(&cfile, frame_num);
- }
- return TRUE;
-}
-
-/* create a new backing pixmap of the appropriate size */
-static gboolean
-draw_area_configure_event(GtkWidget *widget, GdkEventConfigure *event _U_, gpointer user_data)
-{
- io_stat_t *io = (io_stat_t *)user_data;
- GtkWidget *save_bt;
- GtkAllocation widget_alloc;
- cairo_t *cr;
-#if GTK_CHECK_VERSION(2,22,0)
- surface_info_t *surface_info = g_new(surface_info_t, 1);
-#endif
-
-#if GTK_CHECK_VERSION(2,22,0)
- if (io->surface) {
- cairo_surface_destroy (io->surface);
- io->surface = NULL;
- }
-#else
- if (io->pixmap) {
- g_object_unref(io->pixmap);
- io->pixmap = NULL;
- }
-#endif
-
- gtk_widget_get_allocation(widget, &widget_alloc);
-#if GTK_CHECK_VERSION(2,22,0)
- io->surface = gdk_window_create_similar_surface (gtk_widget_get_window(widget),
- CAIRO_CONTENT_COLOR,
- widget_alloc.width,
- widget_alloc.height);
-
-#else
- io->pixmap = gdk_pixmap_new(gtk_widget_get_window(widget),
- widget_alloc.width,
- widget_alloc.height,
- -1);
-#endif
- io->surface_width = widget_alloc.width;
- io->surface_height = widget_alloc.height;
-
- save_bt = (GtkWidget *)g_object_get_data(G_OBJECT(io->window), "save_bt");
-#if GTK_CHECK_VERSION(2,22,0)
- surface_info->surface = io->surface;
- surface_info->width = widget_alloc.width;
- surface_info->height = widget_alloc.height;
- g_object_set_data(G_OBJECT(save_bt), "surface-info", surface_info);
- gtk_widget_set_sensitive(save_bt, TRUE);
-
- cr = cairo_create (io->surface);
-#else
- g_object_set_data(G_OBJECT(save_bt), "pixmap", io->pixmap);
- gtk_widget_set_sensitive(save_bt, TRUE);
-
- cr = gdk_cairo_create (io->pixmap);
-#endif
- cairo_rectangle (cr, 0, 0, widget_alloc.width, widget_alloc.height);
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_fill (cr);
- cairo_destroy (cr);
-
- io_stat_redraw(io);
- return TRUE;
-}
-
-static void
-scrollbar_changed(GtkWidget *widget _U_, gpointer user_data)
-{
- io_stat_t *io = (io_stat_t *)user_data;
- guint32 mi;
-
- mi = (guint32) (gtk_adjustment_get_value(io->scrollbar_adjustment)
- + gtk_adjustment_get_page_size(io->scrollbar_adjustment));
-
- if (io->last_interval == mi) {
- return;
- }
-
- io->last_interval = (mi/io->interval) * io->interval;
- io_stat_redraw(io);
- return;
-}
-#if GTK_CHECK_VERSION(3,0,0)
-static gboolean
-draw_area_draw(GtkWidget *widget, cairo_t *cr, gpointer user_data)
-{
- io_stat_t *io = (io_stat_t *)user_data;
- GtkAllocation allocation;
-
- gtk_widget_get_allocation (widget, &allocation);
- cairo_set_source_surface (cr, io->surface, 0, 0);
- cairo_rectangle (cr, 0, 0, allocation.width, allocation.width);
- cairo_fill (cr);
-
- return FALSE;
-}
-#else
-/* redraw the screen from the backing pixmap */
-static gboolean
-draw_area_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer user_data)
-{
- io_stat_t *io = (io_stat_t *)user_data;
- cairo_t *cr = gdk_cairo_create (gtk_widget_get_window(widget));
-
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, io->surface, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, io->pixmap, 0, 0);
-#endif
- cairo_rectangle (cr, event->area.x, event->area.y, event->area.width, event->area.height);
- cairo_fill (cr);
-
- cairo_destroy (cr);
-
- return FALSE;
-}
-#endif
-static void
-create_draw_area(io_stat_t *io, GtkWidget *box)
-{
- io->draw_area = gtk_drawing_area_new();
- g_signal_connect(io->draw_area, "destroy", G_CALLBACK(draw_area_destroy_cb), io);
-
- gtk_widget_set_size_request(io->draw_area, io->surface_width, io->surface_height);
-
- /* signals needed to handle backing pixmap */
-#if GTK_CHECK_VERSION(3,0,0)
- g_signal_connect(io->draw_area, "draw", G_CALLBACK(draw_area_draw), io);
-#else
- g_signal_connect(io->draw_area, "expose-event", G_CALLBACK(draw_area_expose_event), io);
-#endif
- g_signal_connect(io->draw_area, "configure-event", G_CALLBACK(draw_area_configure_event), io);
- gtk_widget_add_events (io->draw_area, GDK_BUTTON_PRESS_MASK);
- g_signal_connect(io->draw_area, "button-press-event", G_CALLBACK(pixmap_clicked_event), io);
-
- gtk_widget_show(io->draw_area);
- gtk_box_pack_start(GTK_BOX(box), io->draw_area, TRUE, TRUE, 0);
-
- /* create the associated scrollbar */
- io->scrollbar_adjustment = (GtkAdjustment *)gtk_adjustment_new(0,0,0,0,0,0);
- io->scrollbar = gtk_scrollbar_new(GTK_ORIENTATION_HORIZONTAL, io->scrollbar_adjustment);
- gtk_widget_show(io->scrollbar);
- gtk_box_pack_start(GTK_BOX(box), io->scrollbar, FALSE, FALSE, 0);
- g_signal_connect(io->scrollbar_adjustment, "value-changed", G_CALLBACK(scrollbar_changed), io);
-}
-
-static void
-tick_interval_select(GtkWidget *item, gpointer user_data)
-{
- io_stat_t *io = (io_stat_t *)user_data;
- int i;
-
- i = gtk_combo_box_get_active (GTK_COMBO_BOX(item));
-
- io->interval = tick_interval_values[i];
- cf_retap_packets(&cfile);
- gdk_window_raise(gtk_widget_get_window(io->window));
- io_stat_redraw(io);
-}
-
-static void
-pixels_per_tick_select(GtkWidget *item, gpointer user_data)
-{
- io_stat_t *io = (io_stat_t *)user_data;
- int i;
-
- i = gtk_combo_box_get_active (GTK_COMBO_BOX(item));
- io->pixels_per_tick = pixels_per_tick[i];
- io_stat_redraw(io);
-}
-
-static void
-plot_style_select(GtkWidget *item, gpointer user_data)
-{
- io_stat_graph_t *ppt = (io_stat_graph_t *)user_data;
- int val;
-
- val = gtk_combo_box_get_active (GTK_COMBO_BOX(item));
-
- ppt->plot_style = val;
-
- io_stat_redraw(ppt->io);
-}
-
-static GtkWidget *
-create_pixels_per_tick_menu_items(io_stat_t *io)
-{
- char str[5];
- GtkWidget *combo_box;
- int i;
-
- combo_box = gtk_combo_box_text_new ();
-
- for (i=0; i<MAX_PIXELS_PER_TICK; i++) {
- g_snprintf(str, sizeof(str), "%u", pixels_per_tick[i]);
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), str);
- }
- gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), DEFAULT_PIXELS_PER_TICK_INDEX);
- g_signal_connect(combo_box, "changed", G_CALLBACK(pixels_per_tick_select), io);
-
- return combo_box;
-}
-
-static void
-yscale_select(GtkWidget *item, gpointer user_data)
-{
- io_stat_t *io = (io_stat_t *)user_data;
- int i;
-
- i = gtk_combo_box_get_active (GTK_COMBO_BOX(item));
-
- io->max_y_units = yscale_max[i];
- io_stat_redraw(io);
-}
-
-static void
-filter_select(GtkWidget *item, gpointer user_data)
-{
- io_stat_t *io = (io_stat_t *)user_data;
- int i;
-
- i = gtk_combo_box_get_active (GTK_COMBO_BOX(item));
-
- if (i == NO_FILTER_ORDER) {
- io->filter_type = NO_FILTER;
- } else {
- io->filter_type = MOVING_AVERAGE_FILTER;
- io->filter_order = moving_average_orders[i];
- }
- io_stat_redraw(io);
-}
-
-static GtkWidget *
-create_tick_interval_menu_items(io_stat_t *io)
-{
- GtkWidget *combo_box;
- char str[15];
- int i;
-
- combo_box = gtk_combo_box_text_new ();
-
- for (i=0; i<MAX_TICK_VALUES; i++) {
- if (tick_interval_values[i] >= 60000) {
- g_snprintf(str, sizeof(str), "%u min", tick_interval_values[i]/60000);
- } else if (tick_interval_values[i] >= 1000) {
- g_snprintf(str, sizeof(str), "%u sec", tick_interval_values[i]/1000);
- } else if (tick_interval_values[i] >= 100) {
- g_snprintf(str, sizeof(str), "0.%1u sec", (tick_interval_values[i]/100)%10);
- } else if (tick_interval_values[i] >= 10) {
- g_snprintf(str, sizeof(str), "0.%02u sec", (tick_interval_values[i]/10)%10);
- } else {
- g_snprintf(str, sizeof(str), "0.%03u sec", (tick_interval_values[i])%10);
- }
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), str);
- }
- gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), DEFAULT_TICK_VALUE_INDEX);
- g_signal_connect(combo_box, "changed", G_CALLBACK(tick_interval_select), io);
-
- return combo_box;
-}
-
-static GtkWidget *
-create_yscale_max_menu_items(io_stat_t *io)
-{
- char str[15];
- GtkWidget *combo_box;
- int i;
-
- combo_box = gtk_combo_box_text_new ();
- for (i=0; i<MAX_YSCALE; i++) {
- if (yscale_max[i] == LOGARITHMIC_YSCALE) {
- g_strlcpy(str, "Logarithmic", sizeof(str));
- } else if (yscale_max[i] == AUTO_MAX_YSCALE) {
- g_strlcpy(str, "Auto", sizeof(str));
- } else {
- g_snprintf(str, sizeof(str), "%u", yscale_max[i]);
- }
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), str);
- }
- gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), DEFAULT_YSCALE_INDEX);
- g_signal_connect(combo_box, "changed", G_CALLBACK(yscale_select), io);
- return combo_box;
-}
-
-static GtkWidget *
-create_filter_menu_items(io_stat_t *io)
-{
- char str[15];
- GtkWidget *combo_box;
- int i;
-
- combo_box = gtk_combo_box_text_new ();
-
- for (i=0; i<MAX_MOVING_AVERAGE_ORDER; i++) {
- if (i == NO_FILTER_ORDER) {
- g_strlcpy(str, "No filter", sizeof(str));
- } else {
- g_snprintf(str, sizeof(str), "M.avg %u", moving_average_orders[i]);
- }
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), str);
- }
- gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), 0);
- g_signal_connect(combo_box, "changed", G_CALLBACK(filter_select), io);
- return combo_box;
-}
-
-static void
-count_type_select(GtkWidget *item, gpointer user_data)
-{
- io_stat_t *io = (io_stat_t *)user_data;
- int i;
- GtkAllocation widget_alloc;
- static gboolean advanced_visible = FALSE;
-
- io->count_type = gtk_combo_box_get_active (GTK_COMBO_BOX(item));
-
- if (io->count_type == COUNT_TYPE_ADVANCED) {
- for (i=0; i<MAX_GRAPHS; i++) {
- disable_graph(&io->graphs[i]);
- gtk_widget_show(io->graphs[i].advanced_buttons);
- /* redraw the entire window so the unhidden widgets show up, hopefully */
- gtk_widget_get_allocation(io->window, &widget_alloc);
- gtk_widget_queue_draw_area(io->window,
- 0,
- 0,
- widget_alloc.width,
- widget_alloc.height);
- }
- advanced_visible = TRUE;
- io_stat_redraw(io);
- } else if (advanced_visible) {
- for (i=0; i<MAX_GRAPHS; i++) {
- gtk_widget_hide(io->graphs[i].advanced_buttons);
- filter_callback(item, &io->graphs[i]);
- }
- advanced_visible = FALSE;
- } else {
- io_stat_redraw(io);
- }
-}
-
-static GtkWidget *
-create_frames_or_bytes_menu_items(io_stat_t *io)
-{
- GtkWidget *combo_box;
- int i;
-
- combo_box = gtk_combo_box_text_new ();
-
- for (i=0; i<MAX_COUNT_TYPES; i++) {
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), count_type_names[i]);
- }
- gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), DEFAULT_COUNT_TYPE);
- g_signal_connect(combo_box, "changed", G_CALLBACK(count_type_select), io);
- return combo_box;
-}
-
-static void
-create_ctrl_menu(io_stat_t *io, GtkWidget *box, const char *name, GtkWidget * (*func)(io_stat_t *io))
-{
- GtkWidget *hbox;
- GtkWidget *label;
- GtkWidget *combo_box;
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0);
- gtk_widget_show(hbox);
-
- label = gtk_label_new(name);
- gtk_widget_show(label);
- gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-
- combo_box = (*func)(io);
- gtk_box_pack_end(GTK_BOX(hbox), combo_box, FALSE, FALSE, 0);
- gtk_widget_show(combo_box);
-}
-
-static void
-view_as_time_toggle_dest(GtkWidget *widget _U_, gpointer user_data)
-{
- io_stat_t *io = (io_stat_t *)user_data;
-
- io->view_as_time = io->view_as_time ? FALSE : TRUE;
-
- io_stat_redraw(io);
-}
-
-static void
-create_ctrl_area(io_stat_t *io, GtkWidget *box)
-{
- GtkWidget *frame_vbox;
- GtkWidget *frame;
- GtkWidget *vbox;
- GtkWidget *view_cb;
-
- frame_vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(box), frame_vbox, FALSE, FALSE, 0);
- gtk_widget_show(frame_vbox);
-
- frame = gtk_frame_new("X Axis");
- gtk_container_add(GTK_CONTAINER(frame_vbox), frame);
- gtk_widget_show(frame);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(frame), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 3);
- gtk_widget_show(vbox);
-
- create_ctrl_menu(io, vbox, "Tick interval:", create_tick_interval_menu_items);
- create_ctrl_menu(io, vbox, "Pixels per tick:", create_pixels_per_tick_menu_items);
-
- view_cb = gtk_check_button_new_with_mnemonic("_View as time of day");
- gtk_container_add(GTK_CONTAINER(vbox), view_cb);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(view_cb), io->view_as_time);
- g_signal_connect(view_cb, "toggled", G_CALLBACK(view_as_time_toggle_dest), io);
- gtk_widget_show(view_cb);
-
- frame = gtk_frame_new("Y Axis");
- gtk_container_add(GTK_CONTAINER(frame_vbox), frame);
- gtk_widget_show(frame);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(frame), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 3);
- gtk_widget_show(vbox);
-
- create_ctrl_menu(io, vbox, "Unit:", create_frames_or_bytes_menu_items);
- create_ctrl_menu(io, vbox, "Scale:", create_yscale_max_menu_items);
- create_ctrl_menu(io, vbox, "Smooth:", create_filter_menu_items);
-
- return;
-}
-
-static void
-filter_callback(GtkWidget *widget, gpointer user_data)
-{
- io_stat_graph_t *gio = (io_stat_graph_t *)user_data;
- const char *filter;
- dfilter_t *dfilter;
- gchar *err_msg;
- const char *field_name = NULL;
-
- /* this graph is not active, just update display and redraw */
- if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gio->display_button))) {
- disable_graph(gio);
- io_stat_redraw(gio->io);
- return;
- }
-
- /* first check if the field string is valid */
- if (gio->io->count_type == COUNT_TYPE_ADVANCED) {
- GString *err_str;
- field_name = gtk_entry_get_text(GTK_ENTRY(gio->calc_field));
-
- err_str = check_field_unit(field_name, &gio->hf_index, CALC_TYPE_TO_ITEM_UNIT(gio->calc_type));
-
- if (err_str) {
- /* warn and bail out */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_str->str);
- g_string_free(err_str, TRUE);
- disable_graph(gio);
- io_stat_redraw(gio->io);
- return;
- }
- }
-
-
- /* first check if the filter string is valid. */
- filter = gtk_entry_get_text(GTK_ENTRY(gio->filter_field));
- if (!dfilter_compile(filter, &dfilter, &err_msg)) {
- bad_dfilter_alert_box(gtk_widget_get_toplevel(widget),
- filter, err_msg);
- g_free(err_msg);
- disable_graph(gio);
- io_stat_redraw(gio->io);
- return;
- }
- dfilter_free(dfilter);
-
- /* ok, we have a valid filter and the graph is active.
- first just try to delete any previous settings and then apply
- the new ones.
- */
- remove_tap_listener(gio);
-
- io_stat_reset(gio->io);
- enable_graph(gio, filter, field_name);
- cf_retap_packets(&cfile);
- gdk_window_raise(gtk_widget_get_window(gio->io->window));
- io_stat_redraw(gio->io);
-
- return;
-}
-
-static void
-calc_type_select(GtkWidget *item, gpointer user_data)
-{
- io_stat_graph_t *gio = (io_stat_graph_t *)user_data;
-
- gio->calc_type = gtk_combo_box_get_active (GTK_COMBO_BOX(item));
-
- /* disable the graph */
- disable_graph(gio);
- io_stat_redraw(gio->io);
-}
-
-static GtkWidget *
-create_calc_types_menu_items(io_stat_graph_t *gio)
-{
- GtkWidget *combo_box;
- int i;
-
- combo_box = gtk_combo_box_text_new ();
- for (i=0; i<MAX_CALC_TYPES; i++) {
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), calc_type_names[i]);
- }
- gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), DEFAULT_CALC_TYPE);
- g_signal_connect(combo_box, "changed", G_CALLBACK(calc_type_select), gio);
- return combo_box;
-}
-
-static void
-create_advanced_menu(io_stat_graph_t *gio, GtkWidget *box, const char *name, GtkWidget *(*func)(io_stat_graph_t *io))
-{
- GtkWidget *hbox;
- GtkWidget *label;
- GtkWidget *combo_box;
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0);
- gtk_widget_show(hbox);
-
- label = gtk_label_new(name);
- gtk_widget_show(label);
- gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-
- combo_box = (*func)(gio);
- gtk_box_pack_end(GTK_BOX(hbox), combo_box, FALSE, FALSE, 0);
- gtk_widget_show(combo_box);
-}
-
-static void
-create_advanced_field(io_stat_graph_t *gio, GtkWidget *box)
-{
- gio->calc_field = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(box), gio->calc_field, TRUE, TRUE, 0);
- gtk_widget_show(gio->calc_field);
- g_signal_connect(gio->calc_field, "activate", G_CALLBACK(filter_callback), gio);
- g_object_set_data (G_OBJECT(gio->calc_field), E_FILT_FIELD_NAME_ONLY_KEY, (gpointer)"");
- g_signal_connect(gio->calc_field, "changed", G_CALLBACK(filter_te_syntax_check_cb), NULL);
- g_object_set_data(G_OBJECT(box), E_FILT_AUTOCOMP_PTR_KEY, NULL);
- g_signal_connect(gio->calc_field, "key-press-event", G_CALLBACK (filter_string_te_key_pressed_cb), NULL);
- g_signal_connect(gio->io->window, "key-press-event", G_CALLBACK (filter_parent_dlg_key_pressed_cb), NULL);
- colorize_filter_te_as_empty(gio->calc_field);
-}
-
-static void
-create_advanced_box(io_stat_graph_t *gio, GtkWidget *box)
-{
- GtkWidget *hbox;
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gio->advanced_buttons = hbox;
- gtk_box_pack_start(GTK_BOX(box), hbox, TRUE, TRUE, 0);
- gtk_widget_hide(hbox);
-
- gio->calc_type = CALC_TYPE_SUM;
- create_advanced_menu(gio, hbox, "Calc:", create_calc_types_menu_items);
- create_advanced_field(gio, hbox);
-}
-
-static void
-filter_button_clicked(GtkWidget *w, gpointer user_data)
-{
- io_stat_graph_t *gio = (io_stat_graph_t *)user_data;
-
- display_filter_construct_cb(w, gio->args);
- return;
-}
-
-static void
-smooth_filter_toggled(GtkWidget *w, gpointer user_data)
-{
- io_stat_graph_t *gio = (io_stat_graph_t *)user_data;
-
- gio->follow_smooth =
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w));
- io_stat_redraw(gio->io);
-}
-
-static void
-create_filter_box(io_stat_graph_t *gio, GtkWidget *box, int num)
-{
- GtkWidget *combo_box;
- GtkWidget *hbox;
- GtkWidget *label;
- GtkWidget *smooth;
- char str[256];
- int i;
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0);
- gtk_widget_show(hbox);
-
- g_snprintf(str, sizeof(str), "Graph %d", num);
- gio->display_button = gtk_toggle_button_new_with_label(str);
- gtk_box_pack_start(GTK_BOX(hbox), gio->display_button, FALSE, FALSE, 0);
- gtk_widget_show(gio->display_button);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gio->display_button), gio->display);
- g_signal_connect(gio->display_button, "toggled", G_CALLBACK(filter_callback), gio);
-
- label = gtk_label_new("Color");
- gtk_widget_show(label);
- gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_override_color(label, (GtkStateFlags)GTK_STATE_FLAG_NORMAL, &gio->rgba_color);
- /* XXX gtk_widget_override_color() takes flags not state */
- gtk_widget_override_color(label, (GtkStateFlags)GTK_STATE_ACTIVE, &gio->rgba_color);
- gtk_widget_override_color(label, (GtkStateFlags)GTK_STATE_PRELIGHT, &gio->rgba_color);
- gtk_widget_override_color(label, (GtkStateFlags)GTK_STATE_SELECTED, &gio->rgba_color);
- gtk_widget_override_color(label, (GtkStateFlags)GTK_STATE_INSENSITIVE, &gio->rgba_color);
-#else
- gtk_widget_modify_fg(label, GTK_STATE_NORMAL, &gio->color);
- gtk_widget_modify_fg(label, GTK_STATE_ACTIVE, &gio->color);
- gtk_widget_modify_fg(label, GTK_STATE_PRELIGHT, &gio->color);
- gtk_widget_modify_fg(label, GTK_STATE_SELECTED, &gio->color);
- gtk_widget_modify_fg(label, GTK_STATE_INSENSITIVE, &gio->color);
-#endif
-/* g_signal_connect(gio->display_button, "toggled", G_CALLBACK(filter_callback), gio);*/
-
-
- /* filter prefs dialog */
- gio->filter_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_DISPLAY_FILTER_ENTRY);
-
- g_snprintf(str, sizeof(str), "Wireshark: Display Filter IO-Stat (Filter:%d)", num);
- g_free( (gpointer) (gio->args->title) );
- gio->args->title = g_strdup(str);
-
- g_signal_connect(gio->filter_bt, "clicked", G_CALLBACK(filter_button_clicked), gio);
- g_signal_connect(gio->filter_bt, "destroy", G_CALLBACK(filter_button_destroy_cb), NULL);
-
- gtk_box_pack_start(GTK_BOX(hbox), gio->filter_bt, FALSE, TRUE, 0);
- gtk_widget_show(gio->filter_bt);
-
- gio->filter_field = gtk_entry_new();
- /* filter prefs dialog */
- g_object_set_data(G_OBJECT(gio->filter_bt), E_FILT_TE_PTR_KEY, gio->filter_field);
- /* filter prefs dialog */
-
- gtk_box_pack_start(GTK_BOX(hbox), gio->filter_field, TRUE, TRUE, 0);
- gtk_widget_show(gio->filter_field);
- g_signal_connect(gio->filter_field, "activate", G_CALLBACK(filter_callback), gio);
- g_signal_connect(gio->filter_field, "changed", G_CALLBACK(filter_te_syntax_check_cb), NULL);
- g_object_set_data(G_OBJECT(box), E_FILT_AUTOCOMP_PTR_KEY, NULL);
- g_signal_connect(gio->filter_field, "key-press-event", G_CALLBACK (filter_string_te_key_pressed_cb), NULL);
- g_signal_connect(gio->io->window, "key-press-event", G_CALLBACK (filter_parent_dlg_key_pressed_cb), NULL);
- colorize_filter_te_as_empty(gio->filter_field);
-
- create_advanced_box(gio, hbox);
-
- /*
- * create PlotStyle menu
- */
- g_snprintf(str, sizeof(str), " Style:");
- label = gtk_label_new(str);
- gtk_widget_show(label);
- gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-
- combo_box = gtk_combo_box_text_new ();
- for (i=0; i<MAX_PLOT_STYLES; i++) {
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), plot_style_name[i]);
- }
- gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), DEFAULT_PLOT_STYLE);
- g_signal_connect(combo_box, "changed", G_CALLBACK(plot_style_select), &gio->io->graphs[num-1]);
-
- gtk_box_pack_start(GTK_BOX(hbox), combo_box, FALSE, FALSE, 0);
- gtk_widget_show(combo_box);
-
- /*
- * Create smooth followfilter option
- */
- smooth = gtk_check_button_new_with_mnemonic("Smooth");
- gtk_widget_set_tooltip_text(smooth, "Only has effect if a smothing filter is set");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(smooth),
- gio->follow_smooth);
- g_signal_connect(smooth, "toggled", G_CALLBACK(smooth_filter_toggled),
- gio);
- gtk_widget_show(smooth);
- gtk_box_pack_end(GTK_BOX(hbox), smooth, FALSE, FALSE, 0);
-
- return;
-}
-
-static void
-create_filter_area(io_stat_t *io, GtkWidget *box)
-{
- GtkWidget *frame;
- GtkWidget *vbox;
- int i;
-
- frame = gtk_frame_new("Graphs");
- gtk_box_pack_start(GTK_BOX(box), frame, TRUE, TRUE, 0);
- gtk_widget_show(frame);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 1, FALSE);
- gtk_container_add(GTK_CONTAINER(frame), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 3);
- gtk_widget_show(vbox);
-
- for (i=0; i<MAX_GRAPHS; i++) {
- create_filter_box(&io->graphs[i], vbox, i+1);
- }
-
- return;
-}
-
-static void
-copy_as_csv_cb(GtkWindow *copy_bt _U_, gpointer user_data)
-{
- guint32 i, interval;
- guint64 val;
- char string[15];
- GtkClipboard *cb;
- GString *CSV_str = g_string_new("");
- io_stat_t *io = (io_stat_t *)user_data;
-
- g_string_append(CSV_str, "\"Interval start\"");
- for (i=0; i<MAX_GRAPHS; i++) {
- if (io->graphs[i].display) {
- g_string_append_printf(CSV_str, ",\"Graph %d\"", i+1);
- }
- }
- g_string_append(CSV_str,"\n");
-
- for (interval=0; interval<io->max_interval; interval+=io->interval) {
- print_interval_string (string, sizeof(string), interval, io, FALSE);
- g_string_append_printf(CSV_str, "\"%s\"", string);
- for (i=0; i<MAX_GRAPHS; i++) {
- if (io->graphs[i].display) {
- val = get_it_value(io, i, interval/io->interval);
- g_string_append_printf(CSV_str, ",\"%" G_GINT64_MODIFIER "d\"", val);
- }
- }
- g_string_append(CSV_str,"\n");
- }
-
- /* Now that we have the CSV data, copy it into the default clipboard */
- cb = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); /* Get the default clipboard */
- gtk_clipboard_set_text(cb, CSV_str->str, -1); /* Copy the CSV data into the clipboard */
- g_string_free(CSV_str, TRUE); /* Free the memory */
-}
-
-static void
-init_io_stat_window(io_stat_t *io)
-{
- GtkWidget *vbox;
- GtkWidget *hbox;
- GtkWidget *bbox;
- GtkWidget *close_bt, *help_bt;
- GtkWidget *copy_bt;
- GtkWidget *save_bt;
-
- /* create the main window, transient_for top_level */
- io->window = dlg_window_new("I/O Graphs");
- gtk_window_set_destroy_with_parent (GTK_WINDOW(io->window), TRUE);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(io->window), vbox);
- gtk_widget_show(vbox);
-
- create_draw_area(io, vbox);
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
- gtk_container_set_border_width(GTK_CONTAINER(hbox), 3);
- gtk_widget_show(hbox);
-
- create_filter_area(io, hbox);
- create_ctrl_area(io, hbox);
-
- io_stat_set_title(io);
-
- bbox = dlg_button_row_new(GTK_STOCK_CLOSE, GTK_STOCK_SAVE,
- GTK_STOCK_COPY, GTK_STOCK_HELP, NULL);
- gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
- gtk_widget_show(bbox);
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(io->window, close_bt, window_cancel_button_cb);
- gtk_widget_set_tooltip_text(close_bt, "Close this dialog");
- save_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_SAVE);
- gtk_widget_set_sensitive(save_bt, FALSE);
- gtk_widget_set_tooltip_text(save_bt, "Save the displayed graph to a file");
- g_signal_connect(save_bt, "clicked", G_CALLBACK(pixmap_save_cb), NULL);
- g_object_set_data(G_OBJECT(io->window), "save_bt", save_bt);
-
- copy_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_COPY);
- gtk_widget_set_tooltip_text(copy_bt,
- "Copy values from selected graphs to the clipboard in"
- " CSV (Comma Separated Values) format");
- g_signal_connect(copy_bt, "clicked", G_CALLBACK(copy_as_csv_cb), io);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_STATS_IO_GRAPH_DIALOG);
- gtk_widget_set_tooltip_text (help_bt, "Show topic specific help");
- g_signal_connect(io->window, "delete-event", G_CALLBACK(window_delete_event_cb), NULL);
-
- gtk_widget_show(io->window);
- window_present(io->window);
-}
-
-void
-gui_iostat_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- iostat_init(NULL,NULL);
-}
-
-static stat_tap_ui iostat_ui = {
- REGISTER_STAT_GROUP_GENERIC,
- NULL,
- "io,stat",
- iostat_init,
- 0,
- NULL
-};
-
-void
-register_tap_listener_gtk_iostat(void)
-{
- register_stat_tap_ui(&iostat_ui, NULL);
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/keys.h b/ui/gtk/keys.h
deleted file mode 100644
index 2b62543164..0000000000
--- a/ui/gtk/keys.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/* keys.h
- * Key definitions for various objects
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __KEYS_H__
-#define __KEYS_H__
-
-/** @file
- * Various keys for g_object_set_data().
- */
-#define E_DFILTER_CM_KEY "display_filter_combo"
-
-#define E_DFILTER_TE_KEY "display_filter_entry"
-#define E_RFILTER_TE_KEY "read_filter_te"
-#define E_MPACKET_LIST_KEY "menu_packet_list"
-#define E_MPACKET_LIST_ROW_KEY "menu_packet_list_row"
-#define E_MPACKET_LIST_COL_KEY "menu_packet_list_col"
-#define E_MPACKET_LIST_COLUMN_KEY "menu_packet_list_column"
-#define E_MPACKET_LIST_PREV_COLUMN_KEY "menu_packet_list_prev_column"
-#define E_MCAPTURE_COLUMNS_COL_KEY "menu_capture_columns_col"
-#define E_MCAPTURE_COLUMNS_COLUMN_KEY "menu_capture_columns_column"
-
-#define PRINT_CMD_LB_KEY "printer_command_label"
-#define PRINT_CMD_TE_KEY "printer_command_entry"
-#define PRINT_FILE_BT_KEY "printer_file_button"
-#define PRINT_FILE_TE_KEY "printer_file_entry"
-
-#define PLUGINS_DFILTER_TE "plugins_dfilter_te"
-
-#define PM_MENU_LIST_KEY "popup_menu_menu_list"
-#define PM_PACKET_LIST_COL_KEY "popup_menu_packet_list_column"
-#define PM_PACKET_LIST_KEY "popup_menu_packet_list"
-#define PM_TREE_VIEW_KEY "popup_menu_tree_view"
-#define PM_BYTES_VIEW_KEY "popup_menu_bytes_view"
-#define PM_STATUSBAR_PROFILES_KEY "popup_menu_statusbar_profiles"
-#define PM_COLUMNS_KEY "popup_menu_capture_options"
-
-#define E_TB_MAIN_KEY "toolbar_main"
-#define E_TB_FILTER_KEY "toolbar_filter"
-
-#ifdef HAVE_AIRPCAP
-#define AIRPCAP_TOOLBAR_KEY "airpcap_toolbar_key"
-#define AIRPCAP_TOOLBAR_INTERFACE_KEY "airpcap_toolbar_if_key"
-#define AIRPCAP_TOOLBAR_LINK_TYPE_KEY "airpcap_toolbar_lt_key"
-#define AIRPCAP_TOOLBAR_CHANNEL_KEY "airpcap_toolbar_ch_key"
-#define AIRPCAP_TOOLBAR_CHANNEL_LABEL_KEY "airpcap_toolbar_ch_lb_key"
-#define AIRPCAP_TOOLBAR_CHANNEL_OFFSET_KEY "airpcap_toolbar_ch_offset_key"
-#define AIRPCAP_TOOLBAR_CHANNEL_OFFSET_LABEL_KEY "airpcap_toolbar_ch_offset_lb_key"
-#define AIRPCAP_TOOLBAR_FCS_CHECK_KEY "airpcap_toolbar_fcs_check_key"
-#define AIRPCAP_TOOLBAR_FCS_FILTER_LABEL_KEY "airpcap_toolbar_fcs_filter_lb_key"
-#define AIRPCAP_TOOLBAR_FCS_FILTER_KEY "airpcap_toolbar_fcs_filter_key"
-#define AIRPCAP_TOOLBAR_ADVANCED_KEY "airpcap_toolbar_advanced_key"
-#define AIRPCAP_TOOLBAR_KEY_MANAGEMENT_KEY "airpcap_toolbar_key_management_key"
-#define AIRPCAP_TOOLBAR_DECRYPTION_KEY "airpcap_toolbar_decryption_key"
-#define AIRPCAP_TOOLBAR_DECRYPTION_LABEL_KEY "airpcap_toolbar_decryption_lb_key"
-
-#define AIRPCAP_ADVANCED_KEY "airpcap_advanced_key"
-#define AIRPCAP_ADVANCED_INTERFACE_KEY "airpcap_advanced_if_key"
-#define AIRPCAP_ADVANCED_LINK_TYPE_KEY "airpcap_advanced_lt_key"
-#define AIRPCAP_ADVANCED_CHANNEL_KEY "airpcap_advanced_ch_key"
-#define AIRPCAP_ADVANCED_CHANNEL_OFFSET_KEY "airpcap_advanced_ch_offset_key"
-#define AIRPCAP_ADVANCED_FCS_CHECK_KEY "airpcap_advanced_fcs_check_key"
-#define AIRPCAP_ADVANCED_FCS_FILTER_KEY "airpcap_advanced_fcs_filter_key"
-#define AIRPCAP_ADVANCED_BLINK_KEY "airpcap_advanced_blink_key"
-#define AIRPCAP_ADVANCED_ADD_KEY_TEXT_KEY "airpcap_advanced_add_key_text_key"
-#define AIRPCAP_ADVANCED_ADD_KEY_OK_KEY "airpcap_advanced_add_key_ok_key"
-#define AIRPCAP_ADVANCED_ADD_KEY_LIST_KEY "airpcap_advanced_add_key_list_key"
-#define AIRPCAP_ADVANCED_ADD_KEY_TYPE_KEY "airpcap_advanced_add_key_type_key"
-#define AIRPCAP_ADVANCED_ADD_KEY_KEY_KEY "airpcap_advanced_add_key_key_key"
-#define AIRPCAP_ADVANCED_ADD_KEY_SSID_KEY "airpcap_advanced_add_key_ssid_key"
-#define AIRPCAP_ADVANCED_ADD_KEY_KEY_LABEL_KEY "airpcap_advanced_add_key_key_label_key"
-#define AIRPCAP_ADVANCED_ADD_KEY_SSID_LABEL_KEY "airpcap_advanced_add_key_ssid_label_key"
-#define AIRPCAP_ADVANCED_EDIT_KEY_SELECTED_KEY "airpcap_advanced_edit_key_selected_key"
-#define AIRPCAP_ADVANCED_EDIT_KEY_OK_KEY "airpcap_advanced_edit_key_ok_key"
-#define AIRPCAP_ADVANCED_EDIT_KEY_LIST_KEY "airpcap_advanced_edit_key_list_key"
-#define AIRPCAP_ADVANCED_EDIT_KEY_TYPE_KEY "airpcap_advanced_edit_key_type_key"
-#define AIRPCAP_ADVANCED_EDIT_KEY_KEY_KEY "airpcap_advanced_edit_key_key_key"
-#define AIRPCAP_ADVANCED_EDIT_KEY_SSID_KEY "airpcap_advanced_edit_key_ssid_key"
-#define AIRPCAP_ADVANCED_EDIT_KEY_KEY_LABEL_KEY "airpcap_advanced_edit_key_key_label_key"
-#define AIRPCAP_ADVANCED_EDIT_KEY_SSID_LABEL_KEY "airpcap_advanced_edit_key_ssid_label_key"
-#define AIRPCAP_ADVANCED_DECRYPTION_MODE_KEY "airpcap_advanced_decryption_mode_key"
-#define AIRPCAP_ADVANCED_WPA_DECRYPTION_KEY "airpcap_advanced_wpa_decryption_key"
-#define AIRPCAP_ADVANCED_NOTEBOOK_KEY "airpcap_advanced_notebook_key"
-#define AIRPCAP_ADVANCED_CANCEL_KEY "airpcap_advanced_cancel_key"
-#define AIRPCAP_ADVANCED_OK_KEY "airpcap_advanced_ok_key"
-#define AIRPCAP_ADVANCED_KEYLIST_KEY "airpcap_advanced_keylist_key"
-#define AIRPCAP_CHECK_WINDOW_RADIO_KEEP_KEY "airpcap_check_window_radio_keep_key"
-#define AIRPCAP_CHECK_WINDOW_RADIO_MERGE_KEY "airpcap_check_window_radio_merge_key"
-#define AIRPCAP_CHECK_WINDOW_RADIO_IMPORT_KEY "airpcap_check_window_radio_import_key"
-#define AIRPCAP_CHECK_WINDOW_RADIO_IGNORE_KEY "airpcap_check_window_radio_ignore_key"
-#define AIRPCAP_CHECK_WINDOW_RADIO_GROUP_KEY "airpcap_check_window_radio_group_key"
-
-#define AIRPCAP_CHECK_WINDOW_KEY "airpcap_check_window_key"
-
-#define AIRPCAP_ADVANCED_EDIT_KEY_SELECTION_KEY "airpcap_advanced_edit_key_selection_key"
-
-#define AIRPCAP_ADVANCED_FROM_KEY "airpcap_advanced_from_key"
-
-#define AIRPCAP_KEY_MGMT_NEW_KEY "airpcap_key_mgmt_new_key"
-#define AIRPCAP_KEY_MGMT_EDIT_KEY "airpcap_key_mgmt_edit_key"
-#define AIRPCAP_KEY_MGMT_DELETE_KEY "airpcap_key_mgmt_delete_key"
-#define AIRPCAP_KEY_MGMT_UP_KEY "airpcap_key_mgmt_up_key"
-#define AIRPCAP_KEY_MGMT_DOWN_KEY "airpcap_key_mgmt_down_key"
-#endif /* HAVE_AIRPCAP */
-
-#endif /* __KEYS_H__ */
-
diff --git a/ui/gtk/lbm_stream_dlg.c b/ui/gtk/lbm_stream_dlg.c
deleted file mode 100644
index d3fea45ce1..0000000000
--- a/ui/gtk/lbm_stream_dlg.c
+++ /dev/null
@@ -1,775 +0,0 @@
-/* lbm_stream_dlg.c
- * Routines for LBMC stream dialog
- *
- * Copyright (c) 2005-2014 Informatica Corporation. All Rights Reserved.
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-#include <epan/to_str.h>
-#include <epan/packet.h>
-#include <epan/tap.h>
-#include <gtk/gtk.h>
-#include <ui/gtk/gui_utils.h>
-#include <ui/gtk/dlg_utils.h>
-#include <globals.h>
-#include <epan/dissectors/packet-lbm.h>
-#include "lbm_stream_dlg.h"
-
-/* Stream structures. */
-typedef struct
-{
- guint64 channel;
- gchar * endpoint_a;
- gchar * endpoint_b;
- guint32 first_frame;
- guint32 last_frame;
- guint32 messages;
- guint32 bytes;
- GtkTreeIter iter;
- GSequence * substreams;
-} lbmc_stream_dlg_stream_entry_t;
-
-typedef struct
-{
- guint32 substream_id;
- gchar * endpoint_a;
- gchar * endpoint_b;
- guint32 first_frame;
- guint32 last_frame;
- guint32 messages;
- guint32 bytes;
- GtkTreeIter iter;
- lbmc_stream_dlg_stream_entry_t * parent;
-} lbmc_stream_dlg_substream_entry_t;
-
-/* Tree definitions. */
-#define LBMC_STREAM_DLG_STORE_STREAM_DISPLAY_COLUMN 0
-#define LBMC_STREAM_DLG_STORE_ENDPOINTA_COLUMN 1
-#define LBMC_STREAM_DLG_STORE_ENDPOINTB_COLUMN 2
-#define LBMC_STREAM_DLG_STORE_MESSAGES_COLUMN 3
-#define LBMC_STREAM_DLG_STORE_BYTES_COLUMN 4
-#define LBMC_STREAM_DLG_STORE_FIRST_FRAME_COLUMN 5
-#define LBMC_STREAM_DLG_STORE_LAST_FRAME_COLUMN 6
-#define LBMC_STREAM_DLG_STORE_CHANNEL_COLUMN 7
-#define LBMC_STREAM_DLG_STORE_SUBSTREAM_COLUMN 8
-
-static const gchar * global_stream_view_data = "stream-view";
-
-typedef struct
-{
- GtkWidget * dialog;
- GtkTreeModel * model;
- GSequence * stream_table;
-} lbmc_stream_dlg_info_t;
-
-static lbmc_stream_dlg_info_t * global_stream_dialog_info = NULL;
-
-static gchar * lbmc_stream_dlg_format_endpoint(wmem_allocator_t *allocator, const lbm_uim_stream_endpoint_t * endpoint)
-{
- gchar * buf = NULL;
- char* addr_str;
-
- if (endpoint->type == lbm_uim_instance_stream)
- {
- buf = bytes_to_str(allocator, endpoint->stream_info.ctxinst.ctxinst, sizeof(endpoint->stream_info.ctxinst.ctxinst));
- }
- else
- {
- addr_str = (char*)address_to_str(NULL, &(endpoint->stream_info.dest.addr));
- buf = wmem_strdup_printf(allocator,
- "%" G_GUINT32_FORMAT ":%s:%" G_GUINT16_FORMAT,
- endpoint->stream_info.dest.domain,
- addr_str,
- endpoint->stream_info.dest.port);
- wmem_free(NULL, addr_str);
- }
- return (buf);
-}
-
-/**************************************************************/
-/* Common functions. */
-/**************************************************************/
-static void lbmc_stream_dlg_stream_entry_destroy_cb(gpointer data)
-{
- lbmc_stream_dlg_stream_entry_t * stream = (lbmc_stream_dlg_stream_entry_t *)data;
-
- if (stream->substreams != NULL)
- {
- g_sequence_free(stream->substreams);
- stream->substreams = NULL;
- }
- g_free(data);
-}
-
-static void lbmc_stream_dlg_substream_entry_destroy_cb(gpointer data)
-{
- g_free(data);
-}
-
-static void lbmc_stream_dlg_reset_stream_table(lbmc_stream_dlg_info_t * info)
-{
- if (info->stream_table != NULL)
- {
- g_sequence_free(info->stream_table);
- info->stream_table = NULL;
- }
- info->stream_table = g_sequence_new(lbmc_stream_dlg_stream_entry_destroy_cb);
-}
-
-static void lbmc_stream_dlg_window_destroy_event_cb(GtkWindow * window _U_, gpointer user_data)
-{
- lbmc_stream_dlg_info_t * info = (lbmc_stream_dlg_info_t *)user_data;
-
- remove_tap_listener(info);
- if (info->stream_table != NULL)
- {
- g_sequence_free(info->stream_table);
- info->stream_table = NULL;
- }
- global_stream_dialog_info = NULL;
- g_free(info);
-}
-
-static GtkTreeModel * lbmc_stream_dlg_create_model(void)
-{
- GtkTreeStore * store = NULL;
-
- store = gtk_tree_store_new(9, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT64, G_TYPE_UINT);
- return (GTK_TREE_MODEL(store));
-}
-
-static void lbmc_stream_dlg_stream_cell_data_function(GtkTreeViewColumn * column _U_, GtkCellRenderer * renderer, GtkTreeModel * model, GtkTreeIter * iter, gpointer user_data _U_)
-{
- char stream_buf[64];
- guint64 channel;
- guint substream_id;
-
- gtk_tree_model_get(model, iter,
- LBMC_STREAM_DLG_STORE_CHANNEL_COLUMN, &channel,
- LBMC_STREAM_DLG_STORE_SUBSTREAM_COLUMN, &substream_id,
- -1);
- if (substream_id == 0)
- {
- g_snprintf(stream_buf, (gulong)sizeof(stream_buf), "%" G_GUINT64_FORMAT, channel);
- /* Left-align */
- g_object_set(renderer, "xalign", 0.0, NULL);
- }
- else
- {
- g_snprintf(stream_buf, (gulong)sizeof(stream_buf), "%" G_GUINT64_FORMAT ".%u", channel, substream_id);
- /* Right-align */
- g_object_set(renderer, "xalign", 1.0, NULL);
- }
- g_object_set(renderer, "text", stream_buf, NULL);
-}
-
-static void lbmc_stream_dlg_string_cell_data_function(GtkTreeViewColumn * column _U_, GtkCellRenderer * renderer, GtkTreeModel * model, GtkTreeIter * iter, gpointer user_data)
-{
- gchar * value = NULL;
- gint data_column;
-
- data_column = GPOINTER_TO_INT(user_data);
- gtk_tree_model_get(model, iter, data_column, &value, -1);
- g_object_set(renderer, "text", value, NULL);
- /* Left-align */
- g_object_set(renderer, "xalign", 0.0, NULL);
-}
-
-static void lbmc_stream_dlg_guint_cell_data_function(GtkTreeViewColumn * column _U_, GtkCellRenderer * renderer, GtkTreeModel * model, GtkTreeIter * iter, gpointer user_data)
-{
- guint uint_value;
- gint data_column;
- char value[64];
-
- data_column = GPOINTER_TO_INT(user_data);
- gtk_tree_model_get(model, iter, data_column, &uint_value, -1);
- g_snprintf(value, (gulong)sizeof(value), "%u", uint_value);
- g_object_set(renderer, "text", value, NULL);
- /* Right-align */
- g_object_set(renderer, "xalign", 1.0, NULL);
-}
-
-static gint lbmc_stream_dlg_guint_sort_func(GtkTreeModel * model, GtkTreeIter * a, GtkTreeIter * b, gpointer user_data)
-{
- guint32 val_a;
- guint32 val_b;
- gint data_column;
-
- data_column = GPOINTER_TO_INT(user_data);
- gtk_tree_model_get(model, a, data_column, &val_a, -1);
- gtk_tree_model_get(model, b, data_column, &val_b, -1);
- if (val_a == val_b)
- {
- return (0);
- }
- else if (val_a < val_b)
- {
- return (-1);
- }
- else
- {
- return (1);
- }
-}
-
-static gint lbmc_stream_dlg_stream_sort_func(GtkTreeModel * model, GtkTreeIter * a, GtkTreeIter * b, gpointer user_data _U_)
-{
- guint stream_a;
- guint substream_a;
- guint stream_b;
- guint substream_b;
-
- gtk_tree_model_get(model, a,
- LBMC_STREAM_DLG_STORE_CHANNEL_COLUMN, &stream_a,
- LBMC_STREAM_DLG_STORE_SUBSTREAM_COLUMN, &substream_a,
- -1);
- gtk_tree_model_get(model, b,
- LBMC_STREAM_DLG_STORE_CHANNEL_COLUMN, &stream_b,
- LBMC_STREAM_DLG_STORE_SUBSTREAM_COLUMN, &substream_b,
- -1);
- if (stream_a == stream_b)
- {
- if (substream_a == substream_b)
- {
- return (0);
- }
- else if (substream_a < substream_b)
- {
- return (-1);
- }
- else
- {
- return (1);
- }
- }
- else if (stream_a < stream_b)
- {
- return (-1);
- }
- else
- {
- return (1);
- }
-}
-
-static gint lbmc_stream_dlg_string_sort_func(GtkTreeModel * model, GtkTreeIter * a, GtkTreeIter * b, gpointer user_data)
-{
- const gchar * str_a = NULL;
- const gchar * str_b = NULL;
- gint ret = 0;
-
- /* The col to get data from is in user_data */
- gint data_column = GPOINTER_TO_INT(user_data);
-
- gtk_tree_model_get(model, a, data_column, &str_a, -1);
- gtk_tree_model_get(model, b, data_column, &str_b, -1);
-
- if (str_a == str_b)
- {
- /* it's worth testing because a lot of rows point to the same data */
- return 0;
- }
- else if (str_a == NULL || str_b == NULL)
- {
- ret = (str_a == NULL) ? -1 : 1;
- }
- else
- {
- ret = g_ascii_strcasecmp(str_a, str_b);
- }
- return (ret);
-}
-
-static GtkWidget * lbmc_stream_dlg_create_view_and_model(lbmc_stream_dlg_info_t * info)
-{
- GtkWidget * view = NULL;
- GtkTreeViewColumn * column;
- GtkCellRenderer * renderer;
- GtkTreeSortable * sortable;
-
- info->model = lbmc_stream_dlg_create_model();
- view = gtk_tree_view_new();
- sortable = GTK_TREE_SORTABLE(GTK_TREE_STORE(info->model));
-#if GTK_CHECK_VERSION(2,6,0)
- gtk_tree_view_set_fixed_height_mode(GTK_TREE_VIEW(view), TRUE);
-#endif
- gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(view), FALSE);
-
- /* Column 1 - Stream */
- renderer = gtk_cell_renderer_text_new();
- g_object_set(renderer, "ypad", 0, NULL);
- column = gtk_tree_view_column_new_with_attributes("Stream", renderer, NULL);
- gtk_tree_view_column_set_sort_column_id(column, LBMC_STREAM_DLG_STORE_STREAM_DISPLAY_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_cell_data_func(column, renderer, lbmc_stream_dlg_stream_cell_data_function, GINT_TO_POINTER(LBMC_STREAM_DLG_STORE_STREAM_DISPLAY_COLUMN), NULL);
- gtk_tree_sortable_set_sort_func(sortable, LBMC_STREAM_DLG_STORE_STREAM_DISPLAY_COLUMN, lbmc_stream_dlg_stream_sort_func, GINT_TO_POINTER(LBMC_STREAM_DLG_STORE_STREAM_DISPLAY_COLUMN), NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 80);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
-
- /* Column 2 - EndpointA */
- renderer = gtk_cell_renderer_text_new();
- g_object_set(renderer, "ypad", 0, NULL);
- column = gtk_tree_view_column_new_with_attributes("Endpoint A", renderer, NULL);
- gtk_tree_view_column_set_sort_column_id(column, LBMC_STREAM_DLG_STORE_ENDPOINTA_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_cell_data_func(column, renderer, lbmc_stream_dlg_string_cell_data_function, GINT_TO_POINTER(LBMC_STREAM_DLG_STORE_ENDPOINTA_COLUMN), NULL);
- gtk_tree_sortable_set_sort_func(sortable, LBMC_STREAM_DLG_STORE_ENDPOINTA_COLUMN, lbmc_stream_dlg_string_sort_func, GINT_TO_POINTER(LBMC_STREAM_DLG_STORE_ENDPOINTA_COLUMN), NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 140);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
-
- /* Column 3 - EndpointB */
- renderer = gtk_cell_renderer_text_new();
- g_object_set(renderer, "ypad", 0, NULL);
- column = gtk_tree_view_column_new_with_attributes("Endpoint B", renderer, NULL);
- gtk_tree_view_column_set_sort_column_id(column, LBMC_STREAM_DLG_STORE_ENDPOINTB_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_cell_data_func(column, renderer, lbmc_stream_dlg_string_cell_data_function, GINT_TO_POINTER(LBMC_STREAM_DLG_STORE_ENDPOINTB_COLUMN), NULL);
- gtk_tree_sortable_set_sort_func(sortable, LBMC_STREAM_DLG_STORE_ENDPOINTB_COLUMN, lbmc_stream_dlg_string_sort_func, GINT_TO_POINTER(LBMC_STREAM_DLG_STORE_ENDPOINTB_COLUMN), NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 140);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
-
- /* Column 4 - Messages */
- renderer = gtk_cell_renderer_text_new();
- g_object_set(renderer, "ypad", 0, NULL);
- column = gtk_tree_view_column_new_with_attributes("Messages", renderer, NULL);
- gtk_tree_view_column_set_sort_column_id(column, LBMC_STREAM_DLG_STORE_MESSAGES_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_cell_data_func(column, renderer, lbmc_stream_dlg_guint_cell_data_function, GINT_TO_POINTER(LBMC_STREAM_DLG_STORE_MESSAGES_COLUMN), NULL);
- gtk_tree_sortable_set_sort_func(sortable, LBMC_STREAM_DLG_STORE_MESSAGES_COLUMN, lbmc_stream_dlg_guint_sort_func, GINT_TO_POINTER(LBMC_STREAM_DLG_STORE_MESSAGES_COLUMN), NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 100);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
-
- /* Column 5 - Bytes */
- renderer = gtk_cell_renderer_text_new();
- g_object_set(renderer, "ypad", 0, NULL);
- column = gtk_tree_view_column_new_with_attributes("Bytes", renderer, NULL);
- gtk_tree_view_column_set_sort_column_id(column, LBMC_STREAM_DLG_STORE_BYTES_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_cell_data_func(column, renderer, lbmc_stream_dlg_guint_cell_data_function, GINT_TO_POINTER(LBMC_STREAM_DLG_STORE_BYTES_COLUMN), NULL);
- gtk_tree_sortable_set_sort_func(sortable, LBMC_STREAM_DLG_STORE_BYTES_COLUMN, lbmc_stream_dlg_guint_sort_func, GINT_TO_POINTER(LBMC_STREAM_DLG_STORE_BYTES_COLUMN), NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 80);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
-
- /* Column 6 - First frame */
- renderer = gtk_cell_renderer_text_new();
- g_object_set(renderer, "ypad", 0, NULL);
- column = gtk_tree_view_column_new_with_attributes("First frame", renderer, NULL);
- gtk_tree_view_column_set_sort_column_id(column, LBMC_STREAM_DLG_STORE_FIRST_FRAME_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_cell_data_func(column, renderer, lbmc_stream_dlg_guint_cell_data_function, GINT_TO_POINTER(LBMC_STREAM_DLG_STORE_FIRST_FRAME_COLUMN), NULL);
- gtk_tree_sortable_set_sort_func(sortable, LBMC_STREAM_DLG_STORE_FIRST_FRAME_COLUMN, lbmc_stream_dlg_guint_sort_func, GINT_TO_POINTER(LBMC_STREAM_DLG_STORE_FIRST_FRAME_COLUMN), NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 100);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
-
- /* Column 6 - Last frame */
- renderer = gtk_cell_renderer_text_new();
- g_object_set(renderer, "ypad", 0, NULL);
- column = gtk_tree_view_column_new_with_attributes("Last frame", renderer, NULL);
- gtk_tree_view_column_set_sort_column_id(column, LBMC_STREAM_DLG_STORE_LAST_FRAME_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_cell_data_func(column, renderer, lbmc_stream_dlg_guint_cell_data_function, GINT_TO_POINTER(LBMC_STREAM_DLG_STORE_LAST_FRAME_COLUMN), NULL);
- gtk_tree_sortable_set_sort_func(sortable, LBMC_STREAM_DLG_STORE_FIRST_FRAME_COLUMN, lbmc_stream_dlg_guint_sort_func, GINT_TO_POINTER(LBMC_STREAM_DLG_STORE_LAST_FRAME_COLUMN), NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 100);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
-
- gtk_tree_view_set_model(GTK_TREE_VIEW(view), info->model);
- g_object_unref(info->model);
- return (view);
-}
-
-static lbmc_stream_dlg_info_t * lbmc_stream_dlg_window_create(void)
-{
- GtkWidget * vbox = NULL;
- GtkWidget * view = NULL;
- GtkWidget * button_row = NULL;
- GtkWidget * close_button = NULL;
- GtkWidget * scrolled_window = NULL;
- lbmc_stream_dlg_info_t * info = NULL;
-
- /* Setup the info structure. */
- info = (lbmc_stream_dlg_info_t *)g_malloc(sizeof(lbmc_stream_dlg_info_t));
- info->dialog = NULL;
- info->model = NULL;
- info->stream_table = NULL;
- lbmc_stream_dlg_reset_stream_table(info);
-
- /* Create the main window */
- info->dialog = dlg_window_new("29West LBMC Streams");
- g_signal_connect(info->dialog, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(info->dialog, "destroy", G_CALLBACK(lbmc_stream_dlg_window_destroy_event_cb), (gpointer)info);
- gtk_window_set_default_size(GTK_WINDOW(info->dialog), 800, 400);
-
- /* Build the vbox (to contain the tree view and buttons) */
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_add(GTK_CONTAINER(info->dialog), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 12);
-
- /* Build the tree view */
- view = lbmc_stream_dlg_create_view_and_model(info);
- g_object_set_data((GObject *)info->dialog, global_stream_view_data, (gpointer)view);
-
- /* Build a scrolling container for the tree view */
- scrolled_window = scrolled_window_new(NULL, NULL);
- gtk_container_add(GTK_CONTAINER(scrolled_window), view);
-
- /* Add the scrolling container to the vbox */
- gtk_box_pack_start(GTK_BOX(vbox), scrolled_window, TRUE, TRUE, 0);
-
- /* Build the button row */
- button_row = dlg_button_row_new(GTK_STOCK_CLOSE, NULL);
-
- /* Add the button row to the vbox */
- gtk_box_pack_end(GTK_BOX(vbox), button_row, FALSE, FALSE, 0);
-
- /* Connect to the close button */
- close_button = (GtkWidget *)g_object_get_data(G_OBJECT(button_row), GTK_STOCK_CLOSE);
- window_set_cancel_button(info->dialog, close_button, window_cancel_button_cb);
- gtk_widget_show_all(info->dialog);
- return (info);
-}
-
-/**************************************************************/
-/* Tap callbacks. */
-/**************************************************************/
-static void lbmc_stream_dlg_tap_reset(void * tap_data)
-{
- lbmc_stream_dlg_info_t * info = (lbmc_stream_dlg_info_t *)tap_data;
-
- gtk_tree_store_clear(GTK_TREE_STORE(info->model));
- lbmc_stream_dlg_reset_stream_table(info);
-}
-
-static gint lbmc_stream_dlg_stream_compare_cb(gconstpointer lhs, gconstpointer rhs, gpointer user_data _U_)
-{
- const lbmc_stream_dlg_stream_entry_t * stream1 = (const lbmc_stream_dlg_stream_entry_t *)lhs;
- const lbmc_stream_dlg_stream_entry_t * stream2 = (const lbmc_stream_dlg_stream_entry_t *)rhs;
-
- if (stream1->channel == stream2->channel)
- {
- return (0);
- }
- else if (stream1->channel < stream2->channel)
- {
- return (-1);
- }
- return (1);
-}
-
-static gint lbmc_stream_dlg_substream_compare_cb(gconstpointer lhs, gconstpointer rhs, gpointer user_data _U_)
-{
- const lbmc_stream_dlg_substream_entry_t * substream1 = (const lbmc_stream_dlg_substream_entry_t *)lhs;
- const lbmc_stream_dlg_substream_entry_t * substream2 = (const lbmc_stream_dlg_substream_entry_t *)rhs;
-
- if (substream1->substream_id == substream2->substream_id)
- {
- return (0);
- }
- else if (substream1->substream_id < substream2->substream_id)
- {
- return (-1);
- }
- return (1);
-}
-
-static gboolean lbmc_stream_dlg_tap_packet(void * tap_data, packet_info * pinfo, epan_dissect_t * edt _U_, const void * stream_info)
-{
- const lbm_uim_stream_tap_info_t * tapinfo = (const lbm_uim_stream_tap_info_t *)stream_info;
- lbmc_stream_dlg_info_t * info = (lbmc_stream_dlg_info_t *)tap_data;
- GtkTreeIter stream_iter;
- GtkTreeIter stream_insert_before_iter;
- lbmc_stream_dlg_stream_entry_t * stream = NULL;
- GSequenceIter * stream_entry_it;
- lbmc_stream_dlg_stream_entry_t stream_key;
- gboolean add_stream = FALSE;
- gboolean add_stream_before = FALSE;
- GtkTreeIter substream_iter;
- GtkTreeIter substream_insert_before_iter;
- lbmc_stream_dlg_substream_entry_t * substream = NULL;
- GSequenceIter * substream_entry_it;
- lbmc_stream_dlg_substream_entry_t substream_key;
- gboolean add_substream = FALSE;
- gboolean add_substream_before = FALSE;
- GtkTreePath * stream_path = NULL;
- GtkTreePath * substream_path = NULL;
-
- memset((void *)&stream_key, 0, sizeof(lbmc_stream_dlg_stream_entry_t));
- stream_key.channel = tapinfo->channel;
- stream_entry_it = g_sequence_search(info->stream_table, (gpointer)&stream_key, lbmc_stream_dlg_stream_compare_cb, NULL);
- /* If the node exists, g_sequence_search() will return an iterator giving the NEXT node. */
- if (g_sequence_iter_is_begin(stream_entry_it))
- {
- /*
- The iterator marks the beginning of the sequence, so the node doesn't exist
- and the previous node doesn't exist.
- */
- add_stream = TRUE;
- if (g_sequence_iter_is_end(stream_entry_it))
- {
- /* Iterator is both beginning and end, so the list is empty - just append it. */
- }
- else
- {
- /* Not the end, so we'll insert before the next stream. */
- stream = (lbmc_stream_dlg_stream_entry_t *)g_sequence_get(stream_entry_it);
- add_stream_before = TRUE;
- stream_insert_before_iter = stream->iter;
- }
- }
- else
- {
- GSequenceIter * save_stream_entry_it = stream_entry_it;
-
- stream_entry_it = g_sequence_iter_prev(stream_entry_it);
- stream = (lbmc_stream_dlg_stream_entry_t *)g_sequence_get(stream_entry_it);
- if (stream->channel != tapinfo->channel)
- {
- /* Not the one we were looking for. */
- add_stream = TRUE;
- if (g_sequence_iter_is_end(save_stream_entry_it))
- {
- /* Insert after -> append */
- }
- else
- {
- /* Insert before */
- stream = (lbmc_stream_dlg_stream_entry_t *)g_sequence_get(stream_entry_it);
- add_stream_before = TRUE;
- stream_insert_before_iter = stream->iter;
- }
- }
- }
-
- if (add_stream)
- {
- char valbuf[256];
-
- stream = (lbmc_stream_dlg_stream_entry_t *)g_malloc(sizeof(lbmc_stream_dlg_stream_entry_t));
- stream->channel = tapinfo->channel;
- stream->endpoint_a = lbmc_stream_dlg_format_endpoint(wmem_file_scope(), &(tapinfo->endpoint_a));
- stream->endpoint_b = lbmc_stream_dlg_format_endpoint(wmem_file_scope(), &(tapinfo->endpoint_b));
- stream->first_frame = (guint32)(~0);
- stream->last_frame = 0;
- stream->messages = 0;
- stream->bytes = 0;
- stream->substreams = g_sequence_new(lbmc_stream_dlg_substream_entry_destroy_cb);
- (void) g_sequence_insert_sorted(info->stream_table, (void *)stream, lbmc_stream_dlg_stream_compare_cb, NULL);
- if (add_stream_before)
- {
- gtk_tree_store_insert_before(GTK_TREE_STORE(info->model), &stream_iter, NULL, &stream_insert_before_iter);
- }
- else
- {
- gtk_tree_store_append(GTK_TREE_STORE(info->model), &stream_iter, NULL);
- }
- stream->iter = stream_iter;
- g_snprintf(valbuf, (gulong)sizeof(valbuf), "%" G_GUINT64_FORMAT, stream->channel);
- gtk_tree_store_set(GTK_TREE_STORE(info->model), &(stream->iter),
- LBMC_STREAM_DLG_STORE_STREAM_DISPLAY_COLUMN, valbuf,
- LBMC_STREAM_DLG_STORE_ENDPOINTA_COLUMN, stream->endpoint_a,
- LBMC_STREAM_DLG_STORE_ENDPOINTB_COLUMN, stream->endpoint_b,
- LBMC_STREAM_DLG_STORE_MESSAGES_COLUMN, (guint)0,
- LBMC_STREAM_DLG_STORE_BYTES_COLUMN, (guint)0,
- LBMC_STREAM_DLG_STORE_FIRST_FRAME_COLUMN, (guint)0,
- LBMC_STREAM_DLG_STORE_LAST_FRAME_COLUMN, (guint)0,
- LBMC_STREAM_DLG_STORE_CHANNEL_COLUMN, (guint64)stream->channel,
- LBMC_STREAM_DLG_STORE_SUBSTREAM_COLUMN, (guint)0,
- -1);
- }
- stream_iter = stream->iter;
- if (stream->first_frame > pinfo->num)
- {
- stream->first_frame = pinfo->num;
- }
- if (stream->last_frame < pinfo->num)
- {
- stream->last_frame = pinfo->num;
- }
- stream->bytes += tapinfo->bytes;
- stream->messages++;
- gtk_tree_store_set(GTK_TREE_STORE(info->model), &stream_iter,
- LBMC_STREAM_DLG_STORE_MESSAGES_COLUMN, (guint)stream->messages,
- LBMC_STREAM_DLG_STORE_BYTES_COLUMN, (guint)stream->bytes,
- LBMC_STREAM_DLG_STORE_FIRST_FRAME_COLUMN, (guint)stream->first_frame,
- LBMC_STREAM_DLG_STORE_LAST_FRAME_COLUMN, (guint)stream->last_frame,
- -1);
-
- memset((void *)&substream_key, 0, sizeof(lbmc_stream_dlg_substream_entry_t));
- substream_key.substream_id = tapinfo->substream_id;
- substream_entry_it = g_sequence_search(stream->substreams, (gpointer)&substream_key, lbmc_stream_dlg_substream_compare_cb, NULL);
- /* If the node exists, g_sequence_search() will return an iterator giving the NEXT node. */
- if (g_sequence_iter_is_begin(substream_entry_it))
- {
- /*
- The iterator marks the beginning of the sequence, so the node doesn't exist
- and the previous node doesn't exist.
- */
- add_substream = TRUE;
- if (g_sequence_iter_is_end(substream_entry_it))
- {
- /* Iterator is both beginning and end, so the list is empty - just append it. */
- }
- else
- {
- /* Not the end, so we'll insert before the next stream. */
- substream = (lbmc_stream_dlg_substream_entry_t *)g_sequence_get(substream_entry_it);
- add_substream_before = TRUE;
- substream_insert_before_iter = substream->iter;
- }
- }
- else
- {
- GSequenceIter * save_substream_entry_it = substream_entry_it;
-
- substream_entry_it = g_sequence_iter_prev(substream_entry_it);
- substream = (lbmc_stream_dlg_substream_entry_t *)g_sequence_get(substream_entry_it);
- if (substream->substream_id != tapinfo->substream_id)
- {
- /* Not the one we were looking for. */
- add_substream = TRUE;
- if (g_sequence_iter_is_end(save_substream_entry_it))
- {
- /* Insert after -> append */
- }
- else
- {
- /* Insert before */
- substream = (lbmc_stream_dlg_substream_entry_t *)g_sequence_get(substream_entry_it);
- add_substream_before = TRUE;
- substream_insert_before_iter = substream->iter;
- }
- }
- }
- if (add_substream)
- {
- char valbuf[256];
-
- substream = (lbmc_stream_dlg_substream_entry_t *)g_malloc(sizeof(lbmc_stream_dlg_substream_entry_t));
- substream->substream_id = tapinfo->substream_id;
- substream->endpoint_a = wmem_strdup_printf(wmem_file_scope(), "%s:%" G_GUINT16_FORMAT, address_to_str(pinfo->pool, &(pinfo->src)), (guint16)pinfo->srcport);
- substream->endpoint_b = wmem_strdup_printf(wmem_file_scope(), "%s:%" G_GUINT16_FORMAT, address_to_str(pinfo->pool, &(pinfo->dst)), (guint16)pinfo->destport);
- substream->first_frame = (guint32)(~0);
- substream->last_frame = 0;
- substream->messages = 0;
- substream->bytes = 0;
- substream->parent = stream;
- (void) g_sequence_insert_sorted(stream->substreams, (void *)substream, lbmc_stream_dlg_substream_compare_cb, NULL);
- if (add_substream_before)
- {
- gtk_tree_store_insert_before(GTK_TREE_STORE(info->model), &substream_iter, &stream_iter, &substream_insert_before_iter);
- }
- else
- {
- gtk_tree_store_append(GTK_TREE_STORE(info->model), &substream_iter, &stream_iter);
- }
- substream->iter = substream_iter;
- g_snprintf(valbuf, (gulong)sizeof(valbuf), "%" G_GUINT64_FORMAT ":%" G_GUINT32_FORMAT, stream->channel, substream->substream_id);
- gtk_tree_store_set(GTK_TREE_STORE(info->model), &(substream->iter),
- LBMC_STREAM_DLG_STORE_STREAM_DISPLAY_COLUMN, valbuf,
- LBMC_STREAM_DLG_STORE_ENDPOINTA_COLUMN, substream->endpoint_a,
- LBMC_STREAM_DLG_STORE_ENDPOINTB_COLUMN, substream->endpoint_b,
- LBMC_STREAM_DLG_STORE_MESSAGES_COLUMN, (guint)0,
- LBMC_STREAM_DLG_STORE_BYTES_COLUMN, (guint)0,
- LBMC_STREAM_DLG_STORE_FIRST_FRAME_COLUMN, (guint)0,
- LBMC_STREAM_DLG_STORE_LAST_FRAME_COLUMN, (guint)0,
- LBMC_STREAM_DLG_STORE_CHANNEL_COLUMN, (guint)stream->channel,
- LBMC_STREAM_DLG_STORE_SUBSTREAM_COLUMN, (guint)substream->substream_id,
- -1);
- }
- substream_iter = substream->iter;
- if (substream->first_frame > pinfo->num)
- {
- substream->first_frame = pinfo->num;
- }
- if (substream->last_frame < pinfo->num)
- {
- substream->last_frame = pinfo->num;
- }
- substream->bytes += tapinfo->bytes;
- substream->messages++;
- gtk_tree_store_set(GTK_TREE_STORE(info->model), &substream_iter,
- LBMC_STREAM_DLG_STORE_MESSAGES_COLUMN, (guint)substream->messages,
- LBMC_STREAM_DLG_STORE_BYTES_COLUMN, (guint)substream->bytes,
- LBMC_STREAM_DLG_STORE_FIRST_FRAME_COLUMN, (guint)substream->first_frame,
- LBMC_STREAM_DLG_STORE_LAST_FRAME_COLUMN, (guint)substream->last_frame,
- -1);
- substream_path = gtk_tree_model_get_path(info->model, &(substream->iter));
- gtk_tree_model_row_changed(info->model, substream_path, &(substream->iter));
- gtk_tree_path_free(substream_path);
- substream_path = NULL;
- stream_path = gtk_tree_model_get_path(info->model, &(stream->iter));
- gtk_tree_model_row_changed(info->model, stream_path, &(stream->iter));
- gtk_tree_path_free(stream_path);
- stream_path = NULL;
- return (TRUE);
-}
-
-static void lbmc_stream_dlg_tap_draw(void * tap_data _U_)
-{
- /* Nothing to do. */
-}
-
-/**************************************************************/
-/* Stream table functions. */
-/**************************************************************/
-void lbmc_stream_dlg_stream_menu_cb(gpointer arg _U_)
-{
- GString * err_msg;
-
- if (global_stream_dialog_info != NULL)
- {
- gtk_widget_show(global_stream_dialog_info->dialog);
- return;
- }
- global_stream_dialog_info = lbmc_stream_dlg_window_create();
- err_msg = register_tap_listener("lbm_stream",
- (void *)global_stream_dialog_info,
- NULL,
- TL_REQUIRES_COLUMNS,
- lbmc_stream_dlg_tap_reset,
- lbmc_stream_dlg_tap_packet,
- lbmc_stream_dlg_tap_draw);
- if (err_msg != NULL)
- {
- fprintf(stderr, "register_tap_listener: %s\n", err_msg->str);
- g_string_free(err_msg, TRUE);
- }
- cf_retap_packets(&cfile);
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/lbm_stream_dlg.h b/ui/gtk/lbm_stream_dlg.h
deleted file mode 100644
index ff6a9ce04e..0000000000
--- a/ui/gtk/lbm_stream_dlg.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* lbm_stream_dlg.h
- * Routines for LBMC stream dialog
- *
- * Copyright (c) 2005-2014 Informatica Corporation. All Rights Reserved.
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef LBM_STREAM_DLG_H_INCLUDED
-#define LBM_STREAM_DLG_H_INCLUDED
-
-#include <glib.h>
-
-void lbmc_stream_dlg_stream_menu_cb(gpointer arg);
-
-#endif
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/mac_lte_stat_dlg.c b/ui/gtk/mac_lte_stat_dlg.c
deleted file mode 100644
index ed3e957fec..0000000000
--- a/ui/gtk/mac_lte_stat_dlg.c
+++ /dev/null
@@ -1,1434 +0,0 @@
-/* mac_lte_stat_dlg.c
- * Copyright 2009 Martin Mathieson
- * (originally based upon wlan_stat_dlg.c)
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include "ui/gtk/gtkglobals.h"
-
-#include <epan/packet.h>
-#include <epan/tap.h>
-#include <epan/dissectors/packet-mac-lte.h>
-
-#include "ui/simple_dialog.h"
-#include <epan/stat_groups.h>
-
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/tap_param_dlg.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/main.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-#include "globals.h"
-
-void register_tap_listener_mac_lte_stat(void);
-
-/**********************************************/
-/* Table column identifiers and title strings */
-
-enum {
- RNTI_COLUMN,
- RNTI_TYPE_COLUMN,
- UEID_COLUMN,
- UL_FRAMES_COLUMN,
- UL_BYTES_COLUMN,
- UL_BW_COLUMN,
- UL_PADDING_PERCENT_COLUMN,
- UL_RETX_FRAMES_COLUMN,
- DL_FRAMES_COLUMN,
- DL_BYTES_COLUMN,
- DL_BW_COLUMN,
- DL_PADDING_PERCENT_COLUMN,
- DL_CRC_FAILED_COLUMN,
- DL_CRC_HIGH_CODE_RATE_COLUMN,
- DL_CRC_PDSCH_LOST_COLUMN,
- DL_CRC_DUPLICATE_NONZERO_RV,
- DL_RETX_FRAMES_COLUMN,
- TABLE_COLUMN,
- NUM_UE_COLUMNS
-};
-
-enum {
- CCCH_COLUMN=1,
- LCID1_COLUMN,
- LCID2_COLUMN,
- LCID3_COLUMN,
- LCID4_COLUMN,
- LCID5_COLUMN,
- LCID6_COLUMN,
- LCID7_COLUMN,
- LCID8_COLUMN,
- LCID9_COLUMN,
- LCID10_COLUMN,
- PREDEFINED_COLUMN,
- NUM_CHANNEL_COLUMNS
-};
-
-static const gchar *ue_titles[] = { "RNTI", "Type", "UEId",
- "UL Frames", "UL Bytes", "UL MBit/sec", "UL Padding %", "UL ReTX",
- "DL Frames", "DL Bytes", "DL MBit/sec", "DL Padding %", "DL CRC Failed",
- "DL CRC High Code Rate", "DL CRC PDSCH Lost", "DL CRC Dup NonZero RV", "DL ReTX"};
-
-static const gchar *channel_titles[] = { "CCCH",
- "LCID 1", "LCID 2", "LCID 3", "LCID 4", "LCID 5",
- "LCID 6", "LCID 7", "LCID 8", "LCID 9", "LCID 10",
- "Predefined"};
-
-
-/* Stats for one UE */
-typedef struct mac_lte_row_data {
- /* Key for matching this row */
- guint16 rnti;
- guint8 rnti_type;
- guint16 ueid;
-
- gboolean is_predefined_data;
-
- guint32 UL_frames;
- guint32 UL_raw_bytes; /* all bytes */
- guint32 UL_total_bytes; /* payload */
- nstime_t UL_time_start;
- nstime_t UL_time_stop;
- guint32 UL_padding_bytes;
- guint32 UL_CRC_errors;
- guint32 UL_retx_frames;
-
- guint32 DL_frames;
- guint32 DL_raw_bytes; /* all bytes */
- guint32 DL_total_bytes;
- nstime_t DL_time_start;
- nstime_t DL_time_stop;
- guint32 DL_padding_bytes;
- guint32 DL_CRC_failures;
- guint32 DL_CRC_high_code_rate;
- guint32 DL_CRC_PDSCH_lost;
- guint32 DL_CRC_Duplicate_Nonzero_rv;
- guint32 DL_retx_frames;
-
- guint32 UL_bytes_for_lcid[11];
- guint32 UL_sdus_for_lcid[11];
- guint32 DL_bytes_for_lcid[11];
- guint32 DL_sdus_for_lcid[11];
-} mac_lte_row_data;
-
-
-/* One row/UE in the UE table */
-typedef struct mac_lte_ep {
- struct mac_lte_ep *next;
- struct mac_lte_row_data stats;
- GtkTreeIter iter;
- gboolean iter_valid;
-} mac_lte_ep_t;
-
-
-/* Common channel stats */
-typedef struct mac_lte_common_stats {
- guint32 all_frames;
- guint32 mib_frames;
- guint32 sib_frames;
- guint32 sib_bytes;
- guint32 pch_frames;
- guint32 pch_bytes;
- guint32 pch_paging_ids;
- guint32 rar_frames;
- guint32 rar_entries;
-
- guint16 max_ul_ues_in_tti;
- guint16 max_dl_ues_in_tti;
-} mac_lte_common_stats;
-
-
-static const char *selected_ue_row_names[] = {"UL SDUs", "UL Bytes", "DL SDUs", "DL Bytes"};
-
-
-/* Used to keep track of whole MAC LTE statistics window */
-typedef struct mac_lte_stat_t {
- /* Stats window itself */
- GtkWidget *mac_lte_stat_dlg_w;
-
- char *filter;
-
- /* Labels */
- GtkWidget *mac_lte_stat_ues_lb;
- GtkWidget *ul_filter_bt;
- GtkWidget *dl_filter_bt;
- GtkWidget *uldl_filter_bt;
-
- GtkWidget *show_mac_rach_cb;
- GtkWidget *show_mac_srs_cb;
- GtkWidget *show_dct_errors_cb;
- GtkWidget *dct_error_substring_lb;
- GtkWidget *dct_error_substring_te;
-
- GtkWidget *ul_max_ues_per_tti;
- GtkWidget *dl_max_ues_per_tti;
-
- /* Common stats */
- mac_lte_common_stats common_stats;
- GtkWidget *common_mib_frames;
- GtkWidget *common_sib_frames;
- GtkWidget *common_sib_bytes;
- GtkWidget *common_pch_frames;
- GtkWidget *common_pch_bytes;
- GtkWidget *common_pch_paging_ids;
- GtkWidget *common_rar_frames;
- GtkWidget *common_rar_entries;
-
- /* Keep track of unique rntis & ueids */
- guint8 used_ueids[65535];
- guint8 used_rntis[65535];
- guint16 number_of_ueids;
- guint16 number_of_rntis;
-
- guint16 selected_rnti;
- guint16 selected_ueid;
-
- /* Labels in selected UE 'table' */
- GtkWidget *selected_ue_column_entry[NUM_CHANNEL_COLUMNS][5];
-
- GtkTreeView *ue_table;
- mac_lte_ep_t *ep_list;
-} mac_lte_stat_t;
-
-
-/* Reset the statistics window */
-static void mac_lte_stat_reset(void *phs)
-{
- mac_lte_stat_t *mac_lte_stat = (mac_lte_stat_t *)phs;
- mac_lte_ep_t *list = mac_lte_stat->ep_list;
- char *display_name;
- gchar title[256];
- GtkListStore *store;
- gint i, n;
-
- /* Set the title */
- if (mac_lte_stat->mac_lte_stat_dlg_w != NULL) {
- display_name = cf_get_display_name(&cfile);
- g_snprintf(title, sizeof(title), "Wireshark: LTE MAC Traffic Statistics: %s (filter=\"%s\")",
- display_name,
- ((mac_lte_stat->filter != NULL) && (mac_lte_stat->filter[0] != 0)) ? mac_lte_stat->filter : "none");
- g_free(display_name);
- gtk_window_set_title(GTK_WINDOW(mac_lte_stat->mac_lte_stat_dlg_w), title);
- }
-
- g_snprintf(title, sizeof(title), "UL/DL-SCH data (0 entries)");
- gtk_frame_set_label(GTK_FRAME(mac_lte_stat->mac_lte_stat_ues_lb), title);
-
- /* Reset counts of unique ueids & rntis */
- memset(mac_lte_stat->used_ueids, 0, 65535);
- mac_lte_stat->number_of_ueids = 0;
- memset(mac_lte_stat->used_rntis, 0, 65535);
- mac_lte_stat->number_of_rntis = 0;
-
- /* Zero common stats */
- memset(&(mac_lte_stat->common_stats), 0, sizeof(mac_lte_common_stats));
-
- /* Remove all entries from the UE list */
- store = GTK_LIST_STORE(gtk_tree_view_get_model(mac_lte_stat->ue_table));
- gtk_list_store_clear(store);
-
- if (!list) {
- return;
- }
-
- mac_lte_stat->ep_list = NULL;
-
- /* Set all of the channel counters to 0 */
- for (n=1; n <=4; n++) {
- for (i=CCCH_COLUMN; i < NUM_CHANNEL_COLUMNS; i++) {
- gtk_label_set_text(GTK_LABEL(mac_lte_stat->selected_ue_column_entry[i][n]), "0");
- }
- }
-}
-
-
-/* Allocate a mac_lte_ep_t struct to store info for new UE */
-static mac_lte_ep_t* alloc_mac_lte_ep(const struct mac_lte_tap_info *si, packet_info *pinfo _U_)
-{
- mac_lte_ep_t *ep;
- int n;
-
- if (!si) {
- return NULL;
- }
-
- if (!(ep = (mac_lte_ep_t *)g_malloc(sizeof(mac_lte_ep_t)))) {
- return NULL;
- }
-
- /* Copy SI data into ep->stats */
- ep->stats.rnti = si->rnti;
- ep->stats.rnti_type = si->rntiType;
- ep->stats.ueid = si->ueid;
-
- /* Counts for new UE are all 0 */
- ep->stats.UL_frames = 0;
- ep->stats.DL_frames = 0;
- ep->stats.UL_total_bytes = 0;
- ep->stats.UL_raw_bytes = 0;
- ep->stats.DL_raw_bytes = 0;
- ep->stats.UL_padding_bytes = 0;
- ep->stats.DL_padding_bytes = 0;
- ep->stats.DL_total_bytes = 0;
- ep->stats.UL_CRC_errors = 0;
- ep->stats.DL_CRC_failures = 0;
- ep->stats.DL_CRC_high_code_rate = 0;
- ep->stats.DL_CRC_PDSCH_lost = 0;
- ep->stats.DL_CRC_Duplicate_Nonzero_rv = 0;
- ep->stats.UL_retx_frames = 0;
- ep->stats.DL_retx_frames = 0;
-
- for (n=0; n < 11; n++) {
- ep->stats.UL_sdus_for_lcid[n] = 0;
- ep->stats.UL_bytes_for_lcid[n] = 0;
- }
- ep->stats.DL_total_bytes = 0;
- for (n=0; n < 11; n++) {
- ep->stats.DL_sdus_for_lcid[n] = 0;
- ep->stats.DL_bytes_for_lcid[n] = 0;
- }
-
- ep->next = NULL;
-
- ep->iter_valid = FALSE;
-
- return ep;
-}
-
-
-/* Update counts of unique rntis & ueids */
-static void update_ueid_rnti_counts(guint16 rnti, guint16 ueid, mac_lte_stat_t *hs)
-{
- if (!hs->used_ueids[ueid]) {
- hs->used_ueids[ueid] = TRUE;
- hs->number_of_ueids++;
- }
- if (!hs->used_rntis[rnti]) {
- hs->used_rntis[rnti] = TRUE;
- hs->number_of_rntis++;
- }
-}
-
-
-/* Process stat struct for a MAC LTE frame */
-static int mac_lte_stat_packet(void *phs, packet_info *pinfo, epan_dissect_t *edt _U_,
- const void *phi)
-{
- int n;
-
- /* Get reference to stat window instance */
- mac_lte_stat_t *hs = (mac_lte_stat_t *)phs;
- mac_lte_ep_t *tmp = NULL, *te = NULL;
-
- /* Cast tap info struct */
- const struct mac_lte_tap_info *si = (const struct mac_lte_tap_info *)phi;
-
- if (!hs) {
- return 0;
- }
-
- hs->common_stats.all_frames++;
-
- /* For common channels, just update global counters */
- switch (si->rntiType) {
- case P_RNTI:
- hs->common_stats.pch_frames++;
- hs->common_stats.pch_bytes += si->single_number_of_bytes;
- hs->common_stats.pch_paging_ids += si->number_of_paging_ids;
- return 1;
- case SI_RNTI:
- hs->common_stats.sib_frames++;
- hs->common_stats.sib_bytes += si->single_number_of_bytes;
- return 1;
- case NO_RNTI:
- hs->common_stats.mib_frames++;
- return 1;
- case RA_RNTI:
- hs->common_stats.rar_frames++;
- hs->common_stats.rar_entries += si->number_of_rars;
- return 1;
- case C_RNTI:
- case SPS_RNTI:
- /* Drop through for per-UE update */
- break;
-
- default:
- /* Error */
- return 0;
- }
-
- /* Check max UEs/tti counter */
- switch (si->direction) {
- case DIRECTION_UPLINK:
- hs->common_stats.max_ul_ues_in_tti =
- MAX(hs->common_stats.max_ul_ues_in_tti, si->ueInTTI);
- break;
- case DIRECTION_DOWNLINK:
- hs->common_stats.max_dl_ues_in_tti =
- MAX(hs->common_stats.max_dl_ues_in_tti, si->ueInTTI);
- break;
- }
-
- /* For per-UE data, must create a new row if none already existing */
- if (!hs->ep_list) {
- /* Allocate new list */
- hs->ep_list = alloc_mac_lte_ep(si, pinfo);
- /* Make it the first/only entry */
- te = hs->ep_list;
-
- /* Update counts of unique ueids & rntis */
- update_ueid_rnti_counts(si->rnti, si->ueid, hs);
- } else {
- /* Look among existing rows for this RNTI */
- for (tmp = hs->ep_list;(tmp != NULL); tmp = tmp->next) {
- /* Match only by RNTI and UEId together */
- if ((tmp->stats.rnti == si->rnti) &&
- (tmp->stats.ueid == si->ueid)) {
- te = tmp;
- break;
- }
- }
-
- /* Not found among existing, so create a new one anyway */
- if (te == NULL) {
- if ((te = alloc_mac_lte_ep(si, pinfo))) {
- /* Add new item to end of list */
- mac_lte_ep_t *p = hs->ep_list;
- while (p->next) {
- p = p->next;
- }
- p->next = te;
- te->next = NULL;
-
- /* Update counts of unique ueids & rntis */
- update_ueid_rnti_counts(si->rnti, si->ueid, hs);
- }
- }
- }
-
- /* Really should have a row pointer by now */
- if (!te) {
- return 0;
- }
-
- /* Update entry with details from si */
- te->stats.rnti = si->rnti;
- te->stats.is_predefined_data = si->isPredefinedData;
-
- /* Uplink */
- if (si->direction == DIRECTION_UPLINK) {
- if (si->isPHYRetx) {
- te->stats.UL_retx_frames++;
- return 1;
- }
-
- if (si->crcStatusValid && (si->crcStatus != crc_success)) {
- te->stats.UL_CRC_errors++;
- return 1;
- }
-
- /* Update time range */
- if (te->stats.UL_frames == 0) {
- te->stats.UL_time_start = si->mac_lte_time;
- }
- te->stats.UL_time_stop = si->mac_lte_time;
-
- te->stats.UL_frames++;
-
- te->stats.UL_raw_bytes += si->raw_length;
- te->stats.UL_padding_bytes += si->padding_bytes;
-
- if (si->isPredefinedData) {
- te->stats.UL_total_bytes += si->single_number_of_bytes;
- }
- else {
- for (n=0; n < 11; n++) {
- te->stats.UL_sdus_for_lcid[n] += si->sdus_for_lcid[n];
- te->stats.UL_bytes_for_lcid[n] += si->bytes_for_lcid[n];
- te->stats.UL_total_bytes += si->bytes_for_lcid[n];
- }
- }
- }
-
- /* Downlink */
- else {
- if (si->isPHYRetx) {
- te->stats.DL_retx_frames++;
- return 1;
- }
-
- if (si->crcStatusValid && (si->crcStatus != crc_success)) {
- switch (si->crcStatus) {
- case crc_fail:
- te->stats.DL_CRC_failures++;
- break;
- case crc_high_code_rate:
- te->stats.DL_CRC_high_code_rate++;
- break;
- case crc_pdsch_lost:
- te->stats.DL_CRC_PDSCH_lost++;
- break;
- case crc_duplicate_nonzero_rv:
- te->stats.DL_CRC_Duplicate_Nonzero_rv++;
- break;
-
- default:
- /* Something went wrong! */
- break;
- }
- return 1;
- }
-
- /* Update time range */
- if (te->stats.DL_frames == 0) {
- te->stats.DL_time_start = si->mac_lte_time;
- }
- te->stats.DL_time_stop = si->mac_lte_time;
-
- te->stats.DL_frames++;
-
- te->stats.DL_raw_bytes += si->raw_length;
- te->stats.DL_padding_bytes += si->padding_bytes;
-
- if (si->isPredefinedData) {
- te->stats.DL_total_bytes += si->single_number_of_bytes;
- }
- else {
- for (n=0; n < 11; n++) {
- te->stats.DL_sdus_for_lcid[n] += si->sdus_for_lcid[n];
- te->stats.DL_bytes_for_lcid[n] += si->bytes_for_lcid[n];
- te->stats.DL_total_bytes += si->bytes_for_lcid[n];
- }
- }
- }
-
- return 1;
-}
-
-
-/* Draw the UE details table according to the current UE selection */
-static void mac_lte_ue_details(mac_lte_ep_t *mac_stat_ep, mac_lte_stat_t *hs)
-{
- int n;
- gchar buff[32];
- guint8 show_dct_errors;
-
- /**********************************/
- /* Set data one row at a time */
-
- /* UL SDUs */
- for (n=0; n < PREDEFINED_COLUMN-1; n++) {
- g_snprintf(buff, sizeof(buff), "%u",
- (mac_stat_ep != NULL) ? mac_stat_ep->stats.UL_sdus_for_lcid[n] : 0);
- gtk_label_set_text(GTK_LABEL(hs->selected_ue_column_entry[n+1][1]), buff);
- }
-
- /* Predefined */
- if (mac_stat_ep != NULL) {
- g_snprintf(buff, sizeof(buff), "%u",
- mac_stat_ep->stats.is_predefined_data ? mac_stat_ep->stats.UL_frames : 0);
- }
- else {
- g_snprintf(buff, sizeof(buff), "%u", 0);
- }
- gtk_label_set_text(GTK_LABEL(hs->selected_ue_column_entry[PREDEFINED_COLUMN][1]), buff);
-
-
- /* UL Bytes */
- for (n=0; n < PREDEFINED_COLUMN-1; n++) {
- g_snprintf(buff, sizeof(buff), "%u",
- (mac_stat_ep != NULL) ? mac_stat_ep->stats.UL_bytes_for_lcid[n] : 0);
- gtk_label_set_text(GTK_LABEL(hs->selected_ue_column_entry[n+1][2]), buff);
- }
-
- /* Predefined */
- if (mac_stat_ep != NULL) {
- g_snprintf(buff, sizeof(buff), "%u",
- mac_stat_ep->stats.is_predefined_data ? mac_stat_ep->stats.UL_total_bytes : 0);
- }
- else {
- g_snprintf(buff, sizeof(buff), "%u", 0);
- }
- gtk_label_set_text(GTK_LABEL(hs->selected_ue_column_entry[PREDEFINED_COLUMN][2]), buff);
-
-
- /* DL SDUs */
- for (n=0; n < PREDEFINED_COLUMN-1; n++) {
- g_snprintf(buff, sizeof(buff), "%u",
- (mac_stat_ep != NULL) ? mac_stat_ep->stats.DL_sdus_for_lcid[n] : 0);
- gtk_label_set_text(GTK_LABEL(hs->selected_ue_column_entry[n+1][3]), buff);
- }
- /* Predefined */
- if (mac_stat_ep != NULL) {
- g_snprintf(buff, sizeof(buff), "%u",
- mac_stat_ep->stats.is_predefined_data ? mac_stat_ep->stats.DL_frames : 0);
- }
- else {
- g_snprintf(buff, sizeof(buff), "%u", 0);
- }
- gtk_label_set_text(GTK_LABEL(hs->selected_ue_column_entry[PREDEFINED_COLUMN][3]), buff);
-
-
- /* DL Bytes */
- for (n=0; n < PREDEFINED_COLUMN-1; n++) {
- g_snprintf(buff, sizeof(buff), "%u",
- (mac_stat_ep != NULL) ? mac_stat_ep->stats.DL_bytes_for_lcid[n] : 0);
- gtk_label_set_text(GTK_LABEL(hs->selected_ue_column_entry[n+1][4]), buff);
- }
- /* Predefined */
- if (mac_stat_ep != NULL) {
- g_snprintf(buff, sizeof(buff), "%u",
- mac_stat_ep->stats.is_predefined_data ? mac_stat_ep->stats.DL_total_bytes : 0);
- }
- else {
- g_snprintf(buff, sizeof(buff), "%u", 0);
- }
- gtk_label_set_text(GTK_LABEL(hs->selected_ue_column_entry[PREDEFINED_COLUMN][4]), buff);
-
- /* Remember selected UE */
- if (mac_stat_ep) {
- hs->selected_rnti = mac_stat_ep->stats.rnti;
- hs->selected_ueid = mac_stat_ep->stats.ueid;
- }
-
- /* Enable/disable filter controls */
- gtk_widget_set_sensitive(hs->ul_filter_bt, mac_stat_ep != NULL);
- gtk_widget_set_sensitive(hs->dl_filter_bt, mac_stat_ep != NULL);
- gtk_widget_set_sensitive(hs->uldl_filter_bt, mac_stat_ep != NULL);
- gtk_widget_set_sensitive(hs->show_mac_rach_cb, mac_stat_ep != NULL);
- gtk_widget_set_sensitive(hs->show_mac_srs_cb, mac_stat_ep != NULL);
- gtk_widget_set_sensitive(hs->show_dct_errors_cb, mac_stat_ep != NULL);
-
- /* Enabling substring control only if errors enabled */
- show_dct_errors = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_dct_errors_cb));
- gtk_widget_set_sensitive(hs->dct_error_substring_lb, show_dct_errors && (mac_stat_ep != NULL));
- gtk_widget_set_sensitive(hs->dct_error_substring_te, show_dct_errors && (mac_stat_ep != NULL));
-}
-
-
-/* Calculate and return a bandwidth figure, in Mbs */
-static float calculate_bw(nstime_t *start_time, nstime_t *stop_time, guint32 bytes)
-{
- /* Can only calculate bandwidth if have time delta */
- if (memcmp(start_time, stop_time, sizeof(nstime_t)) != 0) {
- float elapsed_ms = (((float)stop_time->secs - (float)start_time->secs) * 1000) +
- (((float)stop_time->nsecs - (float)start_time->nsecs) / 1000000);
-
- /* Only really meaningful if have a few frames spread over time...
- For now at least avoid dividing by something very close to 0.0 */
- if (elapsed_ms < 2.0) {
- return 0.0f;
- }
- return ((bytes * 8) / elapsed_ms) / 1000;
- }
- else {
- return 0.0f;
- }
-}
-
-
-/* (Re)draw the whole dialog window */
-static void mac_lte_stat_draw(void *phs)
-{
- gchar buff[32];
- guint16 number_of_ues = 0;
- char *display_name;
- gchar title[256];
-
- /* Look up the statistics window */
- mac_lte_stat_t *hs = (mac_lte_stat_t *)phs;
- mac_lte_ep_t *list = hs->ep_list, *tmp = 0;
-
- GtkListStore *ues_store;
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- /* System data */
- g_snprintf(buff, sizeof(buff), "Max UL UEs/TTI: %u", hs->common_stats.max_ul_ues_in_tti);
- gtk_label_set_text(GTK_LABEL(hs->ul_max_ues_per_tti), buff);
- g_snprintf(buff, sizeof(buff), "Max DL UEs/TTI: %u", hs->common_stats.max_dl_ues_in_tti);
- gtk_label_set_text(GTK_LABEL(hs->dl_max_ues_per_tti), buff);
-
- /* Common channel data */
- g_snprintf(buff, sizeof(buff), "MIBs: %u", hs->common_stats.mib_frames);
- gtk_label_set_text(GTK_LABEL(hs->common_mib_frames), buff);
- g_snprintf(buff, sizeof(buff), "SIB Frames: %u", hs->common_stats.sib_frames);
- gtk_label_set_text(GTK_LABEL(hs->common_sib_frames), buff);
- g_snprintf(buff, sizeof(buff), "SIB Bytes: %u", hs->common_stats.sib_bytes);
- gtk_label_set_text(GTK_LABEL(hs->common_sib_bytes), buff);
- g_snprintf(buff, sizeof(buff), "PCH Frames: %u", hs->common_stats.pch_frames);
- gtk_label_set_text(GTK_LABEL(hs->common_pch_frames), buff);
- g_snprintf(buff, sizeof(buff), "PCH Bytes: %u", hs->common_stats.pch_bytes);
- gtk_label_set_text(GTK_LABEL(hs->common_pch_bytes), buff);
- g_snprintf(buff, sizeof(buff), "PCH Paging Ids: %u", hs->common_stats.pch_paging_ids);
- gtk_label_set_text(GTK_LABEL(hs->common_pch_paging_ids), buff);
- g_snprintf(buff, sizeof(buff), "RAR Frames: %u", hs->common_stats.rar_frames);
- gtk_label_set_text(GTK_LABEL(hs->common_rar_frames), buff);
- g_snprintf(buff, sizeof(buff), "RAR Entries: %u", hs->common_stats.rar_entries);
- gtk_label_set_text(GTK_LABEL(hs->common_rar_entries), buff);
-
-
- /* Per-UE table entries */
- ues_store = GTK_LIST_STORE(gtk_tree_view_get_model(hs->ue_table));
-
- /* Set title that shows how many UEs currently in table */
- for (tmp = list; (tmp!=NULL); tmp=tmp->next, number_of_ues++);
- g_snprintf(title, sizeof(title), "UL/DL-SCH data (%u entries - %u unique RNTIs, %u unique UEIds)",
- number_of_ues, hs->number_of_rntis, hs->number_of_ueids);
- gtk_frame_set_label(GTK_FRAME(hs->mac_lte_stat_ues_lb), title);
-
- /* Update title to include number of UEs and frames */
- display_name = cf_get_display_name(&cfile);
- g_snprintf(title, sizeof(title), "Wireshark: LTE MAC Traffic Statistics: %s (%u UEs, %u frames) (filter=\"%s\")",
- display_name,
- number_of_ues,
- hs->common_stats.all_frames,
- ((hs->filter != NULL) && (hs->filter[0] != 0)) ? hs->filter : "none");
- g_free(display_name);
- gtk_window_set_title(GTK_WINDOW(hs->mac_lte_stat_dlg_w), title);
-
-
- for (tmp = list; tmp; tmp=tmp->next) {
-
- /* Calculate bandwidth */
- float UL_bw = calculate_bw(&tmp->stats.UL_time_start,
- &tmp->stats.UL_time_stop,
- tmp->stats.UL_total_bytes);
- float DL_bw = calculate_bw(&tmp->stats.DL_time_start,
- &tmp->stats.DL_time_stop,
- tmp->stats.DL_total_bytes);
-
- if (tmp->iter_valid != TRUE) {
- /* Add to list control if not drawn this UE before */
- gtk_list_store_append(ues_store, &tmp->iter);
- tmp->iter_valid = TRUE;
- }
-
- /* Set each column for this row */
- gtk_list_store_set(ues_store, &tmp->iter,
- RNTI_COLUMN, tmp->stats.rnti,
- RNTI_TYPE_COLUMN,
- (tmp->stats.rnti_type == C_RNTI) ? "C-RNTI" : "SPS-RNTI",
- UEID_COLUMN, tmp->stats.ueid,
- UL_FRAMES_COLUMN, tmp->stats.UL_frames,
- UL_BYTES_COLUMN, tmp->stats.UL_total_bytes,
- UL_BW_COLUMN, UL_bw,
- UL_PADDING_PERCENT_COLUMN,
- tmp->stats.UL_raw_bytes ?
- (((float)tmp->stats.UL_padding_bytes / (float)tmp->stats.UL_raw_bytes) * 100.0) :
- 0.0,
- UL_RETX_FRAMES_COLUMN, tmp->stats.UL_retx_frames,
- DL_FRAMES_COLUMN, tmp->stats.DL_frames,
- DL_BYTES_COLUMN, tmp->stats.DL_total_bytes,
- DL_BW_COLUMN, DL_bw,
- DL_PADDING_PERCENT_COLUMN,
- tmp->stats.DL_raw_bytes ?
- (((float)tmp->stats.DL_padding_bytes / (float)tmp->stats.DL_raw_bytes) * 100.0) :
- 0.0,
- DL_CRC_FAILED_COLUMN, tmp->stats.DL_CRC_failures,
- DL_CRC_HIGH_CODE_RATE_COLUMN, tmp->stats.DL_CRC_high_code_rate,
- DL_CRC_PDSCH_LOST_COLUMN, tmp->stats.DL_CRC_PDSCH_lost,
- DL_CRC_DUPLICATE_NONZERO_RV, tmp->stats.DL_CRC_Duplicate_Nonzero_rv,
- DL_RETX_FRAMES_COLUMN, tmp->stats.DL_retx_frames,
- TABLE_COLUMN, tmp,
- -1);
- }
-
- /* Reselect UE? */
- if (hs->selected_rnti != 0) {
- GtkTreeIter *ue_iter = NULL;
- mac_lte_ep_t *ep = hs->ep_list;
- while (ep != NULL) {
- if ((ep->stats.ueid == hs->selected_ueid) &&
- (ep->stats.rnti == hs->selected_rnti)) {
- ue_iter = &ep->iter;
- break;
- }
- ep = ep->next;
- }
- if (ue_iter != NULL) {
- /* Make selection */
- gtk_tree_selection_select_iter(gtk_tree_view_get_selection(hs->ue_table),
- ue_iter);
- }
- }
-
- /* If there is a UE selected, update its counters in details window */
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(hs->ue_table));
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- mac_lte_ep_t *ep;
-
- gtk_tree_model_get(model, &iter, TABLE_COLUMN, &ep, -1);
- mac_lte_ue_details(ep, hs);
- }
-}
-
-
-/* Compose and set appropriate display filter */
-typedef enum Direction_t {UL_Only, DL_Only, UL_and_DL} Direction_t;
-
-static void set_filter_expression(guint16 ueid,
- guint16 rnti,
- Direction_t direction,
- gint showRACH,
- gint showSRs,
- gint showDCTErrors,
- const gchar *DCTErrorSubstring,
- mac_lte_stat_t *hs)
-{
- #define MAX_FILTER_LEN 512
- static char buffer[MAX_FILTER_LEN];
- int offset = 0;
-
- /* Create the filter expression */
-
- /* Show MAC RACH (preamble attempts and RAR PDUs) */
- if (showRACH) {
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset,
- "(mac-lte.rar or (mac-lte.preamble-sent and mac-lte.ueid == %u)) or (",
- ueid);
- }
-
- /* Show MAC SRs */
- if (showSRs) {
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset,
- "(mac-lte.sr-req and mac-lte.ueid == %u) or (",
- ueid);
- }
-
- /* Errors */
- if (showDCTErrors) {
- if (strlen(DCTErrorSubstring) > 0) {
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset,
- "(dct2000.error-comment and (dct2000.comment contains \"%s\")) or (",
- DCTErrorSubstring);
- }
- else {
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset,
- "dct2000.error-comment or (");
- }
- }
-
- /* Filter expression */
- if (strlen(hs->filter)) {
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset, "%s and ", hs->filter);
- }
-
- /* Direction */
- switch (direction) {
- case UL_Only:
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset, "(mac-lte.direction == 0) and ");
- break;
- case DL_Only:
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset, "(mac-lte.direction == 1) and ");
- break;
- default:
- break;
- }
-
- /* Selected UE */
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset,
- "mac-lte.rnti == %u and mac-lte.ueid == %u",
- rnti, ueid);
-
- /* Close () if open */
- if (showRACH) {
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset, ")");
- }
-
- /* Close () if open */
- if (showSRs) {
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset, ")");
- }
-
-
- /* Close () if open */
- if (showDCTErrors) {
- /*offset +=*/ g_snprintf(buffer+offset, MAX_FILTER_LEN-offset, ")");
- }
-
- /* Set its value to our new string */
- gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), buffer);
-
- /* Run the filter */
- main_filter_packets(&cfile, buffer, TRUE);
-}
-
-/* Respond to UL filter button being clicked by building and using filter */
-static void ul_filter_clicked(GtkWindow *win _U_, mac_lte_stat_t* hs)
-{
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- /* If there is a UE selected, update its counters in details window */
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(hs->ue_table));
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- mac_lte_ep_t *ep;
-
- /* Get the UE details */
- gtk_tree_model_get(model, &iter, TABLE_COLUMN, &ep, -1);
-
- set_filter_expression(ep->stats.ueid, ep->stats.rnti, UL_Only,
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_mac_rach_cb)),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_mac_srs_cb)),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_dct_errors_cb)),
- gtk_entry_get_text(GTK_ENTRY(hs->dct_error_substring_te)),
- hs);
- }
-}
-
-/* Respond to DL filter button being clicked by building and using filter */
-static void dl_filter_clicked(GtkWindow *win _U_, mac_lte_stat_t *hs)
-{
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- /* If there is a UE selected, update its counters in details window */
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(hs->ue_table));
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- mac_lte_ep_t *ep;
-
- /* Get the UE details */
- gtk_tree_model_get(model, &iter, TABLE_COLUMN, &ep, -1);
-
- set_filter_expression(ep->stats.ueid, ep->stats.rnti, DL_Only,
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_mac_rach_cb)),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_mac_srs_cb)),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_dct_errors_cb)),
- gtk_entry_get_text(GTK_ENTRY(hs->dct_error_substring_te)),
- hs);
- }
-
-}
-
-/* Respond to UL/DL filter button being clicked by building and using filter */
-static void uldl_filter_clicked(GtkWindow *win _U_, mac_lte_stat_t *hs)
-{
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- /* If there is a UE selected, update its counters in details window */
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(hs->ue_table));
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- mac_lte_ep_t *ep;
-
- /* Get the UE details */
- gtk_tree_model_get(model, &iter, TABLE_COLUMN, &ep, -1);
-
- set_filter_expression(ep->stats.ueid, ep->stats.rnti, UL_and_DL,
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_mac_rach_cb)),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_mac_srs_cb)),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_dct_errors_cb)),
- gtk_entry_get_text(GTK_ENTRY(hs->dct_error_substring_te)),
- hs);
- }
-
-}
-
-
-/* What to do when a list item is selected/unselected */
-static void mac_lte_select_cb(GtkTreeSelection *sel, gpointer data)
-{
- mac_lte_stat_t *hs = (mac_lte_stat_t *)data;
- mac_lte_ep_t *ep;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- /* Show details of selected UE */
- gtk_tree_model_get(model, &iter, TABLE_COLUMN, &ep, -1);
- mac_lte_ue_details(ep, hs);
- }
- else {
- mac_lte_ue_details(NULL, hs);
- }
-}
-
-/* When DCT errors check-box is toggled, enable substring controls accordingly */
-static void mac_lte_dct_errors_cb(GtkTreeSelection *sel _U_, gpointer data)
-{
- mac_lte_stat_t *hs = (mac_lte_stat_t*)data;
- guint8 show_dct_errors = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_dct_errors_cb));
-
- gtk_widget_set_sensitive(hs->dct_error_substring_lb, show_dct_errors);
- gtk_widget_set_sensitive(hs->dct_error_substring_te, show_dct_errors);
-}
-
-
-/* Destroy the stats window */
-static void win_destroy_cb(GtkWindow *win _U_, gpointer data)
-{
- mac_lte_stat_t *hs = (mac_lte_stat_t *)data;
-
- remove_tap_listener(hs);
-
- if (hs->mac_lte_stat_dlg_w != NULL) {
- window_destroy(hs->mac_lte_stat_dlg_w);
- hs->mac_lte_stat_dlg_w = NULL;
- }
- mac_lte_stat_reset(hs);
- g_free(hs->filter);
- g_free(hs);
-}
-
-
-/* Create a new MAC LTE stats dialog */
-static void gtk_mac_lte_stat_init(const char *opt_arg, void *userdata _U_)
-{
- mac_lte_stat_t *hs;
- const char *filter = NULL;
- GString *error_string;
- GtkWidget *ues_scrolled_window;
- GtkWidget *bbox;
- GtkWidget *top_level_vbox;
-
- GtkWidget *system_row_hbox;
- GtkWidget *common_row_hbox;
- GtkWidget *ues_vb;
- GtkWidget *selected_ue_hb;
-
- GtkWidget *mac_lte_stat_system_lb;
- GtkWidget *mac_lte_stat_common_channel_lb;
- GtkWidget *mac_lte_stat_selected_ue_lb;
- GtkWidget *selected_ue_vbox[NUM_CHANNEL_COLUMNS];
- GtkWidget *selected_ue_column_titles[5];
-
- GtkWidget *mac_lte_stat_filters_lb;
- GtkWidget *filter_buttons_hb;
-
- GtkWidget *close_bt;
- GtkWidget *help_bt;
-
- GtkListStore *store;
-
- GtkTreeView *tree_view;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
- GtkTreeSelection *sel;
- gchar *display_name;
- gchar title[256];
- gint i, n;
-
- /* Check for a filter string */
- if (strncmp(opt_arg, "mac-lte,stat,", 13) == 0) {
- /* Skip those characters from filter to display */
- filter = opt_arg + 13;
- }
- else {
- /* No filter */
- filter = NULL;
- }
-
-
- /* Create dialog */
- hs = (mac_lte_stat_t *)g_malloc(sizeof(mac_lte_stat_t));
- hs->ep_list = NULL;
-
- /* Copy filter (so can be used for window title at reset) */
- hs->filter = g_strdup(filter);
-
- /* Set title */
- display_name = cf_get_display_name(&cfile);
- g_snprintf(title, sizeof(title), "Wireshark: LTE MAC Statistics: %s",
- display_name);
- g_free(display_name);
-
- /* Create top-level window */
- hs->mac_lte_stat_dlg_w = window_new_with_geom(GTK_WINDOW_TOPLEVEL, title, "LTE MAC Statistics", GTK_WIN_POS_CENTER_ON_PARENT);
-
- /* Window size */
- gtk_window_set_default_size(GTK_WINDOW(hs->mac_lte_stat_dlg_w), 750, 300);
-
- /* Will stack widgets vertically inside dlg */
- top_level_vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE); /* FALSE = not homogeneous */
- gtk_container_add(GTK_CONTAINER(hs->mac_lte_stat_dlg_w), top_level_vbox);
-
- gtk_container_set_border_width(GTK_CONTAINER(top_level_vbox), 6);
- gtk_widget_show(top_level_vbox);
-
-
- /**********************************************/
- /* System data */
- /**********************************************/
- mac_lte_stat_system_lb = gtk_frame_new("System Data");
-
- /* Add max UEs/TTI counts in one row */
- system_row_hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(mac_lte_stat_system_lb), system_row_hbox);
- gtk_container_set_border_width(GTK_CONTAINER(system_row_hbox), 5);
-
- gtk_box_pack_start(GTK_BOX(top_level_vbox), mac_lte_stat_system_lb, FALSE, FALSE, 0);
-
- /* Create labels (that will hold label and counter value) */
- hs->ul_max_ues_per_tti = gtk_label_new("Max UL UEs/TTI:");
- gtk_misc_set_alignment(GTK_MISC(hs->ul_max_ues_per_tti), 0.0f, .5f);
- gtk_box_pack_start(GTK_BOX(system_row_hbox), hs->ul_max_ues_per_tti, TRUE, TRUE, 0);
- gtk_widget_show(hs->ul_max_ues_per_tti);
-
- hs->dl_max_ues_per_tti = gtk_label_new("Max DL UEs/TTI:");
- gtk_misc_set_alignment(GTK_MISC(hs->dl_max_ues_per_tti), 0.0f, .5f);
- gtk_box_pack_start(GTK_BOX(system_row_hbox), hs->dl_max_ues_per_tti, TRUE, TRUE, 0);
- gtk_widget_show(hs->dl_max_ues_per_tti);
-
-
- /**********************************************/
- /* Common Channel data */
- /**********************************************/
- mac_lte_stat_common_channel_lb = gtk_frame_new("Common Channel Data");
-
- /* Will add BCH and PCH counters into one row */
- common_row_hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(mac_lte_stat_common_channel_lb), common_row_hbox);
- gtk_container_set_border_width(GTK_CONTAINER(common_row_hbox), 5);
-
- gtk_box_pack_start(GTK_BOX(top_level_vbox), mac_lte_stat_common_channel_lb, FALSE, FALSE, 0);
-
- /* Create labels (that will hold label and counter value) */
- hs->common_mib_frames = gtk_label_new("MIBs:");
- gtk_misc_set_alignment(GTK_MISC(hs->common_mib_frames), 0.0f, .5f);
- gtk_box_pack_start(GTK_BOX(common_row_hbox), hs->common_mib_frames, TRUE, TRUE, 0);
- gtk_widget_show(hs->common_mib_frames);
-
- hs->common_sib_frames = gtk_label_new("SIB Frames:");
- gtk_misc_set_alignment(GTK_MISC(hs->common_sib_frames), 0.0f, .5f);
- gtk_box_pack_start(GTK_BOX(common_row_hbox), hs->common_sib_frames, TRUE, TRUE, 0);
- gtk_widget_show(hs->common_sib_frames);
-
- hs->common_sib_bytes = gtk_label_new("SIB Bytes:");
- gtk_misc_set_alignment(GTK_MISC(hs->common_sib_bytes), 0.0f, .5f);
- gtk_box_pack_start(GTK_BOX(common_row_hbox), hs->common_sib_bytes, TRUE, TRUE, 0);
- gtk_widget_show(hs->common_sib_bytes);
-
- hs->common_pch_frames = gtk_label_new("PCH Frames:");
- gtk_misc_set_alignment(GTK_MISC(hs->common_pch_frames), 0.0f, .5f);
- gtk_box_pack_start(GTK_BOX(common_row_hbox), hs->common_pch_frames, TRUE, TRUE, 0);
- gtk_widget_show(hs->common_pch_frames);
-
- hs->common_pch_bytes = gtk_label_new("PCH Bytes:");
- gtk_misc_set_alignment(GTK_MISC(hs->common_pch_bytes), 0.0f, .5f);
- gtk_box_pack_start(GTK_BOX(common_row_hbox), hs->common_pch_bytes, TRUE, TRUE, 0);
- gtk_widget_show(hs->common_pch_bytes);
-
- hs->common_pch_paging_ids = gtk_label_new("PCH Paging IDs:");
- gtk_misc_set_alignment(GTK_MISC(hs->common_pch_paging_ids), 0.0f, .5f);
- gtk_box_pack_start(GTK_BOX(common_row_hbox), hs->common_pch_paging_ids, TRUE, TRUE, 0);
- gtk_widget_show(hs->common_pch_paging_ids);
-
-
- hs->common_rar_frames = gtk_label_new("RAR Frames:");
- gtk_misc_set_alignment(GTK_MISC(hs->common_rar_frames), 0.0f, .5f);
- gtk_box_pack_start(GTK_BOX(common_row_hbox), hs->common_rar_frames, TRUE, TRUE, 0);
- gtk_widget_show(hs->common_rar_frames);
-
- hs->common_rar_entries = gtk_label_new("RAR Entries:");
- gtk_misc_set_alignment(GTK_MISC(hs->common_rar_entries), 0.0f, .5f);
- gtk_box_pack_start(GTK_BOX(common_row_hbox), hs->common_rar_entries, TRUE, TRUE, 0);
- gtk_widget_show(hs->common_rar_entries);
-
- /**********************************************/
- /* UL/DL-SCH data */
- /**********************************************/
-
- hs->mac_lte_stat_ues_lb = gtk_frame_new("UL/DL-SCH Data (0 UEs)");
- ues_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(hs->mac_lte_stat_ues_lb), ues_vb);
- gtk_container_set_border_width(GTK_CONTAINER(ues_vb), 5);
-
- ues_scrolled_window = scrolled_window_new(NULL, NULL);
- gtk_box_pack_start(GTK_BOX(ues_vb), ues_scrolled_window, TRUE, TRUE, 0);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(ues_scrolled_window),
- GTK_SHADOW_IN);
-
- /* Create the table of UE data */
- store = gtk_list_store_new(NUM_UE_COLUMNS, G_TYPE_INT, G_TYPE_STRING, G_TYPE_INT,
- G_TYPE_INT, G_TYPE_INT, G_TYPE_FLOAT, G_TYPE_FLOAT, G_TYPE_INT, /* UL */
- G_TYPE_INT, G_TYPE_INT, G_TYPE_FLOAT, G_TYPE_FLOAT, G_TYPE_INT,
- G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, /* DL */
- G_TYPE_POINTER);
- hs->ue_table = GTK_TREE_VIEW(tree_view_new(GTK_TREE_MODEL(store)));
- gtk_container_add(GTK_CONTAINER (ues_scrolled_window), GTK_WIDGET(hs->ue_table));
- g_object_unref(G_OBJECT(store));
-
- tree_view = hs->ue_table;
- gtk_tree_view_set_headers_visible(tree_view, TRUE);
- gtk_tree_view_set_headers_clickable(tree_view, TRUE);
-
- /* Create the titles for each column of the per-UE table */
- for (i = 0; i < TABLE_COLUMN; i++) {
- if ((i == UL_PADDING_PERCENT_COLUMN) ||
- (i == DL_PADDING_PERCENT_COLUMN)) {
- /* Show % as progress bar */
- /* XXX: "progess" rendering doesn't seem to work for Gtk3 ?? */
- renderer = gtk_cell_renderer_progress_new();
- column = gtk_tree_view_column_new_with_attributes(ue_titles[i], renderer,
- "text", i,
- "value", i,
- NULL);
- }
- else {
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes(ue_titles[i], renderer,
- "text", i, NULL);
- }
- gtk_tree_view_column_set_sort_column_id(column, i);
-
- if (i == 0) {
- /* Expand first column (RNTI, which is Key) */
- gtk_tree_view_column_set_expand(column, TRUE);
- } else {
- /* For other columns, set all of the free space to be on the left */
- g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
- }
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_append_column(tree_view, column);
- }
-
- /* Set callback function for selecting a row in the UE table */
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(hs->ue_table));
- gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
- g_signal_connect(sel, "changed", G_CALLBACK(mac_lte_select_cb), hs);
-
- gtk_box_pack_start(GTK_BOX(top_level_vbox), hs->mac_lte_stat_ues_lb, TRUE, TRUE, 0);
-
-
- /**********************************************/
- /* Details of selected UE */
- /**********************************************/
-
- mac_lte_stat_selected_ue_lb = gtk_frame_new("Selected UE details");
-
- selected_ue_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6, FALSE);
- gtk_container_add(GTK_CONTAINER(mac_lte_stat_selected_ue_lb), selected_ue_hb);
- gtk_container_set_border_width(GTK_CONTAINER(selected_ue_hb), 5);
-
- /********************************/
- /* First (row titles) column */
- selected_ue_vbox[0] = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(selected_ue_hb), selected_ue_vbox[0], TRUE, TRUE, 0);
-
- selected_ue_column_titles[0] = gtk_label_new("");
- gtk_misc_set_alignment(GTK_MISC(selected_ue_column_titles[0]), 0.0f, 0.0f);
- gtk_box_pack_start(GTK_BOX(selected_ue_vbox[0]), selected_ue_column_titles[0], FALSE, FALSE, 0);
-
- for (n=1; n < 5; n++) {
- selected_ue_column_titles[n] = gtk_label_new(selected_ue_row_names[n-1]);
- gtk_misc_set_alignment(GTK_MISC(selected_ue_column_titles[n]), 0.0f, 0.0f);
- gtk_box_pack_start(GTK_BOX(selected_ue_vbox[0]), selected_ue_column_titles[n], FALSE, FALSE, 0);
- gtk_widget_show(selected_ue_column_titles[n]);
- }
-
-
- /*************************/
- /* Other columns */
- for (i=CCCH_COLUMN; i < NUM_CHANNEL_COLUMNS; i++) {
- selected_ue_vbox[i] = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(selected_ue_hb), selected_ue_vbox[i], TRUE, TRUE, 0);
-
- /* Channel title */
- hs->selected_ue_column_entry[i][0] = gtk_label_new(channel_titles[i-1]);
- gtk_misc_set_alignment(GTK_MISC(hs->selected_ue_column_entry[i][0]), 0.5f, 0.0f);
- gtk_box_pack_start(GTK_BOX(selected_ue_vbox[i]), hs->selected_ue_column_entry[i][0], FALSE, FALSE, 0);
-
- /* Counts for this channel */
- for (n=1; n < 5; n++) {
- hs->selected_ue_column_entry[i][n] = gtk_label_new("0");
- gtk_misc_set_alignment(GTK_MISC(hs->selected_ue_column_entry[i][n]), 1.0f, 0.0f);
- gtk_box_pack_start(GTK_BOX(selected_ue_vbox[i]), hs->selected_ue_column_entry[i][n], FALSE, FALSE, 0);
- gtk_widget_show(hs->selected_ue_column_entry[i][n]);
- }
- }
-
- gtk_box_pack_start(GTK_BOX(top_level_vbox), mac_lte_stat_selected_ue_lb, FALSE, FALSE, 0);
-
-
- /**************************************/
- /* Filter on RNTI/UEId */
- /**************************************/
- mac_lte_stat_filters_lb = gtk_frame_new("Filter on UE");
-
- /* Horizontal row of filter controls */
- filter_buttons_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6, FALSE);
- gtk_container_add(GTK_CONTAINER(mac_lte_stat_filters_lb), filter_buttons_hb);
- gtk_container_set_border_width(GTK_CONTAINER(filter_buttons_hb), 2);
-
- /* Add filters box to top-level window */
- gtk_box_pack_start(GTK_BOX(top_level_vbox), mac_lte_stat_filters_lb, FALSE, FALSE, 0);
-
- /* Filter buttons */
-
- /* UL only */
- hs->ul_filter_bt = gtk_button_new_with_label("Set UL display filter on selected this UE");
- gtk_box_pack_start(GTK_BOX(filter_buttons_hb), hs->ul_filter_bt, FALSE, FALSE, 0);
- g_signal_connect(hs->ul_filter_bt, "clicked", G_CALLBACK(ul_filter_clicked), hs);
- gtk_widget_set_sensitive(hs->ul_filter_bt, FALSE);
- gtk_widget_show(hs->ul_filter_bt);
- gtk_widget_set_tooltip_text(hs->ul_filter_bt,
- "Generate and set a filter showing only UL frames with selected RNTI and UEId");
-
- /* DL only */
- hs->dl_filter_bt = gtk_button_new_with_label("Set DL display filter on selected this UE");
- gtk_box_pack_start(GTK_BOX(filter_buttons_hb), hs->dl_filter_bt, FALSE, FALSE, 0);
- g_signal_connect(hs->dl_filter_bt, "clicked", G_CALLBACK(dl_filter_clicked), hs);
- gtk_widget_set_sensitive(hs->dl_filter_bt, FALSE);
- gtk_widget_show(hs->dl_filter_bt);
- gtk_widget_set_tooltip_text(hs->dl_filter_bt,
- "Generate and set a filter showing only DL frames with selected RNTI and UEId");
-
- /* UL and DL */
- hs->uldl_filter_bt = gtk_button_new_with_label("Set UL / DL display filter on selected this UE");
- gtk_box_pack_start(GTK_BOX(filter_buttons_hb), hs->uldl_filter_bt, FALSE, FALSE, 0);
- g_signal_connect(hs->uldl_filter_bt, "clicked", G_CALLBACK(uldl_filter_clicked), hs);
- gtk_widget_set_sensitive(hs->uldl_filter_bt, FALSE);
- gtk_widget_show(hs->uldl_filter_bt);
- gtk_widget_set_tooltip_text(hs->uldl_filter_bt,
- "Generate and set a filter showing only frames with selected RNTI and UEId");
-
- /* Show MAC RACH */
- hs->show_mac_rach_cb = gtk_check_button_new_with_mnemonic("Show MAC RACH");
- gtk_widget_set_sensitive(hs->show_mac_rach_cb, FALSE);
- gtk_box_pack_start(GTK_BOX(filter_buttons_hb), hs->show_mac_rach_cb, TRUE, TRUE, 0);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(hs->show_mac_rach_cb), FALSE);
- gtk_widget_set_tooltip_text(hs->show_mac_rach_cb, "When checked, generated filters will show "
- "MAC RACH attempts for the UE");
-
- /* Show MAC SRs */
- hs->show_mac_srs_cb = gtk_check_button_new_with_mnemonic("Show MAC SRs");
- gtk_widget_set_sensitive(hs->show_mac_srs_cb, FALSE);
- gtk_box_pack_start(GTK_BOX(filter_buttons_hb), hs->show_mac_srs_cb, TRUE, TRUE, 0);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(hs->show_mac_srs_cb), FALSE);
- gtk_widget_set_tooltip_text(hs->show_mac_srs_cb, "When checked, generated filters will show "
- "MAC SRs for the UE");
-
-
- /* Allow DCT errors to be shown... */
- hs->show_dct_errors_cb = gtk_check_button_new_with_mnemonic("Show DCT2000 error strings");
- gtk_box_pack_start(GTK_BOX(filter_buttons_hb), hs->show_dct_errors_cb, TRUE, TRUE, 0);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(hs->show_dct_errors_cb), FALSE);
- g_signal_connect(hs->show_dct_errors_cb, "toggled", G_CALLBACK(mac_lte_dct_errors_cb), hs);
- gtk_widget_set_tooltip_text(hs->show_dct_errors_cb, "When checked, generated filters will "
- "include DCT2000 error strings");
- /* Initially disabled */
- gtk_widget_set_sensitive(hs->show_dct_errors_cb, FALSE);
-
- /* ... optionally limited by a substring */
- hs->dct_error_substring_lb = gtk_label_new("...containing");
- gtk_box_pack_start(GTK_BOX(filter_buttons_hb), hs->dct_error_substring_lb, FALSE, FALSE, 0);
- gtk_widget_show(hs->dct_error_substring_lb);
- gtk_widget_set_sensitive(hs->dct_error_substring_lb, FALSE);
-
- hs->dct_error_substring_te = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(filter_buttons_hb), hs->dct_error_substring_te, FALSE, FALSE, 0);
- gtk_widget_show(hs->dct_error_substring_te);
- gtk_widget_set_sensitive(hs->dct_error_substring_te, FALSE);
- gtk_widget_set_tooltip_text(hs->dct_error_substring_te,
- "If given, only match error strings containing this substring");
-
-
- /**********************************************/
- /* Register the tap listener */
- /**********************************************/
-
- error_string = register_tap_listener("mac-lte", hs,
- filter, 0,
- mac_lte_stat_reset,
- mac_lte_stat_packet,
- mac_lte_stat_draw);
- if (error_string) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
- g_string_free(error_string, TRUE);
- g_free(hs);
- return;
- }
-
-
- /************************************/
- /* Button row. */
- /************************************/
-
- bbox = dlg_button_row_new (GTK_STOCK_CLOSE, GTK_STOCK_HELP, NULL);
- gtk_box_pack_end (GTK_BOX(top_level_vbox), bbox, FALSE, FALSE, 0);
-
- /* Add the close button */
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(hs->mac_lte_stat_dlg_w, close_bt, window_cancel_button_cb);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_STATS_LTE_MAC_TRAFFIC_DIALOG);
-
- /* Set callbacks */
- g_signal_connect(hs->mac_lte_stat_dlg_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(hs->mac_lte_stat_dlg_w, "destroy", G_CALLBACK(win_destroy_cb), hs);
-
- /* Show the window */
- gtk_widget_show_all(hs->mac_lte_stat_dlg_w);
- window_present(hs->mac_lte_stat_dlg_w);
-
- /* Retap */
- cf_retap_packets(&cfile);
- gdk_window_raise(gtk_widget_get_window(hs->mac_lte_stat_dlg_w));
-}
-
-
-static tap_param mac_lte_stat_params[] = {
- { PARAM_FILTER, "filter", "Filter", NULL, TRUE }
-};
-
-static tap_param_dlg mac_lte_stat_dlg = {
- "LTE MAC Stats",
- "mac-lte,stat",
- gtk_mac_lte_stat_init,
- -1,
- G_N_ELEMENTS(mac_lte_stat_params),
- mac_lte_stat_params,
- NULL
-};
-
-
-/* Register this tap listener (need void on own so line register function found) */
-void register_tap_listener_mac_lte_stat(void)
-{
- register_param_stat(&mac_lte_stat_dlg, "_MAC", REGISTER_STAT_GROUP_TELEPHONY_LTE);
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/macros_dlg.c b/ui/gtk/macros_dlg.c
deleted file mode 100644
index f543e1017a..0000000000
--- a/ui/gtk/macros_dlg.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/* macros_dlg.c
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 2001 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-#include <stdlib.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/dfilter/dfilter-macro.h>
-#include <epan/uat-int.h>
-
-#include "globals.h"
-#include "ui/gtk/uat_gui.h"
-#include "ui/gtk/macros_dlg.h"
-#include "ui/gtk/gtkglobals.h"
-
-void macros_post_update(void) {
- dfilter_t *dfp;
- /* invalidate filter if it stops being valid */
- if (!dfilter_compile(cfile.dfilter, &dfp, NULL)) {
- g_free(cfile.dfilter);
- cfile.dfilter = NULL;
- } else if (dfp) {
- g_free(dfp);
- }
- g_signal_emit_by_name(main_display_filter_widget, "changed");
-}
-
-void macros_init (void) {
- uat_t* dfmuat;
- dfilter_macro_get_uat(&dfmuat);
- dfmuat->post_update_cb = macros_post_update;
-}
-
-void macros_dialog_cb(GtkWidget *w _U_, gpointer data _U_) {
- uat_t* dfmuat;
- dfilter_macro_get_uat(&dfmuat);
- uat_window_cb(NULL,dfmuat);
-}
-
-
-/*
- * Editor modelines - http://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/gtk/macros_dlg.h b/ui/gtk/macros_dlg.h
deleted file mode 100644
index 4e549ed247..0000000000
--- a/ui/gtk/macros_dlg.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* macros_dlg.h
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 2001 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __MACROS_DLG_H__
-#define __MACROS_DLG_H__
-
-void macros_post_update(void);
-void macros_init (void);
-void macros_dialog_cb(GtkWidget*, gpointer);
-
-#endif /* __MACROS_DLG_H__ */
diff --git a/ui/gtk/main.gresources.xml b/ui/gtk/main.gresources.xml
deleted file mode 100644
index 9cbbfb9d34..0000000000
--- a/ui/gtk/main.gresources.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gresources>
- <gresource prefix="/org/wireshark">
- <file>image/wsicon16.png</file>
- <file>image/wsicon24.png</file>
- <file>image/wsicon32.png</file>
- <file>image/wsicon48.png</file>
- <file>image/wsicon64.png</file>
-
- <file>image/wsiconcap16.png</file>
- <file>image/wsiconcap24.png</file>
- <file>image/wsiconcap32.png</file>
- <file>image/wsiconcap48.png</file>
- <file>image/wsiconcap64.png</file>
-
- <file>image/wssplash.png</file>
- <file>image/wssplash_dev.png</file>
-
- <file>image/layout_1.png</file>
- <file>image/layout_2.png</file>
- <file>image/layout_3.png</file>
- <file>image/layout_4.png</file>
- <file>image/layout_5.png</file>
- <file>image/layout_6.png</file>
-
- <file>image/capture_comment_add.png</file>
- <file>image/capture_comment_update.png</file>
- <file>image/capture_comment_disabled.png</file>
-
- <file>image/toolbar/network_bluetooth_16.png</file>
- <file>image/toolbar/network_usb_16.png</file>
- <file>image/toolbar/network_wired_16.png</file>
- <file>image/toolbar/network_wireless_16.png</file>
-
- <file>image/toolbar/remote_arrow_16.png</file>
- <file>image/toolbar/remote_globe_16.png</file>
- <file>image/toolbar/remote_sat_16.png</file>
-
- <file>image/toolbar/pipe_16.png</file>
-
- <file>image/toolbar/capture_interfaces_16.png</file>
- <file>image/toolbar/gnome_emblem_web_16.png</file>
- <file>image/toolbar/capture_interfaces_24.png</file>
- <file>image/toolbar/gnome_emblem_web_24.png</file>
-
- <file>image/stock_icons/14x14/x-expert-chat.png</file>
- <file>image/stock_icons/14x14/x-expert-error.png</file>
- <file>image/stock_icons/14x14/x-expert-none.png</file>
- <file>image/stock_icons/14x14/x-expert-note.png</file>
- <file>image/stock_icons/14x14/x-expert-warn.png</file>
- <file>image/expert_ok.png</file>
-
- <file>image/stock_icons/16x16/x-capture-file-save.png</file>
- <file>image/stock_icons/16x16/x-capture-options.png</file>
- <file>image/stock_icons/16x16/x-capture-restart.png</file>
- <file>image/stock_icons/16x16/x-capture-start.png</file>
- <file>image/stock_icons/16x16/x-capture-stop.png</file>
-
- <file>image/stock_icons/24x24/x-capture-file-save.png</file>
- <file>image/stock_icons/24x24/x-capture-options.png</file>
- <file>image/stock_icons/24x24/x-capture-restart.png</file>
- <file>image/stock_icons/24x24/x-capture-start.png</file>
- <file>image/stock_icons/24x24/x-capture-stop.png</file>
- </gresource>
-</gresources>
diff --git a/ui/gtk/main_80211_toolbar.c b/ui/gtk/main_80211_toolbar.c
deleted file mode 100644
index 32fa326f82..0000000000
--- a/ui/gtk/main_80211_toolbar.c
+++ /dev/null
@@ -1,433 +0,0 @@
-/* main_80211_toolbar.c
- * The 802.11 toolbar by Pontus Fuchs <pontus.fuchs@gmail.com>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/*
- * This file implements the "80211" toolbar for Wireshark.
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-
-
-#include "main_toolbar.h"
-
-#include "ui/ws_ui_util.h"
-#include "ui/gtk/old-gtk-compat.h"
-#include "ui/gtk/main_80211_toolbar.h"
-
-#include "caputils/ws80211_utils.h"
-#include <capchild/capture_session.h>
-#include <capchild/capture_sync.h>
-
-#include <wsutil/frequency-utils.h>
-#include <wsutil/strtoi.h>
-
-static GtkWidget *tb80211_tb, *tb80211_iface_list_box, *tb80211_freq_list_box, *tb80211_chan_type_box, *tb80211_info_label;
-
-static GArray *tb80211_interfaces;
-static struct ws80211_interface *tb80211_current_iface;
-static gint32 tb80211_current_freq = -1;
-static gint32 tb80211_current_type = -1;
-
-static gboolean tb80211_dont_set_chan;
-static gboolean tb80211_dont_set_iface;
-
-static void tb80211_set_info(const char *errstr)
-{
- gtk_label_set_markup(GTK_LABEL(tb80211_info_label), errstr);
-}
-
-static
-void add_channel_type(const char *type, int oldtype, int indx )
-{
- gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(tb80211_chan_type_box), type);
-
- if (oldtype != -1 && oldtype == ws80211_str_to_chan_type(type)) {
- gtk_combo_box_set_active(GTK_COMBO_BOX(tb80211_chan_type_box), indx);
- tb80211_current_type = oldtype;
- }
-}
-
-static
-void tb80211_update_chan_type(void)
-{
- static unsigned int tb80211_type_cnt;
- unsigned int i;
- int oldtype = -1;
- for (i = 0; i < tb80211_type_cnt; i++) {
- gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(tb80211_chan_type_box), 0);
- }
-
- if (!tb80211_current_iface) {
- return;
- }
-
- oldtype = tb80211_current_type;
- tb80211_current_type = -1;
-
- i = 0;
- add_channel_type(CHAN_NO_HT, oldtype, i++);
-
- if (tb80211_current_iface->channel_types & (1 << WS80211_CHAN_HT20)) {
- add_channel_type(CHAN_HT20, oldtype, i++);
- }
- if (tb80211_current_iface->channel_types & (1 << WS80211_CHAN_HT40MINUS)) {
- add_channel_type(CHAN_HT40MINUS, oldtype, i++);
- }
- if (tb80211_current_iface->channel_types & (1 << WS80211_CHAN_HT40PLUS)) {
- add_channel_type(CHAN_HT40PLUS, oldtype, i++);
- }
- tb80211_type_cnt = i;
-}
-
-static
-void tb80211_update_freq(void)
-{
- static unsigned int tb80211_freq_cnt;
- unsigned int i;
- gchar *str;
- gint32 oldfreq = 0;
-
- for (i = 0; i < tb80211_freq_cnt; i++) {
- gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(tb80211_freq_list_box), 0);
- }
-
- oldfreq = tb80211_current_freq;
- tb80211_current_freq = -1;
-
- if (!tb80211_current_iface)
- return;
-
- tb80211_freq_cnt = tb80211_current_iface->frequencies->len;
- for (i = 0; i < tb80211_freq_cnt; i++) {
- int freq;
- freq = g_array_index(tb80211_current_iface->frequencies, int, i);
- str = g_strdup_printf("%d MHz (%d)", freq, ieee80211_mhz_to_chan(freq));
- gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(tb80211_freq_list_box), str);
- g_free(str);
-
- if (freq == oldfreq) {
- gtk_combo_box_set_active(GTK_COMBO_BOX(tb80211_freq_list_box), i);
- tb80211_current_freq = oldfreq;
- }
- }
-}
-
-static
-void tb80211_update_freq_and_type(void)
-{
- tb80211_dont_set_chan = TRUE;
- tb80211_update_freq();
- tb80211_update_chan_type();
- tb80211_dont_set_chan = FALSE;
-}
-
-#ifdef HAVE_LIBPCAP
-/* Get currently selected channel type type enum */
-static
-int get_selected_channel_type(void)
-{
- int ret;
- gchar *s = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(tb80211_chan_type_box));
-
- ret = ws80211_str_to_chan_type(s);
-
- g_free(s);
- return ret;
-}
-
-/* Invoke dumpcap to set channel */
-static int
-tb80211_do_set_channel(char *iface, int freq, int type)
-{
- gchar *freq_s;
- const gchar *type_s;
- gchar *data, *primary_msg, *secondary_msg;
- int ret;
-
- freq_s = g_strdup_printf("%d", freq);
- type_s = ws80211_chan_type_to_str(type);
- ret = sync_interface_set_80211_chan(iface, freq_s, type_s, NULL, NULL,
- &data, &primary_msg, &secondary_msg, main_window_update);
-
- /* Parse the error msg */
- if (ret && primary_msg) {
- ws_strtoi32(primary_msg, NULL, &ret);
- return ret;
- }
- g_free(data);
- g_free(primary_msg);
- g_free(secondary_msg);
- g_free(freq_s);
- return ret;
-}
-
-/* Called on freq and type combo box change. */
-static void
-tb80211_set_channel(void)
-{
- gchar *info = NULL;
- int err, selected_chan, new_type, new_freq;
-
- GtkComboBox *freq_combo = GTK_COMBO_BOX(tb80211_freq_list_box);
-
- GtkComboBox *type_combo = GTK_COMBO_BOX(tb80211_chan_type_box);
-
- selected_chan = gtk_combo_box_get_active(freq_combo);
- if (selected_chan < 0)
- return;
-
- new_freq = g_array_index(tb80211_current_iface->frequencies, int, selected_chan);
- new_type = get_selected_channel_type();
-
- err = tb80211_do_set_channel(tb80211_current_iface->ifname, new_freq, new_type);
- if (err) {
- info = g_strdup_printf("<b>Failed to set channel: %s</b>", g_strerror(abs(err)));
- /* Try to set back to last working chan */
- err = tb80211_do_set_channel(tb80211_current_iface->ifname, tb80211_current_freq, tb80211_current_type);
- if (err) {
- gtk_combo_box_set_active(freq_combo, -1);
- gtk_combo_box_set_active(type_combo, -1);
- tb80211_current_freq = -1;
- tb80211_current_type = -1;
- }
- else {
- tb80211_update_freq_and_type();
- }
- }
- else {
- info = g_strdup_printf("%s Switched to %d MHz (%d)", tb80211_current_iface->ifname, new_freq, ieee80211_mhz_to_chan(new_freq));
- tb80211_current_freq = new_freq;
- tb80211_current_type = new_type;
- }
- tb80211_set_info(info);
- g_free(info);
-}
-
-static void
-tb80211_set_chan_cb(GtkWidget *widget _U_, gpointer data _U_)
-{
- if (!tb80211_current_iface || tb80211_dont_set_chan)
- return;
-
- tb80211_set_channel();
-}
-#endif
-
-static void
-tb80211_iface_changed_cb(GtkWidget *widget, gpointer data _U_)
-{
- unsigned int i;
- int ret;
- struct ws80211_interface *iface;
- struct ws80211_iface_info iface_info;
- gchar *active;
-
- if (tb80211_dont_set_iface)
- return;
-
- active = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(widget));
-
- if (!active || tb80211_dont_set_chan)
- goto out_free;
-
- for (i = 0; i < tb80211_interfaces->len; i++) {
- iface = g_array_index(tb80211_interfaces, struct ws80211_interface *, i);
- if (strcmp(active, iface->ifname) == 0) {
- tb80211_current_iface = iface;
- break;
- }
- }
-
- tb80211_current_freq = -1;
- tb80211_current_type = -1;
- if (tb80211_current_iface) {
- ret = ws80211_get_iface_info(tb80211_current_iface->ifname, &iface_info);
- if (!ret) {
- tb80211_current_freq = iface_info.current_freq;
- tb80211_current_type = iface_info.current_chan_type;
- }
- }
- tb80211_update_freq_and_type();
-
-out_free:
- g_free(active);
-}
-
-void
-tb80211_refresh_interfaces(void)
-{
- struct ws80211_interface *iface;
- unsigned int i;
- gboolean same = FALSE;
- gchar *selected_iface = NULL, *info;
-
- if (!tb80211_tb)
- return;
-
- if (tb80211_interfaces) {
- selected_iface = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(tb80211_iface_list_box));
-
- for (i = 0; i < tb80211_interfaces->len; i++)
- gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(tb80211_iface_list_box), 0);
-
- ws80211_free_interfaces(tb80211_interfaces);
- tb80211_interfaces = NULL;
- tb80211_current_iface = NULL;
- }
- tb80211_interfaces = ws80211_find_interfaces();
-
- if (!tb80211_interfaces) {
- goto out_free;
- }
-
- tb80211_dont_set_iface = TRUE;
- for (i = 0; i < tb80211_interfaces->len; i++) {
- iface = g_array_index(tb80211_interfaces, struct ws80211_interface *, i);
- gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(tb80211_iface_list_box), iface->ifname);
-
- if (selected_iface && strcmp(selected_iface, iface->ifname) == 0) {
- gtk_combo_box_set_active(GTK_COMBO_BOX(tb80211_iface_list_box), i);
- tb80211_current_iface = iface;
- same = TRUE;
- }
- }
- tb80211_dont_set_iface = FALSE;
-
- /* Reset selectors if interface disappeared */
- if (!same) {
- gtk_combo_box_set_active(GTK_COMBO_BOX(tb80211_iface_list_box), -1);
- gtk_combo_box_set_active(GTK_COMBO_BOX(tb80211_freq_list_box), -1);
- gtk_combo_box_set_active(GTK_COMBO_BOX(tb80211_chan_type_box), -1);
- }
-
- info = g_strdup_printf("%d monitor interfaces found", tb80211_interfaces->len);
- tb80211_set_info(info);
- g_free(info);
-out_free:
- g_free(selected_iface);
-}
-
-static void
-tb80211_add_label(const gchar *text, GtkWidget *tb)
-{
- GtkWidget *label;
- GtkToolItem *label_ti;
-
- label_ti = gtk_tool_item_new();
- gtk_widget_show(GTK_WIDGET (label_ti));
- label = gtk_label_new(text);
- gtk_widget_show(GTK_WIDGET (label));
- gtk_container_add(GTK_CONTAINER(label_ti), label);
- gtk_toolbar_insert(GTK_TOOLBAR(tb), label_ti, -1);
-}
-
-GtkWidget *
-ws80211_toolbar_new(void)
-{
- GtkToolItem *ti;
- int ret;
-
- /* filter toolbar */
- tb80211_tb = gtk_toolbar_new();
- gtk_orientable_set_orientation(GTK_ORIENTABLE(tb80211_tb),
- GTK_ORIENTATION_HORIZONTAL);
-
- gtk_widget_show(tb80211_tb);
-
- tb80211_add_label(" Interface: ", tb80211_tb);
-
- ti = gtk_tool_item_new();
- gtk_widget_show(GTK_WIDGET (ti));
- tb80211_iface_list_box = gtk_combo_box_text_new();
- g_signal_connect(tb80211_iface_list_box, "changed", G_CALLBACK(tb80211_iface_changed_cb), NULL);
- gtk_container_add(GTK_CONTAINER(ti), tb80211_iface_list_box);
- gtk_widget_show(GTK_WIDGET (tb80211_iface_list_box));
- gtk_toolbar_insert(GTK_TOOLBAR(tb80211_tb), ti, -1);
-
- tb80211_add_label(" Frequency: ", tb80211_tb);
-
- ti = gtk_tool_item_new();
- gtk_widget_show(GTK_WIDGET (ti));
- tb80211_freq_list_box = gtk_combo_box_text_new();
-#ifdef HAVE_LIBPCAP
- g_signal_connect(tb80211_freq_list_box, "changed", G_CALLBACK(tb80211_set_chan_cb), NULL);
-#else
- gtk_widget_set_sensitive(GTK_WIDGET(tb80211_freq_list_box), FALSE);
-#endif
- gtk_container_add(GTK_CONTAINER(ti), tb80211_freq_list_box);
- gtk_widget_show(GTK_WIDGET (tb80211_freq_list_box));
- gtk_toolbar_insert(GTK_TOOLBAR(tb80211_tb), ti, -1);
-
- ti = gtk_tool_item_new();
- gtk_widget_show(GTK_WIDGET (ti));
- tb80211_chan_type_box = gtk_combo_box_text_new();
-#ifdef HAVE_LIBPCAP
- g_signal_connect(tb80211_chan_type_box, "changed", G_CALLBACK(tb80211_set_chan_cb), NULL);
-#else
- gtk_widget_set_sensitive(GTK_WIDGET(tb80211_freq_list_box), FALSE);
-#endif
- gtk_container_add(GTK_CONTAINER(ti), tb80211_chan_type_box);
- gtk_widget_show(GTK_WIDGET (tb80211_chan_type_box));
- gtk_toolbar_insert(GTK_TOOLBAR(tb80211_tb), ti, -1);
-
- ti = gtk_separator_tool_item_new();
- gtk_widget_show(GTK_WIDGET (ti));
- gtk_toolbar_insert(GTK_TOOLBAR(tb80211_tb), ti, -1);
-
- ti = gtk_tool_item_new();
- gtk_widget_show(GTK_WIDGET (ti));
- tb80211_info_label = gtk_label_new("");
- gtk_container_add(GTK_CONTAINER(ti), tb80211_info_label);
- gtk_widget_show(GTK_WIDGET (tb80211_info_label));
- gtk_toolbar_insert(GTK_TOOLBAR(tb80211_tb), ti, -1);
-
- /* make current preferences effective */
- toolbar_redraw_all();
-
- ret = ws80211_init();
- if(ret) {
- tb80211_set_info("<b>Failed to initialize ws80211</b>");
- } else {
- tb80211_refresh_interfaces();
- }
-
- return tb80211_tb;
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/main_80211_toolbar.h b/ui/gtk/main_80211_toolbar.h
deleted file mode 100644
index d9cd27ba26..0000000000
--- a/ui/gtk/main_80211_toolbar.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2012, Pontus Fuchs <pontus.fuchs@gmail.com>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __80211_TOOLBAR_H__
-#define __80211_TOOLBAR_H__
-
-GtkWidget
-*ws80211_toolbar_new(void);
-
-void
-tb80211_refresh_interfaces(void);
-
-#endif
diff --git a/ui/gtk/main_airpcap_toolbar.c b/ui/gtk/main_airpcap_toolbar.c
deleted file mode 100644
index 1cd89e4eed..0000000000
--- a/ui/gtk/main_airpcap_toolbar.c
+++ /dev/null
@@ -1,429 +0,0 @@
-/* main_airpcap_toolbar.c
- * The airpcap toolbar
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/*
- * This file implements the wireless toolbar for Wireshark.
- */
-
-#include "config.h"
-
-#include <gtk/gtk.h>
-#include "ui/gtk/old-gtk-compat.h"
-
-#include "epan/epan.h"
-
-#include "ui/recent.h"
-#include "simple_dialog.h"
-
-#include "main.h"
-#include "main_airpcap_toolbar.h"
-
-#include "keys.h"
-
-#include "caputils/airpcap.h"
-#include "caputils/airpcap_loader.h"
-#include "airpcap_dlg.h"
-#include "airpcap_gui_utils.h"
-
-#include <epan/crypt/dot11decrypt_ws.h>
-
-
-gboolean block_toolbar_signals = FALSE;
-static GtkWidget *driver_warning_dialog;
-
-
-/*
- * Callback for the wrong crc combo
- */
-static void
-airpcap_toolbar_fcs_filter_combo_cb(GtkWidget *fcs_filter_cb, gpointer user_data _U_)
-{
- PAirpcapHandle ad;
- gchar ebuf[AIRPCAP_ERRBUF_SIZE];
- gchar *fcs_filter_str;
-
- if (fcs_filter_cb != NULL && !block_toolbar_signals && (airpcap_if_active != NULL)) {
- fcs_filter_str = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(fcs_filter_cb));
- ad = airpcap_if_open(airpcap_if_active->name, ebuf);
-
- if (fcs_filter_str && (g_ascii_strcasecmp("", fcs_filter_str)) && ad) {
- airpcap_if_selected->CrcValidationOn = airpcap_get_validation_type(fcs_filter_str);
- airpcap_if_selected->saved = FALSE;
- airpcap_if_set_fcs_validation(ad,airpcap_if_active->CrcValidationOn);
- /* Save configuration */
- airpcap_if_store_cur_config_as_adapter_default(ad);
- airpcap_if_close(ad);
- }
- g_free(fcs_filter_str);
- }
-}
-
-void
-airpcap_toolbar_encryption_cb(GtkWidget *entry _U_, gpointer user_data _U_)
-{
- /* We need to directly access the .dll functions here... */
- gchar ebuf[AIRPCAP_ERRBUF_SIZE];
- PAirpcapHandle ad;
-
- gint n = 0;
- gint i = 0;
- airpcap_if_info_t* curr_if = NULL;
-
- /* Apply changes to the current adapter */
- if( (airpcap_if_active != NULL)) {
- ad = airpcap_if_open(airpcap_if_active->name, ebuf);
-
- if(ad) {
- if(airpcap_if_active->DecryptionOn == AIRPCAP_DECRYPTION_ON) {
- airpcap_if_active->DecryptionOn = AIRPCAP_DECRYPTION_OFF;
- airpcap_if_set_decryption_state(ad,airpcap_if_active->DecryptionOn);
- /* Save configuration */
- if(!airpcap_if_store_cur_config_as_adapter_default(ad)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Cannot save configuration.\nRemember that in order to store the configuration in the registry you have to:\n\n- Close all the airpcap-based applications.\n- Be sure to have administrative privileges.");
- }
- airpcap_if_close(ad);
- } else {
- airpcap_if_active->DecryptionOn = AIRPCAP_DECRYPTION_ON;
- airpcap_if_set_decryption_state(ad,airpcap_if_active->DecryptionOn);
- /* Save configuration */
- if(!airpcap_if_store_cur_config_as_adapter_default(ad)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Cannot save configuration.\nRemember that in order to store the configuration in the registry you have to:\n\n- Close all the airpcap-based applications.\n- Be sure to have administrative privileges.");
- }
- airpcap_if_close(ad);
- }
- }
- } else {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "No active AirPcap Adapter selected.");
- return;
- }
-
- if (!(g_airpcap_if_list == NULL)) {
- n = g_list_length(g_airpcap_if_list);
-
- /* The same kind of settings should be propagated to all the adapters */
- /* Apply this change to all the adapters !!! */
- for(i = 0; i < n; i++) {
- curr_if = (airpcap_if_info_t*)g_list_nth_data(g_airpcap_if_list,i);
-
- if( (curr_if != NULL) && (curr_if != airpcap_if_selected) ) {
- ad = airpcap_if_open(curr_if->name, ebuf);
- if(ad) {
- curr_if->DecryptionOn = airpcap_if_selected->DecryptionOn;
- airpcap_if_set_decryption_state(ad,curr_if->DecryptionOn);
- /* Save configuration for the curr_if */
- if(!airpcap_if_store_cur_config_as_adapter_default(ad)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Unable to save configuration."
- "\nIn order to store the configuration in the registry you"
- "\nhave to close all other AirPcap-based applications and"
- "\nhave Administrator privileges.");
- }
- airpcap_if_close(ad);
- }
- }
- }
- } else {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "AirPcap Adapter Error.");
- return;
- }
-}
-
-/*
- * Callback for the Advanced Wireless Settings button
- */
-static void
-toolbar_display_airpcap_advanced_cb(GtkWidget *w, gpointer data)
-{
- int *from_widget;
-
- from_widget = (gint*)g_malloc(sizeof(gint));
- *from_widget = AIRPCAP_ADVANCED_FROM_TOOLBAR;
- g_object_set_data(G_OBJECT(wireless_tb),AIRPCAP_ADVANCED_FROM_KEY,from_widget);
-
- display_airpcap_advanced_cb(w,data);
-}
-
-/*
- * Callback for the Decryption Key Management button
- */
-static void
-toolbar_display_airpcap_key_management_cb(GtkWidget *w, gpointer data)
-{
- int *from_widget;
-
- from_widget = (gint*)g_malloc(sizeof(gint));
- *from_widget = AIRPCAP_ADVANCED_FROM_TOOLBAR;
- g_object_set_data(G_OBJECT(wireless_tb), AIRPCAP_ADVANCED_FROM_KEY, from_widget);
-
- display_airpcap_key_management_cb(w,data);
-}
-
-GtkWidget *airpcap_toolbar_new(void)
-{
- GtkWidget *channel_lb = NULL,
- *channel_cb = NULL,
- *channel_offset_lb = NULL,
- *channel_offset_cb = NULL,
- *fcs_filter_lb = NULL,
- *fcs_filter_cb = NULL;
- GtkWidget *lcl_wireless_tb;
-
- GtkWidget *decryption_mode_lb;
- GtkWidget *decryption_mode_cb;
-
- GtkToolItem *key_management_bt = NULL,
- *advanced_bt = NULL,
- *tool_item;
-
- /* airpcap toolbar */
- lcl_wireless_tb = gtk_toolbar_new();
- gtk_orientable_set_orientation(GTK_ORIENTABLE(lcl_wireless_tb),
- GTK_ORIENTATION_HORIZONTAL);
-
- /* Create the "802.11 Channel:" label */
- channel_lb = gtk_label_new("802.11 Channel: ");
- g_object_set_data(G_OBJECT(lcl_wireless_tb), AIRPCAP_TOOLBAR_CHANNEL_LABEL_KEY, channel_lb);
- gtk_widget_show(channel_lb);
-
- tool_item = gtk_tool_item_new ();
- gtk_container_add (GTK_CONTAINER (tool_item), channel_lb);
- gtk_widget_show (GTK_WIDGET (tool_item));
- gtk_toolbar_insert(GTK_TOOLBAR(lcl_wireless_tb), tool_item, -1);
-
- gtk_widget_set_tooltip_text(GTK_WIDGET(tool_item), "Current 802.11 Channel");
-
- /* Create the channel combo box */
- channel_cb = gtk_combo_box_text_new();
- g_object_set_data(G_OBJECT(lcl_wireless_tb), AIRPCAP_TOOLBAR_CHANNEL_KEY, channel_cb);
-
- /* Select the current channel */
- airpcap_update_channel_combo(GTK_WIDGET(channel_cb), airpcap_if_selected);
-
- gtk_widget_show(channel_cb);
-
- tool_item = gtk_tool_item_new ();
- gtk_container_add (GTK_CONTAINER (tool_item), channel_cb);
- gtk_widget_show (GTK_WIDGET (tool_item));
- gtk_toolbar_insert(GTK_TOOLBAR(lcl_wireless_tb), tool_item, -1);
-
- gtk_widget_set_tooltip_text(GTK_WIDGET(tool_item), "802.11 Channel");
-
- /* Create the "Channel Offset:" label */
- channel_offset_lb = gtk_label_new("Channel Offset: ");
- g_object_set_data(G_OBJECT(lcl_wireless_tb), AIRPCAP_TOOLBAR_CHANNEL_OFFSET_LABEL_KEY, channel_offset_lb);
- gtk_widget_show(channel_offset_lb);
-
- tool_item = gtk_tool_item_new ();
- gtk_container_add (GTK_CONTAINER (tool_item), channel_offset_lb);
- gtk_widget_show (GTK_WIDGET (tool_item));
- gtk_toolbar_insert(GTK_TOOLBAR(lcl_wireless_tb), tool_item, -1);
-
- gtk_widget_set_tooltip_text(GTK_WIDGET(tool_item), "Current 802.11 Channel Offset");
-
- /* Start: Channel offset combo box */
- channel_offset_cb = gtk_combo_box_text_new();
- g_object_set_data(G_OBJECT(lcl_wireless_tb), AIRPCAP_TOOLBAR_CHANNEL_OFFSET_KEY, channel_offset_cb);
-
- if(airpcap_if_active != NULL){
- airpcap_update_channel_offset_combo(airpcap_if_active, airpcap_if_active->channelInfo.Frequency, channel_offset_cb, FALSE);
- } else {
- gtk_combo_box_set_active(GTK_COMBO_BOX(channel_offset_cb), -1);
- }
-
- gtk_widget_set_tooltip_text(channel_offset_cb, "Current 802.11 Channel Offset");
-
- gtk_widget_show(channel_offset_cb);
-
- tool_item = gtk_tool_item_new ();
- gtk_container_add (GTK_CONTAINER (tool_item), channel_offset_cb);
- gtk_widget_show (GTK_WIDGET (tool_item));
- gtk_toolbar_insert(GTK_TOOLBAR(lcl_wireless_tb), tool_item, -1);
-
- /* callback for channel combo box */
- g_signal_connect(channel_cb,"changed", G_CALLBACK(airpcap_channel_changed_set_cb), channel_offset_cb);
- /* callback for channel offset combo box */
- g_signal_connect(channel_offset_cb, "changed", G_CALLBACK(airpcap_channel_offset_changed_cb), NULL);
- /* End: Channel offset combo box */
-
- /* Wrong CRC Label */
- fcs_filter_lb = gtk_label_new(" FCS Filter: ");
- g_object_set_data(G_OBJECT(lcl_wireless_tb), AIRPCAP_TOOLBAR_FCS_FILTER_LABEL_KEY, fcs_filter_lb);
- gtk_widget_show(fcs_filter_lb);
- tool_item = gtk_tool_item_new ();
- gtk_container_add (GTK_CONTAINER (tool_item), fcs_filter_lb);
- gtk_widget_show (GTK_WIDGET (tool_item));
- gtk_toolbar_insert(GTK_TOOLBAR(lcl_wireless_tb), tool_item, -1);
-
- /* FCS filter combo box */
- fcs_filter_cb = gtk_combo_box_text_new();
- g_object_set_data(G_OBJECT(lcl_wireless_tb), AIRPCAP_TOOLBAR_FCS_FILTER_KEY, fcs_filter_cb);
-
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(fcs_filter_cb), airpcap_get_validation_name(AIRPCAP_VT_ACCEPT_EVERYTHING));
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(fcs_filter_cb), airpcap_get_validation_name(AIRPCAP_VT_ACCEPT_CORRECT_FRAMES));
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(fcs_filter_cb), airpcap_get_validation_name(AIRPCAP_VT_ACCEPT_CORRUPT_FRAMES));
- gtk_combo_box_set_active(GTK_COMBO_BOX(fcs_filter_cb), 0);
-
- gtk_widget_set_tooltip_text(fcs_filter_cb, "Select the 802.11 FCS filter that the wireless adapter will apply.");
-
- if (airpcap_if_selected != NULL) {
- airpcap_validation_type_combo_set_by_type(fcs_filter_cb, airpcap_if_selected->CrcValidationOn);
- }
-
- g_signal_connect (fcs_filter_cb, "changed", G_CALLBACK(airpcap_toolbar_fcs_filter_combo_cb), NULL);
- gtk_widget_show(fcs_filter_cb);
-
- tool_item = gtk_tool_item_new ();
- gtk_container_add (GTK_CONTAINER (tool_item), fcs_filter_cb);
- gtk_widget_show (GTK_WIDGET (tool_item));
- gtk_toolbar_insert(GTK_TOOLBAR(lcl_wireless_tb), tool_item, -1);
-
- /* Decryption mode combo box */
- decryption_mode_lb = gtk_label_new ("Decryption Mode: ");
- g_object_set_data(G_OBJECT(lcl_wireless_tb), AIRPCAP_TOOLBAR_DECRYPTION_LABEL_KEY, decryption_mode_lb);
- gtk_widget_set_name (decryption_mode_lb, "decryption_mode_lb");
- gtk_widget_show (decryption_mode_lb);
-
- decryption_mode_cb = gtk_combo_box_text_new();
- gtk_widget_set_name (decryption_mode_cb, "decryption_mode_cb");
- gtk_widget_show (decryption_mode_cb);
- update_decryption_mode_list(decryption_mode_cb);
-
- tool_item = gtk_tool_item_new ();
- gtk_container_add (GTK_CONTAINER (tool_item), decryption_mode_cb);
- gtk_widget_show (GTK_WIDGET (tool_item));
- gtk_toolbar_insert(GTK_TOOLBAR(lcl_wireless_tb), tool_item, -1);
-
- gtk_widget_set_tooltip_text(fcs_filter_lb, "Choose a Decryption Mode");
- /* Set current decryption mode!!!! */
- update_decryption_mode(decryption_mode_cb);
- g_signal_connect(decryption_mode_cb, "changed", G_CALLBACK(on_decryption_mode_cb_changed), NULL);
- g_object_set_data(G_OBJECT(lcl_wireless_tb), AIRPCAP_TOOLBAR_DECRYPTION_KEY, decryption_mode_cb);
-
- /* Advanced button */
- advanced_bt = gtk_tool_button_new(NULL, /* a widget that will be used as icon widget, or NULL */
- "Wireless Settings...");
- g_object_set_data(G_OBJECT(lcl_wireless_tb), AIRPCAP_TOOLBAR_ADVANCED_KEY, advanced_bt);
-
- g_signal_connect(advanced_bt, "clicked", G_CALLBACK(toolbar_display_airpcap_advanced_cb), lcl_wireless_tb);
- gtk_widget_show(GTK_WIDGET(advanced_bt));
- gtk_toolbar_insert(GTK_TOOLBAR(lcl_wireless_tb), advanced_bt, -1);
-
- gtk_widget_set_tooltip_text(GTK_WIDGET(advanced_bt), "Set Advanced Wireless Settings");
- /* Key Management button */
- key_management_bt = gtk_tool_button_new(NULL, /* a widget that will be used as icon widget, or NULL */
- "Decryption Keys...");
-
- g_object_set_data(G_OBJECT(lcl_wireless_tb), AIRPCAP_TOOLBAR_KEY_MANAGEMENT_KEY, key_management_bt);
-
- g_signal_connect(key_management_bt, "clicked", G_CALLBACK(toolbar_display_airpcap_key_management_cb), lcl_wireless_tb);
- gtk_widget_show(GTK_WIDGET(key_management_bt));
- gtk_toolbar_insert(GTK_TOOLBAR(lcl_wireless_tb), key_management_bt, -1);
- gtk_widget_set_tooltip_text(GTK_WIDGET(key_management_bt), "Manage Decryption Keys");
-
- /* If no airpcap interface is present, gray everything */
- if(airpcap_if_active == NULL) {
- if(g_airpcap_if_list == NULL || g_list_length(g_airpcap_if_list) == 0) {
- /* No airpcap device found */
- airpcap_enable_toolbar_widgets(lcl_wireless_tb, FALSE);
- /* recent.airpcap_toolbar_show = TRUE; */
- } else {
- /* default adapter is not airpcap... or is airpcap but is not found*/
- airpcap_set_toolbar_stop_capture(airpcap_if_active);
- airpcap_enable_toolbar_widgets(lcl_wireless_tb, FALSE);
- /* recent.airpcap_toolbar_show = TRUE; */
- }
- } else {
- airpcap_set_toolbar_stop_capture(airpcap_if_active);
- /* recent.airpcap_toolbar_show = TRUE; */
- }
-
- return lcl_wireless_tb;
-}
-
-static void
-driver_warning_dialog_cb(gpointer dialog, gint btn _U_, gpointer data _U_)
-{
- gboolean r;
-
- r = simple_dialog_check_get(dialog);
- recent.airpcap_driver_check_show = !r;
-}
-
-void airpcap_toolbar_show(GtkWidget *lcl_wireless_tb _U_)
-{
- /*
- * This will read the decryption keys from the preferences file, and will
- * store them into the registry...
- */
- if(g_airpcap_if_list != NULL && g_list_length(g_airpcap_if_list) > 0){
- if (!airpcap_check_decryption_keys(g_airpcap_if_list)) {
- /* Ask the user what to do ...*/
- airpcap_keys_check_w(NULL,NULL);
- } else {
- /* Keys from lists are equals, or Wireshark has got no keys */
- airpcap_load_decryption_keys(g_airpcap_if_list);
- }
- }
-
- switch (airpcap_dll_ret_val) {
-
- case AIRPCAP_DLL_OK:
- break;
-
- case AIRPCAP_DLL_OLD:
- if(recent.airpcap_driver_check_show) {
- driver_warning_dialog = (GtkWidget *)simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s",
- "WARNING: The version of AirPcap on this system\n"
- "does not support driver-level decryption. Please\n"
- "download a more recent version from\n" "http://www.cacetech.com/support/downloads.htm \n");
- simple_dialog_check_set(driver_warning_dialog,"Don't show this message again.");
- simple_dialog_set_cb(driver_warning_dialog, driver_warning_dialog_cb, NULL);
- }
- break;
-
-#if 0
- /*
- * XXX - Maybe we need to warn the user if one of the following happens???
- */
- 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
- }
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/main_airpcap_toolbar.h b/ui/gtk/main_airpcap_toolbar.h
deleted file mode 100644
index 28e736a4f1..0000000000
--- a/ui/gtk/main_airpcap_toolbar.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* main_airpcap_toolbar.h
- * Definitions for the airpcap toolbar routines
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __MAIN_AIRPCAP_TOOLBAR_H__
-#define __MAIN_AIRPCAP_TOOLBAR_H__
-
-extern int airpcap_dll_ret_val;
-
-GtkWidget *airpcap_toolbar_new(void);
-void airpcap_toolbar_show(GtkWidget *wireless_tb);
-
-#endif /* __MAIN_AIRPCAP_TOOLBAR_H__ */
diff --git a/ui/gtk/main_filter_toolbar.c b/ui/gtk/main_filter_toolbar.c
deleted file mode 100644
index 4ab9dc3ce1..0000000000
--- a/ui/gtk/main_filter_toolbar.c
+++ /dev/null
@@ -1,461 +0,0 @@
-/* main_filter_toolbar.c
- * The filter toolbar
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/*
- * This file implements the "filter" toolbar for Wireshark.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include "ui/recent.h"
-#include "ui/recent_utils.h"
-#include "ui/gtk/old-gtk-compat.h"
-
-
-#include "filter_dlg.h"
-#include "filter_autocomplete.h"
-
-#include "epan/prefs.h"
-#include "epan/plugin_if.h"
-
-#include "keys.h"
-#include "gtkglobals.h"
-#include "stock_icons.h"
-
-#include "main.h"
-#include "menus.h"
-#include "main_toolbar.h"
-#include "main_filter_toolbar.h"
-#include "filter_expression_save_dlg.h"
-
-#include "globals.h"
-
-#define MENU_BAR_PATH_FILE_OPEN "/Menubar/FileMenu/Open"
-#define MENU_BAR_PATH_EDIT_COPY_AS_FLT "/Menubar/EditMenu/Copy/AsFilter"
-#define MENU_BAR_PATH_ANALYZE_DISPLAY_FLT "/Menubar/AnalyzeMenu/DisplayFilters"
-#define MENU_BAR_PATH_ANALYZE_FOLLOW_TCP_STREAM "/Menubar/AnalyzeMenu/FollowTCPStream"
-#define MENU_BAR_PATH_ANALYZE_FOLLOW_UDP_STREAM "/Menubar/AnalyzeMenu/FollowUDPStream"
-#define MENU_BAR_PATH_ANALYZE_FOLLOW_SSL_STREAM "/Menubar/AnalyzeMenu/FollowSSLStream"
-#define MENU_BAR_PATH_ANALYZE_APL_AS_FLT_SEL "/Menubar/AnalyzeMenu/ApplyAsFilter/Selected"
-#define MENU_BAR_PATH_ANALYZE_APL_AS_FLT_NOT_SEL "/Menubar/AnalyzeMenu/ApplyAsFilter/NotSelected"
-#define MENU_BAR_PATH_ANALYZE_APL_AS_FLT_AND_SEL "/Menubar/AnalyzeMenu/ApplyAsFilter/AndSelected"
-#define MENU_BAR_PATH_ANALYZE_APL_AS_FLT_OR_SEL "/Menubar/AnalyzeMenu/ApplyAsFilter/OrSelected"
-#define MENU_BAR_PATH_ANALYZE_APL_AS_FLT_AND_NOT_SEL "/Menubar/AnalyzeMenu/ApplyAsFilter/AndNotSelected"
-#define MENU_BAR_PATH_ANALYZE_APL_AS_FLT_OR_NOT_SEL "/Menubar/AnalyzeMenu/ApplyAsFilter/OrNotSelected"
-#define MENU_BAR_PATH_ANALYZE_PREP_A_FLT_SEL "/Menubar/AnalyzeMenu/PrepareaFilter/Selected"
-#define MENU_BAR_PATH_ANALYZE_PREP_A_FLT_NOT_SEL "/Menubar/AnalyzeMenu/PrepareaFilter/NotSelected"
-#define MENU_BAR_PATH_ANALYZE_PREP_A_FLT_AND_SEL "/Menubar/AnalyzeMenu/PrepareaFilter/AndSelected"
-#define MENU_BAR_PATH_ANALYZE_PREP_A_FLT_OR_SEL "/Menubar/AnalyzeMenu/PrepareaFilter/OrSelected"
-#define MENU_BAR_PATH_ANALYZE_PREP_A_FLT_AND_NOT_SEL "/Menubar/AnalyzeMenu/PrepareaFilter/AndNotSelected"
-#define MENU_BAR_PATH_ANALYZE_PREP_A_FLT_OR_NOT_SEL "/Menubar/AnalyzeMenu/PrepareaFilter/OrNotSelected"
-
-GtkWidget *main_display_filter_widget=NULL;
-
-/* Run the current display filter on the current packet set, and
- redisplay. */
-static void
-filter_activate_cb(GtkWidget *w _U_, gpointer data)
-{
- const char *s;
-
- s = gtk_entry_get_text(GTK_ENTRY(data));
- main_filter_packets(&cfile, s, FALSE);
-}
-
-/* Enable both Clear and Apply button when filter is changed */
-static void
-filter_changed_cb(GtkWidget *w _U_, gpointer data)
-{
- gtk_widget_set_sensitive ((GtkWidget *)g_object_get_data (G_OBJECT(data), E_DFILTER_APPLY_KEY), TRUE);
- gtk_widget_set_sensitive ((GtkWidget *)g_object_get_data (G_OBJECT(data), E_DFILTER_CLEAR_KEY), TRUE);
- gtk_widget_set_sensitive ((GtkWidget *)g_object_get_data (G_OBJECT(data), E_DFILTER_SAVE_KEY), TRUE);
-}
-
-/* redisplay with no display filter */
-static void
-filter_reset_cb(GtkWidget *w, gpointer data _U_)
-{
- GtkWidget *filter_te = NULL;
-
- if ((filter_te = (GtkWidget *)g_object_get_data(G_OBJECT(w), E_DFILTER_TE_KEY))) {
- gtk_entry_set_text(GTK_ENTRY(filter_te), "");
- }
- main_filter_packets(&cfile, NULL, FALSE);
-}
-
-static void
-filter_save_cb(GtkWidget *w _U_, GtkWindow *parent_w)
-{
- filter_expression_save_dlg(parent_w);
-}
-
-static void
-plugin_if_filter_apply(GHashTable * dataSet)
-{
- /* code is derived from voip_calls_dlg.c::voip_calls_on_filter */
-
- size_t filter_length;
- size_t max_filter_length = 2048;
- gchar *filter_string;
-
- if ( main_display_filter_widget != 0 && dataSet != 0 )
- {
- if ( g_hash_table_lookup_extended(dataSet, "filter_string", NULL, NULL ) )
- {
- filter_string = g_strndup((const char *)g_hash_table_lookup(dataSet, "filter_string"), max_filter_length);
- filter_length = strlen(filter_string);
-
- if ( filter_length < max_filter_length )
- {
- gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), filter_string);
- main_filter_packets(&cfile, filter_string, FALSE);
- }
- }
- }
-}
-
-GtkWidget *
-filter_toolbar_new(void)
-{
- GtkWidget *filter_cm;
- GtkWidget *filter_te;
- GtkWidget *filter_tb;
- GtkToolItem *filter_bt, *filter_add_expr_bt, *filter_reset;
- GtkToolItem *filter_apply, *filter_save, *item;
-
-
- /* Display filter construct dialog has an Apply button, and "OK" not
- only sets our text widget, it activates it (i.e., it causes us to
- filter the capture). */
- static construct_args_t args = {
- "Wireshark: Display Filter",
- TRUE,
- TRUE,
- FALSE
- };
-
- /* filter toolbar */
- filter_tb = gtk_toolbar_new();
- gtk_orientable_set_orientation(GTK_ORIENTABLE(filter_tb),
- GTK_ORIENTATION_HORIZONTAL);
-
- g_object_set_data(G_OBJECT(top_level), E_TB_FILTER_KEY, filter_tb);
- gtk_widget_show(filter_tb);
-
- /* Create the "Filter:" button */
- filter_bt = ws_gtk_tool_button_new_from_stock (WIRESHARK_STOCK_DISPLAY_FILTER_ENTRY);
- g_signal_connect(filter_bt, "clicked", G_CALLBACK(display_filter_construct_cb), &args);
- gtk_widget_show(GTK_WIDGET (filter_bt));
- g_object_set_data(G_OBJECT(top_level), E_FILT_BT_PTR_KEY, filter_bt);
-
- gtk_toolbar_insert(GTK_TOOLBAR(filter_tb),
- filter_bt,
- -1);
- gtk_widget_set_tooltip_text(GTK_WIDGET(filter_bt), "Open the \"Display Filter\" dialog, to edit/apply filters");
-
- /* Create the filter combobox */
- filter_cm = gtk_combo_box_text_new_with_entry ();
- filter_te = gtk_bin_get_child(GTK_BIN(filter_cm));
- main_display_filter_widget=filter_te;
- g_object_set_data(G_OBJECT(filter_bt), E_FILT_TE_PTR_KEY, filter_te);
- g_object_set_data(G_OBJECT(filter_te), E_DFILTER_CM_KEY, filter_cm);
- g_object_set_data(G_OBJECT(top_level), E_DFILTER_CM_KEY, filter_cm);
- g_signal_connect(filter_te, "activate", G_CALLBACK(filter_activate_cb), filter_te);
- g_signal_connect(filter_te, "changed", G_CALLBACK(filter_changed_cb), filter_cm);
- g_signal_connect(filter_te, "changed", G_CALLBACK(filter_te_syntax_check_cb), NULL);
- g_object_set_data(G_OBJECT(filter_tb), E_FILT_AUTOCOMP_PTR_KEY, NULL);
- g_object_set_data(G_OBJECT(filter_te), E_FILT_FIELD_USE_STATUSBAR_KEY, (gpointer)"");
- g_signal_connect(filter_te, "key-press-event", G_CALLBACK (filter_string_te_key_pressed_cb), NULL);
- g_signal_connect(filter_tb, "key-press-event", G_CALLBACK (filter_parent_dlg_key_pressed_cb), NULL);
-
- gtk_widget_set_size_request(filter_cm, 400, -1);
- gtk_widget_show(filter_cm);
- item = gtk_tool_item_new ();
- gtk_container_add (GTK_CONTAINER (item), filter_cm);
- gtk_widget_show (GTK_WIDGET (item));
-
- gtk_toolbar_insert(GTK_TOOLBAR(filter_tb), item, -1);
-
- /* setting a tooltip for a combobox will do nothing, so add it to the corresponding text entry */
- gtk_widget_set_tooltip_text(filter_cm,
- "Enter a display filter, or choose one of your recently used filters. "
- "The background color of this field is changed by a continuous syntax check "
- "(green is valid, red is invalid, yellow may have unexpected results).");
-
- /* Create the "Add Expression..." button, to pop up a dialog
- for constructing filter comparison expressions. */
- filter_add_expr_bt = ws_gtk_tool_button_new_from_stock(WIRESHARK_STOCK_ADD_EXPRESSION);
- g_object_set_data(G_OBJECT(filter_tb), E_FILT_FILTER_TE_KEY, filter_te);
- g_signal_connect(filter_add_expr_bt, "clicked", G_CALLBACK(filter_add_expr_bt_cb), filter_tb);
- gtk_widget_show(GTK_WIDGET(filter_add_expr_bt));
-
- gtk_toolbar_insert(GTK_TOOLBAR(filter_tb),
- filter_add_expr_bt,
- -1);
-
- gtk_widget_set_tooltip_text(GTK_WIDGET(filter_add_expr_bt), "Add an expression to this filter string");
-
- /* Create the "Clear" button */
- filter_reset = ws_gtk_tool_button_new_from_stock(WIRESHARK_STOCK_CLEAR_EXPRESSION);
- g_object_set_data(G_OBJECT(filter_reset), E_DFILTER_TE_KEY, filter_te);
- g_object_set_data (G_OBJECT(filter_cm), E_DFILTER_CLEAR_KEY, filter_reset);
- g_signal_connect(filter_reset, "clicked", G_CALLBACK(filter_reset_cb), NULL);
- gtk_widget_set_sensitive (GTK_WIDGET(filter_reset), FALSE);
- gtk_widget_show(GTK_WIDGET(filter_reset));
- gtk_toolbar_insert(GTK_TOOLBAR(filter_tb),
- filter_reset,
- -1);
-
- gtk_widget_set_tooltip_text(GTK_WIDGET(filter_reset), "Clear this filter string and update the display");
-
- /* Create the "Apply" button */
- filter_apply = ws_gtk_tool_button_new_from_stock(WIRESHARK_STOCK_APPLY_EXPRESSION);
- g_object_set_data(G_OBJECT(filter_apply), E_DFILTER_CM_KEY, filter_cm);
- g_object_set_data (G_OBJECT(filter_cm), E_DFILTER_APPLY_KEY, filter_apply);
- g_signal_connect(filter_apply, "clicked", G_CALLBACK(filter_activate_cb), filter_te);
- gtk_widget_set_sensitive (GTK_WIDGET(filter_apply), FALSE);
- gtk_widget_show(GTK_WIDGET(filter_apply));
-
- gtk_toolbar_insert(GTK_TOOLBAR(filter_tb),
- filter_apply,
- -1);
-
- gtk_widget_set_tooltip_text(GTK_WIDGET(filter_apply), "Apply this filter string to the display");
-
- /* Create the "Save" button */
- filter_save = ws_gtk_tool_button_new_from_stock(GTK_STOCK_SAVE);
- g_object_set_data(G_OBJECT(filter_save), E_DFILTER_CM_KEY, filter_cm);
- g_object_set_data(G_OBJECT(filter_cm), E_DFILTER_SAVE_KEY, filter_save);
- g_signal_connect(filter_save, "clicked", G_CALLBACK(filter_save_cb), filter_te);
- gtk_widget_set_sensitive (GTK_WIDGET(filter_save), FALSE);
- gtk_widget_show(GTK_WIDGET(filter_save));
-
- gtk_toolbar_insert(GTK_TOOLBAR(filter_tb),
- filter_save,
- -1);
-
- gtk_widget_set_tooltip_text(GTK_WIDGET(filter_save), "Create a button based on the current display filter");
-
- /* Sets the text entry widget pointer as the E_DILTER_TE_KEY data
- * of any widget that ends up calling a callback which needs
- * that text entry pointer */
- set_menu_object_data(MENU_BAR_PATH_FILE_OPEN, E_DFILTER_TE_KEY, filter_te);
- set_menu_object_data(MENU_BAR_PATH_EDIT_COPY_AS_FLT, E_DFILTER_TE_KEY,
- filter_te);
- set_menu_object_data(MENU_BAR_PATH_ANALYZE_DISPLAY_FLT, E_FILT_TE_PTR_KEY,
- filter_te);
- set_menu_object_data(MENU_BAR_PATH_ANALYZE_FOLLOW_TCP_STREAM, E_DFILTER_TE_KEY,
- filter_te);
- set_menu_object_data(MENU_BAR_PATH_ANALYZE_FOLLOW_UDP_STREAM, E_DFILTER_TE_KEY,
- filter_te);
- set_menu_object_data(MENU_BAR_PATH_ANALYZE_FOLLOW_SSL_STREAM, E_DFILTER_TE_KEY,
- filter_te);
- set_menu_object_data(MENU_BAR_PATH_ANALYZE_APL_AS_FLT_SEL, E_DFILTER_TE_KEY,
- filter_te);
- set_menu_object_data(MENU_BAR_PATH_ANALYZE_APL_AS_FLT_NOT_SEL, E_DFILTER_TE_KEY,
- filter_te);
- set_menu_object_data(MENU_BAR_PATH_ANALYZE_APL_AS_FLT_AND_SEL, E_DFILTER_TE_KEY,
- filter_te);
- set_menu_object_data(MENU_BAR_PATH_ANALYZE_APL_AS_FLT_OR_SEL, E_DFILTER_TE_KEY,
- filter_te);
- set_menu_object_data(MENU_BAR_PATH_ANALYZE_APL_AS_FLT_AND_NOT_SEL, E_DFILTER_TE_KEY,
- filter_te);
- set_menu_object_data(MENU_BAR_PATH_ANALYZE_APL_AS_FLT_OR_NOT_SEL, E_DFILTER_TE_KEY,
- filter_te);
- set_menu_object_data(MENU_BAR_PATH_ANALYZE_PREP_A_FLT_SEL, E_DFILTER_TE_KEY,
- filter_te);
- set_menu_object_data(MENU_BAR_PATH_ANALYZE_PREP_A_FLT_NOT_SEL, E_DFILTER_TE_KEY,
- filter_te);
- set_menu_object_data(MENU_BAR_PATH_ANALYZE_PREP_A_FLT_AND_SEL, E_DFILTER_TE_KEY,
- filter_te);
- set_menu_object_data(MENU_BAR_PATH_ANALYZE_PREP_A_FLT_OR_SEL, E_DFILTER_TE_KEY,
- filter_te);
- set_menu_object_data(MENU_BAR_PATH_ANALYZE_PREP_A_FLT_AND_NOT_SEL, E_DFILTER_TE_KEY,
- filter_te);
- set_menu_object_data(MENU_BAR_PATH_ANALYZE_PREP_A_FLT_OR_NOT_SEL, E_DFILTER_TE_KEY,
- filter_te);
-
- set_toolbar_object_data(E_DFILTER_TE_KEY, filter_te);
- g_object_set_data(G_OBJECT(popup_menu_object), E_DFILTER_TE_KEY, filter_te);
-
- filter_expression_save_dlg_init(filter_tb, filter_te);
-
- /* make current preferences effective */
- toolbar_redraw_all();
-
- plugin_if_register_gui_cb(PLUGIN_IF_FILTER_ACTION_APPLY, plugin_if_filter_apply );
- plugin_if_register_gui_cb(PLUGIN_IF_FILTER_ACTION_PREPARE, plugin_if_filter_apply );
-
- return filter_tb;
-}
-
-static gboolean
-dfilter_entry_match(GtkWidget *filter_cm, char *s, int *indx)
-{
- GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX(filter_cm));
- GtkTreeIter iter;
- GValue value = { 0, {{0}}};
- const char *filter_str;
- int i;
-
- i = -1;
- if (!gtk_tree_model_get_iter_first (model, &iter)) {
- *indx = i;
- return FALSE;
- }
- do {
- i++;
- gtk_tree_model_get_value (model, &iter, 0, &value);
- filter_str = g_value_get_string (&value);
- if(filter_str) {
- if(strcmp(s, filter_str) == 0) {
- g_value_unset (&value);
- *indx = i;
- return TRUE;
- }
- }
- g_value_unset (&value);
- } while (gtk_tree_model_iter_next (model, &iter));
-
- *indx = -1;
- return FALSE;
-}
-
-/* add a display filter to the combo box */
-/* Note: a new filter string will not replace an old identical one */
-static gboolean
-dfilter_combo_add(GtkWidget *filter_cm, char *s) {
- int indx;
-
- if(!dfilter_entry_match(filter_cm,s, &indx))
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(filter_cm), s);
- g_free(s);
-
- return TRUE;
-}
-
-
-/* write all non empty display filters (until maximum count)
- * of the combo box GList to the user's recent file */
-void
-dfilter_recent_combo_write_all(FILE *rf) {
- GtkWidget *filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(top_level), E_DFILTER_CM_KEY);
- GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX(filter_cm));
- GtkTreeIter iter;
- GValue value = { 0, {{0}}};
- const char *filter_str;
- guint max_count = 0;
-
- if (!gtk_tree_model_get_iter_first (model, &iter))
- return;
- do {
- gtk_tree_model_get_value (model, &iter, 0, &value);
- filter_str = g_value_get_string (&value);
- if(filter_str)
- fprintf (rf, RECENT_KEY_DISPLAY_FILTER ": %s\n", filter_str);
- g_value_unset (&value);
-
- } while (gtk_tree_model_iter_next (model, &iter)&& (max_count++ < prefs.gui_recent_df_entries_max));
-
-}
-
-/* add a display filter coming from the user's recent file to the dfilter combo box */
-gboolean
-dfilter_combo_add_recent(const gchar *s) {
- GtkWidget *filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(top_level), E_DFILTER_CM_KEY);
- char *dupstr;
-
- dupstr = g_strdup(s);
-
- return dfilter_combo_add(filter_cm, dupstr);
-}
-
-/* call cf_filter_packets() and add this filter string to the recent filter list */
-gboolean
-main_filter_packets(capture_file *cf, const gchar *dftext, gboolean force)
-{
- GtkWidget *filter_cm = (GtkWidget *)g_object_get_data(G_OBJECT(top_level), E_DFILTER_CM_KEY);
- gboolean free_filter = TRUE;
- char *s;
- cf_status_t cf_status;
- gint filter_count;
-
- s = g_strdup(dftext);
-
- cf_status = cf_filter_packets(cf, s, force);
-
- if (cf_status == CF_OK) {
- gtk_widget_set_sensitive ((GtkWidget *)g_object_get_data (G_OBJECT(filter_cm), E_DFILTER_APPLY_KEY), FALSE);
- if (!s || strlen (s) == 0) {
- gtk_widget_set_sensitive ((GtkWidget *)g_object_get_data (G_OBJECT(filter_cm), E_DFILTER_CLEAR_KEY), FALSE);
- gtk_widget_set_sensitive ((GtkWidget *)g_object_get_data (G_OBJECT(filter_cm), E_DFILTER_SAVE_KEY), FALSE);
- }
- }
-
- if (!s)
- return (cf_status == CF_OK);
-
- if (cf_status == CF_OK && strlen(s) > 0) {
- int indx;
-
- if(!dfilter_entry_match(filter_cm,s, &indx) || indx > -1) {
-
- /* If the filter is already there but not the first entry, remove it */
- if (indx > -1) {
- gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(filter_cm), indx);
- indx--;
- }
-
- /* Add the filter (at the head of the list) */
- gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(filter_cm), s);
- indx++;
- }
- }
- if (free_filter)
- g_free(s);
-
- /* If we have too many entries, remove some */
- filter_count = gtk_tree_model_iter_n_children(gtk_combo_box_get_model(GTK_COMBO_BOX(filter_cm)), NULL);
- while (filter_count >= (gint)prefs.gui_recent_df_entries_max) {
- filter_count--;
- gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(filter_cm), filter_count);
- }
-
- return (cf_status == CF_OK);
-}
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/main_filter_toolbar.h b/ui/gtk/main_filter_toolbar.h
deleted file mode 100644
index 69b85da0e2..0000000000
--- a/ui/gtk/main_filter_toolbar.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* main_filter_toolbar.h
- * Definitions for filter toolbar routines
- * Copyright 2003, Ulf Lamping <ulf.lamping@web.de>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __MAIN_FILTER_TOOLBAR_H__
-#define __MAIN_FILTER_TOOLBAR_H__
-
-#define E_DFILTER_APPLY_KEY "display_filter_apply"
-#define E_DFILTER_CLEAR_KEY "display_filter_clear"
-#define E_DFILTER_SAVE_KEY "display_filter_save"
-
-extern GtkWidget *filter_toolbar_new(void);
-
-#endif /* __MAIN_FILTER_TOOLBAR_H__ */
diff --git a/ui/gtk/main_menubar.c b/ui/gtk/main_menubar.c
deleted file mode 100644
index 4844e88b55..0000000000
--- a/ui/gtk/main_menubar.c
+++ /dev/null
@@ -1,5439 +0,0 @@
-/* main_menubar.c
- * Menu routines
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-#include "config.h"
-
-#include <gtk/gtk.h>
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <epan/packet.h>
-#include <epan/prefs.h>
-#include <epan/prefs-int.h>
-#include <epan/dissector_filters.h>
-#include <epan/epan_dissect.h>
-#include <epan/column.h>
-#include <epan/stats_tree_priv.h>
-#include <epan/plugin_if.h>
-#include <epan/export_object.h>
-
-#include "globals.h"
-#include <epan/color_filters.h>
-
-#include "ui/commandline.h"
-#include "ui/dissect_opts.h"
-#include "ui/main_statusbar.h"
-#include "ui/preference_utils.h"
-#include "ui/recent.h"
-#include "ui/recent_utils.h"
-#include "ui/simple_dialog.h"
-#include "ui/software_update.h"
-#include <wsutil/utf8_entities.h>
-
-#include "ui/gtk/gui_stat_menu.h"
-#include "ui/gtk/about_dlg.h"
-#include "ui/gtk/capture_dlg.h"
-#include "ui/gtk/capture_if_dlg.h"
-#include "ui/gtk/color_dlg.h"
-#include "ui/gtk/export_object_dlg.h"
-#include "ui/gtk/filter_dlg.h"
-#include "ui/gtk/profile_dlg.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/capture_file_dlg.h"
-#include "ui/gtk/fileset_dlg.h"
-#include "ui/gtk/file_import_dlg.h"
-#include "ui/gtk/find_dlg.h"
-#include "ui/gtk/goto_dlg.h"
-#include "ui/gtk/summary_dlg.h"
-#include "ui/gtk/prefs_dlg.h"
-#include "ui/gtk/packet_win.h"
-#include "ui/gtk/follow_stream.h"
-#include "ui/gtk/decode_as_dlg.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/supported_protos_dlg.h"
-#include "ui/gtk/proto_dlg.h"
-#include "ui/gtk/proto_hier_stats_dlg.h"
-#include "ui/gtk/keys.h"
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/packet_panes.h"
-#include "ui/gtk/conversations_table.h"
-#include "ui/gtk/hostlist_table.h"
-#include "ui/gtk/packet_history.h"
-#include "ui/gtk/sctp_stat_gtk.h"
-#include "ui/gtk/firewall_dlg.h"
-#include "ui/gtk/macros_dlg.h"
-#include "ui/gtk/export_sslkeys.h"
-#include "ui/gtk/gui_stat_menu.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/menus.h"
-#include "ui/gtk/main_menubar_private.h"
-#include "ui/gtk/main_toolbar.h"
-#include "ui/gtk/main_welcome.h"
-#include "ui/gtk/uat_gui.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/manual_addr_resolv.h"
-#include "ui/gtk/dissector_tables_dlg.h"
-#include "ui/gtk/expert_comp_dlg.h"
-#include "ui/gtk/time_shift_dlg.h"
-#include "ui/gtk/edit_packet_comment_dlg.h"
-#include "ui/gtk/addr_resolution_dlg.h"
-#include "ui/gtk/export_pdu_dlg.h"
-#include "ui/gtk/conversation_hastables_dlg.h"
-#include "ui/gtk/webbrowser.h"
-
-#include "ui/gtk/packet_list.h"
-#include "ui/gtk/lbm_stream_dlg.h"
-
-#ifdef HAVE_LIBPCAP
-#include "capture_opts.h"
-#include "ui/capture_globals.h"
-#endif
-
-static int initialize = TRUE;
-GtkActionGroup *main_menu_bar_action_group;
-static GtkUIManager *ui_manager_main_menubar = NULL;
-static GtkUIManager *ui_manager_packet_list_heading = NULL;
-static GtkUIManager *ui_manager_packet_list_menu = NULL;
-static GtkUIManager *ui_manager_tree_view_menu = NULL;
-static GtkUIManager *ui_manager_bytes_menu = NULL;
-static GtkUIManager *ui_manager_statusbar_profiles_menu = NULL;
-static GSList *popup_menu_list = NULL;
-
-static GtkAccelGroup *grp;
-
-static GList *merge_menu_items_list = NULL;
-static GList *build_menubar_items_callback_list = NULL;
-
-GtkWidget *popup_menu_object;
-
-static void menu_open_recent_file_cmd_cb(GtkAction *action, gpointer data _U_ );
-static void add_recent_items (guint merge_id, GtkUIManager *ui_manager);
-static void add_tap_plugins (guint merge_id, GtkUIManager *ui_manager);
-
-static void menus_init(void);
-static void merge_menu_items(GList *node);
-static void ws_menubar_external_menus(void);
-static void ws_menubar_build_external_menus(void);
-static void set_menu_sensitivity (GtkUIManager *ui_manager, const gchar *, gint);
-static void menu_name_resolution_update_cb(GtkAction *action, gpointer data);
-static void name_resolution_cb(GtkWidget *w, gpointer d, gboolean* res_flag);
-static void colorize_cb(GtkWidget *w, gpointer d);
-static void rebuild_protocol_prefs_menu (module_t *prefs_module_p, gboolean preferences,
- GtkUIManager *ui_menu, const char *path);
-
-static void plugin_if_menubar_preference(GHashTable *dataSet);
-
-
-/* As a general GUI guideline, we try to follow the Gnome Human Interface Guidelines, which can be found at:
- http://developer.gnome.org/projects/gup/hig/1.0/index.html
-
-Please note: there are some differences between the Gnome HIG menu suggestions and our implementation:
-
-File/Open Recent: the Gnome HIG suggests putting the list of recently used files as elements into the File menuitem.
- As this is ok for only a few items, this will become unhandy for 10 or even more list entries.
- For this reason, we use a submenu for this.
-
-File/Close: the Gnome HIG suggests putting this item just above the Quit item.
- This results in unintuitive behaviour as both Close and Quit items are very near together.
- By putting the Close item near the open item(s), it better suggests that it will close the
- currently opened/captured file only.
-*/
-
-static void
-new_window_cb(GtkWidget *widget)
-{
- new_packet_window(widget, FALSE, FALSE);
-}
-
-static void
-new_window_cb_ref(GtkWidget *widget)
-{
- new_packet_window(widget, TRUE, FALSE);
-}
-
-static void
-colorize_conversation_cb(conversation_filter_t* color_filter, int action_num)
-{
- gchar *filter = NULL;
- packet_info *pi = &cfile.edt->pi;
- gchar *err_msg = NULL;
-
- if (action_num == 255) {
- if (!color_filters_reset_tmp(&err_msg)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg);
- g_free(err_msg);
- }
- packet_list_colorize_packets();
- } else if (cfile.current_frame) {
- if (color_filter == NULL) {
- /* colorize_conversation_cb was called from the window-menu
- * or through an accelerator key. Try to build a conversation
- * filter in the order TCP, UDP, IP, Ethernet and apply the
- * coloring */
- filter = conversation_filter_from_packet(pi);
- if( filter == NULL ) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Unable to build conversation filter.");
- return;
- }
- } else {
- filter = color_filter->build_filter_string(pi);
- }
-
- if (action_num == 0) {
- /* Open the "new coloring filter" dialog with the filter */
- color_display_with_filter(filter);
- } else {
- /* Set one of the temporary coloring filters */
- if (!color_filters_set_tmp(action_num, filter, FALSE, &err_msg)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg);
- g_free(err_msg);
- }
- packet_list_colorize_packets();
- }
-
- g_free(filter);
- }
-}
-
-static void
-goto_conversation_frame(gboolean dir)
-{
- gchar *filter = NULL;
- dfilter_t *dfcode = NULL;
- gboolean found_packet = FALSE;
- packet_info *pi = &cfile.edt->pi;
-
- /* Try to build a conversation
- * filter in the order TCP, UDP, IP, Ethernet and apply the
- * coloring */
- filter = conversation_filter_from_packet(pi);
- if( filter == NULL ) {
- statusbar_push_temporary_msg("Unable to build conversation filter.");
- g_free(filter);
- return;
- }
-
- if (!dfilter_compile(filter, &dfcode, NULL)) {
- /* The attempt failed; report an error. */
- statusbar_push_temporary_msg("Error compiling filter for this conversation.");
- g_free(filter);
- return;
- }
-
- found_packet = cf_find_packet_dfilter(&cfile, dfcode, dir?SD_BACKWARD:SD_FORWARD);
-
- if (!found_packet) {
- /* We didn't find a packet */
- statusbar_push_temporary_msg("No previous/next packet in conversation.");
- }
-
- dfilter_free(dfcode);
- g_free(filter);
-}
-
-static void
-goto_next_frame_conversation_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- goto_conversation_frame(FALSE);
-}
-
-static void
-goto_previous_frame_conversation_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- goto_conversation_frame(TRUE);
-}
-
-
-
-static void
-copy_description_cb(GtkAction *action _U_, gpointer user_data)
-{
- copy_selected_plist_cb( NULL /* widget _U_ */ , user_data, COPY_SELECTED_DESCRIPTION);
-}
-
-static void
-copy_fieldname_cb(GtkAction *action _U_, gpointer user_data)
-{
- copy_selected_plist_cb( NULL /* widget _U_ */ , user_data, COPY_SELECTED_FIELDNAME);
-}
-
-static void
-copy_value_cb(GtkAction *action _U_, gpointer user_data)
-{
- copy_selected_plist_cb( NULL /* widget _U_ */ , user_data, COPY_SELECTED_VALUE);
-}
-
-static void
-copy_as_filter_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- /* match_selected_ptree_cb needs the popup_menu_object to get the right object E_DFILTER_TE_KEY */
- match_selected_ptree_cb( popup_menu_object, (MATCH_SELECTED_E)(MATCH_SELECTED_REPLACE|MATCH_SELECTED_COPY_ONLY));
-}
-
-static void
-set_reftime_cb(GtkAction *action _U_, gpointer user_data)
-{
- reftime_frame_cb( NULL /* widget _U_ */ , user_data, REFTIME_TOGGLE);
-}
-
-static void
-find_next_ref_time_cb(GtkAction *action _U_, gpointer user_data)
-{
- reftime_frame_cb( NULL /* widget _U_ */ , user_data, REFTIME_FIND_NEXT);
-}
-
-static void
-find_previous_ref_time_cb(GtkAction *action _U_, gpointer user_data)
-{
- reftime_frame_cb( NULL /* widget _U_ */ , user_data, REFTIME_FIND_PREV);
-}
-
-static void
-menus_prefs_cb(GtkAction *action _U_, gpointer user_data)
-{
- prefs_page_cb( NULL /* widget _U_ */ , user_data, PREFS_PAGE_USER_INTERFACE);
-}
-
-static void
-main_toolbar_show_hide_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/MainToolbar");
-
- recent.main_toolbar_show = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
- main_widgets_show_or_hide();
-
-}
-
-static void
-filter_toolbar_show_hide_cb(GtkAction * action _U_, gpointer user_data _U_)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/FilterToolbar");
-
- recent.filter_toolbar_show = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
- main_widgets_show_or_hide();
-}
-
-static void
-wireless_toolbar_show_hide_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/WirelessToolbar");
-
- if(widget) {
- recent.wireless_toolbar_show = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
- } else {
- recent.wireless_toolbar_show = FALSE;
- }
- main_widgets_show_or_hide();
-}
-
-static void
-status_bar_show_hide_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/StatusBar");
-
- recent.statusbar_show = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
- main_widgets_show_or_hide();
-}
-static void
-packet_list_show_hide_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/PacketList");
-
- recent.packet_list_show = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
- main_widgets_show_or_hide();
-}
-static void
-packet_details_show_hide_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/PacketDetails");
-
- recent.tree_view_show = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
- main_widgets_show_or_hide();
-}
-static void
-packet_bytes_show_hide_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/PacketBytes");
-
- recent.byte_view_show = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
- main_widgets_show_or_hide();
-}
-
-static void
-timestamp_seconds_time_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/TimeDisplayFormat/DisplaySecondsWithHoursAndMinutes");
-
- if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) {
- 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);
-
- /* This call adjusts column width */
- cf_timestamp_auto_precision(&cfile);
- packet_list_queue_draw();
-}
-
-static void
-timestamp_format_new_cb (GtkRadioAction *action, GtkRadioAction *current _U_, gpointer user_data _U_)
-{
- ts_type value;
-
- value = (ts_type) gtk_radio_action_get_current_value (action);
- if (recent.gui_time_format != value) {
- timestamp_set_type(value);
- recent.gui_time_format = value;
- /* This call adjusts column width */
- cf_timestamp_auto_precision(&cfile);
- packet_list_queue_draw();
- }
-
-}
-
-static void
-timestamp_precision_new_cb (GtkRadioAction *action, GtkRadioAction *current _U_, gpointer user_data _U_)
-{
- gint value;
-
- value = gtk_radio_action_get_current_value (action);
- if (recent.gui_time_precision != value) {
- /* the actual precision will be set in packet_list_queue_draw() below */
- timestamp_set_precision(value);
- recent.gui_time_precision = value;
- /* This call adjusts column width */
- cf_timestamp_auto_precision(&cfile);
- packet_list_queue_draw();
- }
-}
-
-static void
-view_menu_en_for_MAC_cb(GtkAction *action _U_, gpointer user_data)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/NameResolution/EnableforMACLayer");
-
- if (!widget){
- g_warning("view_menu_en_for_MAC_cb: No widget found");
- }else{
- name_resolution_cb( widget , user_data, &gbl_resolv_flags.mac_name);
- }
-}
-
-static void
-view_menu_en_for_network_cb(GtkAction *action _U_, gpointer user_data)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/NameResolution/EnableforNetworkLayer");
-
- if (!widget){
- g_warning("view_menu_en_for_network_cb: No widget found");
- }else{
- name_resolution_cb( widget , user_data, &gbl_resolv_flags.network_name);
- }
-}
-
-static void
-view_menu_en_for_transport_cb(GtkAction *action _U_, gpointer user_data)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/NameResolution/EnableforTransportLayer");
-
- if (!widget){
- g_warning("view_menu_en_for_transport_cb: No widget found");
- }else{
- name_resolution_cb( widget , user_data, &gbl_resolv_flags.transport_name);
- }
-}
-
-static void
-view_menu_en_use_external_resolver_cb(GtkAction *action _U_, gpointer user_data)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/NameResolution/UseExternalNetworkNameResolver");
-
- if (!widget){
- g_warning("view_menu_en_use_external_resolver_cb: No widget found");
- }else{
- name_resolution_cb( widget , user_data, &gbl_resolv_flags.use_external_net_name_resolver);
- }
-}
-
-static void
-view_menu_colorize_pkt_lst_cb(GtkAction *action _U_, gpointer user_data)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/ColorizePacketList");
-
- if (!widget){
- g_warning("view_menu_colorize_pkt_lst_cb: No widget found");
- }else{
- colorize_cb( widget , user_data);
- }
-
-}
-
-#ifdef HAVE_LIBPCAP
-static void
-view_menu_auto_scroll_live_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/AutoScrollinLiveCapture");
-
- if (!widget){
- g_warning("view_menu_auto_scroll_live_cb: No widget found");
- }else{
- main_auto_scroll_live_changed(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)));
- }
-}
-#endif
-
-static void
-view_menu_color_conv_color1_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- colorize_conversation_cb(NULL, 1);
-}
-
-static void
-view_menu_color_conv_color2_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- colorize_conversation_cb(NULL, 2);
-}
-
-static void
-view_menu_color_conv_color3_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- colorize_conversation_cb(NULL, 3);
-}
-
-static void
-view_menu_color_conv_color4_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- colorize_conversation_cb(NULL, 4);
-}
-
-static void
-view_menu_color_conv_color5_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- colorize_conversation_cb(NULL, 5);
-}
-
-static void
-view_menu_color_conv_color6_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- colorize_conversation_cb(NULL, 6);
-}
-
-static void
-view_menu_color_conv_color7_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- colorize_conversation_cb(NULL, 7);
-}
-
-static void
-view_menu_color_conv_color8_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- colorize_conversation_cb(NULL, 8);
-}
-
-static void
-view_menu_color_conv_color9_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- colorize_conversation_cb(NULL, 9);
-}
-
-static void
-view_menu_color_conv_color10_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- colorize_conversation_cb(NULL, 10);
-}
-
-static void
-view_menu_color_conv_new_rule_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- colorize_conversation_cb(NULL, 0);
-}
-
-static void
-view_menu_reset_coloring_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- colorize_conversation_cb(NULL, 255);
-}
-
-/*
- * TODO Move this menu to capture_if_dlg.c ?
- */
-#ifdef HAVE_LIBPCAP
-static void
-capture_if_action_cb(GtkAction *action _U_, gpointer user_data)
-{
- capture_if_cb(NULL /* GtkWidget *w _U_ */, user_data);
-}
-
-static void
-capture_prep_action_cb(GtkAction *action _U_, gpointer user_data)
-{
- capture_prep_cb(NULL /* GtkWidget *w _U_ */, user_data);
-}
-
-static void
-capture_start_action_cb(GtkAction *action _U_, gpointer user_data)
-{
- capture_start_cb(NULL /* GtkWidget *w _U_ */, user_data);
-}
-
-static void
-capture_stop_action_cb(GtkAction *action _U_, gpointer user_data)
-{
- capture_stop_cb(NULL /* GtkWidget *w _U_ */, user_data);
-}
-
-static void
-capture_restart_action_cb(GtkAction *action _U_, gpointer user_data)
-{
- capture_restart_cb(NULL /* GtkWidget *w _U_ */, user_data);
-}
-
-static void
-capture_filters_action_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- cfilter_dialog_cb(NULL /* GtkWidget *w _U_ */);
-}
-
-/*
- * We've been asked to rescan the system looking for interfaces.
- */
-static void
-refresh_interfaces_action_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- refresh_local_interface_lists();
-}
-#endif /* HAVE_LIBPCAP */
-
-static void
-help_menu_cont_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- topic_menu_cb(NULL/*widget _U_ */, NULL /*GdkEventButton *event _U_*/, GINT_TO_POINTER(HELP_CONTENT));
-}
-
-static void
-help_menu_faq_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- topic_menu_cb(NULL/*widget _U_ */, NULL /*GdkEventButton *event _U_*/, GINT_TO_POINTER(ONLINEPAGE_FAQ));
-}
-
-static void
-help_menu_ask_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- topic_menu_cb(NULL/*widget _U_ */, NULL /*GdkEventButton *event _U_*/, GINT_TO_POINTER(ONLINEPAGE_ASK));
-}
-
-static void
-help_menu_wireshark_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- topic_menu_cb(NULL/*widget _U_ */, NULL /*GdkEventButton *event _U_*/, GINT_TO_POINTER(LOCALPAGE_MAN_WIRESHARK));
-}
-
-static void
-help_menu_wireshark_flt_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- topic_menu_cb(NULL/*widget _U_ */, NULL /*GdkEventButton *event _U_*/, GINT_TO_POINTER(LOCALPAGE_MAN_WIRESHARK_FILTER));
-}
-
-static void
-help_menu_Capinfos_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- topic_menu_cb(NULL/*widget _U_ */, NULL /*GdkEventButton *event _U_*/, GINT_TO_POINTER(LOCALPAGE_MAN_CAPINFOS));
-}
-
-static void
-help_menu_Dumpcap_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- topic_menu_cb(NULL/*widget _U_ */, NULL /*GdkEventButton *event _U_*/, GINT_TO_POINTER(LOCALPAGE_MAN_DUMPCAP));
-}
-
-static void
-help_menu_Editcap_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- topic_menu_cb(NULL/* widget _U_ */, NULL /*GdkEventButton *event _U_*/, GINT_TO_POINTER(LOCALPAGE_MAN_EDITCAP));
-}
-
-static void
-help_menu_Mergecap_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- topic_menu_cb(NULL/*widget _U_ */, NULL /*GdkEventButton *event _U_*/, GINT_TO_POINTER(LOCALPAGE_MAN_MERGECAP));
-}
-
-static void
-help_menu_RawShark_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- topic_menu_cb(NULL/*widget _U_ */, NULL /*GdkEventButton *event _U_*/, GINT_TO_POINTER(LOCALPAGE_MAN_RAWSHARK));
-}
-
-static void
-help_menu_Reorder_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- topic_menu_cb(NULL/*widget _U_ */, NULL /*GdkEventButton *event _U_*/, GINT_TO_POINTER(LOCALPAGE_MAN_REORDERCAP));
-}
-
-static void
-help_menu_Text2pcap_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- topic_menu_cb(NULL/* widget _U_ */, NULL /*GdkEventButton *event _U_*/, GINT_TO_POINTER(LOCALPAGE_MAN_TEXT2PCAP));
-}
-
-static void
-help_menu_TShark_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- topic_menu_cb(NULL/*widget _U_ */, NULL /*GdkEventButton *event _U_*/, GINT_TO_POINTER(LOCALPAGE_MAN_TSHARK));
-}
-
-static void
-help_menu_Website_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- topic_menu_cb(NULL/* widget _U_ */, NULL /*GdkEventButton *event _U_*/, GINT_TO_POINTER(ONLINEPAGE_HOME));
-}
-
-static void
-help_menu_Wiki_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- topic_menu_cb(NULL/* widget _U_ */, NULL /*GdkEventButton *event _U_*/, GINT_TO_POINTER(ONLINEPAGE_WIKI));
-}
-
-static void
-help_menu_Downloads_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- topic_menu_cb(NULL/* widget _U_ */, NULL /*GdkEventButton *event _U_*/, GINT_TO_POINTER(ONLINEPAGE_DOWNLOAD));
-}
-
-static void
-help_menu_SampleCaptures_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- topic_menu_cb( NULL/* widget_U_ */, NULL /*GdkEventButton *event _U_*/, GINT_TO_POINTER(ONLINEPAGE_SAMPLE_FILES));
-}
-
-#ifdef HAVE_SOFTWARE_UPDATE
-static void
-check_for_updates_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- software_update_check();
-}
-#endif /* HAVE_SOFTWARE_UPDATE */
-
-static const char *ui_desc_menubar =
-"<ui>\n"
-" <menubar name ='Menubar'>\n"
-" <menu name= 'FileMenu' action='/File'>\n"
-" <menuitem name='Open' action='/File/Open'/>\n"
-" <menu name='OpenRecent' action='/File/OpenRecent'>\n"
-" <placeholder name='RecentFiles'/>\n"
-" </menu>\n"
-" <menuitem name='Merge' action='/File/Merge'/>\n"
-" <menuitem name='ImportFromHexDump' action='/File/ImportFromHexDump'/>\n"
-" <menuitem name='Close' action='/File/Close'/>\n"
-" <separator/>\n"
-" <menuitem name='Save' action='/File/Save'/>\n"
-" <menuitem name='SaveAs' action='/File/SaveAs'/>\n"
-" <separator/>\n"
-" <menu name= 'Set' action='/File/Set'>\n"
-" <menuitem name='ListFiles' action='/File/Set/ListFiles'/>\n"
-" <menuitem name='NextFile' action='/File/Set/NextFile'/>\n"
-" <menuitem name='PreviousFile' action='/File/Set/PreviousFile'/>\n"
-" </menu>\n"
-" <separator/>\n"
-" <menuitem name='ExportSpecifiedPackets' action='/File/ExportSpecifiedPackets'/>\n"
-" <menu name= 'ExportPacketDissections' action='/File/ExportPacketDissections'>\n"
-" <menuitem name='AsTxt' action='/File/ExportPacketDissections/Text'/>\n"
-" <menuitem name='AsPostScript' action='/File/ExportPacketDissections/PostScript'/>\n"
-" <menuitem name='AsCSV' action='/File/ExportPacketDissections/CSV'/>\n"
-" <menuitem name='AsCArrays' action='/File/ExportPacketDissections/CArrays'/>\n"
-" <separator/>\n"
-" <menuitem name='AsPSML' action='/File/ExportPacketDissections/PSML'/>\n"
-" <menuitem name='AsPDML' action='/File/ExportPacketDissections/PDML'/>\n"
-" <menuitem name='AsJSON' action='/File/ExportPacketDissections/JSON'/>\n"
-" <separator/>\n"
-" </menu>\n"
-" <menuitem name='ExportSelectedPacketBytes' action='/File/ExportSelectedPacketBytes'/>\n"
-" <menuitem name='ExportPDUs' action='/File/ExportPDUs'/>\n"
-" <menuitem name='ExportSSLSessionKeys' action='/File/ExportSSLSessionKeys'/>\n"
-" <menu name= 'ExportObjectsMenu' action='/File/ExportObjects'>\n"
-" <placeholder name='ExportObjects'/>\n"
-" </menu>\n"
-" <separator/>\n"
-" <menuitem name='Print' action='/File/Print'/>\n"
-" <separator/>\n"
-" <menuitem name='Quit' action='/File/Quit'/>\n"
-" </menu>\n"
-" <menu name= 'EditMenu' action='/Edit'>\n"
-" <menu name= 'Copy' action='/Edit/Copy'>\n"
-" <menuitem name='Description' action='/Edit/Copy/Description'/>\n"
-" <menuitem name='Fieldname' action='/Edit/Copy/Fieldname'/>\n"
-" <menuitem name='Value' action='/Edit/Copy/Value'/>\n"
-" <separator/>\n"
-" <menuitem name='AsFilter' action='/Edit/Copy/AsFilter'/>\n"
-" </menu>\n"
-" <menuitem name='FindPacket' action='/Edit/FindPacket'/>\n"
-" <menuitem name='FindNext' action='/Edit/FindNext'/>\n"
-" <menuitem name='FindPrevious' action='/Edit/FindPrevious'/>\n"
-" <separator/>\n"
-" <menuitem name='MarkPacket' action='/Edit/MarkPacket'/>\n"
-" <menuitem name='MarkAllDisplayedPackets' action='/Edit/MarkAllDisplayedPackets'/>\n"
-" <menuitem name='UnmarkAllDisplayedPackets' action='/Edit/UnmarkAllDisplayedPackets'/>\n"
-" <menuitem name='FindNextMark' action='/Edit/FindNextMark'/>\n"
-" <menuitem name='FindPreviousMark' action='/Edit/FindPreviousMark'/>\n"
-" <separator/>\n"
-" <menuitem name='IgnorePacket' action='/Edit/IgnorePacket'/>\n"
-" <menuitem name='IgnoreAllDisplayedPackets' action='/Edit/IgnoreAllDisplayedPackets'/>\n"
-" <menuitem name='Un-IgnoreAllPackets' action='/Edit/Un-IgnoreAllPackets'/>\n"
-" <separator/>\n"
-" <menuitem name='SetTimeReference' action='/Edit/SetTimeReference'/>\n"
-" <menuitem name='Un-TimeReferenceAllPackets' action='/Edit/Un-TimeReferenceAllPackets'/>\n"
-" <menuitem name='FindNextTimeReference' action='/Edit/FindNextTimeReference'/>\n"
-" <menuitem name='FindPreviousTimeReference' action='/Edit/FindPreviousTimeReference'/>\n"
-" <separator/>\n"
-" <menuitem name='TimeShift' action='/Edit/TimeShift'/>\n"
-" <separator/>\n"
-" <menuitem name='AddEditPktComment' action='/Edit/AddEditPktComment'/>\n"
-" <menuitem name='AddEditCaptureComment' action='/Edit/AddEditCaptureComment'/>\n"
-" <separator/>\n"
-" <menuitem name='ConfigurationProfiles' action='/Edit/ConfigurationProfiles'/>\n"
-" <menuitem name='Preferences' action='/Edit/Preferences'/>\n"
-" </menu>\n"
-" <menu name= 'ViewMenu' action='/View'>\n"
-" <menuitem name='MainToolbar' action='/View/MainToolbar'/>\n"
-" <menuitem name='FilterToolbar' action='/View/FilterToolbar'/>\n"
-" <menuitem name='WirelessToolbar' action='/View/WirelessToolbar'/>\n"
-" <menuitem name='StatusBar' action='/View/StatusBar'/>\n"
-" <separator/>\n"
-" <menuitem name='PacketList' action='/View/PacketList'/>\n"
-" <menuitem name='PacketDetails' action='/View/PacketDetails'/>\n"
-" <menuitem name='PacketBytes' action='/View/PacketBytes'/>\n"
-" <separator/>\n"
-" <menu name= 'TimeDisplayFormat' action='/View/TimeDisplayFormat'>\n"
-" <menuitem name='DateYMDandTimeofDay' action='/View/TimeDisplayFormat/DateYMDandTimeofDay'/>\n"
-" <menuitem name='DateYDOYandTimeofDay' action='/View/TimeDisplayFormat/DateYDOYandTimeofDay'/>\n"
-" <menuitem name='TimeofDay' action='/View/TimeDisplayFormat/TimeofDay'/>\n"
-" <menuitem name='SecondsSinceEpoch' action='/View/TimeDisplayFormat/SecondsSinceEpoch'/>\n"
-" <menuitem name='SecondsSinceBeginningofCapture' action='/View/TimeDisplayFormat/SecondsSinceBeginningofCapture'/>\n"
-" <menuitem name='SecondsSincePreviousCapturedPacket' action='/View/TimeDisplayFormat/SecondsSincePreviousCapturedPacket'/>\n"
-" <menuitem name='SecondsSincePreviousDisplayedPacket' action='/View/TimeDisplayFormat/SecondsSincePreviousDisplayedPacket'/>\n"
-" <menuitem name='UTCDateYMDandTimeofDay' action='/View/TimeDisplayFormat/UTCDateYMDandTimeofDay'/>\n"
-" <menuitem name='UTCDateYDOYandTimeofDay' action='/View/TimeDisplayFormat/UTCDateYDOYandTimeofDay'/>\n"
-" <menuitem name='UTCTimeofDay' action='/View/TimeDisplayFormat/UTCTimeofDay'/>\n"
-" <separator/>\n"
-" <menuitem name='FileFormatPrecision-Automatic' action='/View/TimeDisplayFormat/FileFormatPrecision-Automatic'/>\n"
-" <menuitem name='FileFormatPrecision-Seconds' action='/View/TimeDisplayFormat/FileFormatPrecision-Seconds'/>\n"
-" <menuitem name='FileFormatPrecision-Deciseconds' action='/View/TimeDisplayFormat/FileFormatPrecision-Deciseconds'/>\n"
-" <menuitem name='FileFormatPrecision-Centiseconds' action='/View/TimeDisplayFormat/FileFormatPrecision-Centiseconds'/>\n"
-" <menuitem name='FileFormatPrecision-Milliseconds' action='/View/TimeDisplayFormat/FileFormatPrecision-Milliseconds'/>\n"
-" <menuitem name='FileFormatPrecision-Microseconds' action='/View/TimeDisplayFormat/FileFormatPrecision-Microseconds'/>\n"
-" <menuitem name='FileFormatPrecision-Nanoseconds' action='/View/TimeDisplayFormat/FileFormatPrecision-Nanoseconds'/>\n"
-" <separator/>\n"
-" <menuitem name='DisplaySecondsWithHoursAndMinutes' action='/View/TimeDisplayFormat/DisplaySecondsWithHoursAndMinutes'/>\n"
-" </menu>\n"
-" <menu name= 'NameResolution' action='/View/NameResolution'>\n"
-" <menuitem name='ResolveName' action='/View/NameResolution/ResolveName'/>\n"
-" <menuitem name='ManuallyResolveName' action='/View/NameResolution/ManuallyResolveName'/>\n"
-" <separator/>\n"
-" <menuitem name='EnableforMACLayer' action='/View/NameResolution/EnableforMACLayer'/>\n"
-" <menuitem name='EnableforTransportLayer' action='/View/NameResolution/EnableforTransportLayer'/>\n"
-" <menuitem name='EnableforNetworkLayer' action='/View/NameResolution/EnableforNetworkLayer'/>\n"
-" <menuitem name='UseExternalNetworkNameResolver' action='/View/NameResolution/UseExternalNetworkNameResolver'/>\n"
-" </menu>\n"
-" <menuitem name='ColorizePacketList' action='/View/ColorizePacketList'/>\n"
-#ifdef HAVE_LIBPCAP
-" <menuitem name='AutoScrollinLiveCapture' action='/View/AutoScrollinLiveCapture'/>\n"
-#endif
-" <separator/>\n"
-" <menuitem name='ZoomIn' action='/View/ZoomIn'/>\n"
-" <menuitem name='ZoomOut' action='/View/ZoomOut'/>\n"
-" <menuitem name='NormalSize' action='/View/NormalSize'/>\n"
-" <separator/>\n"
-" <menuitem name='ResizeAllColumns' action='/View/ResizeAllColumns'/>\n"
-" <menuitem name='DisplayedColumns' action='/View/DisplayedColumns'/>\n"
-" <separator/>\n"
-" <menuitem name='ExpandSubtrees' action='/View/ExpandSubtrees'/>\n"
-" <menuitem name='CollapseSubtrees' action='/View/CollapseSubtrees'/>\n"
-" <menuitem name='ExpandAll' action='/View/ExpandAll'/>\n"
-" <menuitem name='CollapseAll' action='/View/CollapseAll'/>\n"
-" <separator/>\n"
-" <menu name= 'ColorizeConversation' action='/View/ColorizeConversation'>\n"
-" <menuitem name='Color1' action='/View/ColorizeConversation/Color 1'/>\n"
-" <menuitem name='Color2' action='/View/ColorizeConversation/Color 2'/>\n"
-" <menuitem name='Color3' action='/View/ColorizeConversation/Color 3'/>\n"
-" <menuitem name='Color4' action='/View/ColorizeConversation/Color 4'/>\n"
-" <menuitem name='Color5' action='/View/ColorizeConversation/Color 5'/>\n"
-" <menuitem name='Color6' action='/View/ColorizeConversation/Color 6'/>\n"
-" <menuitem name='Color7' action='/View/ColorizeConversation/Color 7'/>\n"
-" <menuitem name='Color8' action='/View/ColorizeConversation/Color 8'/>\n"
-" <menuitem name='Color9' action='/View/ColorizeConversation/Color 9'/>\n"
-" <menuitem name='Color10' action='/View/ColorizeConversation/Color 10'/>\n"
-" <menuitem name='NewColoringRule' action='/View/ColorizeConversation/NewColoringRule'/>\n"
-" </menu>\n"
-" <separator/>\n"
-" <menuitem name='ResetColoring1-10' action='/View/ResetColoring1-10'/>\n"
-" <menuitem name='ColoringRules' action='/View/ColoringRules'/>\n"
-" <separator/>\n"
-" <menuitem name='ShowPacketinNewWindow' action='/View/ShowPacketinNewWindow'/>\n"
-" <menuitem name='Reload' action='/View/Reload'/>\n"
-" </menu>\n"
-" <menu name= 'GoMenu' action='/Go'>\n"
-" <menuitem name='Back' action='/Go/Back'/>\n"
-" <menuitem name='Forward' action='/Go/Forward'/>\n"
-" <menuitem name='Goto' action='/Go/Goto'/>\n"
-" <menuitem name='GotoCorrespondingPacket' action='/Go/GotoCorrespondingPacket'/>\n"
-" <separator/>\n"
-" <menuitem name='PreviousPacket' action='/Go/PreviousPacket'/>\n"
-" <menuitem name='NextPacket' action='/Go/NextPacket'/>\n"
-" <menuitem name='FirstPacket' action='/Go/FirstPacket'/>\n"
-" <menuitem name='LastPacket' action='/Go/LastPacket'/>\n"
-" <menuitem name='PreviousPacketInConversation' action='/Go/PreviousPacketInConversation'/>\n"
-" <menuitem name='NextPacketInConversation' action='/Go/NextPacketInConversation'/>\n"
-" </menu>\n"
-#ifdef HAVE_LIBPCAP
-" <menu name= 'CaptureMenu' action='/Capture'>\n"
-" <menuitem name='Interfaces' action='/Capture/Interfaces'/>\n"
-" <menuitem name='Options' action='/Capture/Options'/>\n"
-" <menuitem name='Start' action='/Capture/Start'/>\n"
-" <menuitem name='Stop' action='/Capture/Stop'/>\n"
-" <menuitem name='Restart' action='/Capture/Restart'/>\n"
-" <menuitem name='CaptureFilters' action='/Capture/CaptureFilters'/>\n"
-" <menuitem name='RefreshInterfaces' action='/Capture/RefreshInterfaces'/>\n"
-" </menu>\n"
-#endif
-" <menu name= 'AnalyzeMenu' action='/Analyze'>\n"
-" <menuitem name='DisplayFilters' action='/Analyze/DisplayFilters'/>\n"
-" <menuitem name='DisplayFilterMacros' action='/Analyze/DisplayFilterMacros'/>\n"
-" <separator/>\n"
-" <menuitem name='ApplyasColumn' action='/Analyze/ApplyasColumn'/>\n"
-" <menu name= 'ApplyAsFilter' action='/ApplyasFilter'>\n"
-" <menuitem name='Selected' action='/ApplyasFilter/Selected'/>\n"
-" <menuitem name='NotSelected' action='/ApplyasFilter/Not Selected'/>\n"
-" <menuitem name='AndSelected' action='/ApplyasFilter/AndSelected'/>\n"
-" <menuitem name='OrSelected' action='/ApplyasFilter/OrSelected'/>\n"
-" <menuitem name='AndNotSelected' action='/ApplyasFilter/AndNotSelected'/>\n"
-" <menuitem name='OrNotSelected' action='/ApplyasFilter/OrNotSelected'/>\n"
-" </menu>\n"
-" <menu name= 'PrepareaFilter' action='/PrepareaFilter'>\n"
-" <menuitem name='Selected' action='/PrepareaFilter/Selected'/>\n"
-" <menuitem name='NotSelected' action='/PrepareaFilter/Not Selected'/>\n"
-" <menuitem name='AndSelected' action='/PrepareaFilter/AndSelected'/>\n"
-" <menuitem name='OrSelected' action='/PrepareaFilter/OrSelected'/>\n"
-" <menuitem name='AndNotSelected' action='/PrepareaFilter/AndNotSelected'/>\n"
-" <menuitem name='OrNotSelected' action='/PrepareaFilter/OrNotSelected'/>\n"
-" </menu>\n"
-" <separator/>\n"
-" <menuitem name='EnabledProtocols' action='/Analyze/EnabledProtocols'/>\n"
-" <menuitem name='DecodeAs' action='/Analyze/DecodeAs'/>\n"
-" <menuitem name='UserSpecifiedDecodes' action='/Analyze/UserSpecifiedDecodes'/>\n"
-" <separator/>\n"
-" <menuitem name='FollowTCPStream' action='/Analyze/FollowTCPStream'/>\n"
-" <menuitem name='FollowUDPStream' action='/Analyze/FollowUDPStream'/>\n"
-" <menuitem name='FollowSSLStream' action='/Analyze/FollowSSLStream'/>\n"
-" <menuitem name='FollowHTTPStream' action='/Analyze/FollowHTTPStream'/>\n"
-" <menuitem name='ExpertInfo' action='/Analyze/ExpertInfo'/>\n"
-" <menu name= 'ConversationFilterMenu' action='/Analyze/ConversationFilter'>\n"
-" <placeholder name='Filters'/>\n"
-" </menu>\n"
-" </menu>\n"
-" <menu name= 'StatisticsMenu' action='/Statistics'>\n"
-" <menuitem name='Summary' action='/Statistics/Summary'/>\n"
-" <menuitem name='ShowCommentsSummary' action='/Statistics/CommentsSummary'/>\n"
-" <menuitem name='ShowAddreRes' action='/Statistics/ShowAddreRes'/>\n"
-" <menuitem name='ProtocolHierarchy' action='/Statistics/ProtocolHierarchy'/>\n"
-" <menuitem name='Conversations' action='/Statistics/Conversations'/>\n"
-" <menuitem name='Endpoints' action='/Statistics/Endpoints'/>\n"
-" <menuitem name='PacketLengths' action='/Statistics/plen'/>\n"
-" <menuitem name='IOGraphs' action='/Statistics/IOGraphs'/>\n"
-" <separator/>\n"
-" <menu name= 'ConversationListMenu' action='/Statistics/ConversationList'>\n"
-" <placeholder name='Conversations'/>\n"
-" </menu>\n"
-" <menu name= 'EndpointListMenu' action='/Statistics/EndpointList'>\n"
-" <placeholder name='Endpoints'/>\n"
-" </menu>\n"
-" <menu name='ServiceResponseTimeMenu' action='/Statistics/ServiceResponseTime'>\n"
-" <menuitem name='DCE-RPC' action='/Statistics/ServiceResponseTime/DCE-RPC'/>\n"
-" <menuitem name='ONC-RPC' action='/Statistics/ServiceResponseTime/ONC-RPC'/>\n"
-" </menu>\n"
-" <separator/>\n"
-" <menu name= '29West' action='/Statistics/29West'>\n"
-" <menu name= '29WestTopicMenu' action='/Statistics/29West/Topics'>\n"
-" <menuitem name='29WestTopicAdsTopic' action='/Statistics/29West/Topics/lbmr_topic_ads_topic'/>\n"
-" <menuitem name='29WestTopicAdsSource' action='/Statistics/29West/Topics/lbmr_topic_ads_source'/>\n"
-" <menuitem name='29WestTopicAdsTransport' action='/Statistics/29West/Topics/lbmr_topic_ads_transport'/>\n"
-" <menuitem name='29WestTopicQueriesTopic' action='/Statistics/29West/Topics/lbmr_topic_queries_topic'/>\n"
-" <menuitem name='29WestTopicQueriesReceiver' action='/Statistics/29West/Topics/lbmr_topic_queries_receiver'/>\n"
-" <menuitem name='29WestTopicQueriesPattern' action='/Statistics/29West/Topics/lbmr_topic_queries_pattern'/>\n"
-" <menuitem name='29WestTopicQueriesPatternReceiver' action='/Statistics/29West/Topics/lbmr_topic_queries_pattern_receiver'/>\n"
-" </menu>\n"
-" <menu name= '29WestQueueMenu' action='/Statistics/29West/Queues'>\n"
-" <menuitem name='29WestQueueAdsQueue' action='/Statistics/29West/Queues/lbmr_queue_ads_queue'/>\n"
-" <menuitem name='29WestQueueAdsSource' action='/Statistics/29West/Queues/lbmr_queue_ads_source'/>\n"
-" <menuitem name='29WestQueueQueriesQueue' action='/Statistics/29West/Queues/lbmr_queue_queries_queue'/>\n"
-" <menuitem name='29WestQueueQueriesReceiver' action='/Statistics/29West/Queues/lbmr_queue_queries_receiver'/>\n"
-" </menu>\n"
-" <menu name= '29WestUIMMenu' action='/Statistics/29West/UIM'>\n"
-" <menuitem name='29WestUIMStreams' action='/Statistics/29West/UIM/Streams' />\n"
-" </menu>\n"
-" </menu>\n"
-" <menuitem name='ANCP' action='/Statistics/ancp'/>\n"
-" <menu name= 'BACnetMenu' action='/Statistics/BACnet'>\n"
-" <menuitem name='bacapp_instanceid' action='/Statistics/BACnet/bacapp_instanceid'/>\n"
-" <menuitem name='bacapp_ip' action='/Statistics/BACnet/bacapp_ip'/>\n"
-" <menuitem name='bacapp_objectid' action='/Statistics/BACnet/bacapp_objectid'/>\n"
-" <menuitem name='bacapp_service' action='/Statistics/BACnet/bacapp_service'/>\n"
-" </menu>\n"
-" <menuitem name='Collectd' action='/Statistics/collectd'/>\n"
-" <menuitem name='Compare' action='/Statistics/compare'/>\n"
-" <menuitem name= 'DNS' action='/Statistics/dns'/>\n"
-" <menuitem name='FlowGraph' action='/Statistics/FlowGraph'/>\n"
-" <menuitem name='HART-IP' action='/Statistics/hart_ip'/>\n"
-" <menuitem name= 'Hpfeeds' action='/Statistics/hpfeeds'/>\n"
-" <menu name= 'HTTPMenu' action='/Statistics/HTTP'>\n"
-" <menuitem name='http' action='/Statistics/HTTP/http'/>\n"
-" <menuitem name='http_req' action='/Statistics/HTTP/http_req'/>\n"
-" <menuitem name='http_srv' action='/Statistics/HTTP/http_srv'/>\n"
-" </menu>\n"
-" <menuitem name='HTTP2' action='/Statistics/http2'/>\n"
-" <menu name= 'SametimeMenu' action='/Statistics/Sametime'>\n"
-" <menuitem name='sametime' action='/Statistics/Sametime/sametime'/>\n"
-" </menu>\n"
-" <menu name= 'TCPStreamGraphMenu' action='/Statistics/TCPStreamGraphMenu'>\n"
-" <menuitem name='Sequence-Graph-Stevens' action='/Statistics/TCPStreamGraphMenu/Time-Sequence-Graph-Stevens'/>\n"
-" <menuitem name='Sequence-Graph-tcptrace' action='/Statistics/TCPStreamGraphMenu/Time-Sequence-Graph-tcptrace'/>\n"
-" <menuitem name='Throughput-Graph' action='/Statistics/TCPStreamGraphMenu/Throughput-Graph'/>\n"
-" <menuitem name='RTT-Graph' action='/Statistics/TCPStreamGraphMenu/RTT-Graph'/>\n"
-" <menuitem name='Window-Scaling-Graph' action='/Statistics/TCPStreamGraphMenu/Window-Scaling-Graph'/>\n"
-" </menu>\n"
-" <menuitem name='UDPMulticastStreams' action='/Statistics/UDPMulticastStreams'/>\n"
-" <menuitem name='WLANTraffic' action='/Statistics/WLANTraffic'/>\n"
-" <separator/>\n"
-" </menu>\n"
-" <menu name= 'TelephonyMenu' action='/Telephony'>\n"
-" <menu name= 'ANSImenu' action='/Telephony/ANSI'>\n"
-" </menu>\n"
-" <menu name= 'GSM' action='/Telephony/GSM'>\n"
-" <menuitem name='MAP-Summary' action='/Telephony/GSM/MAPSummary'/>\n"
-" </menu>\n"
-" <menu name= 'IAX2menu' action='/Telephony/IAX2'>\n"
-" <menuitem name='StreamAnalysis' action='/Telephony/IAX2/StreamAnalysis'/>\n"
-" </menu>\n"
-" <menuitem name='ISUP' action='/Telephony/isup_msg'/>\n"
-" <menu name= 'LTEmenu' action='/Telephony/LTE'>\n"
-" <menuitem name='LTE_RLC_Graph' action='/Telephony/LTE/RLCGraph'/>\n"
-" </menu>\n"
-" <menu name= 'MTP3menu' action='/Telephony/MTP3'>\n"
-" <menuitem name='MSUSummary' action='/Telephony/MTP3/MSUSummary'/>\n"
-" </menu>\n"
-" <menu name= 'Osmuxmenu' action='/Telephony/Osmux'>\n"
-" <menuitem name='osmux' action='/Telephony/Osmux/osmux'/>\n"
-" </menu>\n"
-" <menu name= 'RTPmenu' action='/Telephony/RTP'>\n"
-" <menuitem name='ShowAllStreams' action='/Telephony/RTP/ShowAllStreams'/>\n"
-" <menuitem name='StreamAnalysis' action='/Telephony/RTP/StreamAnalysis'/>\n"
-" </menu>\n"
-" <menu name= 'RTSPmenu' action='/Telephony/RTSP'>\n"
-" <menuitem name='rtsp' action='/Telephony/RTSP/rtsp'/>\n"
-" </menu>\n"
-" <menu name= 'SCTPmenu' action='/Telephony/SCTP'>\n"
-" <menuitem name='AnalysethisAssociation' action='/Telephony/SCTP/AnalysethisAssociation'/>\n"
-" <menuitem name='ShowAllAssociations' action='/Telephony/SCTP/ShowAllAssociations'/>\n"
-" </menu>\n"
-" <menuitem name='SMPP' action='/Telephony/smpp_commands'/>\n"
-" <menuitem name='UCP' action='/Telephony/ucp_messages'/>\n"
-" <menuitem name='VoIPCalls' action='/Telephony/VoIPCalls'/>\n"
-" <menuitem name='VoIPFlows' action='/Telephony/VoIPFlows'/>\n"
-" </menu>\n"
-" <menu name= 'ToolsMenu' action='/Tools'>\n"
-" <menuitem name='FirewallACLRules' action='/Tools/FirewallACLRules'/>\n"
-" </menu>\n"
-" <menu name= 'InternalsMenu' action='/Internals'>\n"
-" <menuitem name='Dissectortables' action='/Internals/Dissectortables'/>\n"
-" <menuitem name='Conversations' action='/Internals/Conversations'/>\n"
-" <menuitem name='SupportedProtocols' action='/Internals/SupportedProtocols'/>\n"
-" </menu>\n"
-" <menu name= 'HelpMenu' action='/Help'>\n"
-" <menuitem name='Contents' action='/Help/Contents'/>\n"
-" <menu name= 'ManualPages' action='/Help/ManualPages'>\n"
-" <menuitem name='Wireshark' action='/Help/ManualPages/Wireshark'/>\n"
-" <menuitem name='WiresharkFilter' action='/Help/ManualPages/WiresharkFilter'/>\n"
-" <separator/>\n"
-" <menuitem name='Capinfos' action='/Help/ManualPages/Capinfos'/>\n"
-" <menuitem name='Dumpcap' action='/Help/ManualPages/Dumpcap'/>\n"
-" <menuitem name='Editcap' action='/Help/ManualPages/Editcap'/>\n"
-" <menuitem name='Mergecap' action='/Help/ManualPages/Mergecap'/>\n"
-" <menuitem name='RawShark' action='/Help/ManualPages/RawShark'/>\n"
-" <menuitem name='Reordercap' action='/Help/ManualPages/Reordercap'/>\n"
-" <menuitem name='Text2pcap' action='/Help/ManualPages/Text2pcap'/>\n"
-" <menuitem name='TShark' action='/Help/ManualPages/TShark'/>\n"
-" </menu>\n"
-" <separator/>\n"
-" <menuitem name='Website' action='/Help/Website'/>\n"
-" <menuitem name='FAQs' action='/Help/FAQs'/>\n"
-" <menuitem name='Ask' action='/Help/ASK'/>\n"
-" <menuitem name='Downloads' action='/Help/Downloads'/>\n"
-" <separator/>\n"
-" <menuitem name='Wiki' action='/Help/Wiki'/>\n"
-" <menuitem name='SampleCaptures' action='/Help/SampleCaptures'/>\n"
-#ifdef HAVE_SOFTWARE_UPDATE
-" <separator/>\n"
-" <menuitem name='CheckForUpdates' action='/Help/CheckForUpdates'/>\n"
-#endif /* HAVE_SOFTWARE_UPDATE */
-" <separator/>\n"
-" <menuitem name='AboutWireshark' action='/Help/AboutWireshark'/>\n"
-" </menu>\n"
-" </menubar>\n"
-"</ui>\n";
-
-
-
-/*
- * Main menu.
- *
- * Please do not use keystrokes that are used as "universal" shortcuts in
- * various desktop environments:
- *
- * Windows:
- * http://support.microsoft.com/kb/126449
- *
- * GNOME:
- * http://library.gnome.org/users/user-guide/nightly/keyboard-skills.html.en
- *
- * KDE:
- * http://developer.kde.org/documentation/standards/kde/style/keys/shortcuts.html
- *
- * In particular, do not use the following <control> sequences for anything
- * other than their standard purposes:
- *
- * <control>O File->Open
- * <control>S File->Save
- * <control>P File->Print
- * <control>W File->Close
- * <control>Q File->Quit
- * <control>Z Edit->Undo (which we don't currently have)
- * <control>X Edit->Cut (which we don't currently have)
- * <control>C Edit->Copy (which we don't currently have)
- * <control>V Edit->Paste (which we don't currently have)
- * <control>A Edit->Select All (which we don't currently have)
- *
- * Note that some if not all of the Edit keys above already perform those
- * functions in text boxes, such as the Filter box. Do no, under any
- * circumstances, make a change that keeps them from doing so.
- */
-
-/*
- * GtkActionEntry
- * typedef struct {
- * const gchar *name;
- * const gchar *stock_id;
- * const gchar *label;
- * const gchar *accelerator;
- * const gchar *tooltip;
- * GCallback callback;
- * } GtkActionEntry;
- * const gchar *name; The name of the action.
- * const gchar *stock_id; The stock id for the action, or the name of an icon from the icon theme.
- * const gchar *label; The label for the action. This field should typically be marked for translation,
- * see gtk_action_group_set_translation_domain().
- * If label is NULL, the label of the stock item with id stock_id is used.
- * const gchar *accelerator; The accelerator for the action, in the format understood by gtk_accelerator_parse().
- * const gchar *tooltip; The tooltip for the action. This field should typically be marked for translation,
- * see gtk_action_group_set_translation_domain().
- * GCallback callback; The function to call when the action is activated.
- *
- */
-
-#ifdef HAVE_LIBPCAP
-/*
- * TODO Move this menu to capture_if_dlg.c
- * eg put a "place holder" in the UI description and
- * make a call from main_menubar.c i.e build_capture_menu()
- * ad do the UI stuff there.
- */
-static const GtkActionEntry capture_menu_entries[] = {
- { "/Capture", NULL, "_Capture", NULL, NULL, NULL },
- { "/Capture/Interfaces", WIRESHARK_STOCK_CAPTURE_INTERFACES, "_Interfaces...", "<control>I", NULL, G_CALLBACK(capture_if_action_cb) },
- { "/Capture/Options", WIRESHARK_STOCK_CAPTURE_OPTIONS, "_Options...", "<control>K", NULL, G_CALLBACK(capture_prep_action_cb) },
- { "/Capture/Start", WIRESHARK_STOCK_CAPTURE_START, "_Start", "<control>E", NULL, G_CALLBACK(capture_start_action_cb) },
- { "/Capture/Stop", WIRESHARK_STOCK_CAPTURE_STOP, "S_top", "<control>E", NULL, G_CALLBACK(capture_stop_action_cb) },
- { "/Capture/Restart", WIRESHARK_STOCK_CAPTURE_RESTART, "_Restart", "<control>R", NULL, G_CALLBACK(capture_restart_action_cb) },
- { "/Capture/CaptureFilters", WIRESHARK_STOCK_CAPTURE_FILTER, "Capture _Filters...", NULL, NULL, G_CALLBACK(capture_filters_action_cb) },
- { "/Capture/RefreshInterfaces", GTK_STOCK_REFRESH, "Refresh Interfaces", NULL, NULL, G_CALLBACK(refresh_interfaces_action_cb) },
-};
-#endif
-
-static const GtkActionEntry main_menu_bar_entries[] = {
- /* Top level */
- { "/File", NULL, "_File", NULL, NULL, NULL },
- { "/Edit", NULL, "_Edit", NULL, NULL, NULL },
- { "/View", NULL, "_View", NULL, NULL, NULL },
- { "/Go", NULL, "_Go", NULL, NULL, NULL },
- { "/Analyze", NULL, "_Analyze", NULL, NULL, NULL },
- { "/Statistics", NULL, "_Statistics", NULL, NULL, NULL },
- { "/Telephony", NULL, "Telephon_y", NULL, NULL, NULL },
- { "/Tools", NULL, "_Tools", NULL, NULL, NULL },
- { "/Internals", NULL, "_Internals", NULL, NULL, NULL },
- { "/Help", NULL, "_Help", NULL, NULL, NULL },
-
- { "/File/Open", GTK_STOCK_OPEN, "_Open...", "<control>O", "Open a file", G_CALLBACK(file_open_cmd_cb) },
- { "/File/OpenRecent", NULL, "Open _Recent", NULL, NULL, NULL },
- { "/File/Merge", NULL, "_Merge...", NULL, NULL, G_CALLBACK(file_merge_cmd_cb) },
- { "/File/ImportFromHexDump", NULL, "_Import from Hex Dump...", NULL, NULL, G_CALLBACK(file_import_cmd_cb) },
- { "/File/Close", GTK_STOCK_CLOSE, "_Close", "<control>W", NULL, G_CALLBACK(file_close_cmd_cb) },
-
- { "/File/Save", WIRESHARK_STOCK_SAVE, "_Save", "<control>S", NULL, G_CALLBACK(file_save_cmd_cb) },
- { "/File/SaveAs", WIRESHARK_STOCK_SAVE, "Save _As...", "<shift><control>S", NULL, G_CALLBACK(file_save_as_cmd_cb) },
-
- { "/File/Set", NULL, "File Set", NULL, NULL, NULL },
- { "/File/ExportSpecifiedPackets", NULL, "Export Specified Packets...", NULL, NULL, G_CALLBACK(file_export_specified_packets_cmd_cb) },
- { "/File/ExportPacketDissections", NULL, "Export Packet Dissections", NULL, NULL, NULL },
- { "/File/ExportSelectedPacketBytes", NULL, "Export Selected Packet _Bytes...", "<control>H", NULL, G_CALLBACK(savehex_cb) },
- { "/File/ExportPDUs", NULL, "Export PDUs to File...", NULL, NULL, G_CALLBACK(export_pdu_show_cb) },
- { "/File/ExportSSLSessionKeys", NULL, "Export SSL Session Keys...", NULL, NULL, G_CALLBACK(savesslkeys_cb) },
- { "/File/ExportObjects", NULL, "Export Objects", NULL, NULL, NULL },
- { "/File/Print", GTK_STOCK_PRINT, "_Print...", "<control>P", NULL, G_CALLBACK(file_print_cmd_cb) },
- { "/File/Quit", GTK_STOCK_QUIT, "_Quit", "<control>Q", NULL, G_CALLBACK(file_quit_cmd_cb) },
-
- { "/File/Set/ListFiles", WIRESHARK_STOCK_FILE_SET_LIST, "List Files", NULL, NULL, G_CALLBACK(fileset_cb) },
- { "/File/Set/NextFile", WIRESHARK_STOCK_FILE_SET_NEXT, "Next File", NULL, NULL, G_CALLBACK(fileset_next_cb) },
- { "/File/Set/PreviousFile", WIRESHARK_STOCK_FILE_SET_PREVIOUS, "Previous File", NULL, NULL, G_CALLBACK(fileset_previous_cb) },
-
- { "/File/ExportPacketDissections/Text", NULL, "as \"Plain _Text\" file...", NULL, NULL, G_CALLBACK(export_text_cmd_cb) },
- { "/File/ExportPacketDissections/PostScript", NULL, "as \"_PostScript\" file...", NULL, NULL, G_CALLBACK(export_ps_cmd_cb) },
- { "/File/ExportPacketDissections/CSV", NULL, "as \"_CSV\" (Comma Separated Values packet summary) file...",
- NULL, NULL, G_CALLBACK(export_csv_cmd_cb) },
- { "/File/ExportPacketDissections/CArrays", NULL, "as \"C _Arrays\" (packet bytes) file...",
- NULL, NULL, G_CALLBACK(export_carrays_cmd_cb) },
- { "/File/ExportPacketDissections/PSML", NULL, "as XML - \"P_SML\" (packet summary) file...",
- NULL, NULL, G_CALLBACK(export_psml_cmd_cb) },
- { "/File/ExportPacketDissections/PDML", NULL, "as XML - \"P_DML\" (packet details) file...",
- NULL, NULL, G_CALLBACK(export_pdml_cmd_cb) },
- { "/File/ExportPacketDissections/JSON", NULL, "as \"_JSON\" file...",
- NULL, NULL, G_CALLBACK(export_json_cmd_cb) },
-
- { "/Edit/Copy", NULL, "Copy", NULL, NULL, NULL },
-
- { "/Edit/Copy/Description", NULL, "Description", "<shift><control>D", NULL, G_CALLBACK(copy_description_cb) },
- { "/Edit/Copy/Fieldname", NULL, "Fieldname", "<shift><control>F", NULL, G_CALLBACK(copy_fieldname_cb) },
- { "/Edit/Copy/Value", NULL, "Value", "<shift><control>V", NULL, G_CALLBACK(copy_value_cb) },
- { "/Edit/Copy/AsFilter", NULL, "As Filter", "<shift><control>C", NULL, G_CALLBACK(copy_as_filter_cb) },
-
-#if 0
- /*
- * Un-#if this when we actually implement Cut/Copy/Paste for the
- * packet list and packet detail windows.
- *
- * Note: when we implement Cut/Copy/Paste in those windows, we
- * will almost certainly want to allow multiple packets to be
- * selected in the packet list pane and multiple packet detail
- * items to be selected in the packet detail pane, so that
- * the user can, for example, copy the summaries of multiple
- * packets to the clipboard from the packet list pane and multiple
- * packet detail items - perhaps *all* packet detail items - from
- * the packet detail pane. Given that, we'll also want to
- * implement Select All.
- *
- * If multiple packets are selected, we would probably display nothing
- * in the packet detail pane, just as we do if no packet is selected,
- * and any menu items etc. that would pertain only to a single packet
- * would be disabled.
- *
- * If multiple packet detail items are selected, we would probably
- * disable all items that pertain only to a single packet detail
- * item, such as some items in the status bar.
- *
- * XXX - the actions for these will be different depending on what
- * widget we're in; ^C should copy from the filter text widget if
- * we're in that widget, the packet list if we're in that widget
- * (presumably copying the summaries of selected packets to the
- * clipboard, e.g. the text copy would be the text of the columns),
- * the packet detail if we're in that widget (presumably copying
- * the contents of selected protocol tree items to the clipboard,
- * e.g. the text copy would be the text displayed for those items),
- * etc..
- *
- * Given that those menu items should also affect text widgets
- * such as the filter box, we would again want Select All, and,
- * at least for the filter box, we would also want Undo and Redo.
- * We would only want Cut, Paste, Undo, and Redo for the packet
- * list and packet detail panes if we support modifying them.
- */
- {"/Edit/_Undo", "<control>Z", NULL,
- 0, "<StockItem>", GTK_STOCK_UNDO,},
- {"/Edit/_Redo", "<shift><control>Z", NULL,
- 0, "<StockItem>", GTK_STOCK_REDO,},
- {"/Edit/<separator>", NULL, NULL, 0, "<Separator>", NULL,},
- {"/Edit/Cu_t", "<control>X", NULL,
- 0, "<StockItem>", GTK_STOCK_CUT,},
- {"/Edit/_Copy", "<control>C", NULL,
- 0, "<StockItem>", GTK_STOCK_COPY,},
- {"/Edit/_Paste", "<control>V", NULL,
- 0, "<StockItem>", GTK_STOCK_PASTE,},
- {"/Edit/<separator>", NULL, NULL, 0, "<Separator>", NULL,},
- {"/Edit/Select _All", "<control>A", NULL, 0,
- "<StockItem>", GTK_STOCK_SELECT_ALL,},
-#endif /* 0 */
- { "/Edit/FindPacket", GTK_STOCK_FIND, "_Find Packet...", "<control>F", NULL, G_CALLBACK(find_frame_cb) },
- { "/Edit/FindNext", NULL, "Find Ne_xt", "<control>N", NULL, G_CALLBACK(find_next_cb) },
- { "/Edit/FindPrevious", NULL, "Find Pre_vious", "<control>B", NULL, G_CALLBACK(find_previous_cb) },
-
- { "/Edit/MarkPacket", NULL, "_Mark/Unmark Packet", "<control>M", NULL, G_CALLBACK(packet_list_mark_frame_cb) },
- /* XXX - Unused. Should this and its associated code be removed? */
- { "/Edit/ToggleMarkingOfAllDisplayedPackets", NULL, "Toggle Marking of All Displayed Packets", "<shift><alt><control>M", NULL, G_CALLBACK(packet_list_toggle_mark_all_displayed_frames_cb) },
- { "/Edit/MarkAllDisplayedPackets", NULL, "Mark All Displayed Packets", "<shift><control>M", NULL, G_CALLBACK(packet_list_mark_all_displayed_frames_cb) },
- { "/Edit/UnmarkAllDisplayedPackets", NULL, "_Unmark All Displayed Packets", "<alt><control>M", NULL, G_CALLBACK(packet_list_unmark_all_displayed_frames_cb) },
- { "/Edit/FindNextMark", NULL, "Next Mark", "<shift><control>N", NULL, G_CALLBACK(find_next_mark_cb) },
- { "/Edit/FindPreviousMark", NULL, "Previous Mark", "<shift><control>B", NULL, G_CALLBACK(find_prev_mark_cb) },
-
- { "/Edit/IgnorePacket", NULL, "_Ignore/Unignore Packet", "<control>D", NULL, G_CALLBACK(packet_list_ignore_frame_cb) },
- /*
- * XXX - this next one overrides /Edit/Copy/Description
- */
- { "/Edit/IgnoreAllDisplayedPackets", NULL, "Ignore All Displayed Packets", "<shift><control>D", NULL, G_CALLBACK(packet_list_ignore_all_displayed_frames_cb) },
- { "/Edit/Un-IgnoreAllPackets", NULL, "U_nignore All Packets", "<alt><control>D", NULL, G_CALLBACK(packet_list_unignore_all_frames_cb) },
- { "/Edit/SetTimeReference", WIRESHARK_STOCK_TIME, "Set/Unset Time Reference", "<control>T", NULL, G_CALLBACK(set_reftime_cb) },
- { "/Edit/Un-TimeReferenceAllPackets",NULL, "Unset All Time References", "<alt><control>T", NULL, G_CALLBACK(packet_list_untime_reference_all_frames_cb) },
- { "/Edit/FindNextTimeReference", NULL, "Next Time Reference", "<alt><control>N", NULL, G_CALLBACK(find_next_ref_time_cb) },
- { "/Edit/FindPreviousTimeReference", NULL, "Previous Time Reference", "<alt><control>B", NULL, G_CALLBACK(find_previous_ref_time_cb) },
- { "/Edit/TimeShift", WIRESHARK_STOCK_TIME, "Time Shift...", "<shift><control>T", NULL, G_CALLBACK(time_shift_cb) },
-
- { "/Edit/ConfigurationProfiles", NULL, "_Configuration Profiles...", "<shift><control>A", NULL, G_CALLBACK(profile_dialog_cb) },
- { "/Edit/Preferences", GTK_STOCK_PREFERENCES, "_Preferences...", "<shift><control>P", NULL, G_CALLBACK(menus_prefs_cb) },
- { "/Edit/AddEditPktComment", WIRESHARK_STOCK_EDIT, "Packet Comment...", "<alt><control>C", NULL, G_CALLBACK(edit_packet_comment_dlg) },
- { "/Edit/AddEditCaptureComment", NULL, "Capture Comment...", "<shift><alt><control>C", NULL, G_CALLBACK(edit_capture_comment_dlg_launch) },
-
- { "/View/TimeDisplayFormat", NULL, "_Time Display Format", NULL, NULL, NULL },
-
- { "/View/NameResolution", NULL, "Name Resol_ution", NULL, NULL, NULL },
- { "/View/NameResolution/ResolveName", NULL, "_Resolve Name", NULL, NULL, G_CALLBACK(resolve_name_cb) },
- { "/View/NameResolution/ManuallyResolveName",NULL, "Manually Resolve Name", NULL, NULL, G_CALLBACK(manual_addr_resolv_dlg) },
-
- { "/View/ZoomIn", GTK_STOCK_ZOOM_IN, "_Zoom In", "<control>plus", NULL, G_CALLBACK(view_zoom_in_cb) },
- { "/View/ZoomOut", GTK_STOCK_ZOOM_OUT, "Zoom _Out", "<control>minus", NULL, G_CALLBACK(view_zoom_out_cb) },
- { "/View/NormalSize", GTK_STOCK_ZOOM_100, "_Normal Size", "<control>equal", NULL, G_CALLBACK(view_zoom_100_cb) },
- { "/View/ResizeAllColumns", WIRESHARK_STOCK_RESIZE_COLUMNS, "Resize All Columns", "<shift><control>R", NULL, G_CALLBACK(packet_list_resize_columns_cb) },
- { "/View/DisplayedColumns", NULL, "Displayed Columns", NULL, NULL, NULL },
- { "/View/ExpandSubtrees", NULL, "E_xpand Subtrees", "<shift>Right", NULL, G_CALLBACK(expand_tree_cb) },
- { "/View/CollapseSubtrees", NULL, "Collapse Subtrees", "<shift>Left", NULL, G_CALLBACK(collapse_tree_cb) },
- { "/View/ExpandAll", NULL, "_Expand All", "<control>Right", NULL, G_CALLBACK(expand_all_cb) },
- { "/View/CollapseAll", NULL, "Collapse _All", "<control>Left", NULL, G_CALLBACK(collapse_all_cb) },
- { "/View/ColorizeConversation", NULL, "Colorize Conversation",NULL, NULL, NULL },
-
- { "/View/ColorizeConversation/Color 1", WIRESHARK_STOCK_COLOR1, "Color 1", "<control>1", NULL, G_CALLBACK(view_menu_color_conv_color1_cb) },
- { "/View/ColorizeConversation/Color 2", WIRESHARK_STOCK_COLOR2, "Color 2", "<control>2", NULL, G_CALLBACK(view_menu_color_conv_color2_cb) },
- { "/View/ColorizeConversation/Color 3", WIRESHARK_STOCK_COLOR3, "Color 3", "<control>3", NULL, G_CALLBACK(view_menu_color_conv_color3_cb) },
- { "/View/ColorizeConversation/Color 4", WIRESHARK_STOCK_COLOR4, "Color 4", "<control>4", NULL, G_CALLBACK(view_menu_color_conv_color4_cb) },
- { "/View/ColorizeConversation/Color 5", WIRESHARK_STOCK_COLOR5, "Color 5", "<control>5", NULL, G_CALLBACK(view_menu_color_conv_color5_cb) },
- { "/View/ColorizeConversation/Color 6", WIRESHARK_STOCK_COLOR6, "Color 6", "<control>6", NULL, G_CALLBACK(view_menu_color_conv_color6_cb) },
- { "/View/ColorizeConversation/Color 7", WIRESHARK_STOCK_COLOR7, "Color 7", "<control>7", NULL, G_CALLBACK(view_menu_color_conv_color7_cb) },
- { "/View/ColorizeConversation/Color 8", WIRESHARK_STOCK_COLOR8, "Color 8", "<control>8", NULL, G_CALLBACK(view_menu_color_conv_color8_cb) },
- { "/View/ColorizeConversation/Color 9", WIRESHARK_STOCK_COLOR9, "Color 9", "<control>9", NULL, G_CALLBACK(view_menu_color_conv_color9_cb) },
- { "/View/ColorizeConversation/Color 10", WIRESHARK_STOCK_COLOR0, "Color 10", "<control>0", NULL, G_CALLBACK(view_menu_color_conv_color10_cb) },
- { "/View/ColorizeConversation/NewColoringRule", NULL, "New Coloring Rule...", NULL, NULL, G_CALLBACK(view_menu_color_conv_new_rule_cb) },
-
- { "/View/ResetColoring1-10", NULL, "Reset Coloring 1-10", "<control>space", NULL, G_CALLBACK(view_menu_reset_coloring_cb) },
- { "/View/ColoringRules", GTK_STOCK_SELECT_COLOR, "_Coloring Rules...", NULL, NULL, G_CALLBACK(color_display_cb) },
- { "/View/ShowPacketinNewWindow", NULL, "Show Packet in New _Window", NULL, NULL, G_CALLBACK(new_window_cb) },
- { "/View/Reload", GTK_STOCK_REFRESH, "_Reload", "<control>R", NULL, G_CALLBACK(file_reload_cmd_cb) },
-
-
- { "/Go/Back", GTK_STOCK_GO_BACK, "_Back", "<alt>Left", NULL, G_CALLBACK(history_back_cb) },
- { "/Go/Forward", GTK_STOCK_GO_FORWARD, "_Forward", "<alt>Right", NULL, G_CALLBACK(history_forward_cb) },
- { "/Go/Goto", GTK_STOCK_JUMP_TO, "_Go to Packet...", "<control>G", NULL, G_CALLBACK(goto_frame_cb) },
- { "/Go/GotoCorrespondingPacket", NULL, "Go to _Corresponding Packet", NULL, NULL, G_CALLBACK(goto_framenum_cb) },
- { "/Go/PreviousPacket", GTK_STOCK_GO_UP, "Previous Packet", "<control>Up", NULL, G_CALLBACK(goto_previous_frame_cb) },
- { "/Go/NextPacket", GTK_STOCK_GO_DOWN, "Next Packet", "<control>Down", NULL, G_CALLBACK(goto_next_frame_cb) },
- { "/Go/FirstPacket", GTK_STOCK_GOTO_TOP, "F_irst Packet", "<control>Home", NULL, G_CALLBACK(goto_top_frame_cb) },
- { "/Go/LastPacket", GTK_STOCK_GOTO_BOTTOM, "_Last Packet", "<control>End", NULL, G_CALLBACK(goto_bottom_frame_cb) },
- { "/Go/PreviousPacketInConversation", GTK_STOCK_GO_UP, "Previous Packet In Conversation", "<control>comma", NULL, G_CALLBACK(goto_previous_frame_conversation_cb) },
- { "/Go/NextPacketInConversation", GTK_STOCK_GO_DOWN, "Next Packet In Conversation", "<control>period", NULL, G_CALLBACK(goto_next_frame_conversation_cb) },
-
-
- { "/Analyze/DisplayFilters", WIRESHARK_STOCK_DISPLAY_FILTER, "_Display Filters...", NULL, NULL, G_CALLBACK(dfilter_dialog_cb) },
-
- { "/Analyze/DisplayFilterMacros", NULL, "Display Filter _Macros...", NULL, NULL, G_CALLBACK(macros_dialog_cb) },
- { "/Analyze/ApplyasColumn", NULL, "Apply as Column", NULL, NULL, G_CALLBACK(apply_as_custom_column_cb) },
-
- { "/Analyze/EnabledProtocols", WIRESHARK_STOCK_CHECKBOX, "_Enabled Protocols...", "<shift><control>E", NULL, G_CALLBACK(proto_cb) },
- { "/Analyze/DecodeAs", WIRESHARK_STOCK_DECODE_AS, "Decode _As...", NULL, NULL, G_CALLBACK(decode_as_cb) },
- { "/Analyze/UserSpecifiedDecodes", WIRESHARK_STOCK_DECODE_AS, "_User Specified Decodes...", NULL, NULL, G_CALLBACK(decode_show_cb) },
-
- { "/Analyze/FollowTCPStream", NULL, "Follow TCP Stream", NULL, NULL, G_CALLBACK(follow_tcp_stream_cb) },
- { "/Analyze/FollowUDPStream", NULL, "Follow UDP Stream", NULL, NULL, G_CALLBACK(follow_udp_stream_cb) },
- { "/Analyze/FollowSSLStream", NULL, "Follow SSL Stream", NULL, NULL, G_CALLBACK(follow_ssl_stream_cb) },
- { "/Analyze/FollowHTTPStream", NULL, "Follow HTTP Stream", NULL, NULL, G_CALLBACK(follow_http_stream_cb) },
-
- { "/Analyze/ExpertInfo", WIRESHARK_STOCK_EXPERT_INFO, "Expert _Info", NULL, NULL, G_CALLBACK(expert_comp_dlg_launch) },
-
- { "/Analyze/ConversationFilter", NULL, "Conversation Filter", NULL, NULL, NULL },
-
-
- { "/Statistics/ConversationList", NULL, "_Conversation List", NULL, NULL, NULL },
-
- { "/Statistics/EndpointList", NULL, "_Endpoint List", NULL, NULL, NULL },
-
- { "/Statistics/ServiceResponseTime", NULL, "Service _Response Time", NULL, NULL, NULL },
- { "/Statistics/ServiceResponseTime/DCE-RPC", WIRESHARK_STOCK_TIME, "DCE-RPC...", NULL, NULL, G_CALLBACK(gtk_dcerpcstat_cb) },
- { "/Statistics/ServiceResponseTime/ONC-RPC", WIRESHARK_STOCK_TIME, "ONC-RPC...", NULL, NULL, G_CALLBACK(gtk_rpcstat_cb) },
-
- { "/Statistics/29West", NULL, "29West", NULL, NULL, NULL },
- { "/Statistics/29West/Topics", NULL, "Topics", NULL, NULL, NULL },
- { "/Statistics/29West/Topics/lbmr_topic_ads_topic", NULL, "Advertisements by Topic", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/29West/Topics/lbmr_topic_ads_source", NULL, "Advertisements by Source", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/29West/Topics/lbmr_topic_ads_transport", NULL, "Advertisements by Transport", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/29West/Topics/lbmr_topic_queries_topic", NULL, "Queries by Topic", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/29West/Topics/lbmr_topic_queries_receiver", NULL, "Queries by Receiver", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/29West/Topics/lbmr_topic_queries_pattern", NULL, "Wildcard Queries by Pattern", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/29West/Topics/lbmr_topic_queries_pattern_receiver", NULL, "Wildcard Queries by Receiver", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/29West/Queues", NULL, "Queues", NULL, NULL, NULL },
- { "/Statistics/29West/Queues/lbmr_queue_ads_queue", NULL, "Advertisements by Queue", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/29West/Queues/lbmr_queue_ads_source", NULL, "Advertisements by Source", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/29West/Queues/lbmr_queue_queries_queue", NULL, "Queries by Queue", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/29West/Queues/lbmr_queue_queries_receiver", NULL, "Queries by Receiver", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/29West/UIM", NULL, "UIM", NULL, NULL, NULL },
- { "/Statistics/29West/UIM/Streams", NULL, "Streams", NULL, NULL, G_CALLBACK(lbmc_stream_dlg_stream_menu_cb) },
-
- { "/Statistics/ancp", NULL, "ANCP", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/BACnet", NULL, "BACnet", NULL, NULL, NULL },
- { "/Statistics/BACnet/bacapp_instanceid", NULL, "Packets sorted by Instance ID", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/BACnet/bacapp_ip", NULL, "Packets sorted by IP", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/BACnet/bacapp_objectid", NULL, "Packets sorted by Object Type", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/BACnet/bacapp_service", NULL, "Packets sorted by Service", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/collectd", NULL, "Collectd...", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/compare", NULL, "Compare...", NULL, NULL, G_CALLBACK(gtk_comparestat_cb) },
- { "/Statistics/dns", NULL, "DNS", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/FlowGraph", WIRESHARK_STOCK_FLOW_GRAPH, "Flo_w Graph...", NULL, NULL, G_CALLBACK(flow_graph_launch) },
- { "/Statistics/hart_ip", NULL, "HART-IP", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/hpfeeds", NULL, "HPFEEDS", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/HTTP", NULL, "HTTP", NULL, NULL, NULL },
- { "/Statistics/HTTP/http", NULL, "Packet Counter", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/HTTP/http_req", NULL, "Requests", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/HTTP/http_srv", NULL, "Load Distribution", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/http2", NULL, "HTTP2", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/Sametime", NULL, "Sametime", NULL, NULL, NULL },
- { "/Statistics/Sametime/sametime", NULL, "Messages", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Statistics/TCPStreamGraphMenu", NULL, "TCP StreamGraph", NULL, NULL, NULL },
- { "/Statistics/TCPStreamGraphMenu/Time-Sequence-Graph-Stevens", NULL, "Time-Sequence Graph (Stevens)", NULL, NULL, G_CALLBACK(tcp_graph_cb) },
- { "/Statistics/TCPStreamGraphMenu/Time-Sequence-Graph-tcptrace", NULL, "Time-Sequence Graph (tcptrace)", NULL, NULL, G_CALLBACK(tcp_graph_cb) },
- { "/Statistics/TCPStreamGraphMenu/Throughput-Graph", NULL, "Throughput Graph", NULL, NULL, G_CALLBACK(tcp_graph_cb) },
- { "/Statistics/TCPStreamGraphMenu/RTT-Graph", NULL, "Round Trip Time Graph", NULL, NULL, G_CALLBACK(tcp_graph_cb) },
- { "/Statistics/TCPStreamGraphMenu/Window-Scaling-Graph", NULL, "Window Scaling Graph", NULL, NULL, G_CALLBACK(tcp_graph_cb) },
-
- { "/Statistics/UDPMulticastStreams", NULL, "UDP Multicast Streams", NULL, NULL, G_CALLBACK(mcaststream_launch) },
- { "/Statistics/WLANTraffic", NULL, "WLAN Traffic", NULL, NULL, G_CALLBACK(wlanstat_launch) },
-
- { "/Statistics/Summary", GTK_STOCK_PROPERTIES, "_Summary", NULL, NULL, G_CALLBACK(summary_open_cb) },
- { "/Statistics/CommentsSummary", NULL, "Comments Summary", NULL, NULL, G_CALLBACK(show_packet_comment_summary_dlg) },
- { "/Statistics/ShowAddreRes", NULL, "Show address resolution", NULL, NULL, G_CALLBACK(addr_resolution_dlg) },
- { "/Statistics/ProtocolHierarchy", NULL, "_Protocol Hierarchy", NULL, NULL, G_CALLBACK(proto_hier_stats_cb) },
- { "/Statistics/Conversations", WIRESHARK_STOCK_CONVERSATIONS, "Conversations", NULL, NULL, G_CALLBACK(init_conversation_notebook_cb) },
- { "/Statistics/Endpoints", WIRESHARK_STOCK_ENDPOINTS, "Endpoints", NULL, NULL, G_CALLBACK(init_hostlist_notebook_cb) },
- { "/Statistics/IOGraphs", WIRESHARK_STOCK_GRAPHS, "_IO Graph", NULL, NULL, G_CALLBACK(gui_iostat_cb) },
- { "/Statistics/plen", NULL, "Packet Lengths...", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
-
- { "/Telephony/ANSI", NULL, "_ANSI", NULL, NULL, NULL },
- { "/Telephony/GSM", NULL, "_GSM", NULL, NULL, NULL },
- { "/Telephony/GSM/MAPSummary", NULL, "MAP Summary", NULL, NULL, G_CALLBACK(gsm_map_stat_gtk_sum_cb) },
-
- { "/Telephony/IAX2", NULL, "IA_X2", NULL, NULL, NULL },
- { "/Telephony/IAX2/StreamAnalysis", NULL, "Stream Analysis...", NULL, NULL, G_CALLBACK(iax2_analysis_cb) },
-
- { "/Telephony/isup_msg", NULL, "_ISUP Messages", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
-
- { "/Telephony/LTE", NULL, "_LTE", NULL, NULL, NULL },
- { "/Telephony/LTE/RLCGraph", NULL, "RLC _Graph...", NULL, NULL, G_CALLBACK(rlc_lte_graph_cb) },
- { "/Telephony/MTP3", NULL, "_MTP3", NULL, NULL, NULL },
- { "/Telephony/MTP3/MSUSummary", NULL, "MSU Summary", NULL, NULL, G_CALLBACK(mtp3_sum_gtk_sum_cb) },
- { "/Telephony/Osmux", NULL, "Osmux", NULL, NULL, NULL },
- { "/Telephony/Osmux/osmux", NULL, "Packet Counter", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Telephony/RTP", NULL, "_RTP", NULL, NULL, NULL },
- { "/Telephony/RTP/StreamAnalysis", NULL, "Stream Analysis...", NULL, NULL, G_CALLBACK(rtp_analysis_cb) },
- { "/Telephony/RTP/ShowAllStreams", NULL, "Show All Streams", NULL, NULL, G_CALLBACK(rtpstream_launch) },
- { "/Telephony/RTSP", NULL, "RTSP", NULL, NULL, NULL },
- { "/Telephony/RTSP/rtsp", NULL, "Packet Counter", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Telephony/SCTP", NULL, "S_CTP", NULL, NULL, NULL },
- { "/Telephony/SCTP/AnalysethisAssociation", NULL, "Analyse this Association", NULL, NULL, G_CALLBACK(sctp_analyse_start) },
- { "/Telephony/SCTP/ShowAllAssociations", NULL, "Show All Associations...", NULL, NULL, G_CALLBACK(sctp_stat_start) },
- { "/Telephony/smpp_commands", NULL, "SM_PPOperations", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Telephony/ucp_messages", NULL, "_UCP Messages", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/Telephony/VoIPCalls", WIRESHARK_STOCK_TELEPHONE, "_VoIP Calls", NULL, NULL, G_CALLBACK(voip_calls_launch) },
- { "/Telephony/VoIPFlows", WIRESHARK_STOCK_TELEPHONE, "SIP _Flows", NULL, NULL, G_CALLBACK(voip_flows_launch) },
-
- { "/Tools/FirewallACLRules", NULL, "Firewall ACL Rules", NULL, NULL, G_CALLBACK(firewall_rule_cb) },
-
- { "/Internals/Dissectortables", NULL, "_Dissector tables", NULL, NULL, G_CALLBACK(dissector_tables_dlg_cb) },
- { "/Internals/Conversations", NULL, "_Conversation hash tables",NULL, NULL, G_CALLBACK(conversation_hastables_dlg) },
- { "/Internals/SupportedProtocols", NULL, "_Supported Protocols (slow!)", NULL, NULL, G_CALLBACK(supported_cb) },
-
- { "/Help/Contents", GTK_STOCK_HELP, "_Contents", "F1", NULL, G_CALLBACK(help_menu_cont_cb) },
- { "/Help/ManualPages", NULL, "ManualPages", NULL, NULL, NULL },
- { "/Help/ManualPages/Wireshark", NULL, "Wireshark", NULL, NULL, G_CALLBACK(help_menu_wireshark_cb) },
- { "/Help/ManualPages/WiresharkFilter", NULL, "Wireshark Filter", NULL, NULL, G_CALLBACK(help_menu_wireshark_flt_cb) },
- { "/Help/ManualPages/Capinfos", NULL, "Capinfos", NULL, NULL, G_CALLBACK(help_menu_Capinfos_cb) },
- { "/Help/ManualPages/Dumpcap", NULL, "Dumpcap", NULL, NULL, G_CALLBACK(help_menu_Dumpcap_cb) },
- { "/Help/ManualPages/Editcap", NULL, "Editcap", NULL, NULL, G_CALLBACK(help_menu_Editcap_cb) },
- { "/Help/ManualPages/Mergecap", NULL, "Mergecap", NULL, NULL, G_CALLBACK(help_menu_Mergecap_cb) },
- { "/Help/ManualPages/RawShark", NULL, "RawShark", NULL, NULL, G_CALLBACK(help_menu_RawShark_cb) },
- { "/Help/ManualPages/Reordercap", NULL, "Reordercap", NULL, NULL, G_CALLBACK(help_menu_Reorder_cb) },
- { "/Help/ManualPages/Text2pcap", NULL, "Text2pcap", NULL, NULL, G_CALLBACK(help_menu_Text2pcap_cb) },
- { "/Help/ManualPages/TShark", NULL, "TShark", NULL, NULL, G_CALLBACK(help_menu_TShark_cb) },
-
- { "/Help/Website", GTK_STOCK_HOME, "Website", NULL, NULL, G_CALLBACK(help_menu_Website_cb) },
- { "/Help/FAQs", NULL, "FAQ's", NULL, NULL, G_CALLBACK(help_menu_faq_cb) },
- { "/Help/ASK", NULL, "Ask (Q&A)", NULL, NULL, G_CALLBACK(help_menu_ask_cb) },
- { "/Help/Downloads", NULL, "Downloads", NULL, NULL, G_CALLBACK(help_menu_Downloads_cb) },
- { "/Help/Wiki", WIRESHARK_STOCK_WIKI, "Wiki", NULL, NULL, G_CALLBACK(help_menu_Wiki_cb) },
- { "/Help/SampleCaptures", NULL, "Sample Captures", NULL, NULL, G_CALLBACK(help_menu_SampleCaptures_cb) },
-#ifdef HAVE_SOFTWARE_UPDATE
- { "/Help/CheckForUpdates", NULL, "Check for Updates...", NULL, NULL, G_CALLBACK(check_for_updates_cb) },
-#endif /* HAVE_SOFTWARE_UPDATE */
- { "/Help/AboutWireshark", WIRESHARK_STOCK_ABOUT, "_About Wireshark", NULL, NULL, G_CALLBACK(about_wireshark_cb) },
-};
-
-static const GtkToggleActionEntry main_menu_bar_toggle_action_entries[] =
-{
- /* name, stock id, label, accel, tooltip, callback, is_active */
- {"/View/MainToolbar", NULL, "_Main Toolbar", NULL, NULL, G_CALLBACK(main_toolbar_show_hide_cb), TRUE},
- {"/View/FilterToolbar", NULL, "_Filter Toolbar", NULL, NULL, G_CALLBACK(filter_toolbar_show_hide_cb), TRUE},
- {"/View/WirelessToolbar", NULL, "Wire_less Toolbar", NULL, NULL, G_CALLBACK(wireless_toolbar_show_hide_cb), FALSE},
- {"/View/StatusBar", NULL, "_Status Bar", NULL, NULL, G_CALLBACK(status_bar_show_hide_cb), TRUE},
- {"/View/PacketList", NULL, "Packet _List", NULL, NULL, G_CALLBACK(packet_list_show_hide_cb), TRUE},
- {"/View/PacketDetails", NULL, "Packet _Details", NULL, NULL, G_CALLBACK(packet_details_show_hide_cb), TRUE},
- {"/View/PacketBytes", NULL, "Packet _Bytes", NULL, NULL, G_CALLBACK(packet_bytes_show_hide_cb), TRUE},
- {"/View/TimeDisplayFormat/DisplaySecondsWithHoursAndMinutes", NULL, "Display Seconds with hours and minutes", NULL, NULL, G_CALLBACK(timestamp_seconds_time_cb), FALSE},
- {"/View/NameResolution/EnableforMACLayer", NULL, "Enable for _MAC Layer", NULL, NULL, G_CALLBACK(view_menu_en_for_MAC_cb), TRUE},
- {"/View/NameResolution/EnableforTransportLayer", NULL, "Enable for _Transport Layer", NULL, NULL, G_CALLBACK(view_menu_en_for_transport_cb), TRUE },
- {"/View/NameResolution/EnableforNetworkLayer", NULL, "Enable for _Network Layer", NULL, NULL, G_CALLBACK(view_menu_en_for_network_cb), TRUE },
- {"/View/NameResolution/UseExternalNetworkNameResolver", NULL, "Use _External Network Name Resolver", NULL, NULL, G_CALLBACK(view_menu_en_use_external_resolver_cb), TRUE },
- {"/View/ColorizePacketList", NULL, "Colorize Packet List", NULL, NULL, G_CALLBACK(view_menu_colorize_pkt_lst_cb), TRUE },
-#ifdef HAVE_LIBPCAP
- {"/View/AutoScrollinLiveCapture", NULL, "Auto Scroll in Li_ve Capture", NULL, NULL, G_CALLBACK(view_menu_auto_scroll_live_cb), TRUE },
-#endif
-};
-
-static const GtkRadioActionEntry main_menu_bar_radio_view_time_entries [] =
-{
- /* name, stock id, label, accel, tooltip, value */
- { "/View/TimeDisplayFormat/DateYMDandTimeofDay", NULL, "Date and Time of Day: 1970-01-01 01:02:03.123456", "<alt><control>1", NULL, TS_ABSOLUTE_WITH_YMD },
- { "/View/TimeDisplayFormat/DateYDOYandTimeofDay", NULL, "Date (with day of year) and Time of Day: 1970/001 01:02:03.123456", NULL, NULL, TS_ABSOLUTE_WITH_YDOY },
- { "/View/TimeDisplayFormat/TimeofDay", NULL, "Time of Day: 01:02:03.123456", "<alt><control>2", NULL, TS_ABSOLUTE },
- { "/View/TimeDisplayFormat/SecondsSinceEpoch", NULL, "Seconds Since Epoch (1970-01-01): 1234567890.123456", "<alt><control>3", NULL, TS_EPOCH },
- { "/View/TimeDisplayFormat/SecondsSinceBeginningofCapture", NULL, "Seconds Since Beginning of Capture: 123.123456", "<alt><control>4", NULL, TS_RELATIVE },
- { "/View/TimeDisplayFormat/SecondsSincePreviousCapturedPacket", NULL, "Seconds Since Previous Captured Packet: 1.123456", "<alt><control>5", NULL, TS_DELTA },
- { "/View/TimeDisplayFormat/SecondsSincePreviousDisplayedPacket",NULL, "Seconds Since Previous Displayed Packet: 1.123456", "<alt><control>6", NULL, TS_DELTA_DIS },
- { "/View/TimeDisplayFormat/UTCDateYMDandTimeofDay", NULL, "UTC Date and Time of Day: 1970-01-01 01:02:03.123456", "<alt><control>7", NULL, TS_UTC_WITH_YMD },
- { "/View/TimeDisplayFormat/UTCDateYDOYandTimeofDay", NULL, "UTC Date (with day of year) and Time of Day: 1970/001 01:02:03.123456", NULL, NULL, TS_UTC_WITH_YDOY },
- { "/View/TimeDisplayFormat/UTCTimeofDay", NULL, "UTC Time of Day: 01:02:03.123456", "<alt><control>8", NULL, TS_UTC },
-};
-
-static const GtkRadioActionEntry main_menu_bar_radio_view_time_fileformat_prec_entries [] =
-{
- /* name, stock id, label, accel, tooltip, value */
- { "/View/TimeDisplayFormat/FileFormatPrecision-Automatic", NULL, "Automatic (use precision indicated in the file)", NULL, NULL, TS_PREC_AUTO },
- { "/View/TimeDisplayFormat/FileFormatPrecision-Seconds", NULL, "Seconds: 0", NULL, NULL, TS_PREC_FIXED_SEC },
- { "/View/TimeDisplayFormat/FileFormatPrecision-Deciseconds", NULL, "Deciseconds: 0.1", NULL, NULL, TS_PREC_FIXED_DSEC },
- { "/View/TimeDisplayFormat/FileFormatPrecision-Centiseconds", NULL, "Centiseconds: 0.12", NULL, NULL, TS_PREC_FIXED_CSEC },
- { "/View/TimeDisplayFormat/FileFormatPrecision-Milliseconds", NULL, "Milliseconds: 0.123", NULL, NULL, TS_PREC_FIXED_MSEC },
- { "/View/TimeDisplayFormat/FileFormatPrecision-Microseconds", NULL, "Microseconds: 0.123456", NULL, NULL, TS_PREC_FIXED_USEC },
- { "/View/TimeDisplayFormat/FileFormatPrecision-Nanoseconds", NULL, "Nanoseconds: 0.123456789", NULL, NULL, TS_PREC_FIXED_NSEC },
-};
-
-
-static void
-select_bytes_view_cb (GtkRadioAction *action, GtkRadioAction *current _U_, gpointer user_data _U_)
-{
- bytes_view_type value;
-
- value = (bytes_view_type)gtk_radio_action_get_current_value (action);
- /* Fix me */
- select_bytes_view( NULL, NULL, value);
-}
-
-static void
-sort_ascending_cb(GtkAction *action _U_, gpointer user_data)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_packet_list_heading, "/PacketListHeadingPopup/SortAscending");
- packet_list_column_menu_cb( widget , user_data, COLUMN_SELECTED_SORT_ASCENDING);
-}
-
-static void
-sort_descending_cb(GtkAction *action _U_, gpointer user_data)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_packet_list_heading, "/PacketListHeadingPopup/SortDescending");
- packet_list_column_menu_cb( widget , user_data, COLUMN_SELECTED_SORT_DESCENDING);
-}
-
-static void
-no_sorting_cb(GtkAction *action _U_, gpointer user_data)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_packet_list_heading, "/PacketListHeadingPopup/NoSorting");
- packet_list_column_menu_cb( widget , user_data, COLUMN_SELECTED_SORT_NONE);
-}
-
-static void
-packet_list_heading_show_resolved_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_packet_list_heading, "/PacketListHeadingPopup/ShowResolved");
-
- packet_list_column_menu_cb( widget , user_data, COLUMN_SELECTED_TOGGLE_RESOLVED);
-}
-
-static void
-packet_list_heading_align_left_cb(GtkAction *action _U_, gpointer user_data)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_packet_list_heading, "/PacketListHeadingPopup/AlignLeft");
- packet_list_column_menu_cb( widget , user_data, COLUMN_SELECTED_ALIGN_LEFT);
-}
-
-static void
-packet_list_heading_align_center_cb(GtkAction *action _U_, gpointer user_data)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_packet_list_heading, "/PacketListHeadingPopup/AlignCenter");
- packet_list_column_menu_cb( widget , user_data, COLUMN_SELECTED_ALIGN_CENTER);
-}
-
-static void
-packet_list_heading_align_right_cb(GtkAction *action _U_, gpointer user_data)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_packet_list_heading, "/PacketListHeadingPopup/AlignRight");
- packet_list_column_menu_cb( widget , user_data, COLUMN_SELECTED_ALIGN_RIGHT);
-}
-
-static void
-packet_list_heading_col_pref_cb(GtkAction *action _U_, gpointer user_data)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_packet_list_heading, "/PacketListHeadingPopup/ColumnPreferences");
- prefs_page_cb( widget , user_data, PREFS_PAGE_COLUMNS);
-}
-
-static void
-packet_list_heading_resize_col_cb(GtkAction *action _U_, gpointer user_data)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_packet_list_heading, "/PacketListHeadingPopup/ResizeColumn");
- packet_list_column_menu_cb( widget , user_data, COLUMN_SELECTED_RESIZE);
-}
-
-static void
-packet_list_heading_change_col_cb(GtkAction *action _U_, gpointer user_data)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_packet_list_heading, "/PacketListHeadingPopup/EditColumnDetails");
- packet_list_column_menu_cb( widget , user_data, COLUMN_SELECTED_CHANGE);
-}
-
-static void
-packet_list_heading_activate_all_columns_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- packet_list_set_all_columns_visible ();
-}
-
-static void
-packet_list_heading_hide_col_cb(GtkAction *action _U_, gpointer user_data)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_packet_list_heading, "/PacketListHeadingPopup/HideColumn");
- packet_list_column_menu_cb( widget , user_data, COLUMN_SELECTED_HIDE);
-}
-
-static void
-packet_list_heading_remove_col_cb(GtkAction *action _U_, gpointer user_data)
-{
- GtkWidget *widget = gtk_ui_manager_get_widget(ui_manager_packet_list_heading, "/PacketListHeadingPopup/RemoveColumn");
- packet_list_column_menu_cb( widget , user_data, COLUMN_SELECTED_REMOVE);
-}
-
-static void
-packet_list_menu_set_ref_time_cb(GtkAction *action _U_, gpointer user_data)
-{
- reftime_frame_cb( NULL /* widget _U_ */ , user_data, REFTIME_TOGGLE);
-}
-
-
-static void
-apply_selected_filter_cb(GtkAction *action, gpointer user_data)
-{
- const gchar *path = gtk_action_get_accel_path(action);
- /*g_warning("Accelerator path %s",path+9);*/
-
- /* path starts with "<Actions>" */
- if (strncmp (path+9,"/PacketListPopUpMenuActionGroup",31) == 0){
- /* Use different callbacks depending action path */
- match_selected_plist_cb(user_data, (MATCH_SELECTED_E)(MATCH_SELECTED_REPLACE|MATCH_SELECTED_APPLY_NOW));
- } else {
- match_selected_ptree_cb(user_data, (MATCH_SELECTED_E)(MATCH_SELECTED_REPLACE|MATCH_SELECTED_APPLY_NOW));
- }
-}
-
-static void
-apply_not_selected_cb(GtkAction *action, gpointer user_data)
-{
- const gchar *path = gtk_action_get_accel_path(action);
-
- /* path starts with "<Actions>" */
- if (strncmp (path+9,"/PacketListPopUpMenuActionGroup",31) == 0){
- /* Use different callbacks depending action path */
- match_selected_plist_cb(user_data, (MATCH_SELECTED_E)(MATCH_SELECTED_NOT|MATCH_SELECTED_APPLY_NOW));
- } else {
- match_selected_ptree_cb(user_data, (MATCH_SELECTED_E)(MATCH_SELECTED_NOT|MATCH_SELECTED_APPLY_NOW));
- }
-}
-
-static void
-apply_and_selected_cb(GtkAction *action, gpointer user_data)
-{
- const gchar *path = gtk_action_get_accel_path(action);
-
- /* path starts with "<Actions>" */
- if (strncmp (path+9,"/PacketListPopUpMenuActionGroup",31) == 0){
- /* Use different callbacks depending action path */
- match_selected_plist_cb(user_data, (MATCH_SELECTED_E)(MATCH_SELECTED_AND|MATCH_SELECTED_APPLY_NOW));
- } else {
- match_selected_ptree_cb(user_data, (MATCH_SELECTED_E)(MATCH_SELECTED_AND|MATCH_SELECTED_APPLY_NOW));
- }
-}
-
-static void
-apply_or_selected_cb(GtkAction *action, gpointer user_data)
-{
- const gchar *path = gtk_action_get_accel_path(action);
-
- /* path starts with "<Actions>" */
- if (strncmp (path+9,"/PacketListPopUpMenuActionGroup",31) == 0){
- /* Use different callbacks depending action path */
- match_selected_plist_cb(user_data, (MATCH_SELECTED_E)(MATCH_SELECTED_OR|MATCH_SELECTED_APPLY_NOW));
- } else {
- match_selected_ptree_cb(user_data, (MATCH_SELECTED_E)(MATCH_SELECTED_OR|MATCH_SELECTED_APPLY_NOW));
- }
-}
-
-static void
-apply_and_not_selected_cb(GtkAction *action, gpointer user_data)
-{
- const gchar *path = gtk_action_get_accel_path(action);
-
- /* path starts with "<Actions>" */
- if (strncmp (path+9,"/PacketListPopUpMenuActionGroup",31) == 0){
- /* Use different callbacks depending action path */
- match_selected_plist_cb(user_data, (MATCH_SELECTED_E)(MATCH_SELECTED_AND_NOT|MATCH_SELECTED_APPLY_NOW));
- } else {
- match_selected_ptree_cb(user_data, (MATCH_SELECTED_E)(MATCH_SELECTED_AND_NOT|MATCH_SELECTED_APPLY_NOW));
- }
-}
-
-static void
-apply_or_not_selected_cb(GtkAction *action, gpointer user_data)
-{
- const gchar *path = gtk_action_get_accel_path(action);
-
- /* path starts with "<Actions>" */
- if (strncmp (path+9,"/PacketListPopUpMenuActionGroup",31) == 0){
- /* Use different callbacks depending action path */
- match_selected_plist_cb(user_data,(MATCH_SELECTED_E)(MATCH_SELECTED_OR_NOT|MATCH_SELECTED_APPLY_NOW));
- } else {
- match_selected_ptree_cb(user_data, (MATCH_SELECTED_E)(MATCH_SELECTED_OR_NOT|MATCH_SELECTED_APPLY_NOW));
- }
-}
-
-/* Prepare a filter */
-static void
-prepare_selected_cb(GtkAction *action, gpointer user_data)
-{
- const gchar *path = gtk_action_get_accel_path(action);
-
- /* path starts with "<Actions>" */
- if (strncmp (path+9,"/PacketListPopUpMenuActionGroup",31) == 0){
- /* Use different callbacks depending action path */
- match_selected_plist_cb(user_data, MATCH_SELECTED_REPLACE);
- } else {
- match_selected_ptree_cb(user_data, MATCH_SELECTED_REPLACE);
- }
-}
-
-static void
-prepare_not_selected_cb(GtkAction *action, gpointer user_data)
-{
- const gchar *path = gtk_action_get_accel_path(action);
-
- /* path starts with "<Actions>" */
- if (strncmp (path+9,"/PacketListPopUpMenuActionGroup",31) == 0){
- /* Use different callbacks depending action path */
- match_selected_plist_cb(user_data, MATCH_SELECTED_NOT);
- } else {
- match_selected_ptree_cb(user_data, MATCH_SELECTED_NOT);
- }
-}
-
-static void
-prepare_and_selected_cb(GtkAction *action, gpointer user_data)
-{
- const gchar *path = gtk_action_get_accel_path(action);
-
- /* path starts with "<Actions>" */
- if (strncmp (path+9,"/PacketListPopUpMenuActionGroup",31) == 0){
- /* Use different callbacks depending action path */
- match_selected_plist_cb(user_data, MATCH_SELECTED_AND);
- } else {
- match_selected_ptree_cb(user_data, MATCH_SELECTED_AND);
- }
-}
-
-static void
-prepare_or_selected_cb(GtkAction *action, gpointer user_data)
-{
- const gchar *path = gtk_action_get_accel_path(action);
-
- /* path starts with "<Actions>" */
- if (strncmp (path+9,"/PacketListPopUpMenuActionGroup",31) == 0){
- /* Use different callbacks depending action path */
- match_selected_plist_cb(user_data, MATCH_SELECTED_OR);
- } else {
- match_selected_ptree_cb(user_data, MATCH_SELECTED_OR);
- }
-}
-
-static void
-prepare_and_not_selected_cb(GtkAction *action, gpointer user_data)
-{
- const gchar *path = gtk_action_get_accel_path(action);
-
- /* path starts with "<Actions>" */
- if (strncmp (path+9,"/PacketListPopUpMenuActionGroup",31) == 0){
- /* Use different callbacks depending action path */
- match_selected_plist_cb(user_data, MATCH_SELECTED_AND_NOT);
- } else {
- match_selected_ptree_cb(user_data, MATCH_SELECTED_AND_NOT);
- }
-}
-
-static void
-prepare_or_not_selected_cb(GtkAction *action, gpointer user_data)
-{
- const gchar *path = gtk_action_get_accel_path(action);
-
- /* path starts with "<Actions>" */
- if (strncmp (path+9,"/PacketListPopUpMenuActionGroup",31) == 0){
- /* Use different callbacks depending action path */
- match_selected_plist_cb(user_data, MATCH_SELECTED_OR_NOT);
- } else {
- match_selected_ptree_cb(user_data, MATCH_SELECTED_OR_NOT);
- }
-}
-
-typedef void (*packet_list_menu_color_conv_color_cb_t)(GtkAction *action, gpointer user_data);
-
-static void
-packet_list_menu_color_conv_color1_cb(GtkAction *action _U_, gpointer user_data)
-{
- conversation_filter_t* color_filter = (conversation_filter_t*)user_data;
- colorize_conversation_cb(color_filter, 1);
-}
-
-static void
-packet_list_menu_color_conv_color2_cb(GtkAction *action _U_, gpointer user_data)
-{
- conversation_filter_t* color_filter = (conversation_filter_t*)user_data;
- colorize_conversation_cb(color_filter, 2);
-}
-
-static void
-packet_list_menu_color_conv_color3_cb(GtkAction *action _U_, gpointer user_data)
-{
- conversation_filter_t* color_filter = (conversation_filter_t*)user_data;
- colorize_conversation_cb(color_filter, 3);
-}
-
-static void
-packet_list_menu_color_conv_color4_cb(GtkAction *action _U_, gpointer user_data)
-{
- conversation_filter_t* color_filter = (conversation_filter_t*)user_data;
- colorize_conversation_cb(color_filter, 4);
-}
-
-static void
-packet_list_menu_color_conv_color5_cb(GtkAction *action _U_, gpointer user_data)
-{
- conversation_filter_t* color_filter = (conversation_filter_t*)user_data;
- colorize_conversation_cb(color_filter, 5);
-}
-
-static void
-packet_list_menu_color_conv_color6_cb(GtkAction *action _U_, gpointer user_data)
-{
- conversation_filter_t* color_filter = (conversation_filter_t*)user_data;
- colorize_conversation_cb(color_filter, 6);
-}
-
-static void
-packet_list_menu_color_conv_color7_cb(GtkAction *action _U_, gpointer user_data)
-{
- conversation_filter_t* color_filter = (conversation_filter_t*)user_data;
- colorize_conversation_cb(color_filter, 7);
-}
-
-static void
-packet_list_menu_color_conv_color8_cb(GtkAction *action _U_, gpointer user_data)
-{
- conversation_filter_t* color_filter = (conversation_filter_t*)user_data;
- colorize_conversation_cb(color_filter, 8);
-}
-
-static void
-packet_list_menu_color_conv_color9_cb(GtkAction *action _U_, gpointer user_data)
-{
- conversation_filter_t* color_filter = (conversation_filter_t*)user_data;
- colorize_conversation_cb(color_filter, 9);
-}
-
-static void
-packet_list_menu_color_conv_color10_cb(GtkAction *action _U_, gpointer user_data)
-{
- conversation_filter_t* color_filter = (conversation_filter_t*)user_data;
- colorize_conversation_cb(color_filter, 10);
-}
-
-static void
-packet_list_menu_color_conv_new_rule_cb(GtkAction *action _U_, gpointer user_data)
-{
- conversation_filter_t* color_filter = (conversation_filter_t*)user_data;
- colorize_conversation_cb(color_filter, 0);
-}
-
-static void
-packet_list_menu_copy_sum_txt(GtkAction *action _U_, gpointer user_data)
-{
- packet_list_copy_summary_cb(user_data, CS_TEXT);
-}
-
-static void
-packet_list_menu_copy_sum_csv(GtkAction *action _U_, gpointer user_data)
-{
- packet_list_copy_summary_cb(user_data, CS_CSV);
-}
-
-static void
-packet_list_menu_copy_as_flt(GtkAction *action _U_, gpointer user_data)
-{
- match_selected_plist_cb(user_data, (MATCH_SELECTED_E)(MATCH_SELECTED_REPLACE|MATCH_SELECTED_COPY_ONLY));
-}
-
-static void
-packet_list_menu_copy_bytes_oht_cb(GtkAction *action _U_, gpointer user_data)
-{
- copy_hex_cb( NULL /* widget _U_ */ , user_data, (copy_data_type)(CD_ALLINFO | CD_FLAGS_SELECTEDONLY));
-}
-
-static void
-packet_list_menu_copy_bytes_oh_cb(GtkAction *action _U_, gpointer user_data)
-{
- copy_hex_cb( NULL /* widget _U_ */ , user_data, (copy_data_type)(CD_HEXCOLUMNS | CD_FLAGS_SELECTEDONLY));
-}
-
-static void
-packet_list_menu_copy_bytes_text_cb(GtkAction *action _U_, gpointer user_data)
-{
- copy_hex_cb( NULL /* widget _U_ */ , user_data, (copy_data_type)(CD_TEXTONLY | CD_FLAGS_SELECTEDONLY));
-}
-
-static void
-packet_list_menu_copy_bytes_hex_strm_cb(GtkAction *action _U_, gpointer user_data)
-{
- copy_hex_cb( NULL /* widget _U_ */ , user_data, (copy_data_type)(CD_HEX | CD_FLAGS_SELECTEDONLY));
-}
-
-static void
-packet_list_menu_copy_bytes_bin_strm_cb(GtkAction *action _U_, gpointer user_data)
-{
- copy_hex_cb( NULL /* widget _U_ */ , user_data, (copy_data_type)(CD_BINARY | CD_FLAGS_SELECTEDONLY));
-}
-
-/* tree */
-
-static void
-tree_view_menu_color_with_flt_color1_cb(GtkAction *action _U_, gpointer user_data)
-{
- colorize_selected_ptree_cb( NULL /* widget _U_ */ , user_data, 1);
-}
-
-static void
-tree_view_menu_color_with_flt_color2_cb(GtkAction *action _U_, gpointer user_data)
-{
- colorize_selected_ptree_cb( NULL /* widget _U_ */ , user_data, 2);
-}
-
-static void
-tree_view_menu_color_with_flt_color3_cb(GtkAction *action _U_, gpointer user_data)
-{
- colorize_selected_ptree_cb( NULL /* widget _U_ */ , user_data, 3);
-}
-
-static void
-tree_view_menu_color_with_flt_color4_cb(GtkAction *action _U_, gpointer user_data)
-{
- colorize_selected_ptree_cb( NULL /* widget _U_ */ , user_data, 4);
-}
-
-static void
-tree_view_menu_color_with_flt_color5_cb(GtkAction *action _U_, gpointer user_data)
-{
- colorize_selected_ptree_cb( NULL /* widget _U_ */ , user_data, 5);
-}
-
-static void
-tree_view_menu_color_with_flt_color6_cb(GtkAction *action _U_, gpointer user_data)
-{
- colorize_selected_ptree_cb( NULL /* widget _U_ */ , user_data, 6);
-}
-
-static void
-tree_view_menu_color_with_flt_color7_cb(GtkAction *action _U_, gpointer user_data)
-{
- colorize_selected_ptree_cb( NULL /* widget _U_ */ , user_data, 7);
-}
-
-static void
-tree_view_menu_color_with_flt_color8_cb(GtkAction *action _U_, gpointer user_data)
-{
- colorize_selected_ptree_cb( NULL /* widget _U_ */ , user_data, 8);
-}
-
-static void
-tree_view_menu_color_with_flt_color9_cb(GtkAction *action _U_, gpointer user_data)
-{
- colorize_selected_ptree_cb( NULL /* widget _U_ */ , user_data, 9);
-}
-
-static void
-tree_view_menu_color_with_flt_color10_cb(GtkAction *action _U_, gpointer user_data)
-{
- colorize_selected_ptree_cb( NULL /* widget _U_ */ , user_data, 10);
-}
-
-static void
-tree_view_menu_color_with_flt_new_rule_cb(GtkAction *action _U_, gpointer user_data)
-{
- colorize_selected_ptree_cb( NULL /* widget _U_ */ , user_data, 0);
-}
-
-
-static void
-tree_view_menu_copy_desc(GtkAction *action _U_, gpointer user_data)
-{
- copy_selected_plist_cb( NULL /* widget _U_ */ , user_data, COPY_SELECTED_DESCRIPTION);
-}
-
-static void
-tree_view_menu_copy_field(GtkAction *action _U_, gpointer user_data)
-{
- copy_selected_plist_cb( NULL /* widget _U_ */ , user_data, COPY_SELECTED_FIELDNAME);
-}
-
-static void
-tree_view_menu_copy_value(GtkAction *action _U_, gpointer user_data)
-{
- copy_selected_plist_cb( NULL /* widget _U_ */ , user_data, COPY_SELECTED_VALUE);
-}
-
-static void
-tree_view_menu_copy_as_flt(GtkAction *action _U_, gpointer user_data _U_)
-{
- /* match_selected_ptree_cb needs the popup_menu_object to get the right object E_DFILTER_TE_KEY */
- match_selected_ptree_cb( popup_menu_object, (MATCH_SELECTED_E)(MATCH_SELECTED_REPLACE|MATCH_SELECTED_COPY_ONLY));
-}
-
-static const char *ui_desc_packet_list_heading_menu_popup =
-"<ui>\n"
-" <popup name='PacketListHeadingPopup' action='PopupAction'>\n"
-" <menuitem name='SortAscending' action='/Sort Ascending'/>\n"
-" <menuitem name='SortDescending' action='/Sort Descending'/>\n"
-" <menuitem name='NoSorting' action='/No Sorting'/>\n"
-" <separator/>\n"
-" <menuitem name='ShowResolved' action='/Show Resolved'/>\n"
-" <separator/>\n"
-" <menuitem name='AlignLeft' action='/Align Left'/>\n"
-" <menuitem name='AlignCenter' action='/Align Center'/>\n"
-" <menuitem name='AlignRight' action='/Align Right'/>\n"
-" <separator/>\n"
-" <menuitem name='ColumnPreferences' action='/Column Preferences'/>\n"
-" <menuitem name='EditColumnDetails' action='/Edit Column Details'/>\n"
-" <menuitem name='ResizeColumn' action='/Resize Column'/>\n"
-" <separator/>\n"
-" <menu name='DisplayedColumns' action='/Displayed Columns'>\n"
-" <menuitem name='Display All' action='/Displayed Columns/Display All'/>\n"
-" </menu>\n"
-" <menuitem name='HideColumn' action='/Hide Column'/>\n"
-" <menuitem name='RemoveColumn' action='/Remove Column'/>\n"
-" </popup>\n"
-"</ui>\n";
-
-static const GtkActionEntry packet_list_heading_menu_popup_action_entries[] = {
- { "/Sort Ascending", GTK_STOCK_SORT_ASCENDING, "Sort Ascending", NULL, NULL, G_CALLBACK(sort_ascending_cb) },
- { "/Sort Descending", GTK_STOCK_SORT_DESCENDING, "Sort Descending", NULL, NULL, G_CALLBACK(sort_descending_cb) },
- { "/No Sorting", NULL, "No Sorting", NULL, NULL, G_CALLBACK(no_sorting_cb) },
- { "/Align Left", GTK_STOCK_JUSTIFY_LEFT, "Align Left", NULL, NULL, G_CALLBACK(packet_list_heading_align_left_cb) },
- { "/Align Center", GTK_STOCK_JUSTIFY_CENTER, "Align Center", NULL, NULL, G_CALLBACK(packet_list_heading_align_center_cb) },
- { "/Align Right", GTK_STOCK_JUSTIFY_RIGHT, "Align Right", NULL, NULL, G_CALLBACK(packet_list_heading_align_right_cb) },
- { "/Column Preferences", GTK_STOCK_PREFERENCES, "Column Preferences...", NULL, NULL, G_CALLBACK(packet_list_heading_col_pref_cb) },
- { "/Edit Column Details", WIRESHARK_STOCK_EDIT, "Edit Column Details...", NULL, NULL, G_CALLBACK(packet_list_heading_change_col_cb) },
- { "/Resize Column", WIRESHARK_STOCK_RESIZE_COLUMNS, "Resize Column", NULL, NULL, G_CALLBACK(packet_list_heading_resize_col_cb) },
- { "/Displayed Columns", NULL, "Displayed Columns", NULL, NULL, NULL },
- { "/Displayed Columns/Display All", NULL, "Display All", NULL, NULL, G_CALLBACK(packet_list_heading_activate_all_columns_cb) },
- { "/Hide Column", NULL, "Hide Column", NULL, NULL, G_CALLBACK(packet_list_heading_hide_col_cb) },
- { "/Remove Column", GTK_STOCK_DELETE, "Remove Column", NULL, NULL, G_CALLBACK(packet_list_heading_remove_col_cb) },
-};
-
-static const GtkToggleActionEntry packet_list_heading_menu_toggle_action_entries[] =
-{
- /* name, stock id, label, accel, tooltip, callback, is_active */
- {"/Show Resolved", NULL, "Show Resolved", NULL, NULL, G_CALLBACK(packet_list_heading_show_resolved_cb), FALSE},
-};
-
-static const char *ui_desc_packet_list_menu_popup =
-"<ui>\n"
-" <popup name='PacketListMenuPopup' action='PopupAction'>\n"
-" <menuitem name='MarkPacket' action='/MarkPacket'/>\n"
-" <menuitem name='IgnorePacket' action='/IgnorePacket'/>\n"
-" <menuitem name='SetTimeReference' action='/Set Time Reference'/>\n"
-" <menuitem name='TimeShift' action='/TimeShift'/>\n"
-" <menuitem name='AddEditPktComment' action='/Edit/AddEditPktComment'/>\n"
-" <separator/>\n"
-" <menuitem name='ManuallyResolveAddress' action='/ManuallyResolveAddress'/>\n"
-" <separator/>\n"
-" <menu name= 'ApplyAsFilter' action='/ApplyasFilter'>\n"
-" <menuitem name='Selected' action='/ApplyasFilter/Selected'/>\n"
-" <menuitem name='NotSelected' action='/ApplyasFilter/Not Selected'/>\n"
-" <menuitem name='AndSelected' action='/ApplyasFilter/AndSelected'/>\n"
-" <menuitem name='OrSelected' action='/ApplyasFilter/OrSelected'/>\n"
-" <menuitem name='AndNotSelected' action='/ApplyasFilter/AndNotSelected'/>\n"
-" <menuitem name='OrNotSelected' action='/ApplyasFilter/OrNotSelected'/>\n"
-" </menu>\n"
-" <menu name= 'PrepareaFilter' action='/PrepareaFilter'>\n"
-" <menuitem name='Selected' action='/PrepareaFilter/Selected'/>\n"
-" <menuitem name='NotSelected' action='/PrepareaFilter/Not Selected'/>\n"
-" <menuitem name='AndSelected' action='/PrepareaFilter/AndSelected'/>\n"
-" <menuitem name='OrSelected' action='/PrepareaFilter/OrSelected'/>\n"
-" <menuitem name='AndNotSelected' action='/PrepareaFilter/AndNotSelected'/>\n"
-" <menuitem name='OrNotSelected' action='/PrepareaFilter/OrNotSelected'/>\n"
-" </menu>\n"
-" <menu name= 'ConversationFilter' action='/Conversation Filter'>\n"
-" <placeholder name='Conversations'/>\n"
-" </menu>\n"
-" <menu name= 'ColorizeConversation' action='/Colorize Conversation'>\n"
-" <placeholder name='Colorize'/>\n"
-" </menu>\n"
-" <menu name= 'SCTP' action='/SCTP'>\n"
-" <menuitem name='AnalysethisAssociation' action='/SCTP/Analyse this Association'/>\n"
-" <menuitem name='PrepareFilterforthisAssociation' action='/SCTP/Prepare Filter for this Association'/>\n"
-" </menu>\n"
-" <menuitem name='FollowTCPStream' action='/Follow TCP Stream'/>\n"
-" <menuitem name='FollowUDPStream' action='/Follow UDP Stream'/>\n"
-" <menuitem name='FollowSSLStream' action='/Follow SSL Stream'/>\n"
-" <menuitem name='FollowHTTPStream' action='/Follow HTTP Stream'/>\n"
-" <separator/>\n"
-" <menu name= 'Copy' action='/Copy'>\n"
-" <menuitem name='SummaryTxt' action='/Copy/SummaryTxt'/>\n"
-" <menuitem name='SummaryCSV' action='/Copy/SummaryCSV'/>\n"
-" <menuitem name='AsFilter' action='/Copy/AsFilter'/>\n"
-" <separator/>\n"
-" <menu name= 'Bytes' action='/Copy/Bytes'>\n"
-" <menuitem name='OffsetHexText' action='/Copy/Bytes/OffsetHexText'/>\n"
-" <menuitem name='OffsetHex' action='/Copy/Bytes/OffsetHex'/>\n"
-" <menuitem name='PrintableTextOnly' action='/Copy/Bytes/PrintableTextOnly'/>\n"
-" <separator/>\n"
-" <menuitem name='HexStream' action='/Copy/Bytes/HexStream'/>\n"
-" <menuitem name='BinaryStream' action='/Copy/Bytes/BinaryStream'/>\n"
-" </menu>\n"
-" </menu>\n"
-" <separator/>\n"
-" <menuitem name='ProtocolPreferences' action='/ProtocolPreferences'/>\n"
-" <menuitem name='DecodeAs' action='/DecodeAs'/>\n"
-" <menuitem name='Print' action='/Print'/>\n"
-" <menuitem name='ShowPacketinNewWindow' action='/ShowPacketinNewWindow'/>\n"
-" </popup>\n"
-"</ui>\n";
-
-static const GtkActionEntry apply_prepare_filter_action_entries[] = {
- { "/ApplyasFilter", NULL, "Apply as Filter", NULL, NULL, NULL },
- { "/ApplyasFilter/Selected", NULL, "_Selected" , NULL, NULL, G_CALLBACK(apply_selected_filter_cb) },
- { "/ApplyasFilter/Not Selected", NULL, "_Not Selected", NULL, NULL, G_CALLBACK(apply_not_selected_cb) },
- { "/ApplyasFilter/AndSelected", NULL, UTF8_HORIZONTAL_ELLIPSIS " _and Selected", NULL, NULL, G_CALLBACK(apply_and_selected_cb) },
- { "/ApplyasFilter/OrSelected", NULL, UTF8_HORIZONTAL_ELLIPSIS " _or Selected", NULL, NULL, G_CALLBACK(apply_or_selected_cb) },
- { "/ApplyasFilter/AndNotSelected", NULL, UTF8_HORIZONTAL_ELLIPSIS " a_nd not Selected", NULL, NULL, G_CALLBACK(apply_and_not_selected_cb) },
- { "/ApplyasFilter/OrNotSelected", NULL, UTF8_HORIZONTAL_ELLIPSIS " o_r not Selected", NULL, NULL, G_CALLBACK(apply_or_not_selected_cb) },
-
- { "/PrepareaFilter", NULL, "Prepare a Filter", NULL, NULL, NULL },
- { "/PrepareaFilter/Selected", NULL, "_Selected" , NULL, NULL, G_CALLBACK(prepare_selected_cb) },
- { "/PrepareaFilter/Not Selected", NULL, "_Not Selected", NULL, NULL, G_CALLBACK(prepare_not_selected_cb) },
- { "/PrepareaFilter/AndSelected", NULL, UTF8_HORIZONTAL_ELLIPSIS " _and Selected", NULL, NULL, G_CALLBACK(prepare_and_selected_cb) },
- { "/PrepareaFilter/OrSelected", NULL, UTF8_HORIZONTAL_ELLIPSIS " _or Selected", NULL, NULL, G_CALLBACK(prepare_or_selected_cb) },
- { "/PrepareaFilter/AndNotSelected", NULL, UTF8_HORIZONTAL_ELLIPSIS " a_nd not Selected", NULL, NULL, G_CALLBACK(prepare_and_not_selected_cb) },
- { "/PrepareaFilter/OrNotSelected", NULL, UTF8_HORIZONTAL_ELLIPSIS " o_r not Selected", NULL, NULL, G_CALLBACK(prepare_or_not_selected_cb) },
-};
-
-
-static const GtkActionEntry packet_list_menu_popup_action_entries[] = {
- { "/MarkPacket", NULL, "Mark Packet (toggle)", NULL, NULL, G_CALLBACK(packet_list_mark_frame_cb) },
- { "/IgnorePacket", NULL, "Ignore Packet (toggle)", NULL, NULL, G_CALLBACK(packet_list_ignore_frame_cb) },
- { "/Set Time Reference", WIRESHARK_STOCK_TIME, "Set Time Reference (toggle)", NULL, NULL, G_CALLBACK(packet_list_menu_set_ref_time_cb) },
- { "/TimeShift", WIRESHARK_STOCK_TIME, "Time Shift...", NULL, NULL, G_CALLBACK(time_shift_cb) },
- { "/ManuallyResolveAddress", NULL, "Manually Resolve Address", NULL, NULL, G_CALLBACK(manual_addr_resolv_dlg) },
- { "/Edit/AddEditPktComment", WIRESHARK_STOCK_EDIT, "Packet Comment...", NULL, NULL, G_CALLBACK(edit_packet_comment_dlg) },
-
- { "/Conversation Filter", NULL, "Conversation Filter", NULL, NULL, NULL },
- { "/Colorize Conversation", NULL, "Colorize Conversation", NULL, NULL, NULL },
-
- { "/SCTP", NULL, "SCTP", NULL, NULL, NULL },
- { "/SCTP/Analyse this Association", NULL, "Analyse this Association", NULL, NULL, G_CALLBACK(sctp_analyse_start) },
- { "/SCTP/Prepare Filter for this Association", NULL, "Prepare Filter for this Association", NULL, NULL, G_CALLBACK(sctp_set_assoc_filter) },
-
-
- { "/Follow TCP Stream", NULL, "Follow TCP Stream", NULL, NULL, G_CALLBACK(follow_tcp_stream_cb) },
- { "/Follow UDP Stream", NULL, "Follow UDP Stream", NULL, NULL, G_CALLBACK(follow_udp_stream_cb) },
- { "/Follow SSL Stream", NULL, "Follow SSL Stream", NULL, NULL, G_CALLBACK(follow_ssl_stream_cb) },
- { "/Follow HTTP Stream", NULL, "Follow HTTP Stream", NULL, NULL, G_CALLBACK(follow_http_stream_cb) },
-
- { "/Copy", NULL, "Copy", NULL, NULL, NULL },
- { "/Copy/SummaryTxt", NULL, "Summary (Text)", NULL, NULL, G_CALLBACK(packet_list_menu_copy_sum_txt) },
- { "/Copy/SummaryCSV", NULL, "Summary (CSV)", NULL, NULL, G_CALLBACK(packet_list_menu_copy_sum_csv) },
- { "/Copy/AsFilter", NULL, "As Filter", NULL, NULL, G_CALLBACK(packet_list_menu_copy_as_flt) },
-
-
- { "/Copy/Bytes", NULL, "Bytes", NULL, NULL, NULL },
- { "/Copy/Bytes/OffsetHexText", NULL, "Offset Hex Text", NULL, NULL, G_CALLBACK(packet_list_menu_copy_bytes_oht_cb) },
- { "/Copy/Bytes/OffsetHex", NULL, "Offset Hex", NULL, NULL, G_CALLBACK(packet_list_menu_copy_bytes_oh_cb) },
- { "/Copy/Bytes/PrintableTextOnly", NULL, "Printable Text Only", NULL, NULL, G_CALLBACK(packet_list_menu_copy_bytes_text_cb) },
-
- { "/Copy/Bytes/HexStream", NULL, "Hex Stream", NULL, NULL, G_CALLBACK(packet_list_menu_copy_bytes_hex_strm_cb) },
- { "/Copy/Bytes/BinaryStream", NULL, "Binary Stream", NULL, NULL, G_CALLBACK(packet_list_menu_copy_bytes_bin_strm_cb) },
-
- { "/ProtocolPreferences", NULL, "Protocol Preferences", NULL, NULL, NULL },
- { "/DecodeAs", WIRESHARK_STOCK_DECODE_AS, "Decode As...", NULL, NULL, G_CALLBACK(decode_as_cb) },
- { "/Print", GTK_STOCK_PRINT, "Print...", NULL, NULL, G_CALLBACK(file_print_selected_cmd_cb) },
- { "/ShowPacketinNewWindow", NULL, "Show Packet in New Window", NULL, NULL, G_CALLBACK(new_window_cb) },
-
-};
-
-static const char *ui_desc_tree_view_menu_popup =
-"<ui>\n"
-" <popup name='TreeViewPopup' action='PopupAction'>\n"
-" <menuitem name='ExpandSubtrees' action='/ExpandSubtrees'/>\n"
-" <menuitem name='CollapseSubtrees' action='/CollapseSubtrees'/>\n"
-" <menuitem name='ExpandAll' action='/ExpandAll'/>\n"
-" <menuitem name='CollapseAll' action='/CollapseAll'/>\n"
-" <separator/>\n"
-" <menuitem name='ApplyasColumn' action='/Apply as Column'/>\n"
-" <separator/>\n"
-" <menu name= 'ApplyAsFilter' action='/ApplyasFilter'>\n"
-" <menuitem name='Selected' action='/ApplyasFilter/Selected'/>\n"
-" <menuitem name='NotSelected' action='/ApplyasFilter/Not Selected'/>\n"
-" <menuitem name='AndSelected' action='/ApplyasFilter/AndSelected'/>\n"
-" <menuitem name='OrSelected' action='/ApplyasFilter/OrSelected'/>\n"
-" <menuitem name='AndNotSelected' action='/ApplyasFilter/AndNotSelected'/>\n"
-" <menuitem name='OrNotSelected' action='/ApplyasFilter/OrNotSelected'/>\n"
-" </menu>\n"
-" <menu name= 'PrepareaFilter' action='/PrepareaFilter'>\n"
-" <menuitem name='Selected' action='/PrepareaFilter/Selected'/>\n"
-" <menuitem name='NotSelected' action='/PrepareaFilter/Not Selected'/>\n"
-" <menuitem name='AndSelected' action='/PrepareaFilter/AndSelected'/>\n"
-" <menuitem name='OrSelected' action='/PrepareaFilter/OrSelected'/>\n"
-" <menuitem name='AndNotSelected' action='/PrepareaFilter/AndNotSelected'/>\n"
-" <menuitem name='OrNotSelected' action='/PrepareaFilter/OrNotSelected'/>\n"
-" </menu>\n"
-" <menu name= 'ColorizewithFilter' action='/Colorize with Filter'>\n"
-" <menuitem name='Color1' action='/Colorize with Filter/Color 1'/>\n"
-" <menuitem name='Color2' action='/Colorize with Filter/Color 2'/>\n"
-" <menuitem name='Color3' action='/Colorize with Filter/Color 3'/>\n"
-" <menuitem name='Color4' action='/Colorize with Filter/Color 4'/>\n"
-" <menuitem name='Color5' action='/Colorize with Filter/Color 5'/>\n"
-" <menuitem name='Color6' action='/Colorize with Filter/Color 6'/>\n"
-" <menuitem name='Color7' action='/Colorize with Filter/Color 7'/>\n"
-" <menuitem name='Color8' action='/Colorize with Filter/Color 8'/>\n"
-" <menuitem name='Color9' action='/Colorize with Filter/Color 9'/>\n"
-" <menuitem name='Color10' action='/Colorize with Filter/Color 10'/>\n"
-" <menuitem name='NewColoringRule' action='/Colorize with Filter/New Coloring Rule'/>\n"
-" </menu>\n"
-" <menuitem name='FollowTCPStream' action='/Follow TCP Stream'/>\n"
-" <menuitem name='FollowUDPStream' action='/Follow UDP Stream'/>\n"
-" <menuitem name='FollowSSLStream' action='/Follow SSL Stream'/>\n"
-" <menuitem name='FollowHTTPStream' action='/Follow HTTP Stream'/>\n"
-" <separator/>\n"
-" <menu name= 'Copy' action='/Copy'>\n"
-" <menuitem name='Description' action='/Copy/Description'/>\n"
-" <menuitem name='Fieldname' action='/Copy/Fieldname'/>\n"
-" <menuitem name='Value' action='/Copy/Value'/>\n"
-" <separator/>\n"
-" <menuitem name='AsFilter' action='/Copy/AsFilter'/>\n"
-" <separator/>\n"
-" <menu name= 'Bytes' action='/Copy/Bytes'>\n"
-" <menuitem name='OffsetHexText' action='/Copy/Bytes/OffsetHexText'/>\n"
-" <menuitem name='OffsetHex' action='/Copy/Bytes/OffsetHex'/>\n"
-" <menuitem name='PrintableTextOnly' action='/Copy/Bytes/PrintableTextOnly'/>\n"
-" <separator/>\n"
-" <menuitem name='HexStream' action='/Copy/Bytes/HexStream'/>\n"
-" <menuitem name='BinaryStream' action='/Copy/Bytes/BinaryStream'/>\n"
-" </menu>\n"
-" </menu>\n"
-" <menuitem name='ExportSelectedPacketBytes' action='/ExportSelectedPacketBytes'/>\n"
-" <separator/>\n"
-" <menuitem name='WikiProtocolPage' action='/WikiProtocolPage'/>\n"
-" <menuitem name='FilterFieldReference' action='/FilterFieldReference'/>\n"
-" <menuitem name='ProtocolHelp' action='/ProtocolHelp'/>\n"
-" <menuitem name='ProtocolPreferences' action='/ProtocolPreferences'/>\n"
-" <separator/>\n"
-" <menuitem name='DecodeAs' action='/DecodeAs'/>\n"
-" <menuitem name='DisableProtocol' action='/DisableProtocol'/>\n"
-" <menuitem name='ResolveName' action='/ResolveName'/>\n"
-" <menuitem name='GotoCorrespondingPacket' action='/GotoCorrespondingPacket'/>\n"
-" <menuitem name='ShowPacketRefinNewWindow' action='/ShowPacketRefinNewWindow'/>\n"
-" </popup>\n"
-"</ui>\n";
-
-static const GtkActionEntry tree_view_menu_popup_action_entries[] = {
- { "/ExpandSubtrees", NULL, "Expand Subtrees", NULL, NULL, G_CALLBACK(expand_tree_cb) },
- { "/CollapseSubtrees", NULL, "Collapse Subtrees", NULL, NULL, G_CALLBACK(collapse_tree_cb) },
- { "/ExpandAll", NULL, "Expand All", NULL, NULL, G_CALLBACK(expand_all_cb) },
- { "/CollapseAll", NULL, "Collapse All", NULL, NULL, G_CALLBACK(collapse_all_cb) },
- { "/Apply as Column", NULL, "Apply as Column", NULL, NULL, G_CALLBACK(apply_as_custom_column_cb) },
-
- { "/Colorize with Filter", NULL, "Colorize with Filter", NULL, NULL, NULL },
- { "/Colorize with Filter/Color 1", WIRESHARK_STOCK_COLOR1, "Color 1", NULL, NULL, G_CALLBACK(tree_view_menu_color_with_flt_color1_cb) },
- { "/Colorize with Filter/Color 2", WIRESHARK_STOCK_COLOR2, "Color 2", NULL, NULL, G_CALLBACK(tree_view_menu_color_with_flt_color2_cb) },
- { "/Colorize with Filter/Color 3", WIRESHARK_STOCK_COLOR3, "Color 3", NULL, NULL, G_CALLBACK(tree_view_menu_color_with_flt_color3_cb) },
- { "/Colorize with Filter/Color 4", WIRESHARK_STOCK_COLOR4, "Color 4", NULL, NULL, G_CALLBACK(tree_view_menu_color_with_flt_color4_cb) },
- { "/Colorize with Filter/Color 5", WIRESHARK_STOCK_COLOR5, "Color 5", NULL, NULL, G_CALLBACK(tree_view_menu_color_with_flt_color5_cb) },
- { "/Colorize with Filter/Color 6", WIRESHARK_STOCK_COLOR6, "Color 6", NULL, NULL, G_CALLBACK(tree_view_menu_color_with_flt_color6_cb) },
- { "/Colorize with Filter/Color 7", WIRESHARK_STOCK_COLOR7, "Color 7", NULL, NULL, G_CALLBACK(tree_view_menu_color_with_flt_color7_cb) },
- { "/Colorize with Filter/Color 8", WIRESHARK_STOCK_COLOR8, "Color 8", NULL, NULL, G_CALLBACK(tree_view_menu_color_with_flt_color8_cb) },
- { "/Colorize with Filter/Color 9", WIRESHARK_STOCK_COLOR9, "Color 9", NULL, NULL, G_CALLBACK(tree_view_menu_color_with_flt_color9_cb) },
- { "/Colorize with Filter/Color 10", WIRESHARK_STOCK_COLOR0, "Color 10", NULL, NULL, G_CALLBACK(tree_view_menu_color_with_flt_color10_cb) },
- { "/Colorize with Filter/New Coloring Rule", NULL, "New Coloring Rule...", NULL, NULL, G_CALLBACK(tree_view_menu_color_with_flt_new_rule_cb) },
-
- { "/Follow TCP Stream", NULL, "Follow TCP Stream", NULL, NULL, G_CALLBACK(follow_tcp_stream_cb) },
- { "/Follow UDP Stream", NULL, "Follow UDP Stream", NULL, NULL, G_CALLBACK(follow_udp_stream_cb) },
- { "/Follow SSL Stream", NULL, "Follow SSL Stream", NULL, NULL, G_CALLBACK(follow_ssl_stream_cb) },
- { "/Follow HTTP Stream", NULL, "Follow HTTP Stream", NULL, NULL, G_CALLBACK(follow_http_stream_cb) },
-
- { "/Copy", NULL, "Copy", NULL, NULL, NULL },
- { "/Copy/Description", NULL, "Description", NULL, NULL, G_CALLBACK(tree_view_menu_copy_desc) },
- { "/Copy/Fieldname", NULL, "Fieldname", NULL, NULL, G_CALLBACK(tree_view_menu_copy_field) },
- { "/Copy/Value", NULL, "Value", NULL, NULL, G_CALLBACK(tree_view_menu_copy_value) },
-
- { "/Copy/AsFilter", NULL, "As Filter", NULL, NULL, G_CALLBACK(tree_view_menu_copy_as_flt) },
-
- { "/Copy/Bytes", NULL, "Bytes", NULL, NULL, NULL },
- { "/Copy/Bytes/OffsetHexText", NULL, "Offset Hex Text", NULL, NULL, G_CALLBACK(packet_list_menu_copy_bytes_oht_cb) },
- { "/Copy/Bytes/OffsetHex", NULL, "Offset Hex", NULL, NULL, G_CALLBACK(packet_list_menu_copy_bytes_oh_cb) },
- { "/Copy/Bytes/PrintableTextOnly", NULL, "Printable Text Only", NULL, NULL, G_CALLBACK(packet_list_menu_copy_bytes_text_cb) },
-
- { "/Copy/Bytes/HexStream", NULL, "Hex Stream", NULL, NULL, G_CALLBACK(packet_list_menu_copy_bytes_hex_strm_cb) },
- { "/Copy/Bytes/BinaryStream", NULL, "Binary Stream", NULL, NULL, G_CALLBACK(packet_list_menu_copy_bytes_bin_strm_cb) },
-
- { "/ExportSelectedPacketBytes", NULL, "Export Selected Packet Bytes...", NULL, NULL, G_CALLBACK(savehex_cb) },
- { "/WikiProtocolPage", WIRESHARK_STOCK_WIKI, "Wiki Protocol Page", NULL, NULL, G_CALLBACK(selected_ptree_info_cb) },
- { "/FilterFieldReference", WIRESHARK_STOCK_INTERNET, "Filter Field Reference", NULL, NULL, G_CALLBACK(selected_ptree_ref_cb) },
- { "/ProtocolHelp", NULL, "Protocol Help", NULL, NULL, NULL },
- { "/ProtocolPreferences", NULL, "Protocol Preferences", NULL, NULL, NULL },
- { "/DecodeAs", WIRESHARK_STOCK_DECODE_AS, "Decode As...", NULL, NULL, G_CALLBACK(decode_as_cb) },
- { "/DisableProtocol", WIRESHARK_STOCK_CHECKBOX, "Disable Protocol...", NULL, NULL, G_CALLBACK(proto_disable_cb) },
- { "/ResolveName", NULL, "_Resolve Name", NULL, NULL, G_CALLBACK(resolve_name_cb) },
- { "/GotoCorrespondingPacket", NULL, "_Go to Corresponding Packet", NULL, NULL, G_CALLBACK(goto_framenum_cb) },
- { "/ShowPacketRefinNewWindow", NULL, "Show Packet Reference in New Window", NULL, NULL, G_CALLBACK(new_window_cb_ref) },
-};
-
-static const char *ui_desc_bytes_menu_popup =
-"<ui>\n"
-" <popup name='BytesMenuPopup' action='PopupAction'>\n"
-" <menuitem name='HexView' action='/HexView'/>\n"
-" <menuitem name='BitsView' action='/BitsView'/>\n"
-" </popup>\n"
-"</ui>\n";
-
-static const GtkRadioActionEntry bytes_menu_radio_action_entries [] =
-{
- /* name, stock id, label, accel, tooltip, value */
- { "/HexView", NULL, "Hex View", NULL, NULL, BYTES_HEX },
- { "/BitsView", NULL, "Bits View", NULL, NULL, BYTES_BITS },
-};
-
-static const char *ui_statusbar_profiles_menu_popup =
-"<ui>\n"
-" <popup name='ProfilesMenuPopup' action='PopupAction'>\n"
-" <menuitem name='Profiles' action='/Profiles'/>\n"
-" <separator/>\n"
-" <menuitem name='New' action='/New'/>\n"
-" <menuitem name='Rename' action='/Rename'/>\n"
-" <menuitem name='Delete' action='/Delete'/>\n"
-" <separator/>\n"
-" <menu name='Change' action='/Change'>\n"
-" <menuitem name='Default' action='/Change/Default'/>\n"
-" </menu>\n"
-" </popup>\n"
-"</ui>\n";
-static const GtkActionEntry statusbar_profiles_menu_action_entries [] =
-{
- { "/Profiles", GTK_STOCK_INDEX, "Manage Profiles...", NULL, NULL, G_CALLBACK(profile_dialog_cb) },
- { "/New", GTK_STOCK_NEW, "New...", NULL, NULL, G_CALLBACK(profile_new_cb) },
- { "/Rename", GTK_STOCK_EDIT, "Rename...", NULL, NULL, G_CALLBACK(profile_rename_cb) },
- { "/Delete", GTK_STOCK_DELETE, "Delete", NULL, NULL, G_CALLBACK(profile_delete_cb) },
- { "/Change", GTK_STOCK_JUMP_TO, "Switch to", NULL, NULL, NULL },
- { "/Change/Default", NULL, "Default", NULL, NULL, NULL },
-};
-
-GtkWidget *
-main_menu_new(GtkAccelGroup ** table)
-{
- GtkWidget *menubar;
-
- grp = gtk_accel_group_new();
-
- if (initialize)
- menus_init();
-
- menubar = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar");
-
- if (table)
- *table = grp;
-
- plugin_if_register_gui_cb(PLUGIN_IF_PREFERENCE_SAVE, plugin_if_menubar_preference);
-
- return menubar;
-}
-
-static void
-menu_dissector_filter_cb(GtkAction *action _U_, gpointer callback_data)
-{
- conversation_filter_t *filter_entry = (conversation_filter_t *)callback_data;
- GtkWidget *filter_te;
- char *buf;
-
- filter_te = gtk_bin_get_child(GTK_BIN(g_object_get_data(G_OBJECT(top_level), E_DFILTER_CM_KEY)));
-
- /* XXX - this gets the packet_info of the last dissected packet, */
- /* which is not necessarily the last selected packet */
- /* e.g. "Update list of packets in real time" won't work correct */
- buf = filter_entry->build_filter_string(&cfile.edt->pi);
-
- gtk_entry_set_text(GTK_ENTRY(filter_te), buf);
-
- /* Run the display filter so it goes in effect - even if it's the
- same as the previous display filter. */
- main_filter_packets(&cfile, buf, TRUE);
-
- g_free( (void *) buf);
-}
-
-static gboolean
-menu_dissector_filter_spe_cb(frame_data *fd _U_, epan_dissect_t *edt, gpointer callback_data)
-{
- conversation_filter_t *filter_entry = (conversation_filter_t*)callback_data;
-
- /* XXX - this gets the packet_info of the last dissected packet, */
- /* which is not necessarily the last selected packet */
- /* e.g. "Update list of packets in real time" won't work correct */
- return (edt != NULL) ? filter_entry->is_filter_valid(&edt->pi) : FALSE;
-}
-
-static void
-menu_dissector_filter(capture_file *cf)
-{
- GList *list_entry = conv_filter_list;
- conversation_filter_t *filter_entry;
-
- guint merge_id;
- GtkActionGroup *action_group;
- GtkAction *action;
- GtkWidget *submenu_dissector_filters;
- gchar *action_name;
- guint i = 0;
-
-
- merge_id = gtk_ui_manager_new_merge_id (ui_manager_main_menubar);
-
- action_group = gtk_action_group_new ("dissector-filters-group");
-
- submenu_dissector_filters = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/AnalyzeMenu/ConversationFilterMenu");
- if(!submenu_dissector_filters){
- g_warning("menu_dissector_filter: No submenu_dissector_filters found, path= /Menubar/AnalyzeMenu/ConversationFilterMenu");
- }
-
- gtk_ui_manager_insert_action_group (ui_manager_main_menubar, action_group, 0);
- g_object_set_data (G_OBJECT (ui_manager_main_menubar),
- "dissector-filters-merge-id", GUINT_TO_POINTER (merge_id));
-
- /* no items */
- if (!list_entry){
-
- action = (GtkAction *)g_object_new (GTK_TYPE_ACTION,
- "name", "filter-list-empty",
- "label", "No filters",
- "sensitive", FALSE,
- NULL);
- gtk_action_group_add_action (action_group, action);
- gtk_action_set_sensitive(action, FALSE);
- g_object_unref (action);
-
- gtk_ui_manager_add_ui (ui_manager_main_menubar, merge_id,
- "/Menubar/AnalyzeMenu/ConversationFilterMenu/Filters",
- "filter-list-empty",
- "filter-list-empty",
- GTK_UI_MANAGER_MENUITEM,
- FALSE);
-
- return;
- }
-
- while (list_entry != NULL) {
- filter_entry = (conversation_filter_t *)list_entry->data;
- action_name = g_strdup_printf ("filter-%u", i);
- /*g_warning("action_name %s, filter_entry->name %s",action_name,filter_entry->name);*/
- action = (GtkAction *)g_object_new (GTK_TYPE_ACTION,
- "name", action_name,
- "label", filter_entry->display_name,
- "sensitive", menu_dissector_filter_spe_cb(/* frame_data *fd _U_*/ NULL, cf->edt, filter_entry),
- NULL);
- g_signal_connect (action, "activate",
- G_CALLBACK (menu_dissector_filter_cb), filter_entry);
- gtk_action_group_add_action (action_group, action);
- g_object_unref (action);
-
- gtk_ui_manager_add_ui (ui_manager_main_menubar, merge_id,
- "/Menubar/AnalyzeMenu/ConversationFilterMenu/Filters",
- action_name,
- action_name,
- GTK_UI_MANAGER_MENUITEM,
- FALSE);
- g_free(action_name);
- i++;
- list_entry = g_list_next(list_entry);
- }
-}
-
-static void
-menu_endpoints_cb(GtkAction *action _U_, gpointer user_data)
-{
- register_ct_t *table = (register_ct_t*)user_data;
-
- conversation_endpoint_cb(table);
-}
-
-typedef struct {
- capture_file *cf;
- guint merge_id;
- GtkActionGroup *action_group;
- int counter;
-} conv_menu_t;
-
-static gboolean
-add_conversation_menuitem(const void *key, void *value, void *userdata)
-{
- register_ct_t *table = (register_ct_t*)value;
- conv_menu_t *conv = (conv_menu_t*)userdata;
- gchar *action_name;
- GtkAction *action;
-
- action_name = g_strdup_printf ("conversation-%u", conv->counter);
- /*g_warning("action_name %s, filter_entry->name %s",action_name,filter_entry->name);*/
- action = (GtkAction *)g_object_new (GTK_TYPE_ACTION,
- "name", action_name,
- "label", key,
- "sensitive", TRUE,
- NULL);
- g_signal_connect (action, "activate",
- G_CALLBACK (menu_endpoints_cb), table);
- gtk_action_group_add_action (conv->action_group, action);
- g_object_unref (action);
-
- gtk_ui_manager_add_ui (ui_manager_main_menubar, conv->merge_id,
- "/Menubar/StatisticsMenu/ConversationListMenu/Conversations",
- action_name,
- action_name,
- GTK_UI_MANAGER_MENUITEM,
- FALSE);
- g_free(action_name);
- conv->counter++;
- return FALSE;
-}
-
-static void
-menu_conversation_list(capture_file *cf)
-{
- GtkWidget *submenu_conversation_list;
- conv_menu_t conv_data;
-
- conv_data.merge_id = gtk_ui_manager_new_merge_id (ui_manager_main_menubar);
-
- conv_data.action_group = gtk_action_group_new ("conversation-list-group");
-
- submenu_conversation_list = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/StatisticsMenu/ConversationListMenu");
- if(!submenu_conversation_list){
- g_warning("menu_conversation_list: No submenu_conversation_list found, path= /Menubar/StatisticsMenu/ConversationListMenu");
- }
-
- gtk_ui_manager_insert_action_group (ui_manager_main_menubar, conv_data.action_group, 0);
- g_object_set_data (G_OBJECT (ui_manager_main_menubar),
- "conversation-list-merge-id", GUINT_TO_POINTER (conv_data.merge_id));
-
- conv_data.cf = cf;
- conv_data.counter = 0;
- conversation_table_iterate_tables(add_conversation_menuitem, &conv_data);
-}
-
-static void
-menu_hostlist_cb(GtkAction *action _U_, gpointer user_data)
-{
- register_ct_t *table = (register_ct_t*)user_data;
-
- hostlist_endpoint_cb(table);
-}
-
-static gboolean
-add_hostlist_menuitem(const void *key, void *value, void *userdata)
-{
- register_ct_t *table = (register_ct_t*)value;
- conv_menu_t *conv = (conv_menu_t*)userdata;
- gchar *action_name;
- GtkAction *action;
-
- action_name = g_strdup_printf ("hostlist-%u", conv->counter);
- /*g_warning("action_name %s, filter_entry->name %s",action_name,filter_entry->name);*/
- action = (GtkAction *)g_object_new (GTK_TYPE_ACTION,
- "name", action_name,
- "label", key,
- "sensitive", TRUE,
- NULL);
- g_signal_connect (action, "activate",
- G_CALLBACK (menu_hostlist_cb), table);
- gtk_action_group_add_action (conv->action_group, action);
- g_object_unref (action);
-
- gtk_ui_manager_add_ui (ui_manager_main_menubar, conv->merge_id,
- "/Menubar/StatisticsMenu/EndpointListMenu/Endpoints",
- action_name,
- action_name,
- GTK_UI_MANAGER_MENUITEM,
- FALSE);
- g_free(action_name);
- conv->counter++;
- return FALSE;
-}
-
-static void
-menu_hostlist_list(capture_file *cf)
-{
- GtkWidget *submenu_hostlist;
- conv_menu_t conv_data;
-
- conv_data.merge_id = gtk_ui_manager_new_merge_id (ui_manager_main_menubar);
-
- conv_data.action_group = gtk_action_group_new ("endpoint-list-group");
-
- submenu_hostlist = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/StatisticsMenu/EndpointListMenu");
- if(!submenu_hostlist){
- g_warning("menu_hostlist_list: No submenu_conversation_list found, path= /Menubar/StatisticsMenu/EndpointListMenu");
- }
-
- gtk_ui_manager_insert_action_group (ui_manager_main_menubar, conv_data.action_group, 0);
- g_object_set_data (G_OBJECT (ui_manager_main_menubar),
- "endpoint-list-merge-id", GUINT_TO_POINTER (conv_data.merge_id));
-
- conv_data.cf = cf;
- conv_data.counter = 0;
- conversation_table_iterate_tables(add_hostlist_menuitem, &conv_data);
-}
-
-typedef struct {
- guint merge_id;
- GtkActionGroup *action_group;
- int counter;
-} eo_menu_t;
-
-static void
-menu_exportobject_cb(GtkAction *action _U_, gpointer user_data)
-{
- register_eo_t *eo = (register_eo_t*)user_data;
-
- exportobject_cb(eo);
-}
-
-static gboolean
-add_export_object_menuitem(const void *key _U_, void *value, void *userdata)
-{
- register_eo_t *eo = (register_eo_t*)value;
- eo_menu_t *eo_menu_data = (eo_menu_t*)userdata;
- gchar *action_name;
- GtkAction *action;
-
- action_name = g_strdup_printf ("exportobject-%u", eo_menu_data->counter);
- /*g_warning("action_name %s, filter_entry->name %s",action_name,filter_entry->name);*/
- action = (GtkAction *)g_object_new (GTK_TYPE_ACTION,
- "name", action_name,
- "label", proto_get_protocol_short_name(find_protocol_by_id(get_eo_proto_id(eo))),
- "sensitive", TRUE,
- NULL);
- g_signal_connect (action, "activate",
- G_CALLBACK (menu_exportobject_cb), eo);
- gtk_action_group_add_action (eo_menu_data->action_group, action);
- g_object_unref (action);
-
- gtk_ui_manager_add_ui (ui_manager_main_menubar, eo_menu_data->merge_id,
- "/Menubar/FileMenu/ExportObjectsMenu/ExportObjects",
- action_name,
- action_name,
- GTK_UI_MANAGER_MENUITEM,
- FALSE);
- g_free(action_name);
- eo_menu_data->counter++;
- return FALSE;
-}
-
-static void
-menu_export_object_list(void)
-{
- GtkWidget *submenu_export_object;
- eo_menu_t eo_data;
-
- eo_data.merge_id = gtk_ui_manager_new_merge_id (ui_manager_main_menubar);
-
- eo_data.action_group = gtk_action_group_new ("exportobject-list-group");
-
- submenu_export_object = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/FileMenu/ExportObjectsMenu");
- if(!submenu_export_object){
- g_warning("menu_export_object_list: No submenu_exportobject_list found, path= /Menubar/FileMenu/ExportObjectsMenu");
- }
-
- gtk_ui_manager_insert_action_group (ui_manager_main_menubar, eo_data.action_group, 0);
- g_object_set_data (G_OBJECT (ui_manager_main_menubar),
- "exportobject-list-merge-id", GUINT_TO_POINTER (eo_data.merge_id));
-
- eo_data.counter = 0;
- eo_iterate_tables(add_export_object_menuitem, &eo_data);
-}
-
-static void
-menu_conversation_display_filter_cb(GtkAction *action _U_, gpointer data)
-{
- conversation_filter_t *filter_entry = (conversation_filter_t *)data;
-
- gchar *filter;
- GtkWidget *filter_te;
-
- if (cfile.current_frame) {
- /* create a filter-string based on the selected packet and action */
- filter = filter_entry->build_filter_string(&cfile.edt->pi);
-
- /* Run the display filter so it goes in effect - even if it's the
- same as the previous display filter. */
- filter_te = gtk_bin_get_child(GTK_BIN(g_object_get_data(G_OBJECT(top_level), E_DFILTER_CM_KEY)));
-
- gtk_entry_set_text(GTK_ENTRY(filter_te), filter);
- main_filter_packets(&cfile, filter, TRUE);
-
- g_free(filter);
- }
-}
-
-static gboolean
-menu_color_dissector_filter_spe_cb(frame_data *fd _U_, epan_dissect_t *edt, gpointer callback_data)
-{
- conversation_filter_t *filter_entry = (conversation_filter_t *)callback_data;
-
- /* XXX - this gets the packet_info of the last dissected packet, */
- /* which is not necessarily the last selected packet */
- /* e.g. "Update list of packets in real time" won't work correct */
- return (edt != NULL) ? filter_entry->is_filter_valid(&edt->pi) : FALSE;
-}
-
-#define MAX_NUM_COLOR_CONVERSATION_COLORS 10
-
-static void
-menu_color_conversation_filter(capture_file *cf)
-{
- GtkWidget *submenu_conv_filters, *submenu_color_conv_filters;
- guint merge_id, color_merge_id;
- GtkActionGroup *action_group, *color_action_group;
- GList *list_entry = conv_filter_list;
- conversation_filter_t* color_filter;
- int conv_counter = 0;
-
- static packet_list_menu_color_conv_color_cb_t callbacks[MAX_NUM_COLOR_CONVERSATION_COLORS] = {
- packet_list_menu_color_conv_color1_cb,
- packet_list_menu_color_conv_color2_cb,
- packet_list_menu_color_conv_color3_cb,
- packet_list_menu_color_conv_color4_cb,
- packet_list_menu_color_conv_color5_cb,
- packet_list_menu_color_conv_color6_cb,
- packet_list_menu_color_conv_color7_cb,
- packet_list_menu_color_conv_color8_cb,
- packet_list_menu_color_conv_color9_cb,
- packet_list_menu_color_conv_color10_cb,
- };
-
- static const gchar *icons[MAX_NUM_COLOR_CONVERSATION_COLORS] = {
- WIRESHARK_STOCK_COLOR1,
- WIRESHARK_STOCK_COLOR2,
- WIRESHARK_STOCK_COLOR3,
- WIRESHARK_STOCK_COLOR4,
- WIRESHARK_STOCK_COLOR5,
- WIRESHARK_STOCK_COLOR6,
- WIRESHARK_STOCK_COLOR7,
- WIRESHARK_STOCK_COLOR8,
- WIRESHARK_STOCK_COLOR9,
- WIRESHARK_STOCK_COLOR0,
- };
-
- merge_id = gtk_ui_manager_new_merge_id (ui_manager_packet_list_menu);
- action_group = gtk_action_group_new ("popup-conversation-filters-group");
- color_merge_id = gtk_ui_manager_new_merge_id (ui_manager_packet_list_menu);
- color_action_group = gtk_action_group_new ("popup-conv-color-filters-group");
-
- submenu_conv_filters = gtk_ui_manager_get_widget(ui_manager_packet_list_menu, "/PacketListMenuPopup/ConversationFilter");
- if(!submenu_conv_filters){
- g_warning("menu_color_conversation_filter: No submenu_conversation_filters found, path= /PacketListMenuPopup/ConversationFilter");
- }
-
- submenu_color_conv_filters = gtk_ui_manager_get_widget(ui_manager_packet_list_menu, "/PacketListMenuPopup/ColorizeConversation");
- if(!submenu_color_conv_filters){
- g_warning("menu_color_conversation_filter: No submenu_color_conversation_filters found, path= /PacketListMenuPopup/ColorizeConversation");
- }
-
- gtk_ui_manager_insert_action_group (ui_manager_packet_list_menu, action_group, 0);
- g_object_set_data (G_OBJECT (ui_manager_packet_list_menu),
- "popup-conversation-filters-merge-id", GUINT_TO_POINTER (merge_id));
- gtk_ui_manager_insert_action_group (ui_manager_packet_list_menu, color_action_group, 0);
- g_object_set_data (G_OBJECT (ui_manager_packet_list_menu),
- "popup-conv-color-filters-merge-id", GUINT_TO_POINTER (color_merge_id));
-
- while (list_entry != NULL) {
- gchar *action_name, *color_num_path_name;
- GtkAction *action, *color_action;
- GtkWidget *color_conv_filter_menuitem, *color_conv_filter_submenu, *color_conv_widget;
-
- color_filter = (conversation_filter_t*)list_entry->data;
-
- /* Create conversation filter menu item for each registered protocol */
- action_name = g_strdup_printf ("color_conversation-%u", conv_counter);
- conv_counter++;
- action = (GtkAction *)g_object_new (GTK_TYPE_ACTION,
- "name", action_name,
- "label", color_filter->display_name,
- "sensitive", menu_color_dissector_filter_spe_cb(NULL, cf->edt, color_filter),
- NULL);
- g_signal_connect (action, "activate", G_CALLBACK (menu_conversation_display_filter_cb), color_filter);
- gtk_action_group_add_action (action_group, action);
- g_object_unref (action);
-
- gtk_ui_manager_add_ui (ui_manager_packet_list_menu, merge_id,
- "/PacketListMenuPopup/ConversationFilter/Conversations",
- action_name,
- action_name,
- GTK_UI_MANAGER_MENUITEM,
- FALSE);
- g_free(action_name);
-
- /* Create color filter menu item for each registered protocol */
- color_action = (GtkAction *)g_object_new (GTK_TYPE_ACTION,
- "name", color_filter->display_name,
- "label", color_filter->display_name,
- "sensitive", menu_color_dissector_filter_spe_cb(NULL, cf->edt, color_filter),
- NULL);
- gtk_action_group_add_action (color_action_group, color_action);
- g_object_unref (color_action);
-
- gtk_ui_manager_add_ui (ui_manager_packet_list_menu, color_merge_id,
- "/PacketListMenuPopup/ColorizeConversation/Colorize",
- color_filter->display_name,
- color_filter->display_name,
- GTK_UI_MANAGER_MENUITEM,
- FALSE);
-
-
- /* Create each "numbered" color filter menu item for each registered protocol */
- color_num_path_name = g_strdup_printf ("/PacketListMenuPopup/ColorizeConversation/Colorize/%s", color_filter->display_name);
- color_conv_widget = gtk_ui_manager_get_widget(ui_manager_packet_list_menu, color_num_path_name);
- if (color_conv_widget != NULL) {
- guint i;
- gchar *color_num_name;
-
- color_conv_filter_submenu = gtk_menu_new();
- for (i = 0; i < MAX_NUM_COLOR_CONVERSATION_COLORS; i++) {
- color_num_name = g_strdup_printf ("Color %d", i+1);
- color_conv_filter_menuitem = gtk_image_menu_item_new_with_label(color_num_name);
- gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM(color_conv_filter_menuitem),
- ws_gtk_image_new_from_stock(icons[i], GTK_ICON_SIZE_MENU));
- g_signal_connect(color_conv_filter_menuitem, "activate", G_CALLBACK(callbacks[i]), color_filter);
- gtk_menu_shell_append(GTK_MENU_SHELL(color_conv_filter_submenu), color_conv_filter_menuitem);
-
- gtk_widget_show (color_conv_filter_menuitem);
- g_free(color_num_name);
- }
-
- /* Create New Coloring Rule... menu item */
- color_conv_filter_menuitem = gtk_menu_item_new_with_label("New Coloring Rule...");
- g_signal_connect(color_conv_filter_menuitem, "activate", G_CALLBACK(packet_list_menu_color_conv_new_rule_cb), color_filter);
- gtk_menu_shell_append(GTK_MENU_SHELL(color_conv_filter_submenu), color_conv_filter_menuitem);
- gtk_widget_show (color_conv_filter_menuitem);
-
- gtk_menu_item_set_submenu (GTK_MENU_ITEM(color_conv_widget), color_conv_filter_submenu);
- } else {
- g_warning("menu_color_conversation_filter: No submenu_color_conv_filters found, path= %s", color_num_path_name);
- }
- g_free(color_num_path_name);
-
- list_entry = g_list_next(list_entry);
- }
-}
-
-static void
-menus_init(void)
-{
- GtkActionGroup *packet_list_heading_action_group, *packet_list_action_group,
- *packet_list_details_action_group, *packet_list_byte_menu_action_group,
- *statusbar_profiles_action_group;
- GtkAction *name_res_action;
- GError *error = NULL;
- guint merge_id;
-
- if (initialize) {
- initialize = FALSE;
-
- popup_menu_object = gtk_menu_new();
-
- /* packet list heading pop-up menu */
- packet_list_heading_action_group = gtk_action_group_new ("PacketListHeadingPopUpMenuActionGroup");
-
- gtk_action_group_add_actions (packet_list_heading_action_group, /* the action group */
- packet_list_heading_menu_popup_action_entries, /* an array of action descriptions */
- G_N_ELEMENTS(packet_list_heading_menu_popup_action_entries), /* the number of entries */
- popup_menu_object); /* data to pass to the action callbacks */
-
- gtk_action_group_add_toggle_actions(packet_list_heading_action_group, /* the action group */
- (const GtkToggleActionEntry *)packet_list_heading_menu_toggle_action_entries, /* an array of action descriptions */
- G_N_ELEMENTS(packet_list_heading_menu_toggle_action_entries), /* the number of entries */
- NULL); /* data to pass to the action callbacks */
-
- ui_manager_packet_list_heading = gtk_ui_manager_new ();
- gtk_ui_manager_insert_action_group (ui_manager_packet_list_heading,
- packet_list_heading_action_group,
- 0); /* the position at which the group will be inserted. */
-
- gtk_ui_manager_add_ui_from_string (ui_manager_packet_list_heading,ui_desc_packet_list_heading_menu_popup, -1, &error);
- if (error != NULL)
- {
- fprintf (stderr, "Warning: building Packet List Heading Pop-Up failed: %s\n",
- error->message);
- g_error_free (error);
- error = NULL;
- }
-
- g_object_set_data(G_OBJECT(popup_menu_object), PM_PACKET_LIST_COL_KEY,
- gtk_ui_manager_get_widget(ui_manager_packet_list_heading, "/PacketListHeadingPopup"));
-
- popup_menu_list = g_slist_append((GSList *)popup_menu_list, ui_manager_packet_list_heading);
-
- /* packet list pop-up menu */
- packet_list_action_group = gtk_action_group_new ("PacketListPopUpMenuActionGroup");
-
- gtk_action_group_add_actions (packet_list_action_group, /* the action group */
- (const GtkActionEntry *)packet_list_menu_popup_action_entries, /* an array of action descriptions */
- G_N_ELEMENTS(packet_list_menu_popup_action_entries), /* the number of entries */
- popup_menu_object); /* data to pass to the action callbacks */
-
- /* Add the filter menu items */
- gtk_action_group_add_actions (packet_list_action_group, /* the action group */
- (const GtkActionEntry *)apply_prepare_filter_action_entries, /* an array of action descriptions */
- G_N_ELEMENTS(apply_prepare_filter_action_entries), /* the number of entries */
- popup_menu_object); /* data to pass to the action callbacks */
-
- ui_manager_packet_list_menu = gtk_ui_manager_new ();
-
- gtk_ui_manager_insert_action_group (ui_manager_packet_list_menu,
- packet_list_action_group,
- 0); /* the position at which the group will be inserted. */
-
- gtk_ui_manager_add_ui_from_string (ui_manager_packet_list_menu, ui_desc_packet_list_menu_popup, -1, &error);
- if (error != NULL)
- {
- fprintf (stderr, "Warning: building Packet List Pop-Up menu failed: %s\n",
- error->message);
- g_error_free (error);
- error = NULL;
- }
-
- g_object_set_data(G_OBJECT(popup_menu_object), PM_PACKET_LIST_KEY,
- gtk_ui_manager_get_widget(ui_manager_packet_list_menu, "/PacketListMenuPopup"));
-
- popup_menu_list = g_slist_append((GSList *)popup_menu_list, ui_manager_packet_list_menu);
-
- menu_color_conversation_filter(&cfile);
-
- /* packet detail pop-up menu */
- packet_list_details_action_group = gtk_action_group_new ("PacketListDetailsMenuPopUpActionGroup");
-
- gtk_action_group_add_actions (packet_list_details_action_group, /* the action group */
- (const GtkActionEntry *)tree_view_menu_popup_action_entries, /* an array of action descriptions */
- G_N_ELEMENTS(tree_view_menu_popup_action_entries), /* the number of entries */
- popup_menu_object); /* data to pass to the action callbacks */
-
- /* Add the filter menu items */
- gtk_action_group_add_actions (packet_list_details_action_group, /* the action group */
- (const GtkActionEntry *)apply_prepare_filter_action_entries, /* an array of action descriptions */
- G_N_ELEMENTS(apply_prepare_filter_action_entries), /* the number of entries */
- popup_menu_object); /* data to pass to the action callbacks */
-
-
- ui_manager_tree_view_menu = gtk_ui_manager_new ();
-
- gtk_ui_manager_insert_action_group (ui_manager_tree_view_menu,
- packet_list_details_action_group,
- 0); /* the position at which the group will be inserted. */
- gtk_ui_manager_add_ui_from_string (ui_manager_tree_view_menu, ui_desc_tree_view_menu_popup, -1, &error);
-#if 0
- /* If we want to load the treewiew popup UI description from file */
- gui_desc_file_name_and_path = get_ui_file_path("tree-view-ui.xml");
- gtk_ui_manager_add_ui_from_file ( ui_manager_tree_view_menu, gui_desc_file_name_and_path, &error);
- g_free (gui_desc_file_name_and_path);
-#endif
- if (error != NULL)
- {
- fprintf (stderr, "Warning: building TreeView Pop-Up menu failed: %s\n",
- error->message);
- g_error_free (error);
- error = NULL;
- }
-
- g_object_set_data(G_OBJECT(popup_menu_object), PM_TREE_VIEW_KEY,
- gtk_ui_manager_get_widget(ui_manager_tree_view_menu, "/TreeViewPopup"));
-
- popup_menu_list = g_slist_append((GSList *)popup_menu_list, ui_manager_tree_view_menu);
-
- /*
- * Hex dump pop-up menu.
- * We provide our own empty menu to suppress the default pop-up menu
- * for text widgets.
- */
- packet_list_byte_menu_action_group = gtk_action_group_new ("PacketListByteMenuPopUpActionGroup");
-
-
- gtk_action_group_add_radio_actions (packet_list_byte_menu_action_group, /* the action group */
- (const GtkRadioActionEntry *)bytes_menu_radio_action_entries, /* an array of radio action descriptions */
- G_N_ELEMENTS(bytes_menu_radio_action_entries), /* the number of entries */
- recent.gui_bytes_view, /* the value of the action to activate initially, or -1 if no action should be activated */
- G_CALLBACK(select_bytes_view_cb), /* the callback to connect to the changed signal */
- popup_menu_object); /* data to pass to the action callbacks */
-
- ui_manager_bytes_menu = gtk_ui_manager_new ();
-
- gtk_ui_manager_insert_action_group (ui_manager_bytes_menu,
- packet_list_byte_menu_action_group,
- 0); /* the position at which the group will be inserted. */
- gtk_ui_manager_add_ui_from_string (ui_manager_bytes_menu, ui_desc_bytes_menu_popup, -1, &error);
-#if 0
- /* If we want to load the bytesview poupup UI description from file */
- gui_desc_file_name_and_path = get_ui_file_path("bytes-view-ui.xml");
- gtk_ui_manager_add_ui_from_file ( ui_manager_bytes_menu, gui_desc_file_name_and_path, &error);
- g_free (gui_desc_file_name_and_path);
-#endif
- if (error != NULL)
- {
- fprintf (stderr, "Warning: building Bytes Pop-Up menu failed: %s\n",
- error->message);
- g_error_free (error);
- error = NULL;
- }
- g_object_unref(packet_list_byte_menu_action_group);
-
- g_object_set_data(G_OBJECT(popup_menu_object), PM_BYTES_VIEW_KEY,
- gtk_ui_manager_get_widget(ui_manager_bytes_menu, "/BytesMenuPopup"));
-
- popup_menu_list = g_slist_append((GSList *)popup_menu_list, ui_manager_bytes_menu);
-
- /* main */
- main_menu_bar_action_group = gtk_action_group_new ("MenuActionGroup");
-
- gtk_action_group_add_actions (main_menu_bar_action_group, /* the action group */
- main_menu_bar_entries, /* an array of action descriptions */
- G_N_ELEMENTS(main_menu_bar_entries), /* the number of entries */
- NULL); /* data to pass to the action callbacks */
-
-#ifdef HAVE_LIBPCAP
- /* Add the capture menu actions */
- gtk_action_group_add_actions (main_menu_bar_action_group, /* the action group */
- capture_menu_entries, /* an array of action descriptions */
- G_N_ELEMENTS(capture_menu_entries), /* the number of entries */
- NULL); /* data to pass to the action callbacks */
-#endif
-
- /* Add the filter menu actions */
- gtk_action_group_add_actions (main_menu_bar_action_group, /* the action group */
- (GtkActionEntry *)apply_prepare_filter_action_entries, /* an array of action descriptions */
- G_N_ELEMENTS(apply_prepare_filter_action_entries), /* the number of entries */
- popup_menu_object); /* data to pass to the action callbacks */
-
- gtk_action_group_add_toggle_actions(main_menu_bar_action_group, /* the action group */
- main_menu_bar_toggle_action_entries, /* an array of action descriptions */
- G_N_ELEMENTS(main_menu_bar_toggle_action_entries), /* the number of entries */
- NULL); /* data to pass to the action callbacks */
-
- if (global_dissect_options.time_format != TS_NOT_SET) {
- recent.gui_time_format = global_dissect_options.time_format;
- }
- gtk_action_group_add_radio_actions (main_menu_bar_action_group, /* the action group */
- main_menu_bar_radio_view_time_entries, /* an array of radio action descriptions */
- G_N_ELEMENTS(main_menu_bar_radio_view_time_entries), /* the number of entries */
- recent.gui_time_format, /* the value of the action to activate initially, or -1 if no action should be activated */
- G_CALLBACK(timestamp_format_new_cb), /* the callback to connect to the changed signal */
- NULL); /* data to pass to the action callbacks */
-
- gtk_action_group_add_radio_actions (main_menu_bar_action_group, /* the action group */
- main_menu_bar_radio_view_time_fileformat_prec_entries, /* an array of radio action descriptions */
- G_N_ELEMENTS(main_menu_bar_radio_view_time_fileformat_prec_entries), /* the number of entries */
- recent.gui_time_precision, /* the value of the action to activate initially, or -1 if no action should be activated */
- G_CALLBACK(timestamp_precision_new_cb), /* the callback to connect to the changed signal */
- NULL); /* data to pass to the action callbacks */
-
-
-
- ui_manager_main_menubar = gtk_ui_manager_new ();
- gtk_ui_manager_insert_action_group (ui_manager_main_menubar, main_menu_bar_action_group, 0);
-
- gtk_ui_manager_add_ui_from_string (ui_manager_main_menubar,ui_desc_menubar, -1, &error);
- if (error != NULL)
- {
- fprintf (stderr, "Warning: building main menubar failed: %s\n",
- error->message);
- g_error_free (error);
- error = NULL;
- }
- g_object_unref(main_menu_bar_action_group);
- gtk_window_add_accel_group (GTK_WINDOW(top_level),
- gtk_ui_manager_get_accel_group(ui_manager_main_menubar));
-
-
- /* Add the recent files items to the menu
- * use place holders and
- * gtk_ui_manager_add_ui().
- */
- merge_id = gtk_ui_manager_new_merge_id (ui_manager_main_menubar);
- add_recent_items (merge_id, ui_manager_main_menubar);
-
- /* Add statistics tap plug-in to the menu
- */
- merge_id = gtk_ui_manager_new_merge_id (ui_manager_main_menubar);
- add_tap_plugins (merge_id, ui_manager_main_menubar);
-
- statusbar_profiles_action_group = gtk_action_group_new ("StatusBarProfilesPopUpMenuActionGroup");
-
- gtk_action_group_add_actions (statusbar_profiles_action_group, /* the action group */
- (const GtkActionEntry *)statusbar_profiles_menu_action_entries, /* an array of action descriptions */
- G_N_ELEMENTS(statusbar_profiles_menu_action_entries), /* the number of entries */
- popup_menu_object); /* data to pass to the action callbacks */
-
- ui_manager_statusbar_profiles_menu = gtk_ui_manager_new ();
- gtk_ui_manager_insert_action_group (ui_manager_statusbar_profiles_menu,
- statusbar_profiles_action_group,
- 0); /* the position at which the group will be inserted. */
-
- gtk_ui_manager_add_ui_from_string (ui_manager_statusbar_profiles_menu,ui_statusbar_profiles_menu_popup, -1, &error);
- if (error != NULL)
- {
- fprintf (stderr, "Warning: building StatusBar Profiles Pop-Up failed: %s\n",
- error->message);
- g_error_free (error);
- error = NULL;
- }
-
- g_object_unref(statusbar_profiles_action_group);
-
- g_object_set_data(G_OBJECT(popup_menu_object), PM_STATUSBAR_PROFILES_KEY,
- gtk_ui_manager_get_widget(ui_manager_statusbar_profiles_menu, "/ProfilesMenuPopup"));
-
- popup_menu_list = g_slist_append((GSList *)popup_menu_list, ui_manager_statusbar_profiles_menu);
-
- menu_dissector_filter(&cfile);
- menu_conversation_list(&cfile);
- menu_hostlist_list(&cfile);
- menu_export_object_list();
-
- /* Add additional entries which may have been introduced by dissectors and/or plugins */
- ws_menubar_external_menus();
-
- merge_menu_items(merge_menu_items_list);
-
- /* Add external menus and items */
- ws_menubar_build_external_menus();
-
- /* Initialize enabled/disabled state of menu items */
- set_menus_for_capture_file(NULL);
-#if 0
- /* Un-#if this when we actually implement Cut/Copy/Paste.
- Then make sure you enable them when they can be done. */
- set_menu_sensitivity_old("/Edit/Cut", FALSE);
- set_menu_sensitivity_old("/Edit/Copy", FALSE);
- set_menu_sensitivity_old("/Edit/Paste", FALSE);
-#endif
- /* Hide not usable menus */
-
- set_menus_for_captured_packets(FALSE);
- set_menus_for_selected_packet(&cfile);
- set_menus_for_selected_tree_row(&cfile);
- set_menus_for_capture_in_progress(FALSE);
- set_menus_for_file_set(/* dialog */TRUE, /* previous file */ FALSE, /* next_file */ FALSE);
-
- /* Set callback to update name resolution settings when activated */
- name_res_action = gtk_action_group_get_action(main_menu_bar_action_group, "/View/NameResolution");
- g_signal_connect (name_res_action, "activate", G_CALLBACK (menu_name_resolution_update_cb), NULL);
- }
-}
-
-/* Get a merge id for the menubar */
-void
-ws_add_build_menubar_items_callback(gpointer callback)
-{
- build_menubar_items_callback_list = g_list_append(build_menubar_items_callback_list, callback);
-
-}
-
-static void
-ws_menubar_build_external_menus(void)
-{
- void (*callback)(gpointer);
-
- while (build_menubar_items_callback_list != NULL) {
- callback = (void (*)(gpointer))build_menubar_items_callback_list->data;
- callback(ui_manager_main_menubar);
- build_menubar_items_callback_list = g_list_next(build_menubar_items_callback_list);
- }
-
-
-}
-
-typedef struct _menu_item {
- const char *gui_path;
- const char *name;
- const char *stock_id;
- const char *label;
- const char *accelerator;
- const gchar *tooltip;
- GCallback callback;
- gpointer callback_data;
- gboolean enabled;
- gboolean (*selected_packet_enabled)(frame_data *, epan_dissect_t *, gpointer callback_data);
- gboolean (*selected_tree_row_enabled)(field_info *, gpointer callback_data);
-} menu_item_t;
-
-static gint
-insert_sorted_by_label(gconstpointer aparam, gconstpointer bparam)
-{
- const menu_item_t *a = (const menu_item_t *)aparam;
- const menu_item_t *b = (const menu_item_t *)bparam;
-
- return g_ascii_strcasecmp(a->label, b->label);
-}
-
-void register_menu_bar_menu_items(
- const char *gui_path,
- const char *name,
- const gchar *stock_id,
- const char *label,
- const char *accelerator,
- const gchar *tooltip,
- gpointer callback,
- gpointer callback_data,
- gboolean enabled,
- gboolean (*selected_packet_enabled)(frame_data *, epan_dissect_t *, gpointer callback_data),
- gboolean (*selected_tree_row_enabled)(field_info *, gpointer callback_data))
-{
- menu_item_t *menu_item_data;
-
- menu_item_data = g_new0(menu_item_t,1);
- menu_item_data->gui_path = gui_path;
- menu_item_data->name = name;
- menu_item_data->label = label;
- menu_item_data->stock_id = stock_id;
- menu_item_data->accelerator = accelerator;
- menu_item_data->tooltip = tooltip;
- menu_item_data->callback = (GCallback)callback;
- menu_item_data->callback_data = callback_data;
- menu_item_data->enabled = enabled;
- menu_item_data->selected_packet_enabled = selected_packet_enabled;
- menu_item_data->selected_tree_row_enabled = selected_tree_row_enabled;
-
- merge_menu_items_list = g_list_insert_sorted(merge_menu_items_list,
- menu_item_data,
- insert_sorted_by_label);
-}
-
-#define XMENU_MAX_DEPTH (1 + 32) /* max number of menus in an xpath (+1 for Menubar) */
-
-static void
-add_menu_item_to_main_menubar(const gchar *path, const gchar *name, const menu_item_t *menu_item_data)
-{
- gchar *xpath;
- GString *item_path;
- guint merge_id;
- char **p;
- char **tokens, **name_action_tokens;
- char *tok, *item_name, *action_name;
- size_t len;
- int i;
- GtkAction *action;
-
- /* no need to specify menu bar...skip it */
- len = strlen("/Menubar");
- if (g_ascii_strncasecmp(path, "/Menubar", len) == 0) {
- path += len;
- }
-
- xpath = g_strdup_printf("%s/%s", path, name);
- item_path = g_string_new("/Menubar");
-
- merge_id = gtk_ui_manager_new_merge_id(ui_manager_main_menubar);
-
- /*
- * The last item in the path is treated as the menu item; all preceding path
- * elements are the names of parent menus. Path elements are stripped of
- * leading/trailing spaces.
- *
- * |'s separate an existing menu's name from its action.
- * If the action has a / in it, it must have been "escaped" into a # before
- * entering this function; this function will translate it back to a /.
- * There must be an easier way!
- *
- * Examples:
- *
- * "/Foo/Bar|/BarAction/I_tem" creates a hierarchy of:
- *
- * A menu with an action of "Foo"
- * A menu with a name of "Bar" and an action of "/BarAction"
- * A menu item with an action of "I_tem", which puts
- * the shortcut on "t".
- *
- * "/Foo/Bar|BarAction/-/Baz|BarAction#BazAction/Item" creates
- * a hierarchy of:
- *
- * A menu with an action of "Foo"
- * A menu with a name of "Bar" and an action of "/BarAction"
- * A separator
- * A menu with a name of "Baz" and an action of
- * "BarAction/BazAction"
- * A menu item with an action of "Item"
- */
- tokens = g_strsplit(xpath, "/", XMENU_MAX_DEPTH);
- for (p = tokens; (p != NULL) && (*p != NULL); p++) {
- tok = g_strstrip(*p);
- if (g_strcmp0(tok, "-") == 0) {
- /* Just a separator. */
- gtk_ui_manager_add_ui(ui_manager_main_menubar, merge_id,
- item_path->str,
- NULL,
- NULL,
- GTK_UI_MANAGER_SEPARATOR,
- FALSE);
- } else {
- if (*(p+1) == NULL) {
- /*
- * This is the last token; it's the name of a menu item,
- * not of a menu.
- *
- * Allow a blank menu item name or else the item is hidden
- * (and thus useless). Showing a blank menu item allows the
- * developer to see the problem and fix it.
- */
- item_name = tok;
- action_name = g_strconcat("/", tok, NULL);
- if (menu_item_data != NULL) {
- action = (GtkAction *)g_object_new (
- GTK_TYPE_ACTION,
- "name", action_name,
- "label", menu_item_data->label,
- "stock-id", menu_item_data->stock_id,
- "tooltip", menu_item_data->tooltip,
- "sensitive", menu_item_data->enabled,
- NULL
- );
- if (menu_item_data->callback != NULL) {
- g_signal_connect (
- action,
- "activate",
- G_CALLBACK (menu_item_data->callback),
- menu_item_data->callback_data
- );
- }
- gtk_action_group_add_action (main_menu_bar_action_group, action);
- g_object_unref (action);
- }
- gtk_ui_manager_add_ui(ui_manager_main_menubar, merge_id,
- item_path->str,
- item_name,
- action_name,
- GTK_UI_MANAGER_MENUITEM,
- FALSE);
- g_free(action_name);
- } else {
- /*
- * This is not the last token; it's the name of an
- * intermediate menu.
- *
- * If it's empty, just skip it.
- */
- if (tok[0] == '\0')
- continue;
-
- /* Split the name of the menu from its action (if any) */
- name_action_tokens = g_strsplit(tok, "|", 2);
- if (name_action_tokens[1]) {
- i = -1;
- /* Replace #'s with /'s.
- * Necessary for menus whose action includes a "/".
- * There MUST be an easier way...
- */
- while (name_action_tokens[1][++i])
- if (name_action_tokens[1][i] == '#')
- name_action_tokens[1][i] = '/';
- item_name = name_action_tokens[0];
- action_name = g_strconcat("/", name_action_tokens[1], NULL);
- } else {
- item_name = tok;
- action_name = g_strconcat("/", tok, NULL);
- }
-
- if (menu_item_data != NULL) {
- /*
- * Add an action for this menu if it doesn't already
- * exist.
- */
- if (gtk_action_group_get_action(main_menu_bar_action_group, action_name) == NULL) {
- action = (GtkAction *)g_object_new (
- GTK_TYPE_ACTION,
- "name", action_name,
- "label", item_name,
- NULL
- );
- gtk_action_group_add_action (main_menu_bar_action_group, action);
- g_object_unref (action);
- }
- }
- gtk_ui_manager_add_ui(ui_manager_main_menubar, merge_id,
- item_path->str,
- item_name,
- action_name,
- GTK_UI_MANAGER_MENU,
- FALSE);
- g_free(action_name);
-
- g_string_append_printf(item_path, "/%s", item_name);
- g_strfreev(name_action_tokens);
- }
- }
- }
-
- /* we're finished processing the tokens so free the list */
- g_strfreev(tokens);
-
- g_string_free(item_path, TRUE);
- g_free(xpath);
-}
-
-static void
-merge_menu_items(GList *lcl_merge_menu_items_list)
-{
- menu_item_t *menu_item_data;
-
- while (lcl_merge_menu_items_list != NULL) {
- menu_item_data = (menu_item_t *)lcl_merge_menu_items_list->data;
- add_menu_item_to_main_menubar(menu_item_data->gui_path, menu_item_data->name, menu_item_data);
- lcl_merge_menu_items_list = g_list_next(lcl_merge_menu_items_list);
- }
-}
-
-const char *
-stat_group_name(register_stat_group_t group)
-{
- /* See add_menu_item_to_main_menubar() for an explanation of the string format */
- static const value_string group_name_vals[] = {
- {REGISTER_ANALYZE_GROUP_UNSORTED, "/Menubar/AnalyzeMenu|Analyze"}, /* unsorted analyze stuff */
- {REGISTER_ANALYZE_GROUP_CONVERSATION_FILTER, "/Menubar/AnalyzeMenu|Analyze/ConversationFilterMenu|Analyze#ConversationFilter"}, /* conversation filters */
- {REGISTER_STAT_GROUP_UNSORTED, "/Menubar/StatisticsMenu|Statistics"}, /* unsorted statistic function */
- {REGISTER_STAT_GROUP_GENERIC, "/Menubar/StatisticsMenu|Statistics"}, /* generic statistic function, not specific to a protocol */
- {REGISTER_STAT_GROUP_CONVERSATION_LIST, "/Menubar/StatisticsMenu|Statistics/ConversationListMenu|Statistics#ConversationList"}, /* member of the conversation list */
- {REGISTER_STAT_GROUP_ENDPOINT_LIST, "/Menubar/StatisticsMenu|Statistics/EndpointListMenu|Statistics#EndpointList"}, /* member of the endpoint list */
- {REGISTER_STAT_GROUP_RESPONSE_TIME, "/Menubar/StatisticsMenu|Statistics/ServiceResponseTimeMenu|Statistics#ServiceResponseTime"}, /* member of the service response time list */
- {REGISTER_STAT_GROUP_TELEPHONY, "/Menubar/TelephonyMenu|Telephony"}, /* telephony specific */
- {REGISTER_STAT_GROUP_TELEPHONY_ANSI, "/Menubar/TelephonyMenu|Telephony/ANSI|Telephony#ANSI"}, /* ANSI-specific */
- {REGISTER_STAT_GROUP_TELEPHONY_GSM, "/Menubar/TelephonyMenu|Telephony/GSM|Telephony#GSM"}, /* GSM-specific */
- {REGISTER_STAT_GROUP_TELEPHONY_LTE, "/Menubar/TelephonyMenu|Telephony/LTEmenu|Telephony#LTE"}, /* LTE-specific */
- {REGISTER_STAT_GROUP_TELEPHONY_MTP3, "/Menubar/TelephonyMenu|Telephony/MTP3menu|Telephony#MTP3"}, /* MTP3-specific */
- {REGISTER_STAT_GROUP_TELEPHONY_SCTP, "/Menubar/TelephonyMenu|Telephony/SCTPmenu|Telephony#SCTP"}, /* SCTP-specific */
- {REGISTER_TOOLS_GROUP_UNSORTED, "/Menubar/ToolsMenu|Tools"}, /* unsorted tools */
- {0, NULL}
- };
- return val_to_str_const(group, group_name_vals, "/Menubar/ToolsMenu|Tools");
-}
-
-/*
- * Enable/disable menu sensitivity.
- */
-static void
-set_menu_sensitivity(GtkUIManager *ui_manager, const gchar *path, gint val)
-{
- GtkAction *action;
-
- action = gtk_ui_manager_get_action(ui_manager, path);
- if(!action){
- fprintf (stderr, "Warning: set_menu_sensitivity couldn't find action path= %s\n",
- path);
- return;
- }
- gtk_action_set_sensitive (action, val); /* TRUE to make the action sensitive */
-}
-
-static void
-set_menu_object_data_meat(GtkUIManager *ui_manager, const gchar *path, const gchar *key, gpointer data)
-{
- GtkWidget *menu = NULL;
-
- if ((menu = gtk_ui_manager_get_widget(ui_manager, path)) != NULL){
- g_object_set_data(G_OBJECT(menu), key, data);
- }else{
-#if 0
- g_warning("set_menu_object_data_meat: no menu, path: %s",path);
-#endif
- }
-}
-
-void
-set_menu_object_data (const gchar *path, const gchar *key, gpointer data)
-{
- if (strncmp (path,"/Menubar",8) == 0){
- set_menu_object_data_meat(ui_manager_main_menubar, path, key, data);
- }else if (strncmp (path,"/PacketListMenuPopup",20) == 0){
- set_menu_object_data_meat(ui_manager_packet_list_menu, path, key, data);
- }else if (strncmp (path,"/TreeViewPopup",14) == 0){
- set_menu_object_data_meat(ui_manager_tree_view_menu, path, key, data);
- }else if (strncmp (path,"/BytesMenuPopup",15) == 0){
- set_menu_object_data_meat(ui_manager_bytes_menu, path, key, data);
- }else if (strncmp (path,"/ProfilesMenuPopup",18) == 0){
- set_menu_object_data_meat(ui_manager_statusbar_profiles_menu, path, key, data);
- }
-}
-
-
-/* Recently used capture files submenu:
- * Submenu containing the recently used capture files.
- * The capture filenames are always kept with the absolute path to be independent
- * of the current path.
- * They are only stored inside the labels of the submenu (no separate list). */
-
-#define MENU_RECENT_FILES_PATH "/Menubar/FileMenu/OpenRecent"
-#define MENU_RECENT_FILES_KEY "Recent File Name"
-
-/* Add a file name to the top of the list; if it's already present remove it first */
-static GList *
-remove_present_file_name(GList *recent_files_list, const gchar *cf_name)
-{
- GList *li, *next;
- gchar *widget_cf_name;
-
- for (li = g_list_first(recent_files_list); li; li = next) {
- widget_cf_name = (gchar *)li->data;
- next = li->next;
- if (
-#ifdef _WIN32
- /* do a case insensitive compare on win32 */
- g_ascii_strncasecmp(widget_cf_name, cf_name, 1000) == 0){
-#else /* _WIN32 */
- /* do a case sensitive compare on unix */
- strncmp(widget_cf_name, cf_name, 1000) == 0 ){
-#endif
- recent_files_list = g_list_remove(recent_files_list,widget_cf_name);
- }
- }
-
- return recent_files_list;
-}
-
-static void
-recent_changed_cb (GtkUIManager *ui_manager,
- gpointer user_data _U_)
-{
- guint merge_id;
- GList *action_groups, *l;
-
-
- merge_id = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (ui_manager),
- "recent-files-merge-id"));
-
- /* remove the UI */
- gtk_ui_manager_remove_ui (ui_manager, merge_id);
-
- /* remove the action group; gtk_ui_manager_remove_action_group()
- * should really take the action group's name instead of its
- * pointer.
- */
- action_groups = gtk_ui_manager_get_action_groups (ui_manager);
- for (l = action_groups; l != NULL; l = l->next)
- {
- GtkActionGroup *group = (GtkActionGroup *)l->data;
-
- if (strcmp (gtk_action_group_get_name (group), "recent-files-group") == 0){
- /* this unrefs the action group and all of its actions */
- gtk_ui_manager_remove_action_group (ui_manager, group);
- break;
- }
- }
-
- /* generate a new merge id and re-add everything */
- merge_id = gtk_ui_manager_new_merge_id (ui_manager);
- add_recent_items (merge_id, ui_manager);
-}
-
-static void
-recent_clear_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- GtkWidget *submenu_recent_files;
- GList *recent_files_list;
-
- /* Get the list of recent files, free the list and store the empty list with the widget */
- submenu_recent_files = gtk_ui_manager_get_widget(ui_manager_main_menubar, MENU_RECENT_FILES_PATH);
- recent_files_list = (GList *)g_object_get_data(G_OBJECT(submenu_recent_files), "recent-files-list");
- /* Free the name strings ?? */
- g_list_free(recent_files_list);
- recent_files_list = NULL;
- g_object_set_data(G_OBJECT(submenu_recent_files), "recent-files-list", recent_files_list);
- /* Calling recent_changed_cb will rebuild the GUI call add_recent_items which will in turn call
- * main_welcome_reset_recent_capture_files
- */
- recent_changed_cb(ui_manager_main_menubar, NULL);
-}
-
-static void
-add_recent_items (guint merge_id, GtkUIManager *ui_manager)
-{
- GtkActionGroup *action_group;
- GtkAction *action;
- GtkWidget *submenu_recent_files;
- GtkWidget *submenu_recent_file;
- GList *items, *l;
- gchar *action_name;
- gchar *recent_path;
- guint i;
-
- /* Reset the recent files list in the welcome screen */
- main_welcome_reset_recent_capture_files();
-
- action_group = gtk_action_group_new ("recent-files-group");
-
- submenu_recent_files = gtk_ui_manager_get_widget(ui_manager, MENU_RECENT_FILES_PATH);
- if(!submenu_recent_files){
- g_warning("add_recent_items: No submenu_recent_files found, path= MENU_RECENT_FILES_PATH");
- }
- items = (GList *)g_object_get_data(G_OBJECT(submenu_recent_files), "recent-files-list");
-
- gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);
- g_object_set_data (G_OBJECT (ui_manager),
- "recent-files-merge-id", GUINT_TO_POINTER (merge_id));
-
- /* no items */
- if (!items){
-
- action = (GtkAction *)g_object_new (GTK_TYPE_ACTION,
- "name", "recent-info-empty",
- "label", "No recently used files",
- "sensitive", FALSE,
- NULL);
- gtk_action_group_add_action (action_group, action);
- gtk_action_set_sensitive(action, FALSE);
- g_object_unref (action);
-
- gtk_ui_manager_add_ui (ui_manager, merge_id,
- "/Menubar/FileMenu/OpenRecent/RecentFiles",
- "recent-info-empty",
- "recent-info-empty",
- GTK_UI_MANAGER_MENUITEM,
- FALSE);
-
- return;
- }
-
- for (i = 0, l = items;
- i < prefs.gui_recent_files_count_max && l != NULL;
- i +=1, l = l->next)
- {
- gchar *item_name = (gchar *)l->data;
- action_name = g_strdup_printf ("recent-info-%u", i);
-
- action = (GtkAction *)g_object_new (GTK_TYPE_ACTION,
- "name", action_name,
- "label", item_name,
- "stock_id", WIRESHARK_STOCK_SAVE,
- NULL);
- g_signal_connect (action, "activate",
- G_CALLBACK (menu_open_recent_file_cmd_cb), NULL);
-#if !GTK_CHECK_VERSION(2,16,0)
- g_object_set_data (G_OBJECT (action), "FileName", item_name);
-#endif
- gtk_action_group_add_action (action_group, action);
- g_object_unref (action);
-
- gtk_ui_manager_add_ui (ui_manager, merge_id,
- "/Menubar/FileMenu/OpenRecent/RecentFiles",
- action_name,
- action_name,
- GTK_UI_MANAGER_MENUITEM,
- FALSE);
-
- /* Disable mnemonic accelerator key for recent file name */
- recent_path = g_strdup_printf ("/Menubar/FileMenu/OpenRecent/RecentFiles/recent-info-%u", i);
- submenu_recent_file = gtk_ui_manager_get_widget(ui_manager, recent_path);
- g_object_set(G_OBJECT (submenu_recent_file), "use-underline", 0, NULL);
-
- /* Add the file name to the recent files list on the Welcome screen */
- main_welcome_add_recent_capture_file(item_name, G_OBJECT(action));
-
- g_free (recent_path);
- g_free (action_name);
- }
- /* Add a Separator */
- gtk_ui_manager_add_ui (ui_manager, merge_id,
- "/Menubar/FileMenu/OpenRecent/RecentFiles",
- "separator-recent-info",
- NULL,
- GTK_UI_MANAGER_SEPARATOR,
- FALSE);
-
- /* Add a clear Icon */
- action = (GtkAction *)g_object_new (GTK_TYPE_ACTION,
- "name", "clear-recent-info",
- "label", "Clear the recent files list",
- "stock_id", GTK_STOCK_CLEAR,
- NULL);
-
- g_signal_connect (action, "activate",
- G_CALLBACK (recent_clear_cb), NULL);
-
- gtk_action_group_add_action (action_group, action);
- g_object_unref (action);
-
- gtk_ui_manager_add_ui (ui_manager, merge_id,
- "/Menubar/FileMenu/OpenRecent/RecentFiles",
- "clear-recent-info",
- "clear-recent-info",
- GTK_UI_MANAGER_MENUITEM,
- FALSE);
-
-}
-
-#define MENU_STATISTICS_PATH "/Menubar/StatisticsMenu"
-
-static void
-add_tap_plugins (guint merge_id, GtkUIManager *ui_manager)
-{
- GtkActionGroup *action_group;
- GtkAction *action;
- GtkWidget *submenu_statistics;
- GList *cfg_list;
- GList *iter;
- gchar *action_name;
-
- gchar *submenu_path;
- gsize submenu_path_size;
- gchar *stat_name_buf;
- gchar *stat_name;
- gchar *sep;
-
- action_group = gtk_action_group_new ("tap-plugins-group");
-
- submenu_statistics = gtk_ui_manager_get_widget(ui_manager_main_menubar, MENU_STATISTICS_PATH);
- if(!submenu_statistics){
- g_warning("add_tap_plugins: No submenu_statistics found, path= MENU_STATISTICS_PATH");
- return;
- }
- gtk_ui_manager_insert_action_group (ui_manager_main_menubar, action_group, 0);
- g_object_set_data (G_OBJECT (ui_manager_main_menubar),
- "tap-plugins-merge-id", GUINT_TO_POINTER (merge_id));
-
- cfg_list = stats_tree_get_cfg_list();
- iter = g_list_first(cfg_list);
- while (iter) {
- stats_tree_cfg *cfg = (stats_tree_cfg*)iter->data;
- if (cfg->plugin) {
- stat_name_buf = g_strdup(cfg->name);
- submenu_path_size = (gsize)(strlen(MENU_STATISTICS_PATH)+strlen(cfg->name)+strlen(cfg->abbr)+1); /* worst case length */
- submenu_path = (gchar *)g_malloc(submenu_path_size);
- g_strlcpy(submenu_path, MENU_STATISTICS_PATH, submenu_path_size);
-
- sep = stat_name= stat_name_buf;
- while ((sep = strchr(sep,'/')) != NULL) {
- if (*(++sep)=='/') { /* escapeded slash - two slash characters after each other */
- memmove(sep,sep+1,strlen(sep));
- }
- else {
- /* we got a new submenu name - ignore the edge case where there is no text following this slash */
- *(sep-1)= 0;
- action_name = g_strdup_printf("%s/%s", submenu_path,stat_name);
- if (!gtk_ui_manager_get_widget(ui_manager, action_name)) {
- action = (GtkAction *)g_object_new (GTK_TYPE_ACTION,
- "name", action_name,
- "label", stat_name,
- NULL);
- gtk_action_group_add_action (action_group, action);
- g_object_unref (action);
-
- gtk_ui_manager_add_ui (ui_manager, merge_id,
- submenu_path,
- stat_name,
- action_name,
- GTK_UI_MANAGER_MENU,
- FALSE);
- }
- g_free (action_name);
-
- g_strlcat(submenu_path,"/",submenu_path_size);
- g_strlcat(submenu_path,stat_name,submenu_path_size);
- stat_name= sep;
- }
- }
-
- action_name = g_strdup_printf("%s/%s", submenu_path, cfg->abbr);
- action = (GtkAction *)g_object_new (GTK_TYPE_ACTION,
- "name", action_name,
- "label", stat_name,
- NULL);
- g_signal_connect (action, "activate", G_CALLBACK (gtk_stats_tree_cb), NULL);
- gtk_action_group_add_action (action_group, action);
- g_object_unref (action);
-
- gtk_ui_manager_add_ui (ui_manager, merge_id,
- submenu_path,
- action_name,
- action_name,
- GTK_UI_MANAGER_MENUITEM,
- FALSE);
-
- g_free (action_name);
- g_free (stat_name_buf);
- g_free (submenu_path);
- }
- iter = g_list_next(iter);
- }
- g_list_free(cfg_list);
-}
-
-/* Open a file by its name
- (Beware: will not ask to close existing capture file!) */
-void
-menu_open_filename(gchar *cf_name)
-{
- GtkWidget *submenu_recent_files;
- int err;
- GList *recent_files_list;
-
-
- submenu_recent_files = gtk_ui_manager_get_widget(ui_manager_main_menubar, MENU_RECENT_FILES_PATH);
- if(!submenu_recent_files){
- g_warning("menu_open_filename: No submenu_recent_files found, path= MENU_RECENT_FILES_PATH");
- }
- recent_files_list = (GList *)g_object_get_data(G_OBJECT(submenu_recent_files), "recent-files-list");
- /* XXX: ask user to remove item, it's maybe only a temporary problem */
- /* open and read the capture file (this will close an existing file) */
- if (cf_open(&cfile, cf_name, WTAP_TYPE_AUTO, FALSE, &err) == CF_OK) {
- cf_read(&cfile, FALSE);
- }else{
- recent_files_list = remove_present_file_name(recent_files_list, cf_name);
- g_object_set_data(G_OBJECT(submenu_recent_files), "recent-files-list", recent_files_list);
- /* Calling recent_changed_cb will rebuild the GUI call add_recent_items which will in turn call
- * main_welcome_reset_recent_capture_files
- */
- recent_changed_cb(ui_manager_main_menubar, NULL);
- }
-}
-
-/* callback, if the user pushed a recent file submenu item */
-static void
-menu_open_recent_file_cmd(GtkAction *action)
-{
- GtkWidget *submenu_recent_files;
- GList *recent_files_list;
- const gchar *cf_name;
- int err;
-
-#if GTK_CHECK_VERSION(2,16,0)
- cf_name = gtk_action_get_label(action);
-#else
- cf_name = (const gchar *)g_object_get_data(G_OBJECT(action), "FileName");
-#endif
-
- /* open and read the capture file (this will close an existing file) */
- if (cf_open(&cfile, cf_name, WTAP_TYPE_AUTO, FALSE, &err) == CF_OK) {
- cf_read(&cfile, FALSE);
- } else {
- submenu_recent_files = gtk_ui_manager_get_widget(ui_manager_main_menubar, MENU_RECENT_FILES_PATH);
- recent_files_list = (GList *)g_object_get_data(G_OBJECT(submenu_recent_files), "recent-files-list");
-
- recent_files_list = remove_present_file_name(recent_files_list, cf_name);
- g_object_set_data(G_OBJECT(submenu_recent_files), "recent-files-list", recent_files_list);
- /* Calling recent_changed_cb will rebuild the GUI call add_recent_items which will in turn call
- * main_welcome_reset_recent_capture_files
- */
- recent_changed_cb(ui_manager_main_menubar, NULL);
- }
-}
-
-static void
-menu_open_recent_file_cmd_cb(GtkAction *action, gpointer data _U_)
-{
- /* If there's unsaved data, let the user save it first.
- If they cancel out of it, don't open the file. */
- if (do_file_close(&cfile, FALSE, " before opening a new capture file"))
- menu_open_recent_file_cmd(action);
-}
-
-static void
-add_menu_recent_capture_file_absolute(const gchar *cf_name)
-{
- GtkWidget *submenu_recent_files;
- GList *li;
- gchar *widget_cf_name;
- gchar *normalized_cf_name;
- guint cnt;
- GList *recent_files_list;
-
- normalized_cf_name = g_strdup(cf_name);
-#ifdef _WIN32
- /* replace all slashes by backslashes */
- g_strdelimit(normalized_cf_name, "/", '\\');
-#endif
-
- /* get the submenu container item */
- submenu_recent_files = gtk_ui_manager_get_widget(ui_manager_main_menubar, MENU_RECENT_FILES_PATH);
- if(!submenu_recent_files){
- g_warning("add_menu_recent_capture_file_absolute: No submenu_recent_files found, path= MENU_RECENT_FILES_PATH");
- g_free(normalized_cf_name);
- return;
- }
- recent_files_list = (GList *)g_object_get_data(G_OBJECT(submenu_recent_files), "recent-files-list");
- cnt = 1;
- for (li = g_list_first(recent_files_list); li; cnt++) {
- widget_cf_name = (gchar *)li->data;
-
- /* Find the next element BEFORE we (possibly) free the current one below */
- li = li->next;
-
- if (
-#ifdef _WIN32
- /* do a case insensitive compare on win32 */
- g_ascii_strncasecmp(widget_cf_name, normalized_cf_name, 1000) == 0 ||
-#else /* _WIN32 */
- /* do a case sensitive compare on unix */
- strncmp(widget_cf_name, normalized_cf_name, 1000) == 0 ||
-#endif
- cnt >= prefs.gui_recent_files_count_max) {
- recent_files_list = g_list_remove(recent_files_list,widget_cf_name);
- cnt--;
- }
- }
- recent_files_list = g_list_prepend(recent_files_list, normalized_cf_name);
- g_object_set_data(G_OBJECT(submenu_recent_files), "recent-files-list", recent_files_list);
- recent_changed_cb( ui_manager_main_menubar, NULL);
-}
-
-
-/* add the capture filename to the "Recent Files" menu */
-/* (will change nothing, if this filename is already in the menu) */
-/*
- * XXX - We might want to call SHAddToRecentDocs under Windows 7:
- * http: //stackoverflow.com/questions/437212/how-do-you-register-a-most-recently-used-list-with-windows-in-preparation-for-win
- */
-void
-add_menu_recent_capture_file(const gchar *cf_name)
-{
- gchar *curr;
- gchar *absolute;
-
- /* if this filename is an absolute path, we can use it directly */
- if (g_path_is_absolute(cf_name)) {
- add_menu_recent_capture_file_absolute(cf_name);
- return;
- }
-
- /* this filename is not an absolute path, prepend the current dir */
- curr = g_get_current_dir();
- absolute = g_strdup_printf("%s%s%s", curr, G_DIR_SEPARATOR_S, cf_name);
- add_menu_recent_capture_file_absolute(absolute);
- g_free(curr);
- g_free(absolute);
-}
-
-
-/* write all capture filenames of the menu to the user's recent file */
-void
-menu_recent_file_write_all(FILE *rf)
-{
- GtkWidget *submenu_recent_files;
- gchar *cf_name;
- GList *recent_files_list, *list;
-
- submenu_recent_files = gtk_ui_manager_get_widget(ui_manager_main_menubar, MENU_RECENT_FILES_PATH);
- if(!submenu_recent_files){
- g_warning("menu_recent_file_write_all: No submenu_recent_files found, path= MENU_RECENT_FILES_PATH");
- }
- recent_files_list = (GList *)g_object_get_data(G_OBJECT(submenu_recent_files), "recent-files-list");
- list = g_list_last(recent_files_list);
- while (list != NULL) {
- cf_name = (gchar *)list->data;
- if (cf_name) {
- fprintf (rf, RECENT_KEY_CAPTURE_FILE ": %s\n", cf_name);
- }
- list = g_list_previous(list);
- }
- g_list_free(recent_files_list);
-}
-
-void
-menu_name_resolution_changed(void)
-{
- GtkWidget *menu;
-
- menu = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/NameResolution/EnableforMACLayer");
- if(!menu){
- g_warning("menu_name_resolution_changed: No menu found, path= /Menubar/ViewMenu/NameResolution/EnableforMACLayer");
- }
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), gbl_resolv_flags.mac_name);
-
- menu = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/NameResolution/EnableforNetworkLayer");
- if(!menu){
- g_warning("menu_name_resolution_changed: No menu found, path= /Menubar/ViewMenu/NameResolution/EnableforNetworkLayer");
- }
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), gbl_resolv_flags.network_name);
-
- menu = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/NameResolution/EnableforTransportLayer");
- if(!menu){
- g_warning("menu_name_resolution_changed: No menu found, path= /Menubar/ViewMenu/NameResolution/EnableforTransportLayer");
- }
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), gbl_resolv_flags.transport_name);
-
- menu = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/NameResolution/UseExternalNetworkNameResolver");
- if(!menu){
- g_warning("menu_name_resolution_changed: No menu found, path= /Menubar/ViewMenu/NameResolution/UseExternalNetworkNameResolver");
- }
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), gbl_resolv_flags.use_external_net_name_resolver);
-}
-
-static void
-menu_name_resolution_update_cb(GtkAction *action _U_, gpointer data _U_)
-{
- menu_name_resolution_changed();
-}
-
-static void
-name_resolution_cb(GtkWidget *w, gpointer d _U_, gboolean* res_flag)
-{
- if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(w))) {
- *res_flag = TRUE;
- } else {
- *res_flag = FALSE;
- }
-
- packet_list_recreate();
- redraw_packet_bytes_all();
-}
-
-#ifdef HAVE_LIBPCAP
-void
-menu_auto_scroll_live_changed(gboolean auto_scroll_live_in)
-{
- GtkWidget *menu;
-
- /* tell menu about it */
- menu = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/AutoScrollinLiveCapture");
- if(!menu){
- g_warning("menu_auto_scroll_live_changed: No menu found, path= /Menubar/ViewMenu/AutoScrollinLiveCapture");
- }
- if( ((gboolean) gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu)) != auto_scroll_live_in) ) {
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), auto_scroll_live_in);
- }
-}
-#endif /*HAVE_LIBPCAP */
-
-
-
-
-void
-menu_colorize_changed(gboolean packet_list_colorize)
-{
- GtkWidget *menu;
-
- /* tell menu about it */
- menu = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/ColorizePacketList");
- if(!menu){
- g_warning("menu_colorize_changed: No menu found, path= /Menubar/ViewMenu/ColorizePacketList");
- }
- if( (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu)) != packet_list_colorize) ) {
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), packet_list_colorize);
- }
-}
-
-static void
-colorize_cb(GtkWidget *w, gpointer d _U_)
-{
- main_colorize_changed(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(w)));
-}
-
-
-/* the recent file read has finished, update the menu corresponding */
-void
-menu_recent_read_finished(void)
-{
- GtkWidget *menu;
-
- menu = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/MainToolbar");
- if(!menu){
- g_warning("menu_recent_read_finished: No menu found, path= /Menubar/ViewMenu/MainToolbar");
- }else{
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), recent.main_toolbar_show);
- }
- menu = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/FilterToolbar");
- if(!menu){
- g_warning("menu_recent_read_finished: No menu found, path= /Menubar/ViewMenu/FilterToolbar");
- }else{
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), recent.filter_toolbar_show);
- };
- menu = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/WirelessToolbar");
- if(!menu){
- g_warning("menu_recent_read_finished: No menu found, path= /Menubar/ViewMenu/WirelessToolbar");
- }else{
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), recent.wireless_toolbar_show);
- }
-
- /* Fix me? */
- menu = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/StatusBar");
- if(!menu){
- g_warning("menu_recent_read_finished: No menu found, path= /Menubar/ViewMenu/StatusBar");
- }else{
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), recent.statusbar_show);
- }
-
- menu = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/PacketList");
- if(!menu){
- g_warning("menu_recent_read_finished: No menu found, path= /Menubar/ViewMenu/PacketList");
- }else{
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), recent.packet_list_show);
- }
-
- menu = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/PacketDetails");
- if(!menu){
- g_warning("menu_recent_read_finished: No menu found, path= /Menubar/ViewMenu/PacketDetails");
- }else{
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), recent.tree_view_show);
- }
-
- menu = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/PacketBytes");
- if(!menu){
- g_warning("menu_recent_read_finished: No menu found, path= /Menubar/ViewMenu/PacketBytes");
- }else{
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), recent.byte_view_show);
- }
-
- menu = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/ColorizePacketList");
- if(!menu){
- g_warning("menu_recent_read_finished: No menu found, path= /Menubar/ViewMenu/ColorizePacketList");
- }else{
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), recent.packet_list_colorize);
- }
-
- menu_name_resolution_changed();
-
-#ifdef HAVE_LIBPCAP
- menu = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/AutoScrollinLiveCapture");
- if(!menu){
- g_warning("menu_recent_read_finished: No menu found, path= /Menubar/ViewMenu/AutoScrollinLiveCapture");
- }else{
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), auto_scroll_live);
- }
-#endif
- main_widgets_rearrange();
-
- /* Update the time format if we had a command line value. */
- if (global_dissect_options.time_format != TS_NOT_SET) {
- recent.gui_time_format = global_dissect_options.time_format;
- }
-
- /* XXX Fix me */
- timestamp_set_type(recent.gui_time_format);
- /* This call adjusts column width */
- cf_timestamp_auto_precision(&cfile);
- packet_list_queue_draw();
- /* the actual precision will be set in packet_list_queue_draw() below */
- if (recent.gui_time_precision > TS_PREC_FIXED_NSEC) {
- timestamp_set_precision(TS_PREC_AUTO);
- } else {
- timestamp_set_precision(recent.gui_time_precision);
- }
- /* This call adjusts column width */
- cf_timestamp_auto_precision(&cfile);
- packet_list_queue_draw();
-
- /* don't change the seconds format, if we had a command line value */
- if (timestamp_get_seconds_type() != TS_SECONDS_NOT_SET) {
- recent.gui_seconds_format = timestamp_get_seconds_type();
- }
- menu = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/TimeDisplayFormat/DisplaySecondsWithHoursAndMinutes");
- if(!menu){
- g_warning("menu_recent_read_finished: No menu found, path= /Menubar/ViewMenu/TimeDisplayFormat/DisplaySecondsWithHoursAndMinutes");
- }
-
- switch (recent.gui_seconds_format) {
- case TS_SECONDS_DEFAULT:
- recent.gui_seconds_format = (ts_seconds_type)-1;
- /* set_active will not trigger the callback when deactivating an inactive item! */
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), TRUE);
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), FALSE);
- break;
- case TS_SECONDS_HOUR_MIN_SEC:
- recent.gui_seconds_format = (ts_seconds_type)-1;
- /* set_active will not trigger the callback when activating an active item! */
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), FALSE);
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), TRUE);
- break;
- default:
- g_assert_not_reached();
- }
-
- main_colorize_changed(recent.packet_list_colorize);
-}
-
-
-gboolean
-popup_menu_handler(GtkWidget *widget, GdkEvent *event, gpointer data)
-{
- GtkWidget *menu = (GtkWidget *)data;
- GdkEventButton *event_button = NULL;
- gint row, column;
-
- if(widget == NULL || event == NULL || data == NULL) {
- return FALSE;
- }
-
- /*
- * If we ever want to make the menu differ based on what row
- * and/or column we're above, we'd use "eth_clist_get_selection_info()"
- * to find the row and column number for the coordinates; a CTree is,
- * I guess, like a CList with one column(?) and the expander widget
- * as a pixmap.
- */
- /* Check if we are on packet_list object */
- if (widget == g_object_get_data(G_OBJECT(popup_menu_object), E_MPACKET_LIST_KEY) &&
- ((GdkEventButton *)event)->button != 1) {
- gint physical_row;
- if (packet_list_get_event_row_column((GdkEventButton *)event, &physical_row, &row, &column)) {
- g_object_set_data(G_OBJECT(popup_menu_object), E_MPACKET_LIST_ROW_KEY,
- GINT_TO_POINTER(row));
- g_object_set_data(G_OBJECT(popup_menu_object), E_MPACKET_LIST_COL_KEY,
- GINT_TO_POINTER(column));
- packet_list_set_selected_row(row);
- }
- }
-
- /* Check if we are on tree_view object */
- if (widget == tree_view_gbl) {
- tree_view_select(widget, (GdkEventButton *) event);
- }
-
- /* context menu handler */
- if(event->type == GDK_BUTTON_PRESS) {
- event_button = (GdkEventButton *) event;
-
- /* To quote the "Gdk Event Structures" doc:
- * "Normally button 1 is the left mouse button, 2 is the middle button, and 3 is the right button" */
- if(event_button->button == 3) {
- gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
- event_button->button,
- event_button->time);
- g_signal_stop_emission_by_name(widget, "button_press_event");
- return TRUE;
- }
- }
-
- /* Check if we are on byte_view object */
- if(widget == get_notebook_bv_ptr(byte_nb_ptr_gbl)) {
- byte_view_select(widget, (GdkEventButton *) event);
- }
-
- /* GDK_2BUTTON_PRESS is a doubleclick -> expand/collapse tree row */
- /* GTK version 1 seems to be doing this automatically */
- if (widget == tree_view_gbl && event->type == GDK_2BUTTON_PRESS) {
- GtkTreePath *path;
-
- if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget),
- (gint) (((GdkEventButton *)event)->x),
- (gint) (((GdkEventButton *)event)->y),
- &path, NULL, NULL, NULL))
- {
- if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(widget), path))
- gtk_tree_view_collapse_row(GTK_TREE_VIEW(widget), path);
- else
- gtk_tree_view_expand_row(GTK_TREE_VIEW(widget), path,
- FALSE);
- gtk_tree_path_free(path);
- }
- }
- return FALSE;
-}
-
-/* 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
-set_menus_for_capture_file(capture_file *cf)
-{
- if (cf == NULL || cf->state == FILE_READ_IN_PROGRESS) {
- /* We have no capture file or we're currently reading a file */
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/Merge", FALSE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/Close", FALSE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/Save", FALSE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/SaveAs", FALSE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/ExportSpecifiedPackets", FALSE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/ExportPacketDissections", FALSE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/ExportSelectedPacketBytes", FALSE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/ExportSSLSessionKeys", FALSE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/ExportObjectsMenu", FALSE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/ExportPDUs", FALSE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/Reload", FALSE);
- } else {
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/Merge", cf_can_write_with_wiretap(cf));
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/Close", TRUE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/Save",
- cf_can_save(cf));
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/SaveAs",
- cf_can_save_as(cf));
- /*
- * "Export Specified Packets..." should be available only if
- * we can write the file out in at least one format.
- */
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/ExportSpecifiedPackets",
- cf_can_write_with_wiretap(cf));
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/ExportPacketDissections", TRUE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/ExportSelectedPacketBytes", TRUE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/ExportSSLSessionKeys", TRUE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/ExportObjectsMenu", TRUE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/ExportPDUs", TRUE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/Reload", TRUE);
- }
-}
-
-/* Enable or disable menu items based on whether there's a capture in
- progress. */
-void
-set_menus_for_capture_in_progress(gboolean capture_in_progress)
-{
- /* Either a capture was started or stopped; in either case, it's not
- in the process of stopping, so allow quitting. */
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/Quit",
- TRUE);
-
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/Open",
- !capture_in_progress);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/OpenRecent",
- !capture_in_progress);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/ExportPacketDissections",
- capture_in_progress);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/ExportSelectedPacketBytes",
- capture_in_progress);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/ExportSSLSessionKeys",
- capture_in_progress);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/ExportObjectsMenu",
- capture_in_progress);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/Set",
- !capture_in_progress);
- 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
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/CaptureMenu/Options",
- !capture_in_progress);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/CaptureMenu/Start",
- !capture_in_progress && global_capture_opts.num_selected > 0);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/CaptureMenu/Stop",
- capture_in_progress);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/CaptureMenu/Restart",
- capture_in_progress);
-#endif /* HAVE_LIBPCAP */
-}
-
-#ifdef HAVE_LIBPCAP
-void
-set_menus_capture_start_sensitivity(gboolean enable)
-{
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/CaptureMenu/Start",
- enable);
-}
-#endif
-
-/* Disable menu items while we're waiting for the capture child to
- finish. We disallow quitting until it finishes, and also disallow
- stopping or restarting the capture. */
-void
-set_menus_for_capture_stopping(void)
-{
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/Quit",
- FALSE);
-#ifdef HAVE_LIBPCAP
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/CaptureMenu/Stop",
- FALSE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/CaptureMenu/Restart",
- FALSE);
-#endif /* HAVE_LIBPCAP */
-}
-
-
-void
-set_menus_for_captured_packets(gboolean have_captured_packets)
-{
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/Print",
- have_captured_packets);
- set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/Print",
- have_captured_packets);
-
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/FindPacket",
- have_captured_packets);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/FindNext",
- have_captured_packets);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/FindPrevious",
- have_captured_packets);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/ZoomIn",
- have_captured_packets);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/ZoomOut",
- have_captured_packets);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/NormalSize",
- have_captured_packets);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/GoMenu/Goto",
- have_captured_packets);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/GoMenu/PreviousPacket",
- have_captured_packets);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/GoMenu/NextPacket",
- have_captured_packets);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/GoMenu/FirstPacket",
- have_captured_packets);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/GoMenu/LastPacket",
- have_captured_packets);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/GoMenu/PreviousPacketInConversation",
- have_captured_packets);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/GoMenu/NextPacketInConversation",
- have_captured_packets);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/StatisticsMenu/Summary",
- have_captured_packets);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/StatisticsMenu/ShowCommentsSummary",
- have_captured_packets);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/StatisticsMenu/ProtocolHierarchy",
- have_captured_packets);
-}
-
-void
-set_menus_for_selected_packet(capture_file *cf)
-{
- GList *conv_filter_list_entry;
- guint i = 0;
- gboolean properties = FALSE;
- const char *abbrev = NULL;
- char *prev_abbrev;
- gboolean is_ip = FALSE, is_tcp = FALSE, is_udp = FALSE, is_sctp = FALSE, is_ssl = FALSE, is_lte_rlc = FALSE, is_http = FALSE;
-
- /* 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. */
- gboolean frame_selected = cf->current_frame != NULL;
- /* A frame is selected */
- gboolean have_marked = frame_selected && cf->marked_count > 0;
- /* We have marked frames. (XXX - why check frame_selected?) */
- gboolean another_is_marked = have_marked &&
- !(cf->marked_count == 1 && cf->current_frame->flags.marked);
- /* 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). */
- gboolean have_time_ref = cf->ref_time_count > 0;
- gboolean another_is_time_ref = frame_selected && have_time_ref &&
- !(cf->ref_time_count == 1 && cf->current_frame->flags.ref_time);
- /* 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?) */
- if (cf->edt)
- {
- proto_get_frame_protocols(cf->edt->pi.layers, &is_ip, &is_tcp, &is_udp, &is_sctp, &is_ssl, NULL, &is_lte_rlc);
- is_http = proto_is_frame_protocol(cf->edt->pi.layers, "http");
- }
- if (cf->edt && cf->edt->tree) {
- GPtrArray *ga;
- header_field_info *hfinfo;
- field_info *v;
- guint ii;
-
- ga = proto_all_finfos(cf->edt->tree);
-
- for (ii = ga->len - 1; ii > 0 ; ii -= 1) {
-
- v = (field_info *)g_ptr_array_index (ga, ii);
- hfinfo = v->hfinfo;
-
- if (!g_str_has_prefix(hfinfo->abbrev, "text") &&
- !g_str_has_prefix(hfinfo->abbrev, "_ws.expert") &&
- !g_str_has_prefix(hfinfo->abbrev, "_ws.malformed")) {
-
- if (hfinfo->parent == -1) {
- abbrev = hfinfo->abbrev;
- } else {
- abbrev = proto_registrar_get_abbrev(hfinfo->parent);
- }
- properties = prefs_is_registered_protocol(abbrev);
- break;
- }
- }
- }
-
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/MarkPacket",
- frame_selected);
- set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/MarkPacket",
- frame_selected);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/MarkAllDisplayedPackets",
- cf->displayed_count > 0);
- /* Unlike un-ignore, do not allow unmark of all frames when no frames are displayed */
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/UnmarkAllDisplayedPackets",
- have_marked);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/FindNextMark",
- another_is_marked);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/FindPreviousMark",
- another_is_marked);
-
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/IgnorePacket",
- frame_selected);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/AddEditPktComment",
- frame_selected && wtap_dump_can_write(cf->linktypes, WTAP_COMMENT_PER_PACKET));
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/AddEditCaptureComment",
- frame_selected && wtap_dump_can_write(cf->linktypes, WTAP_COMMENT_PER_PACKET));
- set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/IgnorePacket",
- frame_selected);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/IgnoreAllDisplayedPackets",
- cf->displayed_count > 0 && cf->displayed_count != cf->count);
- /* Allow un-ignore of all frames even with no frames currently displayed */
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/Un-IgnoreAllPackets",
- cf->ignored_count > 0);
-
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/SetTimeReference",
- frame_selected);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/Un-TimeReferenceAllPackets",
- have_time_ref);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/TimeShift",
- cf->count > 0);
- set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/SetTimeReference",
- frame_selected);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/FindNextTimeReference",
- another_is_time_ref);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/FindPreviousTimeReference",
- another_is_time_ref);
-
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/ResizeAllColumns",
- frame_selected);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/CollapseAll",
- frame_selected);
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/CollapseAll",
- frame_selected);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/ExpandAll",
- frame_selected);
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ExpandAll",
- frame_selected);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/ColorizeConversation",
- frame_selected);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/ResetColoring1-10",
- tmp_color_filters_used());
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/ShowPacketinNewWindow",
- frame_selected);
- set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/ShowPacketinNewWindow",
- frame_selected);
- set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/ManuallyResolveAddress",
- frame_selected ? is_ip : FALSE);
- set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/SCTP",
- frame_selected ? is_sctp : FALSE);
- set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/FollowTCPStream",
- is_tcp);
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/FollowTCPStream",
- is_tcp);
- set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/FollowUDPStream",
- frame_selected ? is_udp : FALSE);
- set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/FollowSSLStream",
- frame_selected ? is_ssl : FALSE);
- set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/FollowHTTPStream",
- frame_selected ? is_http : FALSE);
-
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/FollowSSLStream",
- frame_selected ? is_ssl : FALSE);
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/FollowUDPStream",
- frame_selected ? is_udp : FALSE);
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/FollowHTTPStream",
- frame_selected ? is_http : FALSE);
-
- set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/ColorizeConversation",
- frame_selected);
- set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/DecodeAs",
- frame_selected && decode_as_ok());
-
- if (properties) {
- prev_abbrev = (char *)g_object_get_data(G_OBJECT(ui_manager_packet_list_menu), "menu_abbrev");
- if (!prev_abbrev || (strcmp(prev_abbrev, abbrev) != 0)) {
- /*No previous protocol or protocol changed - update Protocol Preferences menu*/
- module_t *prefs_module_p = prefs_find_module(abbrev);
- rebuild_protocol_prefs_menu(prefs_module_p, properties, ui_manager_packet_list_menu, "/PacketListMenuPopup/ProtocolPreferences");
-
- g_object_set_data(G_OBJECT(ui_manager_packet_list_menu), "menu_abbrev", g_strdup(abbrev));
- g_free (prev_abbrev);
- }
- }
-
- set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/ProtocolPreferences",
- properties);
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/DecodeAs",
- frame_selected && decode_as_ok());
- set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/Copy",
- frame_selected);
- set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/ApplyAsFilter",
- frame_selected);
- set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/PrepareaFilter",
- frame_selected);
- 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));
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/AnalyzeMenu/FollowTCPStream",
- is_tcp);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/AnalyzeMenu/FollowUDPStream",
- frame_selected ? is_udp : FALSE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/AnalyzeMenu/FollowSSLStream",
- frame_selected ? is_ssl : FALSE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/AnalyzeMenu/FollowHTTPStream",
- frame_selected ? is_http : FALSE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/AnalyzeMenu/DecodeAs",
- frame_selected && decode_as_ok());
- 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));
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ToolsMenu/FirewallACLRules",
- frame_selected);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/StatisticsMenu/TCPStreamGraphMenu",
- is_tcp);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/TelephonyMenu/LTEmenu/LTE_RLC_Graph",
- is_lte_rlc);
-
- for (i = 0, conv_filter_list_entry = conv_filter_list;
- conv_filter_list_entry != NULL;
- conv_filter_list_entry = g_list_next(conv_filter_list_entry), i++) {
- conversation_filter_t *filter_entry;
- gchar *path;
-
- filter_entry = (conversation_filter_t *)conv_filter_list_entry->data;
- path = g_strdup_printf("/Menubar/AnalyzeMenu/ConversationFilterMenu/Filters/filter-%u", i);
- set_menu_sensitivity(ui_manager_main_menubar, path,
- menu_dissector_filter_spe_cb(/* frame_data *fd _U_*/ NULL, cf->edt, filter_entry));
- g_free(path);
-
- path = g_strdup_printf("/PacketListMenuPopup/ConversationFilter/Conversations/color_conversation-%d", i);
- set_menu_sensitivity(ui_manager_packet_list_menu, path,
- menu_color_dissector_filter_spe_cb(NULL, cf->edt, filter_entry));
- g_free(path);
-
- path = g_strdup_printf("/PacketListMenuPopup/ColorizeConversation/Colorize/%s", filter_entry->display_name);
- set_menu_sensitivity(ui_manager_packet_list_menu, path,
- menu_color_dissector_filter_spe_cb(NULL, cf->edt, filter_entry));
- g_free(path);
- }
-}
-
-
-static void
-menu_prefs_toggle_bool (GtkWidget *w, gpointer data)
-{
- pref_t *pref = (pref_t*)data;
- module_t *module = (module_t *)g_object_get_data (G_OBJECT(w), "module");
-
- module->prefs_changed_flags |= prefs_get_effect_flags(pref);
- prefs_invert_bool_value(pref, pref_current);
-
- prefs_apply (module);
- if (!prefs.gui_use_pref_save) {
- prefs_main_write();
- }
- redissect_packets();
- redissect_all_packet_windows();
-}
-
-static void
-menu_prefs_change_enum (GtkWidget *w, gpointer data)
-{
- pref_t *pref = (pref_t*)data;
- module_t *module = (module_t *)g_object_get_data (G_OBJECT(w), "module");
- gint new_value = GPOINTER_TO_INT(g_object_get_data (G_OBJECT(w), "enumval"));
-
- if (!gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM(w)))
- return;
-
- if (prefs_set_enum_value(pref, new_value, pref_current)) {
- module->prefs_changed_flags |= prefs_get_effect_flags(pref);
-
- prefs_apply (module);
- if (!prefs.gui_use_pref_save) {
- prefs_main_write();
- }
- redissect_packets();
- redissect_all_packet_windows();
- }
-}
-
-void
-menu_prefs_reset(void)
-{
- g_free (g_object_get_data(G_OBJECT(ui_manager_tree_view_menu), "menu_abbrev"));
- g_object_set_data(G_OBJECT(ui_manager_tree_view_menu), "menu_abbrev", NULL);
-}
-
-static void
-menu_prefs_change_ok (GtkWidget *w, gpointer parent_w)
-{
- GtkWidget *entry = (GtkWidget *)g_object_get_data (G_OBJECT(w), "entry");
- module_t *module = (module_t *)g_object_get_data (G_OBJECT(w), "module");
- pref_t *pref = (pref_t *)g_object_get_data (G_OBJECT(w), "pref");
- const gchar *new_value = gtk_entry_get_text(GTK_ENTRY(entry));
- gchar *p;
- guint uval;
-
- switch (prefs_get_type(pref)) {
- case PREF_UINT:
- uval = (guint)strtoul(new_value, &p, prefs_get_uint_base(pref));
- if (p == new_value || *p != '\0') {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "The value \"%s\" isn't a valid number.",
- new_value);
- return;
- }
- module->prefs_changed_flags |= prefs_set_uint_value(pref, uval, pref_current);
- break;
- case PREF_STRING:
- module->prefs_changed_flags |= prefs_set_string_value(pref, new_value, pref_current);
- break;
- case PREF_RANGE:
- if (!prefs_set_range_value_work(pref, new_value, TRUE, &module->prefs_changed_flags)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "The value \"%s\" isn't a valid range.",
- new_value);
- return;
- }
- break;
- default:
- g_assert_not_reached();
- break;
- }
-
- if (module->prefs_changed_flags) {
- /* Ensure we reload the sub menu */
- menu_prefs_reset();
- prefs_apply (module);
- if (!prefs.gui_use_pref_save) {
- prefs_main_write();
- }
- redissect_packets();
- redissect_all_packet_windows();
- }
-
- window_destroy(GTK_WIDGET(parent_w));
-}
-
-static void
-menu_prefs_change_cancel (GtkWidget *w _U_, gpointer parent_w)
-{
- window_destroy(GTK_WIDGET(parent_w));
-}
-
-static void
-menu_prefs_edit_dlg (GtkWidget *w, gpointer data)
-{
- pref_t *pref = (pref_t *)data;
- module_t *module = (module_t *)g_object_get_data (G_OBJECT(w), "module");
- gchar *value = NULL, *label_str;
-
- GtkWidget *win, *main_grid, *main_vb, *bbox, *cancel_bt, *ok_bt;
- GtkWidget *entry, *label;
-
- value = prefs_pref_to_str(pref, pref_current);
-
- win = dlg_window_new(module->description);
-
- gtk_window_set_resizable(GTK_WINDOW(win),FALSE);
- gtk_window_resize(GTK_WINDOW(win), 400, 100);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 5, FALSE);
- gtk_container_add(GTK_CONTAINER(win), main_vb);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 6);
-
- main_grid = ws_gtk_grid_new();
- gtk_box_pack_start(GTK_BOX(main_vb), main_grid, FALSE, FALSE, 0);
- ws_gtk_grid_set_column_spacing(GTK_GRID(main_grid), 10);
-
- label_str = g_strdup_printf("%s:", prefs_get_title(pref));
- label = gtk_label_new(label_str);
- g_free(label_str);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), label, 0, 1, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(label), 1.0f, 0.5f);
- if (prefs_get_description(pref))
- gtk_widget_set_tooltip_text(label, prefs_get_description(pref));
-
- entry = gtk_entry_new();
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), entry, 1, 1, 1, 1);
- gtk_entry_set_text(GTK_ENTRY(entry), value);
- if (prefs_get_description(pref))
- gtk_widget_set_tooltip_text(entry, prefs_get_description(pref));
-
- bbox = dlg_button_row_new(GTK_STOCK_CANCEL,GTK_STOCK_OK, NULL);
- gtk_box_pack_end(GTK_BOX(main_vb), bbox, FALSE, FALSE, 0);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- g_object_set_data (G_OBJECT(ok_bt), "module", module);
- g_object_set_data (G_OBJECT(ok_bt), "entry", entry);
- g_object_set_data (G_OBJECT(ok_bt), "pref", pref);
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(menu_prefs_change_ok), win);
-
- dlg_set_activate(entry, ok_bt);
-
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- g_signal_connect(cancel_bt, "clicked", G_CALLBACK(menu_prefs_change_cancel), win);
- window_set_cancel_button(win, cancel_bt, NULL);
-
- gtk_widget_grab_default(ok_bt);
- gtk_widget_show_all(win);
- g_free(value);
-}
-
-static guint
-add_protocol_prefs_generic_menu(pref_t *pref, gpointer data, GtkUIManager *ui_menu, const char *path)
-{
- GtkWidget *menu_preferences;
- GtkWidget *menu_item, *menu_sub_item, *sub_menu;
- GSList *group = NULL;
- module_t *module = (module_t *)data;
- const enum_val_t *enum_valp;
- gchar *label = NULL, *tmp_str;
-
- switch (prefs_get_type(pref)) {
- case PREF_UINT:
- switch (prefs_get_uint_base(pref)) {
- case 8:
- label = g_strdup_printf ("%s: %o", prefs_get_title(pref), prefs_get_uint_value_real(pref, pref_current));
- break;
- case 10:
- label = g_strdup_printf ("%s: %u", prefs_get_title(pref), prefs_get_uint_value_real(pref, pref_current));
- break;
- case 16:
- label = g_strdup_printf ("%s: %x", prefs_get_title(pref), prefs_get_uint_value_real(pref, pref_current));
- break;
- default:
- g_assert_not_reached();
- break;
- }
- menu_item = gtk_menu_item_new_with_label(label);
- g_object_set_data (G_OBJECT(menu_item), "module", module);
- g_signal_connect(menu_item, "activate", G_CALLBACK(menu_prefs_edit_dlg), pref);
- g_free (label);
- break;
- case PREF_BOOL:
- menu_item = gtk_check_menu_item_new_with_label(prefs_get_title(pref));
- gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(menu_item), prefs_get_bool_value(pref, pref_current));
- g_object_set_data (G_OBJECT(menu_item), "module", module);
- g_signal_connect(menu_item, "activate", G_CALLBACK(menu_prefs_toggle_bool), pref);
- break;
- case PREF_ENUM:
- menu_item = gtk_menu_item_new_with_label(prefs_get_title(pref));
- sub_menu = gtk_menu_new();
- gtk_menu_item_set_submenu (GTK_MENU_ITEM(menu_item), sub_menu);
- enum_valp = prefs_get_enumvals(pref);
- while (enum_valp->name != NULL) {
- menu_sub_item = gtk_radio_menu_item_new_with_label(group, enum_valp->description);
- group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menu_sub_item));
- if (enum_valp->value == prefs_get_enum_value(pref, pref_current)) {
- gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(menu_sub_item), TRUE);
- }
- g_object_set_data (G_OBJECT(menu_sub_item), "module", module);
- g_object_set_data (G_OBJECT(menu_sub_item), "enumval", GINT_TO_POINTER(enum_valp->value));
- g_signal_connect(menu_sub_item, "activate", G_CALLBACK(menu_prefs_change_enum), pref);
- gtk_menu_shell_append (GTK_MENU_SHELL(sub_menu), menu_sub_item);
- gtk_widget_show (menu_sub_item);
- enum_valp++;
- }
- break;
- case PREF_STRING:
- label = g_strdup_printf ("%s: %s", prefs_get_title(pref), prefs_get_string_value(pref, pref_current));
- menu_item = gtk_menu_item_new_with_label(label);
- g_object_set_data (G_OBJECT(menu_item), "module", module);
- g_signal_connect(menu_item, "activate", G_CALLBACK(menu_prefs_edit_dlg), pref);
- g_free (label);
- break;
- case PREF_RANGE:
- tmp_str = range_convert_range (NULL, prefs_get_range_value_real(pref, pref_current));
- label = g_strdup_printf ("%s: %s", prefs_get_title(pref), tmp_str);
- wmem_free(NULL, tmp_str);
- menu_item = gtk_menu_item_new_with_label(label);
- g_object_set_data (G_OBJECT(menu_item), "module", module);
- g_signal_connect(menu_item, "activate", G_CALLBACK(menu_prefs_edit_dlg), pref);
- g_free (label);
- break;
- case PREF_UAT:
- label = g_strdup_printf ("%s...", prefs_get_title(pref));
- menu_item = gtk_menu_item_new_with_label(label);
- g_signal_connect (menu_item, "activate", G_CALLBACK(uat_window_cb), prefs_get_uat_value(pref));
- g_free (label);
- break;
-
- case PREF_COLOR:
- case PREF_CUSTOM:
- /* currently not supported */
-
- case PREF_STATIC_TEXT:
- case PREF_OBSOLETE:
- default:
- /* Nothing to add */
- return 0;
- }
-
- menu_preferences = gtk_ui_manager_get_widget(ui_menu, path);
- if(!menu_preferences)
- g_warning("menu_preferences Not found path");
- sub_menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM(menu_preferences));
- gtk_menu_shell_append (GTK_MENU_SHELL(sub_menu), menu_item);
- gtk_widget_show (menu_item);
-
- return 0;
-}
-
-static guint
-add_protocol_prefs_menu(pref_t *pref, gpointer data)
-{
- return add_protocol_prefs_generic_menu(pref, data, ui_manager_tree_view_menu, "/TreeViewPopup/ProtocolPreferences");
-}
-
-static guint
-add_protocol_prefs_packet_list_menu(pref_t *pref, gpointer data)
-{
- return add_protocol_prefs_generic_menu(pref, data, ui_manager_packet_list_menu, "/PacketListMenuPopup/ProtocolPreferences");
-}
-
-
-static void
-rebuild_protocol_prefs_menu(module_t *prefs_module_p, gboolean preferences,
- GtkUIManager *ui_menu, const char *path)
-{
- GtkWidget *menu_preferences, *menu_item;
- GtkWidget *sub_menu;
- gchar *label;
-
- menu_preferences = gtk_ui_manager_get_widget(ui_menu, path);
- if (prefs_module_p && preferences) {
- sub_menu = gtk_menu_new();
- gtk_menu_item_set_submenu (GTK_MENU_ITEM(menu_preferences), sub_menu);
-
- label = g_strdup_printf ("%s Preferences...", prefs_module_p->description);
- menu_item = gtk_image_menu_item_new_with_label(label);
- gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM(menu_item),
- ws_gtk_image_new_from_stock(GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_MENU));
- gtk_menu_shell_append(GTK_MENU_SHELL(sub_menu), menu_item);
- g_signal_connect_swapped(G_OBJECT(menu_item), "activate",
- G_CALLBACK(properties_cb), (GObject *) menu_item);
- gtk_widget_show(menu_item);
- g_free(label);
-
- menu_item = gtk_menu_item_new();
- gtk_menu_shell_append(GTK_MENU_SHELL(sub_menu), menu_item);
- gtk_widget_show(menu_item);
-
- if (ui_menu == ui_manager_tree_view_menu) {
- prefs_pref_foreach(prefs_module_p, add_protocol_prefs_menu, prefs_module_p);
- } else {
- prefs_pref_foreach(prefs_module_p, add_protocol_prefs_packet_list_menu, prefs_module_p);
- }
- } else {
- /* No preferences, remove sub menu */
- gtk_menu_item_set_submenu (GTK_MENU_ITEM(menu_preferences), NULL);
- }
-
-}
-
-static void
-menu_visible_column_toggle (GtkWidget *w _U_, gpointer data)
-{
- packet_list_toggle_visible_column (GPOINTER_TO_INT(data));
-}
-
-void
-rebuild_visible_columns_menu (void)
-{
- GtkWidget *menu_columns[2], *menu_item;
- GtkWidget *sub_menu;
- GList *clp;
- fmt_data *cfmt;
- gchar *title;
- gint i, col_id;
-
- menu_columns[0] = gtk_ui_manager_get_widget(ui_manager_main_menubar, "/Menubar/ViewMenu/DisplayedColumns");
- if(! menu_columns[0]){
- fprintf (stderr, "Warning: couldn't find menu_columns[0] path=/Menubar/ViewMenu/DisplayedColumns");
- }
- menu_columns[1] = gtk_ui_manager_get_widget(ui_manager_packet_list_heading, "/PacketListHeadingPopup/DisplayedColumns");
- /* Debug */
- if(! menu_columns[1]){
- fprintf (stderr, "Warning: couldn't find menu_columns[1] path=/PacketListHeadingPopup/DisplayedColumns");
- }
-
- for (i = 0; i < 2; i++) {
- sub_menu = gtk_menu_new();
- gtk_menu_item_set_submenu (GTK_MENU_ITEM(menu_columns[i]), sub_menu);
-
- clp = g_list_first (prefs.col_list);
- col_id = 0;
- while (clp) {
- cfmt = (fmt_data *) clp->data;
- if (cfmt->title[0]) {
- if (cfmt->fmt == COL_CUSTOM) {
- title = g_strdup_printf ("%s (%s)", cfmt->title, cfmt->custom_fields);
- } else {
- title = g_strdup_printf ("%s (%s)", cfmt->title, col_format_desc (cfmt->fmt));
- }
- } else {
- if (cfmt->fmt == COL_CUSTOM) {
- title = g_strdup_printf ("(%s)", cfmt->custom_fields);
- } else {
- title = g_strdup_printf ("(%s)", col_format_desc (cfmt->fmt));
- }
- }
- menu_item = gtk_check_menu_item_new_with_label(title);
- g_free (title);
- gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(menu_item), cfmt->visible);
- g_signal_connect(menu_item, "activate", G_CALLBACK(menu_visible_column_toggle), GINT_TO_POINTER(col_id));
- gtk_menu_shell_append (GTK_MENU_SHELL(sub_menu), menu_item);
- gtk_widget_show (menu_item);
- clp = g_list_next (clp);
- col_id++;
- }
-
- menu_item = gtk_separator_menu_item_new();
- gtk_menu_shell_append (GTK_MENU_SHELL(sub_menu), menu_item);
- gtk_widget_show (menu_item);
-
- menu_item = gtk_menu_item_new_with_label ("Display All");
- gtk_menu_shell_append (GTK_MENU_SHELL(sub_menu), menu_item);
- g_signal_connect(menu_item, "activate", G_CALLBACK(packet_list_heading_activate_all_columns_cb), NULL);
- gtk_widget_show (menu_item);
- }
-}
-
-void
-menus_set_column_resolved (gboolean resolved, gboolean can_resolve)
-{
- GtkWidget *menu;
-
- menu = gtk_ui_manager_get_widget(ui_manager_packet_list_heading, "/PacketListHeadingPopup/ShowResolved");
- if(!menu){
- fprintf (stderr, "Warning: couldn't find menu path=/PacketListHeadingPopup/ShowResolved");
- }
- g_object_set_data(G_OBJECT(menu), "skip-update", (void *)1);
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), resolved && can_resolve);
- set_menu_sensitivity(ui_manager_packet_list_heading, "/PacketListHeadingPopup/ShowResolved", can_resolve);
- g_object_set_data(G_OBJECT(menu), "skip-update", NULL);
-}
-
-void
-menus_set_column_align_default (gboolean right_justify)
-{
- GtkWidget *submenu, *menu_item_child;
- GList *child_list, *child_list_item;
- const gchar *menu_item_name;
- size_t menu_item_len;
-
- /* get the submenu container item */
- submenu = gtk_ui_manager_get_widget (ui_manager_packet_list_heading, "/PacketListHeadingPopup");
- if(!submenu){
- fprintf (stderr, "Warning: couldn't find submenu path=/PacketListHeadingPopup");
- }
-
- /* find the corresponding menu items to update */
- child_list = gtk_container_get_children(GTK_CONTAINER(submenu));
- child_list_item = child_list;
- while (child_list_item) {
- menu_item_child = gtk_bin_get_child(GTK_BIN(child_list_item->data));
- if (menu_item_child != NULL) {
- menu_item_name = gtk_label_get_text(GTK_LABEL(menu_item_child));
- menu_item_len = strlen(menu_item_name);
- if(strncmp(menu_item_name, "Align Left", 10) == 0) {
- if (!right_justify && menu_item_len == 10) {
- gtk_label_set_text(GTK_LABEL(menu_item_child), "Align Left\t(default)");
- } else if (right_justify && menu_item_len > 10) {
- gtk_label_set_text(GTK_LABEL(menu_item_child), "Align Left");
- }
- } else if (strncmp (menu_item_name, "Align Right", 11) == 0) {
- if (right_justify && menu_item_len == 11) {
- gtk_label_set_text(GTK_LABEL(menu_item_child), "Align Right\t(default)");
- } else if (!right_justify && menu_item_len > 11) {
- gtk_label_set_text(GTK_LABEL(menu_item_child), "Align Right");
- }
- }
- }
- child_list_item = g_list_next(child_list_item);
- }
- g_list_free(child_list);
-}
-
-void
-set_menus_for_selected_tree_row(capture_file *cf)
-{
- gboolean properties;
- gint id;
-
- if (cf->finfo_selected != NULL) {
- header_field_info *hfinfo = cf->finfo_selected->hfinfo;
- const char *abbrev;
- char *prev_abbrev;
-
- if (hfinfo->parent == -1) {
- abbrev = hfinfo->abbrev;
- id = (hfinfo->type == FT_PROTOCOL) ? proto_get_id((const protocol_t *)hfinfo->strings) : -1;
- } else {
- abbrev = proto_registrar_get_abbrev(hfinfo->parent);
- id = hfinfo->parent;
- }
- properties = prefs_is_registered_protocol(abbrev);
- set_menu_sensitivity(ui_manager_tree_view_menu,
- "/TreeViewPopup/GotoCorrespondingPacket", hfinfo->type == FT_FRAMENUM);
- set_menu_sensitivity(ui_manager_tree_view_menu,
- "/TreeViewPopup/ShowPacketRefinNewWindow", hfinfo->type == FT_FRAMENUM);
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/Copy",
- TRUE);
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/Copy/AsFilter",
- proto_can_match_selected(cf->finfo_selected, cf->edt));
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ApplyasColumn",
- hfinfo->type != FT_NONE);
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ApplyAsFilter",
- proto_can_match_selected(cf->finfo_selected, cf->edt));
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/PrepareaFilter",
- proto_can_match_selected(cf->finfo_selected, cf->edt));
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ColorizewithFilter",
- proto_can_match_selected(cf->finfo_selected, cf->edt));
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ProtocolPreferences",
- properties);
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/DisableProtocol",
- (id == -1) ? FALSE : proto_can_toggle_protocol(id));
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ExpandSubtrees",
- cf->finfo_selected->tree_type != -1);
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/CollapseSubtrees",
- cf->finfo_selected->tree_type != -1);
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/WikiProtocolPage",
- (id == -1) ? FALSE : TRUE);
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/FilterFieldReference",
- (id == -1) ? FALSE : TRUE);
- set_menu_sensitivity(ui_manager_main_menubar,
- "/Menubar/FileMenu/ExportSelectedPacketBytes", TRUE);
- set_menu_sensitivity(ui_manager_main_menubar,
- "/Menubar/GoMenu/GotoCorrespondingPacket", hfinfo->type == FT_FRAMENUM);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/Copy/Description",
- proto_can_match_selected(cf->finfo_selected, cf->edt));
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/Copy/Fieldname",
- proto_can_match_selected(cf->finfo_selected, cf->edt));
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/Copy/Value",
- proto_can_match_selected(cf->finfo_selected, cf->edt));
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/Copy/AsFilter",
- proto_can_match_selected(cf->finfo_selected, cf->edt));
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/AnalyzeMenu/ApplyasColumn",
- hfinfo->type != FT_NONE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/AnalyzeMenu/ApplyAsFilter",
- proto_can_match_selected(cf->finfo_selected, cf->edt));
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/AnalyzeMenu/PrepareaFilter",
- proto_can_match_selected(cf->finfo_selected, cf->edt));
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/ExpandSubtrees",
- cf->finfo_selected->tree_type != -1);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/CollapseSubtrees",
- cf->finfo_selected->tree_type != -1);
- prev_abbrev = (char *)g_object_get_data(G_OBJECT(ui_manager_tree_view_menu), "menu_abbrev");
- if (!prev_abbrev || (strcmp (prev_abbrev, abbrev) != 0)) {
- /* No previous protocol or protocol changed - update Protocol Preferences menu */
- module_t *prefs_module_p = prefs_find_module(abbrev);
- rebuild_protocol_prefs_menu(prefs_module_p, properties, ui_manager_tree_view_menu, "/TreeViewPopup/ProtocolPreferences");
-
- g_object_set_data(G_OBJECT(ui_manager_tree_view_menu), "menu_abbrev", g_strdup(abbrev));
- g_free (prev_abbrev);
- }
- } else {
- set_menu_sensitivity(ui_manager_tree_view_menu,
- "/TreeViewPopup/GotoCorrespondingPacket", FALSE);
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/Copy", FALSE);
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ApplyasColumn", FALSE);
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ApplyAsFilter", FALSE);
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/PrepareaFilter", FALSE);
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ColorizewithFilter", FALSE);
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ProtocolPreferences",
- FALSE);
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/DisableProtocol", FALSE);
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ExpandSubtrees", FALSE);
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/CollapseSubtrees", FALSE);
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/WikiProtocolPage",
- FALSE);
- set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/FilterFieldReference",
- FALSE);
- set_menu_sensitivity(ui_manager_main_menubar,
- "/Menubar/FileMenu/ExportSelectedPacketBytes", FALSE);
- set_menu_sensitivity(ui_manager_main_menubar,
- "/Menubar/GoMenu/GotoCorrespondingPacket", FALSE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/Copy/Description", FALSE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/Copy/Fieldname", FALSE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/Copy/Value", FALSE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/Copy/AsFilter", FALSE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/AnalyzeMenu/ApplyasColumn", FALSE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/AnalyzeMenu/ApplyAsFilter", FALSE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/AnalyzeMenu/PrepareaFilter", FALSE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/ExpandSubtrees", FALSE);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/CollapseSubtrees", FALSE);
- }
-}
-
-void set_menus_for_packet_history(gboolean back_history, gboolean forward_history)
-{
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/GoMenu/Back", back_history);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/GoMenu/Forward", forward_history);
-}
-
-
-void set_menus_for_file_set(gboolean file_set, gboolean previous_file, gboolean next_file)
-{
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/Set/ListFiles", file_set);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/Set/PreviousFile", previous_file);
- set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/Set/NextFile", next_file);
-}
-
-GtkWidget *menus_get_profiles_rename_menu (void)
-{
- return gtk_ui_manager_get_widget(ui_manager_statusbar_profiles_menu, "/ProfilesMenuPopup/Rename");
-}
-
-GtkWidget *menus_get_profiles_delete_menu (void)
-{
- return gtk_ui_manager_get_widget(ui_manager_statusbar_profiles_menu, "/ProfilesMenuPopup/Delete");
-}
-
-GtkWidget *menus_get_profiles_change_menu (void)
-{
- return gtk_ui_manager_get_widget(ui_manager_statusbar_profiles_menu, "/ProfilesMenuPopup/Change");
-}
-
-void set_menus_for_profiles(gboolean default_profile)
-{
- set_menu_sensitivity(ui_manager_statusbar_profiles_menu, "/ProfilesMenuPopup/Rename", !default_profile);
- set_menu_sensitivity(ui_manager_statusbar_profiles_menu, "/ProfilesMenuPopup/Delete", !default_profile);
-}
-
-static void
-ws_menubar_external_cb(GtkAction *action _U_, gpointer data _U_)
-{
- ext_menubar_t *entry = NULL;
- gchar *url = NULL;
-
- if ( data != NULL )
- {
- entry = (ext_menubar_t *)data;
- if ( entry->type == EXT_MENUBAR_ITEM )
- {
- entry->callback(EXT_MENUBAR_GTK_GUI, (gpointer) ((void *)GTK_WINDOW(top_level)), entry->user_data);
- }
- else if ( entry->type == EXT_MENUBAR_URL )
- {
- url = (gchar *)entry->user_data;
-
- if(url != NULL)
- browser_open_url(url);
- }
- }
-}
-
-static void
-ws_menubar_create_ui(ext_menu_t * menu, const char * xpath_parent, GtkActionGroup * action_group, gint depth)
-{
- ext_menubar_t * item = NULL;
- GList * children = NULL;
- gchar * xpath, * submenu_xpath;
- GtkAction * menu_action;
- gchar *action_name;
- gchar ** paths = NULL;
-
- /* There must exists an xpath parent */
- g_assert(xpath_parent != NULL && strlen(xpath_parent) > 0);
-
- /* If the depth counter exceeds, something must have gone wrong */
- g_assert(depth < EXT_MENUBAR_MAX_DEPTH);
-
- /* Create a correct xpath, and just keep the necessary action ref [which will be paths [1]] */
- xpath = g_strconcat(xpath_parent, menu->name, NULL);
-
- /* Create the action for the menu item and add it to the action group */
- action_name = g_strconcat("/", menu->name, NULL);
- menu_action = (GtkAction *)g_object_new ( GTK_TYPE_ACTION,
- "name", action_name, "label", menu->label, NULL );
- g_free(action_name);
-
- gtk_action_group_add_action(action_group, menu_action);
- g_object_unref(menu_action);
-
- children = menu->children;
-
- /* Iterate children to create submenus */
- while ( children != NULL && children->data != NULL )
- {
- item = (ext_menubar_t *) children->data;
-
- if ( item->type == EXT_MENUBAR_MENU )
- {
- /* Handle Submenu entry */
- submenu_xpath = g_strconcat(xpath, "/", NULL);
- ws_menubar_create_ui(item, submenu_xpath, action_group, depth++);
- g_free(submenu_xpath);
- }
- else if ( item->type != EXT_MENUBAR_SEPARATOR )
- {
- action_name = g_strconcat("/", item->name, NULL);
- menu_action = (GtkAction*) g_object_new( GTK_TYPE_ACTION,
- "name", action_name,
- "label", item->label,
- "tooltip", item->tooltip,
- NULL);
- g_signal_connect(menu_action, "activate", G_CALLBACK(ws_menubar_external_cb), item );
- gtk_action_group_add_action(action_group, menu_action);
- g_object_unref(menu_action);
- g_free(action_name);
-
- /* Create the correct action path */
- paths = g_strsplit(xpath, "|", -1);
-
- /* Ensures that the above operation has not failed. If this fails, it is a major issue,
- * so an assertion is appropriate here */
- g_assert(paths != NULL && paths[1] != NULL && strlen(paths[1]) > 0);
-
- /* Handle a menu bar item. This cannot be done by register_menu_bar_menu_items, as it
- * will create it's own action group, assuming that the menu actions and submenu actions
- * have been pre-registered and globally defined names. This is not the case here. Also
- * register_menu_bar_menu_items adds a sorted list, completely destroying any sorting,
- * a plugin might have intended */
-#if 0
- /* Left here as a reminder, that the code below does basically the same */
- register_menu_bar_menu_items( g_strdup(paths[1]), item->name, NULL, item->label,
- NULL, item->tooltip, ws_menubar_external_cb, item, TRUE, NULL, NULL);
-#endif
-
- /* Creating menu from entry */
- add_menu_item_to_main_menubar(g_strdup(paths[1]), item->name, NULL);
- g_strfreev(paths);
- }
-
- /* Iterate Loop */
- children = g_list_next(children);
- }
-
- /* Cleanup */
- g_free(xpath);
-}
-
-static void
-ws_menubar_external_menus(void)
-{
- GList * user_menu = NULL;
- ext_menu_t * menu = NULL;
- GtkActionGroup *action_group = NULL;
- gchar groupdef[20], * xpath;
- guint8 cnt = 1;
-
- user_menu = ext_menubar_get_entries();
-
- while ( ( user_menu != NULL ) && ( user_menu->data != NULL ) )
- {
- menu = (ext_menu_t *) user_menu->data;
-
- /* 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 = g_list_next(user_menu);
- continue;
- }
-
- /* Create unique main actiongroup name */
- g_snprintf(groupdef, 20, "UserDefined%02d", cnt);
- xpath = g_strconcat( "/MenuBar/", groupdef, "Menu|", NULL );
-
- /* Create an action group per menu */
- action_group = gtk_action_group_new(groupdef);
-
- /* Register action structure for each menu */
- gtk_ui_manager_insert_action_group(ui_manager_main_menubar, action_group, 0);
-
- /* Now we iterate over the items and add them to the UI. This has to be done after the action
- * group for this menu has been added, otherwise the actions will not be found */
- ws_menubar_create_ui(menu, xpath, action_group, 0 );
-
- /* Cleanup */
- g_free(xpath);
- g_object_unref(action_group);
-
- /* Iterate Loop */
- user_menu = g_list_next (user_menu);
- cnt++;
- }
-}
-
-void plugin_if_menubar_preference(GHashTable *dataSet)
-{
- if ( dataSet != NULL )
- {
- const char * module_name;
- const char * pref_name;
- const char * pref_value;
- if ( g_hash_table_lookup_extended(dataSet, "pref_module", NULL, (void**)&module_name ) &&
- g_hash_table_lookup_extended(dataSet, "pref_key", NULL, (void**)&pref_name ) &&
- g_hash_table_lookup_extended(dataSet, "pref_value", NULL, (void**)&pref_value ) )
- {
- unsigned int changed_flags = prefs_store_ext(module_name, pref_name, pref_value);
- if ( changed_flags )
- {
- redissect_packets();
- redissect_all_packet_windows();
- }
- }
- }
-}
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/main_menubar_private.h b/ui/gtk/main_menubar_private.h
deleted file mode 100644
index 123d57a1b4..0000000000
--- a/ui/gtk/main_menubar_private.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* main_menubar_private.h
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __MAIN_MENUBAR_PRIVATE_H__
-#define __MAIN_MENUBAR_PRIVATE_H__
-
-/*** PRIVATE INTERFACE BETWEEN main.c AND main_menubar.c DON'T USE OR TOUCH :-)*/
-
-/** The recent file read has finished, update the menu corresponding. */
-extern void menu_recent_read_finished(void);
-
-/* 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 set_menus_for_capture_file(capture_file *);
-
-/** The packet history has changed, we need to update the menu.
- *
- * @param back_history some back history entries available
- * @param forward_history some forward history entries available
- */
-extern void set_menus_for_packet_history(gboolean back_history, gboolean forward_history);
-
-/* Enable or disable menu items based on whether there's a capture in
- progress. */
-void set_menus_for_capture_in_progress(gboolean);
-
-/* Disable menu items while we're waiting for the capture child to
- finish. We disallow quitting until it finishes, and also disallow
- stopping or restarting the capture. */
-void set_menus_for_capture_stopping(void);
-
-/* Enable or disable menu items based on whether you have some captured
- packets. */
-void set_menus_for_captured_packets(gboolean);
-
-#ifdef HAVE_LIBPCAP
-/** The "Auto Scroll Packet List in Live Capture" option changed. */
-extern void menu_auto_scroll_live_changed(gboolean auto_scroll_in);
-#endif
-
-/** The "Colorize Packet List" option changed. */
-extern void menu_colorize_changed(gboolean packet_list_colorize);
-
-#endif /* __MAIN_MENUBAR_PRIVATE_H__ */
diff --git a/ui/gtk/main_statusbar.c b/ui/gtk/main_statusbar.c
deleted file mode 100644
index f0925160f9..0000000000
--- a/ui/gtk/main_statusbar.c
+++ /dev/null
@@ -1,1138 +0,0 @@
-/* main_statusbar.c
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-
-#include "config.h"
-
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#include <gtk/gtk.h>
-
-#include <epan/epan.h>
-#include <wsutil/filesystem.h>
-#include <epan/epan_dissect.h>
-#include <epan/expert.h>
-#include <epan/prefs.h>
-
-#include "../../cfile.h"
-#include "../../file.h"
-#ifdef HAVE_LIBPCAP
-#include "../../capture_opts.h"
-#include <capchild/capture_session.h>
-#include "ui/capture.h"
-#endif
-
-#include <wsutil/str_util.h>
-
-#include "ui/main_statusbar.h"
-#include "ui/recent.h"
-#include <wsutil/utf8_entities.h>
-#ifdef HAVE_LIBPCAP
-#include "ui/capture_ui_utils.h"
-#endif
-
-#include "ui/gtk/main.h"
-#include "ui/gtk/main_statusbar_private.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/expert_comp_dlg.h"
-#include "ui/gtk/stock_icons.h"
-#ifndef HAVE_GDK_GRESOURCE
-#include "ui/gtk/pixbuf-csource.h"
-#endif
-#include "ui/gtk/profile_dlg.h"
-#include "ui/gtk/keys.h"
-#include "ui/gtk/menus.h"
-#include "ui/gtk/edit_packet_comment_dlg.h"
-
-#include "globals.h"
-
-/*
- * The order below defines the priority of info bar contexts.
- */
-typedef enum {
- STATUS_LEVEL_MAIN,
- STATUS_LEVEL_FILE,
- STATUS_LEVEL_FILTER,
- STATUS_LEVEL_HELP,
- NUM_STATUS_LEVELS
-} status_level_e;
-
-
-#ifdef HAVE_LIBPCAP
-#define DEF_READY_MESSAGE " Ready to load or capture"
-#else
-#define DEF_READY_MESSAGE " Ready to load file"
-#endif
-
-
-static GtkWidget *status_pane_left, *status_pane_right;
-static GtkWidget *info_bar, *info_bar_event, *packets_bar, *profile_bar, *profile_bar_event;
-static GtkWidget *expert_info_error, *expert_info_warn, *expert_info_note;
-static GtkWidget *expert_info_chat, *expert_info_comment, *expert_info_none;
-static GtkWidget *expert_info_placeholder;
-
-static GtkWidget *capture_comment_none, *capture_comment, *capture_comment_placeholder;
-
-static guint main_ctx, file_ctx, help_ctx, filter_ctx, packets_ctx, profile_ctx;
-static guint status_levels[NUM_STATUS_LEVELS];
-static GString *packets_str = NULL;
-static gchar *profile_str = NULL;
-
-
-static void info_bar_new(void);
-static void packets_bar_new(void);
-static void profile_bar_new(void);
-static void status_expert_new(void);
-static void status_capture_comment_new(void);
-
-/* Temporary message timeouts */
-#define TEMPORARY_MSG_TIMEOUT (7 * 1000)
-#define TEMPORARY_FLASH_TIMEOUT (1 * 1000)
-#define TEMPORARY_FLASH_INTERVAL (TEMPORARY_FLASH_TIMEOUT / 4)
-static gint flash_time;
-static gboolean flash_highlight = FALSE;
-
-static void
-statusbar_push_file_msg(const gchar *msg_format, ...)
- G_GNUC_PRINTF(1, 2);
-
-/*
- * Return TRUE if there are any higher priority status level messages pushed.
- * Return FALSE otherwise.
- */
-static gboolean
-higher_priority_status_level(int level)
-{
- int i;
-
- for (i = level + 1; i < NUM_STATUS_LEVELS; i++) {
- if (status_levels[i])
- return TRUE;
- }
- return FALSE;
-}
-
-/*
- * Push a formatted message referring to file access onto the statusbar.
- */
-static void
-statusbar_push_file_msg(const gchar *msg_format, ...)
-{
- va_list ap;
- gchar *msg;
-
- /*g_warning("statusbar_push: %s", msg);*/
- if (higher_priority_status_level(STATUS_LEVEL_FILE))
- return;
- status_levels[STATUS_LEVEL_FILE]++;
-
- va_start(ap, msg_format);
- msg = g_strdup_vprintf(msg_format, ap);
- va_end(ap);
-
- gtk_statusbar_push(GTK_STATUSBAR(info_bar), file_ctx, msg);
- g_free(msg);
-}
-
-/*
- * Pop a message referring to file access off the statusbar.
- */
-static void
-statusbar_pop_file_msg(void)
-{
- /*g_warning("statusbar_pop");*/
- if (status_levels[STATUS_LEVEL_FILE] > 0) {
- status_levels[STATUS_LEVEL_FILE]--;
- }
- gtk_statusbar_pop(GTK_STATUSBAR(info_bar), file_ctx);
-}
-
-/*
- * Push a formatted message referring to the currently-selected field onto
- * the statusbar.
- */
-void
-statusbar_push_field_msg(const gchar *msg_format, ...)
-{
- va_list ap;
- gchar *msg;
-
- if (higher_priority_status_level(STATUS_LEVEL_HELP))
- return;
- status_levels[STATUS_LEVEL_HELP]++;
-
- va_start(ap, msg_format);
- msg = g_strdup_vprintf(msg_format, ap);
- va_end(ap);
-
- gtk_statusbar_push(GTK_STATUSBAR(info_bar), help_ctx, msg);
- g_free(msg);
-}
-
-/*
- * Pop a message referring to the currently-selected field off the statusbar.
- */
-void
-statusbar_pop_field_msg(void)
-{
- if (status_levels[STATUS_LEVEL_HELP] > 0) {
- status_levels[STATUS_LEVEL_HELP]--;
- }
- gtk_statusbar_pop(GTK_STATUSBAR(info_bar), help_ctx);
-}
-
-/*
- * Push a formatted message referring to the current filter onto the statusbar.
- */
-void
-statusbar_push_filter_msg(const gchar *msg_format, ...)
-{
- va_list ap;
- gchar *msg;
-
- if (higher_priority_status_level(STATUS_LEVEL_FILTER))
- return;
- status_levels[STATUS_LEVEL_FILTER]++;
-
- va_start(ap, msg_format);
- msg = g_strdup_vprintf(msg_format, ap);
- va_end(ap);
-
- gtk_statusbar_push(GTK_STATUSBAR(info_bar), filter_ctx, msg);
- g_free(msg);
-}
-
-/*
- * Pop a message referring to the current filter off the statusbar.
- */
-void
-statusbar_pop_filter_msg(void)
-{
- if (status_levels[STATUS_LEVEL_FILTER] > 0) {
- status_levels[STATUS_LEVEL_FILTER]--;
- }
- gtk_statusbar_pop(GTK_STATUSBAR(info_bar), filter_ctx);
-}
-
-/*
- * Timeout callbacks for statusbar_push_temporary_msg
- */
-static gboolean
-statusbar_remove_temporary_msg(gpointer data)
-{
- guint msg_id = GPOINTER_TO_UINT(data);
-
- gtk_statusbar_remove(GTK_STATUSBAR(info_bar), main_ctx, msg_id);
-
- return FALSE;
-}
-
-static gboolean
-statusbar_flash_temporary_msg(gpointer data _U_)
-{
- gboolean retval = TRUE;
-
- if (flash_time > 0) {
- flash_highlight = !flash_highlight;
- } else {
- flash_highlight = FALSE;
- retval = FALSE;
- }
-
- /*
- * As of 2.18.3 gtk_drag_highlight just draws a border around the widget
- * so we can abuse it here.
- */
- if (flash_highlight) {
- gtk_drag_highlight(info_bar);
- } else {
- gtk_drag_unhighlight(info_bar);
- }
-
- flash_time -= TEMPORARY_FLASH_INTERVAL;
-
- return retval;
-}
-
-/*
- * Push a formatted temporary message onto the statusbar.
- */
-void
-statusbar_push_temporary_msg(const gchar *msg_format, ...)
-{
- va_list ap;
- gchar *msg;
- guint msg_id;
-
- va_start(ap, msg_format);
- msg = g_strdup_vprintf(msg_format, ap);
- va_end(ap);
-
- msg_id = gtk_statusbar_push(GTK_STATUSBAR(info_bar), main_ctx, msg);
- g_free(msg);
-
- flash_time = TEMPORARY_FLASH_TIMEOUT - 1;
- g_timeout_add(TEMPORARY_FLASH_INTERVAL, statusbar_flash_temporary_msg, NULL);
-
- g_timeout_add(TEMPORARY_MSG_TIMEOUT, statusbar_remove_temporary_msg, GUINT_TO_POINTER(msg_id));
-}
-
-
-GtkWidget *
-statusbar_new(void)
-{
- GtkWidget *status_hbox;
-
- /* Status hbox */
- status_hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(status_hbox), 0);
-
- /* expert info indicator */
- status_expert_new();
-
- /* Capture comments indicator */
- status_capture_comment_new();
-
- /* info (main) statusbar */
- info_bar_new();
-
- /* packets statusbar */
- packets_bar_new();
-
- /* profile statusbar */
- profile_bar_new();
-
- /* Pane for the statusbar */
- status_pane_left = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_widget_show(status_pane_left);
- status_pane_right = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_widget_show(status_pane_right);
-
- return status_hbox;
-}
-
-void
-statusbar_load_window_geometry(void)
-{
- if (recent.has_gui_geometry_status_pane && recent.gui_geometry_status_pane_left)
- gtk_paned_set_position(GTK_PANED(status_pane_left), recent.gui_geometry_status_pane_left);
- if (recent.has_gui_geometry_status_pane && recent.gui_geometry_status_pane_right)
- gtk_paned_set_position(GTK_PANED(status_pane_right), recent.gui_geometry_status_pane_right);
-}
-
-void
-statusbar_save_window_geometry(void)
-{
- recent.gui_geometry_status_pane_left = gtk_paned_get_position(GTK_PANED(status_pane_left));
- recent.gui_geometry_status_pane_right = gtk_paned_get_position(GTK_PANED(status_pane_right));
-}
-
-
-/*
- * Helper for statusbar_widgets_emptying()
- */
-static void
-foreach_remove_a_child(GtkWidget *widget, gpointer data) {
- gtk_container_remove(GTK_CONTAINER(data), widget);
-}
-
-void
-statusbar_widgets_emptying(GtkWidget *statusbar)
-{
- g_object_ref(G_OBJECT(info_bar));
- g_object_ref(G_OBJECT(info_bar_event));
- g_object_ref(G_OBJECT(packets_bar));
- g_object_ref(G_OBJECT(profile_bar));
- g_object_ref(G_OBJECT(profile_bar_event));
- g_object_ref(G_OBJECT(status_pane_left));
- g_object_ref(G_OBJECT(status_pane_right));
- g_object_ref(G_OBJECT(expert_info_error));
- g_object_ref(G_OBJECT(expert_info_warn));
- g_object_ref(G_OBJECT(expert_info_note));
- g_object_ref(G_OBJECT(expert_info_chat));
- g_object_ref(G_OBJECT(expert_info_comment));
- g_object_ref(G_OBJECT(expert_info_none));
- g_object_ref(G_OBJECT(expert_info_placeholder));
- g_object_ref(G_OBJECT(capture_comment));
- g_object_ref(G_OBJECT(capture_comment_none));
- g_object_ref(G_OBJECT(capture_comment_placeholder));
-
-
- /* empty all containers participating */
- gtk_container_foreach(GTK_CONTAINER(statusbar), foreach_remove_a_child, statusbar);
- gtk_container_foreach(GTK_CONTAINER(status_pane_left), foreach_remove_a_child, status_pane_left);
- gtk_container_foreach(GTK_CONTAINER(status_pane_right), foreach_remove_a_child, status_pane_right);
-}
-
-void
-statusbar_widgets_pack(GtkWidget *statusbar)
-{
- gtk_box_pack_start(GTK_BOX(statusbar), expert_info_error, FALSE, FALSE, 2);
- gtk_box_pack_start(GTK_BOX(statusbar), expert_info_warn, FALSE, FALSE, 2);
- gtk_box_pack_start(GTK_BOX(statusbar), expert_info_note, FALSE, FALSE, 2);
- gtk_box_pack_start(GTK_BOX(statusbar), expert_info_chat, FALSE, FALSE, 2);
- gtk_box_pack_start(GTK_BOX(statusbar), expert_info_comment, FALSE, FALSE, 2);
- gtk_box_pack_start(GTK_BOX(statusbar), expert_info_none, FALSE, FALSE, 2);
- gtk_box_pack_start(GTK_BOX(statusbar), expert_info_placeholder, FALSE, FALSE, 2);
- gtk_box_pack_start(GTK_BOX(statusbar), capture_comment, FALSE, FALSE, 2);
- gtk_box_pack_start(GTK_BOX(statusbar), capture_comment_none, FALSE, FALSE, 2);
- gtk_box_pack_start(GTK_BOX(statusbar), capture_comment_placeholder, FALSE, FALSE, 2);
- gtk_box_pack_start(GTK_BOX(statusbar), status_pane_left, TRUE, TRUE, 0);
- gtk_paned_pack1(GTK_PANED(status_pane_left), info_bar_event, FALSE, FALSE);
- gtk_paned_pack2(GTK_PANED(status_pane_left), status_pane_right, TRUE, FALSE);
- gtk_paned_pack1(GTK_PANED(status_pane_right), packets_bar, TRUE, FALSE);
- gtk_paned_pack2(GTK_PANED(status_pane_right), profile_bar_event, FALSE, FALSE);
-}
-
-void
-statusbar_widgets_show_or_hide(GtkWidget *statusbar)
-{
- /*
- * Show the status hbox if either:
- *
- * 1) we're showing the filter toolbar and we want it in the status
- * line
- *
- * or
- *
- * 2) we're showing the status bar.
- */
- if ((recent.filter_toolbar_show && prefs.filter_toolbar_show_in_statusbar) ||
- recent.statusbar_show) {
- gtk_widget_show(statusbar);
- } else {
- gtk_widget_hide(statusbar);
- }
-
- if (recent.statusbar_show) {
- gtk_widget_show(status_pane_left);
- } else {
- gtk_widget_hide(status_pane_left);
- }
-}
-
-
-static void
-info_bar_new(void)
-{
- info_bar_event = gtk_event_box_new();
- info_bar = gtk_statusbar_new();
- gtk_container_add(GTK_CONTAINER(info_bar_event), info_bar);
- main_ctx = gtk_statusbar_get_context_id(GTK_STATUSBAR(info_bar), "main");
- file_ctx = gtk_statusbar_get_context_id(GTK_STATUSBAR(info_bar), "file");
- help_ctx = gtk_statusbar_get_context_id(GTK_STATUSBAR(info_bar), "help");
- filter_ctx = gtk_statusbar_get_context_id(GTK_STATUSBAR(info_bar), "filter");
-#if !GTK_CHECK_VERSION(3,0,0)
- gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(info_bar), FALSE);
-#endif
- gtk_statusbar_push(GTK_STATUSBAR(info_bar), main_ctx, DEF_READY_MESSAGE);
-
- memset(status_levels, 0, sizeof(status_levels));
-
- gtk_widget_show(info_bar);
- gtk_widget_show(info_bar_event);
-}
-
-static void
-packets_bar_new(void)
-{
- /* tip: tooltips don't work on statusbars! */
- packets_bar = gtk_statusbar_new();
- packets_ctx = gtk_statusbar_get_context_id(GTK_STATUSBAR(packets_bar), "packets");
- packets_bar_update();
-#if !GTK_CHECK_VERSION(3,0,0)
- gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(packets_bar), FALSE);
-#endif
-
- gtk_widget_show(packets_bar);
-}
-
-static void
-profile_bar_new(void)
-{
- profile_bar_event = gtk_event_box_new();
- profile_bar = gtk_statusbar_new();
- gtk_container_add(GTK_CONTAINER(profile_bar_event), profile_bar);
- g_signal_connect(profile_bar_event, "button_press_event", G_CALLBACK(profile_show_popup_cb), NULL);
- g_signal_connect(profile_bar_event, "button_press_event", G_CALLBACK(popup_menu_handler),
- g_object_get_data(G_OBJECT(popup_menu_object), PM_STATUSBAR_PROFILES_KEY));
- profile_ctx = gtk_statusbar_get_context_id(GTK_STATUSBAR(profile_bar), "profile");
- gtk_widget_set_tooltip_text(profile_bar_event, "Click to change configuration profile");
- profile_bar_update();
-#if !GTK_CHECK_VERSION(3,0,0)
- gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(profile_bar), FALSE);
-#endif
-
- gtk_widget_show(profile_bar);
- gtk_widget_show(profile_bar_event);
-}
-
-
-/*
- * Update the packets statusbar to the current values
- */
-void
-packets_bar_update(void)
-{
- if(packets_bar) {
- /* Remove old status */
- if(packets_str) {
- gtk_statusbar_pop(GTK_STATUSBAR(packets_bar), packets_ctx);
- } else {
- packets_str = g_string_new ("");
- }
-
- /* Do we have any packets? */
- if(cfile.count) {
- g_string_printf(packets_str, " Packets: %u " UTF8_MIDDLE_DOT
- " Displayed: %u (%.1f%%) ",
- cfile.count,
- cfile.displayed_count,
- (100.0 * cfile.displayed_count)/cfile.count);
- if(cfile.marked_count) {
- g_string_append_printf(packets_str, " " UTF8_MIDDLE_DOT " Marked: %u (%.1f%%)",
- cfile.marked_count, (100.0 * cfile.marked_count)/cfile.count);
- }
- if(cfile.drops_known) {
- g_string_append_printf(packets_str, " " UTF8_MIDDLE_DOT " Dropped: %u (%.1f%%)",
- cfile.drops, (100.0 * cfile.drops)/cfile.count);
- }
- if(cfile.ignored_count) {
- g_string_append_printf(packets_str, " " UTF8_MIDDLE_DOT " Ignored: %u (%.1f%%)",
- cfile.ignored_count, (100.0 * cfile.ignored_count)/cfile.count);
- }
- if(!cfile.is_tempfile){
- /* Loading an existing file */
- gulong computed_elapsed = cf_get_computed_elapsed(&cfile);
- g_string_append_printf(packets_str, " " UTF8_MIDDLE_DOT " Load time: %lu:%02lu.%03lu",
- computed_elapsed/60000,
- computed_elapsed%60000/1000,
- computed_elapsed%1000);
- }
- } else {
- g_string_printf(packets_str, " No Packets");
- }
- gtk_statusbar_push(GTK_STATUSBAR(packets_bar), packets_ctx, packets_str->str);
- }
-}
-
-/*
- * Update the packets statusbar to the current values
- */
-void
-profile_bar_update(void)
-{
- if (profile_bar) {
- /* remove old status */
- if(profile_str) {
- g_free(profile_str);
- gtk_statusbar_pop(GTK_STATUSBAR(profile_bar), profile_ctx);
- }
-
- profile_str = g_strdup_printf (" Profile: %s", get_profile_name ());
- gtk_statusbar_push(GTK_STATUSBAR(profile_bar), profile_ctx, profile_str);
-
- set_menus_for_profiles(is_default_profile());
- }
-}
-
-static gboolean
-expert_comp_dlg_event_cb(GtkWidget *w _U_, GdkEventButton *event _U_, gpointer user_data _U_)
-{
- expert_comp_dlg_launch();
- return TRUE;
-}
-
-static gboolean
-edit_capture_comment_dlg_event_cb(GtkWidget *w _U_, GdkEventButton *event _U_, gpointer user_data _U_)
-{
- edit_capture_comment_dlg_launch(NULL, NULL);
- return TRUE;
-}
-
-static void
-status_expert_new(void)
-{
- GtkWidget *expert_image;
-
- expert_image = PIXBUF_TO_WIDGET(expert_error_pb_data, "/org/wireshark/image/stock_icons/14x14/x-expert-error.png");
- gtk_widget_set_tooltip_text(expert_image, "ERROR is the highest expert info level");
- gtk_widget_show(expert_image);
- expert_info_error = gtk_event_box_new();
- gtk_container_add(GTK_CONTAINER(expert_info_error), expert_image);
- g_signal_connect(expert_info_error, "button_press_event", G_CALLBACK(expert_comp_dlg_event_cb), NULL);
-
- expert_image = PIXBUF_TO_WIDGET(expert_warn_pb_data, "/org/wireshark/image/stock_icons/14x14/x-expert-warn.png");
- gtk_widget_set_tooltip_text(expert_image, "WARNING is the highest expert info level");
- gtk_widget_show(expert_image);
- expert_info_warn = gtk_event_box_new();
- gtk_container_add(GTK_CONTAINER(expert_info_warn), expert_image);
- g_signal_connect(expert_info_warn, "button_press_event", G_CALLBACK(expert_comp_dlg_event_cb), NULL);
-
- expert_image = PIXBUF_TO_WIDGET(expert_note_pb_data, "/org/wireshark/image/stock_icons/14x14/x-expert-note.png");
- gtk_widget_set_tooltip_text(expert_image, "NOTE is the highest expert info level");
- gtk_widget_show(expert_image);
- expert_info_note = gtk_event_box_new();
- gtk_container_add(GTK_CONTAINER(expert_info_note), expert_image);
- g_signal_connect(expert_info_note, "button_press_event", G_CALLBACK(expert_comp_dlg_event_cb), NULL);
-
- expert_image = PIXBUF_TO_WIDGET(expert_chat_pb_data, "/org/wireshark/image/stock_icons/14x14/x-expert-chat.png");
- gtk_widget_set_tooltip_text(expert_image, "CHAT is the highest expert info level");
- gtk_widget_show(expert_image);
- expert_info_chat = gtk_event_box_new();
- gtk_container_add(GTK_CONTAINER(expert_info_chat), expert_image);
- g_signal_connect(expert_info_chat, "button_press_event", G_CALLBACK(expert_comp_dlg_event_cb), NULL);
-
- expert_image = ws_gtk_image_new_from_stock(GTK_STOCK_YES, GTK_ICON_SIZE_MENU);
- gtk_widget_set_tooltip_text(expert_image, "COMMENT is the highest expert info level");
- gtk_widget_show(expert_image);
- expert_info_comment = gtk_event_box_new();
- gtk_container_add(GTK_CONTAINER(expert_info_comment), expert_image);
- g_signal_connect(expert_info_comment, "button_press_event", G_CALLBACK(expert_comp_dlg_event_cb), NULL);
-
- expert_image = PIXBUF_TO_WIDGET(expert_none_pb_data, "/org/wireshark/image/stock_icons/14x14/x-expert-none.png");
- gtk_widget_set_tooltip_text(expert_image, "No expert info");
- gtk_widget_show(expert_image);
- expert_info_none = gtk_event_box_new();
- gtk_container_add(GTK_CONTAINER(expert_info_none), expert_image);
- g_signal_connect(expert_info_none, "button_press_event", G_CALLBACK(expert_comp_dlg_event_cb), NULL);
-
- expert_image = PIXBUF_TO_WIDGET(expert_none_pb_data, "/org/wireshark/image/stock_icons/14x14/x-expert-none.png");
- gtk_widget_show(expert_image);
- expert_info_placeholder = gtk_event_box_new();
- gtk_container_add(GTK_CONTAINER(expert_info_placeholder), expert_image);
- gtk_widget_set_sensitive(expert_info_placeholder, FALSE);
-
- gtk_widget_show(expert_info_placeholder);
-}
-
-static void
-status_expert_hide(gboolean show_placeholder)
-{
- /* reset expert info indicator */
- gtk_widget_hide(expert_info_error);
- gtk_widget_hide(expert_info_warn);
- gtk_widget_hide(expert_info_note);
- gtk_widget_hide(expert_info_chat);
- gtk_widget_hide(expert_info_comment);
- gtk_widget_hide(expert_info_none);
-
- if (show_placeholder)
- gtk_widget_show(expert_info_placeholder);
- else
- gtk_widget_hide(expert_info_placeholder);
-}
-
-void
-status_expert_update(void)
-{
- status_expert_hide(FALSE);
-
- switch(expert_get_highest_severity()) {
- case(PI_ERROR):
- gtk_widget_show(expert_info_error);
- break;
- case(PI_WARN):
- gtk_widget_show(expert_info_warn);
- break;
- case(PI_NOTE):
- gtk_widget_show(expert_info_note);
- break;
- case(PI_CHAT):
- gtk_widget_show(expert_info_chat);
- break;
- case(PI_COMMENT):
- gtk_widget_show(expert_info_comment);
- break;
- default:
- gtk_widget_show(expert_info_none);
- break;
- }
-}
-
-static void
-status_capture_comment_new(void)
-{
- GtkWidget *comment_image;
-
- comment_image = PIXBUF_TO_WIDGET(capture_comment_update_pb_data, "/org/wireshark/image/capture_comment_update.png");
- gtk_widget_set_tooltip_text(comment_image, "Read or edit the comment for this capture file");
- gtk_widget_show(comment_image);
- capture_comment = gtk_event_box_new();
- gtk_container_add(GTK_CONTAINER(capture_comment), comment_image);
- g_signal_connect(capture_comment, "button_press_event", G_CALLBACK(edit_capture_comment_dlg_event_cb), NULL);
-
- comment_image = PIXBUF_TO_WIDGET(capture_comment_add_pb_data, "/org/wireshark/image/capture_comment_add.png");
- gtk_widget_set_tooltip_text(comment_image, "Add a comment to this capture file");
- gtk_widget_show(comment_image);
- capture_comment_none = gtk_event_box_new();
- gtk_container_add(GTK_CONTAINER(capture_comment_none), comment_image);
- g_signal_connect(capture_comment_none, "button_press_event", G_CALLBACK(edit_capture_comment_dlg_event_cb), NULL);
-
- comment_image = PIXBUF_TO_WIDGET(capture_comment_add_pb_data, "/org/wireshark/image/capture_comment_add.png");
- gtk_widget_show(comment_image);
- capture_comment_placeholder = gtk_event_box_new();
- gtk_container_add(GTK_CONTAINER(capture_comment_placeholder), comment_image);
- gtk_widget_set_sensitive(capture_comment_placeholder, FALSE);
-
- gtk_widget_show(capture_comment_placeholder);
- /* comment_image = PIXBUF_TO_WIDGET(capture_comment_disabled_pb_data, "/org/wireshark/image/toolbar/capture_comment_disabled.png"); ... */
-
-}
-
-static void
-status_capture_comment_hide(gboolean show_placeholder)
-{
- edit_capture_comment_dlg_hide();
-
- /* reset capture coment info indicator */
- gtk_widget_hide(capture_comment);
- gtk_widget_hide(capture_comment_none);
-
- if (show_placeholder)
- gtk_widget_show(capture_comment_placeholder);
- else
- gtk_widget_hide(capture_comment_placeholder);
-}
-
-void
-status_capture_comment_update(void)
-{
- const gchar *comment_str;
-
- status_capture_comment_hide(FALSE);
-
- comment_str = cf_read_section_comment(&cfile);
-
- /* *comment_str==0x0 -> comment exists, but it's empty */
- if(comment_str!=NULL && *comment_str!=0x0){
- gtk_widget_show(capture_comment);
- }else{
- gtk_widget_show(capture_comment_none);
- }
-
-}
-
-static void
-statusbar_set_filename(const char *file_name, gint64 file_length, nstime_t *file_elapsed_time)
-{
- gchar *size_str;
-
- /* expert info indicator */
- status_expert_update();
-
- /* statusbar */
- size_str = format_size(file_length, (format_size_flags_e)(format_size_unit_bytes|format_size_prefix_si));
-
- statusbar_push_file_msg(" File: \"%s\" %s %02lu:%02lu:%02lu",
- (file_name) ? file_name : "", size_str,
- (long)file_elapsed_time->secs/3600,
- (long)file_elapsed_time->secs%3600/60,
- (long)file_elapsed_time->secs%60);
- g_free(size_str);
-}
-
-
-static void
-statusbar_cf_file_closing_cb(capture_file *cf _U_)
-{
- /* Clear any file-related status bar messages.
- XXX - should be "clear *ALL* file-related status bar messages;
- will there ever be more than one on the stack? */
- statusbar_pop_file_msg();
-
- /* reset expert info indicator */
- status_expert_hide(FALSE);
- gtk_widget_show(expert_info_none);
-}
-
-
-static void
-statusbar_cf_file_closed_cb(capture_file *cf _U_)
-{
- /* go back to "No packets" */
- packets_bar_update();
- /* Disable the comments icon */
- status_capture_comment_hide(TRUE);
- /* Disable the experts icon */
- status_expert_hide(TRUE);
-}
-
-
-static void
-statusbar_cf_file_read_started_cb(capture_file *cf, const char *action)
-{
- gchar *name_ptr;
-
- /* Ensure we pop any previous loaded filename */
- statusbar_pop_file_msg();
-
- name_ptr = g_filename_display_basename(cf->filename);
- statusbar_push_file_msg(" %s: %s", action, name_ptr);
- g_free(name_ptr);
-}
-
-
-static void
-statusbar_cf_file_read_finished_cb(capture_file *cf)
-{
- statusbar_pop_file_msg();
- statusbar_set_filename(cf->filename, cf->f_datalen, &(cf->elapsed_time));
- status_capture_comment_update();
-}
-
-
-#ifdef HAVE_LIBPCAP
-static void
-statusbar_capture_prepared_cb(capture_session *cap_session _U_)
-{
- static const gchar msg[] = " Waiting for capture input data ...";
- statusbar_push_file_msg(msg);
-}
-
-static GString *
-statusbar_get_interface_names(capture_options *capture_opts)
-{
- GString *interface_names;
-
- 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, " ");
- return (interface_names);
-}
-
-static void
-statusbar_capture_update_started_cb(capture_session *cap_session)
-{
- capture_options *capture_opts = cap_session->capture_opts;
- GString *interface_names;
-
- statusbar_pop_file_msg();
-
- interface_names = statusbar_get_interface_names(capture_opts);
- statusbar_push_file_msg("%s<live capture in progress> to file: %s",
- interface_names->str,
- (capture_opts->save_file) ? capture_opts->save_file : "");
- g_string_free(interface_names, TRUE);
-
- status_capture_comment_update();
-}
-
-static void
-statusbar_capture_update_continue_cb(capture_session *cap_session)
-{
- GString *interface_names;
- capture_options *capture_opts = cap_session->capture_opts;
- capture_file *cf = (capture_file *)cap_session->cf;
-
- status_expert_update();
-
- statusbar_pop_file_msg();
-
- interface_names = statusbar_get_interface_names(capture_opts);
- if (cf->f_datalen/1024/1024 > 10) {
- statusbar_push_file_msg("%s<live capture in progress> File: %s %" G_GINT64_MODIFIER "d MB",
- interface_names->str,
- capture_opts->save_file,
- cf->f_datalen/1024/1024);
- } else if (cf->f_datalen/1024 > 10) {
- statusbar_push_file_msg("%s<live capture in progress> File: %s %" G_GINT64_MODIFIER "d KB",
- interface_names->str,
- capture_opts->save_file,
- cf->f_datalen/1024);
- } else {
- statusbar_push_file_msg("%s<live capture in progress> File: %s %" G_GINT64_MODIFIER "d Bytes",
- interface_names->str,
- capture_opts->save_file,
- cf->f_datalen);
- }
- g_string_free(interface_names, TRUE);
-}
-
-static void
-statusbar_capture_update_finished_cb(capture_session *cap_session)
-{
- capture_file *cf = (capture_file *)cap_session->cf;
-
- /* Pop the "<live capture in progress>" message off the status bar. */
- statusbar_pop_file_msg();
- statusbar_set_filename(cf->filename, cf->f_datalen, &(cf->elapsed_time));
- packets_bar_update();
-}
-
-static void
-statusbar_capture_fixed_started_cb(capture_session *cap_session)
-{
- capture_options *capture_opts = cap_session->capture_opts;
- GString *interface_names;
-
- statusbar_pop_file_msg();
-
- interface_names = statusbar_get_interface_names(capture_opts);
- statusbar_push_file_msg("%s<live capture in progress> to file: %s",
- interface_names->str,
- (capture_opts->save_file) ? capture_opts->save_file : "");
-
- gtk_statusbar_push(GTK_STATUSBAR(packets_bar), packets_ctx, " Packets: 0");
- g_string_free(interface_names, TRUE);
-}
-
-static void
-statusbar_capture_fixed_continue_cb(capture_session *cap_session)
-{
- gchar *capture_msg;
-
- gtk_statusbar_pop(GTK_STATUSBAR(packets_bar), packets_ctx);
- capture_msg = g_strdup_printf(" Packets: %u", cap_session->count);
- gtk_statusbar_push(GTK_STATUSBAR(packets_bar), packets_ctx, capture_msg);
- g_free(capture_msg);
-}
-
-
-static void
-statusbar_capture_fixed_finished_cb(capture_session *cap_session _U_)
-{
-#if 0
- capture_file *cf = (capture_file *)cap_session->cf;
-#endif
-
- /* Pop the "<live capture in progress>" message off the status bar. */
- statusbar_pop_file_msg();
-
- /* Pop the "<capturing>" message off the status bar */
- gtk_statusbar_pop(GTK_STATUSBAR(packets_bar), packets_ctx);
-}
-
-static void
-statusbar_capture_failed_cb(capture_session *cap_session _U_)
-{
-#if 0
- capture_file *cf = (capture_file *)cap_session->cf;
-#endif
-
- /* Pop the "<live capture in progress>" message off the status bar. */
- statusbar_pop_file_msg();
-
- /* Pop the "<capturing>" message off the status bar */
- gtk_statusbar_pop(GTK_STATUSBAR(packets_bar), packets_ctx);
-}
-#endif /* HAVE_LIBPCAP */
-
-
-static void
-statusbar_cf_field_unselected_cb(capture_file *cf _U_)
-{
- statusbar_pop_field_msg();
-}
-
-static void
-statusbar_cf_file_save_started_cb(gchar *filename)
-{
- statusbar_pop_file_msg();
- statusbar_push_file_msg(" Saving: %s...", g_filename_display_basename(filename));
-}
-
-static void
-statusbar_cf_file_save_finished_cb(gpointer data _U_)
-{
- /* Pop the "Saving:" message off the status bar. */
- statusbar_pop_file_msg();
-}
-
-static void
-statusbar_cf_file_save_failed_cb(gpointer data _U_)
-{
- /* Pop the "Saving:" message off the status bar. */
- statusbar_pop_file_msg();
-}
-
-static void
-statusbar_cf_file_save_stopped_cb(gpointer data _U_)
-{
- /* Pop the "Saving:" message off the status bar. */
- statusbar_pop_file_msg();
-}
-
-static void
-statusbar_cf_file_export_specified_packets_started_cb(gchar *filename)
-{
- statusbar_pop_file_msg();
- statusbar_push_file_msg(" Exporting to: %s...", g_filename_display_basename(filename));
-}
-
-static void
-statusbar_cf_file_export_specified_packets_finished_cb(gpointer data _U_)
-{
- /* Pop the "Exporting to:" message off the status bar. */
- statusbar_pop_file_msg();
-}
-
-static void
-statusbar_cf_file_export_specified_packets_failed_cb(gpointer data _U_)
-{
- /* Pop the "Exporting to:" message off the status bar. */
- statusbar_pop_file_msg();
-}
-
-static void
-statusbar_cf_file_export_specified_packets_stopped_cb(gpointer data _U_)
-{
- /* Pop the "Saving:" message off the status bar. */
- statusbar_pop_file_msg();
-}
-
-
-
-void
-statusbar_cf_callback(gint event, gpointer data, gpointer user_data _U_)
-{
- switch(event) {
- case(cf_cb_file_opened):
- break;
- case(cf_cb_file_closing):
- statusbar_cf_file_closing_cb((capture_file *)data);
- break;
- case(cf_cb_file_closed):
- statusbar_cf_file_closed_cb((capture_file *)data);
- break;
- case(cf_cb_file_read_started):
- statusbar_cf_file_read_started_cb((capture_file *)data, "Loading");
- break;
- case(cf_cb_file_read_finished):
- statusbar_cf_file_read_finished_cb((capture_file *)data);
- break;
- case(cf_cb_file_reload_started):
- statusbar_cf_file_read_started_cb((capture_file *)data, "Reloading");
- break;
- case(cf_cb_file_reload_finished):
- statusbar_cf_file_read_finished_cb((capture_file *)data);
- break;
- case(cf_cb_file_rescan_started):
- statusbar_cf_file_read_started_cb((capture_file *)data, "Rescanning");
- break;
- case(cf_cb_file_rescan_finished):
- statusbar_cf_file_read_finished_cb((capture_file *)data);
- break;
- case(cf_cb_file_retap_started):
- break;
- case(cf_cb_file_retap_finished):
- break;
- case(cf_cb_file_merge_started):
- break;
- case(cf_cb_file_merge_finished):
- break;
- case(cf_cb_file_fast_save_finished):
- break;
- case(cf_cb_packet_selected):
- break;
- case(cf_cb_packet_unselected):
- break;
- case(cf_cb_field_unselected):
- statusbar_cf_field_unselected_cb((capture_file *)data);
- break;
- case(cf_cb_file_save_started):
- statusbar_cf_file_save_started_cb((gchar *)data);
- break;
- case(cf_cb_file_save_finished):
- statusbar_cf_file_save_finished_cb(data);
- break;
- case(cf_cb_file_save_failed):
- statusbar_cf_file_save_failed_cb(data);
- break;
- case(cf_cb_file_save_stopped):
- statusbar_cf_file_save_stopped_cb(data);
- break;
- case(cf_cb_file_export_specified_packets_started):
- statusbar_cf_file_export_specified_packets_started_cb((gchar *)data);
- break;
- case(cf_cb_file_export_specified_packets_finished):
- statusbar_cf_file_export_specified_packets_finished_cb(data);
- break;
- case(cf_cb_file_export_specified_packets_failed):
- statusbar_cf_file_export_specified_packets_failed_cb(data);
- break;
- case(cf_cb_file_export_specified_packets_stopped):
- statusbar_cf_file_export_specified_packets_stopped_cb(data);
- break;
- default:
- g_warning("statusbar_cf_callback: event %u unknown", event);
- g_assert_not_reached();
- }
-}
-
-#ifdef HAVE_LIBPCAP
-void
-statusbar_capture_callback(gint event, capture_session *cap_session,
- gpointer user_data _U_)
-{
- switch(event) {
- case(capture_cb_capture_prepared):
- statusbar_capture_prepared_cb(cap_session);
- break;
- case(capture_cb_capture_update_started):
- statusbar_capture_update_started_cb(cap_session);
- break;
- case(capture_cb_capture_update_continue):
- statusbar_capture_update_continue_cb(cap_session);
- break;
- case(capture_cb_capture_update_finished):
- statusbar_capture_update_finished_cb(cap_session);
- break;
- case(capture_cb_capture_fixed_started):
- statusbar_capture_fixed_started_cb(cap_session);
- break;
- case(capture_cb_capture_fixed_continue):
- statusbar_capture_fixed_continue_cb(cap_session);
- break;
- case(capture_cb_capture_fixed_finished):
- statusbar_capture_fixed_finished_cb(cap_session);
- break;
- case(capture_cb_capture_stopping):
- /* Beware: this state won't be called, if the capture child
- * closes the capturing on its own! */
- break;
- case(capture_cb_capture_failed):
- statusbar_capture_failed_cb(cap_session);
- break;
- default:
- g_warning("statusbar_capture_callback: event %u unknown", event);
- g_assert_not_reached();
- }
-}
-#endif
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/main_statusbar_private.h b/ui/gtk/main_statusbar_private.h
deleted file mode 100644
index 5b2cdce6b5..0000000000
--- a/ui/gtk/main_statusbar_private.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* main_statusbar_private.h
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __MAIN_STATUSBAR_PRIVATE_H__
-#define __MAIN_STATUSBAR_PRIVATE_H__
-
-/*** PRIVATE INTERFACE BETWEEN main.c AND main_statusbar.c DON'T USE OR TOUCH :-)*/
-
-GtkWidget *statusbar_new(void);
-void statusbar_load_window_geometry(void);
-void statusbar_save_window_geometry(void);
-void statusbar_widgets_emptying(GtkWidget *statusbar);
-void statusbar_widgets_pack(GtkWidget *statusbar);
-void statusbar_widgets_show_or_hide(GtkWidget *statusbar);
-void statusbar_cf_callback(gint event, gpointer data, gpointer user_data);
-#ifdef HAVE_LIBPCAP
-void statusbar_capture_callback(gint event, capture_session *cap_session,
- gpointer user_data);
-#endif
-
-#endif /* __MAIN_STATUSBAR_PRIVATE_H__ */
-
diff --git a/ui/gtk/main_titlebar.c b/ui/gtk/main_titlebar.c
deleted file mode 100644
index 9b8ee56538..0000000000
--- a/ui/gtk/main_titlebar.c
+++ /dev/null
@@ -1,127 +0,0 @@
-/* main_titlebar.c
- * Main window title bar routines.
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <epan/prefs.h>
-
-#include <gtk/gtk.h>
-
-#include "file.h"
-
-#include "gtkglobals.h"
-#include "gui_utils.h"
-#include "main_titlebar.h"
-
-#include <version_info.h>
-
-/*
- * Key to attach the "un-decorated" title to the window, so that if the
- * user-specified decoration changes, we can correctly update the
- * window title.
- */
-#define MAIN_WINDOW_NAME_KEY "main_window_name"
-
-/* Set the name of the top level main_window_name with the specified string and call
- main_titlebar_update() to construct the full title and display it in the main window. */
-static void
-main_set_window_name(const gchar *window_name)
-{
- gchar *old_window_name;
-
- /* Attach the new un-decorated window name to the window. */
- old_window_name = (gchar *)g_object_get_data(G_OBJECT(top_level), MAIN_WINDOW_NAME_KEY);
- g_free(old_window_name);
- g_object_set_data(G_OBJECT(top_level), MAIN_WINDOW_NAME_KEY, g_strdup(window_name));
-
- main_titlebar_update();
-}
-
-/* Construct the main window's title with the current main_window_name, optionally appended
- with the user-specified title and/or wireshark version. Display the result in the main
- window title bar. */
-void
-main_titlebar_update(void)
-{
- gchar *window_name;
- gchar *title;
-
- /* Get the current filename or other title set in main_set_window_name */
- window_name = (gchar *)g_object_get_data(G_OBJECT(top_level), MAIN_WINDOW_NAME_KEY);
- if (window_name != NULL) {
- /* Optionally append the user-defined window title */
- title = create_user_window_title(window_name);
-
- /* Optionally append the version */
- if ((prefs.gui_version_placement == version_title_only) ||
- (prefs.gui_version_placement == version_both)) {
- gchar *old_title = title;
- title = g_strdup_printf("%s [Wireshark %s]", title, get_ws_vcs_version_info());
- g_free(old_title);
- }
- gtk_window_set_title(GTK_WINDOW(top_level), title);
- g_free(title);
- }
-}
-
-/* Set titlebar to reflect the current state of the capture file, if any */
-void
-set_titlebar_for_capture_file(capture_file *cf)
-{
- gchar *display_name;
- gchar *window_name;
-
- if (cf && cf->filename) {
- display_name = cf_get_display_name(cf);
- window_name = g_strdup_printf("%s%s", cf_has_unsaved_data(cf) ? "*" : "",
- display_name);
- g_free(display_name);
- main_set_window_name(window_name);
- g_free(window_name);
- } else {
- main_set_window_name("The Wireshark Network Analyzer");
- }
-}
-
-/* Set titlebar to reflect a capture in progress */
-void
-set_titlebar_for_capture_in_progress(capture_file *cf)
-{
- gchar *window_name;
-
- window_name = g_strdup_printf("Capturing from %s", cf_get_tempfile_source(cf));
- main_set_window_name(window_name);
- g_free(window_name);
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/main_titlebar.h b/ui/gtk/main_titlebar.h
deleted file mode 100644
index 970731a6ce..0000000000
--- a/ui/gtk/main_titlebar.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* main_titlebar.h
- * Declarations of GTK+-specific UI utility routines
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __MAIN_TITLEBAR_H__
-#define __MAIN_TITLEBAR_H__
-
-/** Construct the main window's title with the current main_window_name optionally appended
- * with the user-specified title and/or wireshark version.
- * Display the result in the main window's title bar and in its icon title
- */
-extern void main_titlebar_update(void);
-
-/* Set titlebar to reflect the current state of the capture file, if any */
-extern void set_titlebar_for_capture_file(capture_file *cf);
-
-/* Set titlebar to reflect a capture in progress */
-extern void set_titlebar_for_capture_in_progress(capture_file *cf);
-
-#endif /* __MAIN_TITLEBAR_H__ */
diff --git a/ui/gtk/main_toolbar.c b/ui/gtk/main_toolbar.c
deleted file mode 100644
index a1f05c0a93..0000000000
--- a/ui/gtk/main_toolbar.c
+++ /dev/null
@@ -1,486 +0,0 @@
-/* main_toolbar.c
- * The main toolbar
- * Copyright 2003, Ulf Lamping <ulf.lamping@web.de>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/*
- * This file implements the "main" toolbar for Wireshark.
- */
-
-#include "config.h"
-
-
-#include <epan/prefs.h>
-
-#include "../../cfile.h"
-
-#include <gtk/gtk.h>
-
-#ifdef HAVE_LIBPCAP
-#include "ui/gtk/capture_dlg.h"
-#include "ui/gtk/capture_if_dlg.h"
-#endif /* HAVE_LIBPCAP */
-#include "ui/gtk/filter_dlg.h"
-#include "ui/gtk/capture_file_dlg.h"
-#include "ui/gtk/find_dlg.h"
-#include "ui/gtk/goto_dlg.h"
-#include "ui/gtk/color_dlg.h"
-#include "ui/gtk/prefs_dlg.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/main_toolbar.h"
-#include "ui/gtk/main_toolbar_private.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/keys.h"
-#include "ui/gtk/packet_history.h"
-#include "ui/gtk/packet_list.h"
-#include "ui/capture_globals.h"
-
-#include <epan/plugin_if.h>
-
-#include "ui/gtk/old-gtk-compat.h"
-
-#include "globals.h"
-
-static gboolean toolbar_init = FALSE;
-
-#ifdef HAVE_LIBPCAP
-static GtkToolItem *capture_options_button, *new_button, *stop_button, *clear_button, *if_button;
-static GtkToolItem *capture_filter_button, *autoscroll_button;
-#endif /* HAVE_LIBPCAP */
-static GtkToolItem *open_button, *save_button, *close_button, *reload_button;
-static GtkToolItem *find_button, *history_forward_button, *history_back_button;
-static GtkToolItem *go_to_button, *go_to_top_button, *go_to_bottom_button;
-static GtkToolItem *display_filter_button;
-static GtkToolItem *zoom_in_button, *zoom_out_button, *zoom_100_button, *colorize_button;
-static GtkToolItem *resize_columns_button;
-static GtkToolItem *color_display_button, *prefs_button, *help_button;
-
-/*
- * Redraw all toolbars
- */
-void
-toolbar_redraw_all(void)
-{
- GtkWidget *main_tb;
- GtkWidget *filter_tb;
-
- main_tb = (GtkWidget *)g_object_get_data(G_OBJECT(top_level), E_TB_MAIN_KEY);
-
- gtk_toolbar_set_style(GTK_TOOLBAR(main_tb),
- (GtkToolbarStyle)prefs.gui_toolbar_main_style);
-
- filter_tb = (GtkWidget *)g_object_get_data(G_OBJECT(top_level), E_TB_FILTER_KEY);
-
- /* In case the filter toolbar hasn't been built */
- if(filter_tb)
- gtk_toolbar_set_style(GTK_TOOLBAR(filter_tb),
- (GtkToolbarStyle)prefs.gui_toolbar_filter_style);
-}
-
-#ifdef HAVE_LIBPCAP
-void set_start_button_sensitive(gboolean enable) {
- gtk_widget_set_sensitive(GTK_WIDGET(new_button), enable);
-}
-#endif
-
-/* Enable or disable toolbar items based on whether you have a capture file
- and, if so, whether you've finished reading it and whether there's stuff
- in it that hasn't yet been saved to a permanent file. */
-void set_toolbar_for_capture_file(capture_file *cf) {
- if (toolbar_init) {
- if (cf == NULL || cf->state == FILE_READ_IN_PROGRESS) {
- /* We have no open capture file, or we have one but we're in
- the process of reading it. Disable everything having to
- do with the file. */
- gtk_widget_set_sensitive(GTK_WIDGET(save_button), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(close_button), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(reload_button), FALSE);
- } else {
- /* We have an open capture file and we're finished reading it.
- Enable "Save" if and only if we have something to save and
- can do so. Enable "Close" and "Reload" unconditionally. */
- gtk_widget_set_sensitive(GTK_WIDGET(save_button), cf_can_save(cf));
- gtk_widget_set_sensitive(GTK_WIDGET(close_button), TRUE);
- gtk_widget_set_sensitive(GTK_WIDGET(reload_button), TRUE);
- }
- }
-}
-
-/** The packet history has changed, we need to update the menu.
- *
- * @param back_history some back history entries available
- * @param forward_history some forward history entries available
- */
-void set_toolbar_for_packet_history(gboolean back_history, gboolean forward_history) {
- gtk_widget_set_sensitive(GTK_WIDGET(history_back_button), back_history);
- gtk_widget_set_sensitive(GTK_WIDGET(history_forward_button), forward_history);
-}
-
-
-/* set toolbar state "have a capture in progress" */
-void set_toolbar_for_capture_in_progress(gboolean capture_in_progress) {
-
- if (toolbar_init) {
-#ifdef HAVE_LIBPCAP
- gtk_widget_set_sensitive(GTK_WIDGET(capture_options_button), !capture_in_progress);
- gtk_widget_set_sensitive(GTK_WIDGET(new_button), !capture_in_progress);
- gtk_widget_set_sensitive(GTK_WIDGET(stop_button), capture_in_progress);
- gtk_widget_set_sensitive(GTK_WIDGET(clear_button), capture_in_progress);
- if (!capture_in_progress) {
- gtk_widget_set_sensitive(GTK_WIDGET(new_button), (global_capture_opts.num_selected > 0));
- }
- /*if (capture_in_progress) {
- gtk_widget_hide(GTK_WIDGET(new_button));
- gtk_widget_show(GTK_WIDGET(stop_button));
- } else {
- gtk_widget_show(GTK_WIDGET(new_button));
- gtk_widget_hide(GTK_WIDGET(stop_button));
- }*/
-#endif /* HAVE_LIBPCAP */
- gtk_widget_set_sensitive(GTK_WIDGET(open_button), !capture_in_progress);
- }
-}
-
-/* set toolbar state "stopping a capture" */
-void set_toolbar_for_capture_stopping(void) {
-
- if (toolbar_init) {
-#ifdef HAVE_LIBPCAP
- gtk_widget_set_sensitive(GTK_WIDGET(stop_button), FALSE);
- gtk_widget_set_sensitive(GTK_WIDGET(clear_button), FALSE);
- /*if (capture_in_progress) {
- gtk_widget_hide(GTK_WIDGET(new_button));
- gtk_widget_show(GTK_WIDGET(stop_button));
- } else {
- gtk_widget_show(GTK_WIDGET(new_button));
- gtk_widget_hide(GTK_WIDGET(stop_button));
- }*/
-#endif /* HAVE_LIBPCAP */
- }
-}
-
-/* set toolbar state "have packets captured" */
-void set_toolbar_for_captured_packets(gboolean have_captured_packets) {
-
- if (toolbar_init) {
- gtk_widget_set_sensitive(GTK_WIDGET(find_button),
- have_captured_packets);
- gtk_widget_set_sensitive(GTK_WIDGET(history_back_button),
- have_captured_packets);
- gtk_widget_set_sensitive(GTK_WIDGET(history_forward_button),
- have_captured_packets);
- gtk_widget_set_sensitive(GTK_WIDGET(go_to_button),
- have_captured_packets);
- gtk_widget_set_sensitive(GTK_WIDGET(go_to_top_button),
- have_captured_packets);
- gtk_widget_set_sensitive(GTK_WIDGET(go_to_bottom_button),
- have_captured_packets);
- gtk_widget_set_sensitive(GTK_WIDGET(zoom_in_button),
- have_captured_packets);
- gtk_widget_set_sensitive(GTK_WIDGET(zoom_out_button),
- have_captured_packets);
- gtk_widget_set_sensitive(GTK_WIDGET(zoom_100_button),
- have_captured_packets);
- gtk_widget_set_sensitive(GTK_WIDGET(resize_columns_button),
- have_captured_packets);
-
- /* XXX - I don't see a reason why this should be done (as it is in the
- * menus) */
- /* gtk_widget_set_sensitive(GTK_WIDGET(color_display_button),
- have_captured_packets);*/
- }
-}
-
-
-/* helper function: add a separator to the toolbar */
-static void toolbar_append_separator(GtkWidget *toolbar) {
- GtkToolItem *tool_item = gtk_separator_tool_item_new();
- gtk_toolbar_insert(GTK_TOOLBAR(toolbar), tool_item, -1);
- gtk_widget_show(GTK_WIDGET(tool_item));
-}
-
-
-
-#define toolbar_item(new_item, toolbar, stock, tooltip_text, callback, user_data) { \
- new_item = ws_gtk_tool_button_new_from_stock(stock); \
- gtk_widget_set_tooltip_text(GTK_WIDGET(new_item), tooltip_text); \
- g_signal_connect(new_item, "clicked", G_CALLBACK(callback), user_data); \
- gtk_toolbar_insert(GTK_TOOLBAR(toolbar), new_item, -1); \
- gtk_widget_show(GTK_WIDGET(new_item)); \
- }
-
-#define toolbar_toggle_button(new_item, window, toolbar, stock, tooltip_text, callback, user_data) { \
- new_item = ws_gtk_toggle_tool_button_new_from_stock(stock); \
- gtk_widget_set_tooltip_text(GTK_WIDGET(new_item), tooltip_text); \
- g_signal_connect(new_item, "toggled", G_CALLBACK(callback), user_data); \
- gtk_toolbar_insert(GTK_TOOLBAR(toolbar), new_item, -1); \
- gtk_widget_show_all(GTK_WIDGET(new_item)); \
- }
-
-#define TOGGLE_BUTTON GTK_TOGGLE_TOOL_BUTTON
-#define TOGGLE_BUTTON_GET_ACTIVE gtk_toggle_tool_button_get_active
-#define TOGGLE_BUTTON_SET_ACTIVE gtk_toggle_tool_button_set_active
-
-static void
-colorize_toggle_cb(GtkWidget *toggle_button, gpointer user_data _U_) {
- main_colorize_changed(TOGGLE_BUTTON_GET_ACTIVE(TOGGLE_BUTTON(toggle_button)));
-}
-
-void
-toolbar_colorize_changed(gboolean packet_list_colorize) {
- if(TOGGLE_BUTTON_GET_ACTIVE(TOGGLE_BUTTON(colorize_button)) != packet_list_colorize) {
- TOGGLE_BUTTON_SET_ACTIVE(TOGGLE_BUTTON(colorize_button), packet_list_colorize);
- }
-}
-
-#ifdef HAVE_LIBPCAP
-static void
-auto_scroll_live_toggle_cb(GtkWidget *autoscroll_button_lcl, gpointer user_data _U_) {
- main_auto_scroll_live_changed(TOGGLE_BUTTON_GET_ACTIVE(TOGGLE_BUTTON(autoscroll_button_lcl)));
-}
-
-void
-toolbar_auto_scroll_live_changed(gboolean auto_scroll_live_lcl) {
- if(TOGGLE_BUTTON_GET_ACTIVE(TOGGLE_BUTTON(autoscroll_button)) != auto_scroll_live_lcl) {
- TOGGLE_BUTTON_SET_ACTIVE(TOGGLE_BUTTON(autoscroll_button), auto_scroll_live_lcl);
- }
-}
-#endif
-
-static void
-plugin_if_maintoolbar_goto_frame(GHashTable * data_set)
-{
- if (data_set) {
- gpointer framenr;
-
- if (g_hash_table_lookup_extended(data_set, "frame_nr", NULL, &framenr)) {
- if (GPOINTER_TO_UINT(framenr) != 0)
- cf_goto_frame(&cfile, GPOINTER_TO_UINT(framenr));
- }
- }
-}
-
-#ifdef HAVE_LIBPCAP
-
-static void plugin_if_maintoolbar_get_ws_info(GHashTable * data_set)
-{
- ws_info_t *ws_info = NULL;
- capture_file *cf;
-
- if (!g_hash_table_lookup_extended(data_set, "ws_info", NULL, (void**)&ws_info))
- return;
-
- cf = &cfile;
-
- if (cf->state != FILE_CLOSED) {
- ws_info->ws_info_supported = TRUE;
- ws_info->cf_state = cf->state;
- ws_info->cf_count = cf->count;
-
- g_free(ws_info->cf_filename);
- ws_info->cf_filename = g_strdup(cf->filename);
-
- if (cf->state == FILE_READ_DONE && cf->current_frame) {
- ws_info->cf_framenr = cf->current_frame->num;
- ws_info->frame_passed_dfilter = (cf->current_frame->flags.passed_dfilter == 1);
- } else {
- ws_info->cf_framenr = 0;
- ws_info->frame_passed_dfilter = FALSE;
- }
- } else if (ws_info->cf_state != FILE_CLOSED) {
- /* Initialise the ws_info structure */
- ws_info->ws_info_supported = TRUE;
- ws_info->cf_count = 0;
-
- g_free(ws_info->cf_filename);
- ws_info->cf_filename = NULL;
-
- ws_info->cf_framenr = 0;
- ws_info->frame_passed_dfilter = FALSE;
- ws_info->cf_state = FILE_CLOSED;
- }
-}
-
-#endif /* HAVE_LIBPCAP */
-
-/*
- * Create all toolbars (currently only the main toolbar)
- */
-GtkWidget *
-toolbar_new(void)
-{
- GtkWidget *main_tb;
- GtkWidget *window = top_level;
-
- /* this function should be only called once! */
- g_assert(!toolbar_init);
-
- /* we need to realize the window because we use pixmaps for
- * items on the toolbar in the context of it */
- /* (coming from the gtk example, please don't ask me why ;-) */
- gtk_widget_realize(window);
-
- /* toolbar will be horizontal, with both icons and text (as default here) */
- /* (this will usually be overwritten by the preferences setting) */
- main_tb = gtk_toolbar_new();
- gtk_orientable_set_orientation(GTK_ORIENTABLE(main_tb),
- GTK_ORIENTATION_HORIZONTAL);
-
- g_object_set_data(G_OBJECT(top_level), E_TB_MAIN_KEY, main_tb);
-
-
-#ifdef HAVE_LIBPCAP
- toolbar_item(if_button, main_tb,
- WIRESHARK_STOCK_CAPTURE_INTERFACES, "List the available capture interfaces...", capture_if_cb, NULL);
-
- toolbar_item(capture_options_button, main_tb,
- WIRESHARK_STOCK_CAPTURE_OPTIONS, "Show the capture options...", capture_prep_cb, NULL);
-
- toolbar_item(new_button, main_tb,
- WIRESHARK_STOCK_CAPTURE_START, "Start a new live capture", capture_start_cb, NULL);
-
- toolbar_item(stop_button, main_tb,
- WIRESHARK_STOCK_CAPTURE_STOP, "Stop the running live capture", capture_stop_cb, NULL);
-
- toolbar_item(clear_button, main_tb,
- WIRESHARK_STOCK_CAPTURE_RESTART, "Restart the running live capture", capture_restart_cb, NULL);
-
- toolbar_append_separator(main_tb);
-#endif /* HAVE_LIBPCAP */
-
- toolbar_item(open_button, main_tb,
- GTK_STOCK_OPEN, "Open a capture file...", file_open_cmd_cb, NULL);
-
- toolbar_item(save_button, main_tb,
- WIRESHARK_STOCK_SAVE, "Save this capture file", file_save_cmd_cb, NULL);
-
- toolbar_item(close_button, main_tb,
- GTK_STOCK_CLOSE, "Close this capture file", file_close_cmd_cb, NULL);
-
- toolbar_item(reload_button, main_tb,
- GTK_STOCK_REFRESH, "Reload this capture file", file_reload_cmd_cb, NULL);
-
- toolbar_append_separator(main_tb);
-
- toolbar_item(find_button, main_tb,
- GTK_STOCK_FIND, "Find a packet...", find_frame_cb, NULL);
-
- toolbar_item(history_back_button, main_tb,
- GTK_STOCK_GO_BACK, "Go back in packet history", history_back_cb, NULL);
-
- toolbar_item(history_forward_button, main_tb,
- GTK_STOCK_GO_FORWARD, "Go forward in packet history", history_forward_cb, NULL);
-
- toolbar_item(go_to_button, main_tb,
- GTK_STOCK_JUMP_TO, "Go to the packet with number...", goto_frame_cb, NULL);
-
- toolbar_item(go_to_top_button, main_tb,
- GTK_STOCK_GOTO_TOP, "Go to the first packet", goto_top_frame_cb, NULL);
-
- toolbar_item(go_to_bottom_button, main_tb,
- GTK_STOCK_GOTO_BOTTOM, "Go to the last packet", goto_bottom_frame_cb, NULL);
-
- toolbar_append_separator(main_tb);
-
- toolbar_toggle_button(colorize_button, window, main_tb,
- WIRESHARK_STOCK_COLORIZE, "Colorize Packet List", colorize_toggle_cb, NULL);
-
-#ifdef HAVE_LIBPCAP
- toolbar_toggle_button(autoscroll_button, window, main_tb,
- WIRESHARK_STOCK_AUTOSCROLL, "Auto Scroll Packet List in Live Capture", auto_scroll_live_toggle_cb, NULL);
-#endif
-
- toolbar_append_separator(main_tb);
-
- toolbar_item(zoom_in_button, main_tb,
- GTK_STOCK_ZOOM_IN, "Zoom in", view_zoom_in_cb, NULL);
-
- toolbar_item(zoom_out_button, main_tb,
- GTK_STOCK_ZOOM_OUT, "Zoom out", view_zoom_out_cb, NULL);
-
- toolbar_item(zoom_100_button, main_tb,
- GTK_STOCK_ZOOM_100, "Zoom 100%", view_zoom_100_cb, NULL);
-
- toolbar_item(resize_columns_button, main_tb,
- WIRESHARK_STOCK_RESIZE_COLUMNS, "Resize All Columns", packet_list_resize_columns_cb, NULL);
-
- toolbar_append_separator(main_tb);
-
-#ifdef HAVE_LIBPCAP
- toolbar_item(capture_filter_button, main_tb,
- WIRESHARK_STOCK_CAPTURE_FILTER, "Edit capture filter...", cfilter_dialog_cb, NULL);
-#endif /* HAVE_LIBPCAP */
-
- toolbar_item(display_filter_button, main_tb,
- WIRESHARK_STOCK_DISPLAY_FILTER, "Edit/apply display filter...", dfilter_dialog_cb, NULL);
-
- toolbar_item(color_display_button, main_tb,
- GTK_STOCK_SELECT_COLOR, "Edit coloring rules...", color_display_cb, NULL);
-
- /* the preference button uses its own Stock icon label "Prefs", as "Preferences" is too long */
- toolbar_item(prefs_button, main_tb,
- GTK_STOCK_PREFERENCES, "Edit preferences...", prefs_cb, NULL);
-
- toolbar_append_separator(main_tb);
-
- toolbar_item(help_button, main_tb,
- GTK_STOCK_HELP, "Show some help...", topic_cb, GINT_TO_POINTER(HELP_CONTENT));
-
- /* disable all "sensitive" items by default */
- toolbar_init = TRUE;
- set_toolbar_for_captured_packets(FALSE);
- set_toolbar_for_capture_file(NULL);
-#ifdef HAVE_LIBPCAP
- set_toolbar_for_capture_in_progress(FALSE);
-#endif /* HAVE_LIBPCAP */
-
- /* make current preferences effective */
- toolbar_redraw_all();
-
- plugin_if_register_gui_cb(PLUGIN_IF_GOTO_FRAME, plugin_if_maintoolbar_goto_frame);
-#ifdef HAVE_LIBPCAP
- plugin_if_register_gui_cb(PLUGIN_IF_GET_WS_INFO, plugin_if_maintoolbar_get_ws_info);
-#endif /* HAVE_LIBPCAP */
-
- return main_tb;
-}
-
-void
-set_toolbar_object_data(const gchar *key, gpointer data)
-{
- g_object_set_data(G_OBJECT(open_button), key, data);
- g_object_set_data(G_OBJECT(reload_button), key, data);
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/main_toolbar.h b/ui/gtk/main_toolbar.h
deleted file mode 100644
index 7d2fba83a8..0000000000
--- a/ui/gtk/main_toolbar.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* main_toolbar.h
- * Definitions for toolbar utility routines
- * Copyright 2003, Ulf Lamping <ulf.lamping@web.de>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __TOOLBAR_H__
-#define __TOOLBAR_H__
-
-
-/** @file
- * The main toolbar.
- * @ingroup main_window_group
- */
-
-/** Redraw the main toolbar. Used, when user changes preferences. */
-void toolbar_redraw_all(void);
-
-/** Set object data of some buttons (where needed). It's needed so callback
- * functions can read back their required data. Acts like g_object_set_data()
- * on multiple buttons.
- *
- * @param key the key
- * @param data the data to set
- */
-void set_toolbar_object_data(const gchar *key, gpointer data);
-
-void set_start_button_sensitive(gboolean enable);
-void set_menus_capture_start_sensitivity(gboolean enable);
-
-#endif /* __TOOLBAR_H__ */
diff --git a/ui/gtk/main_toolbar_private.h b/ui/gtk/main_toolbar_private.h
deleted file mode 100644
index 7b9a93f7fd..0000000000
--- a/ui/gtk/main_toolbar_private.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* main_toolbar_private.h
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __MAIN_TOLBAR_PRIVATE_H__
-#define __MAIN_TOLBAR_PRIVATE_H__
-
-/*** PRIVATE INTERFACE BETWEEN main.c AND main_toolbar.c DON'T USE OR TOUCH :-)*/
-
-/** Create the main toolbar.
- * @return the new toolbar
- */
-GtkWidget *toolbar_new(void);
-
-/** We have (or don't have) a capture in progress now.
- *
- * @param have_capture_file TRUE, if we have a capture in progress file
- */
-void set_toolbar_for_capture_in_progress(gboolean have_capture_file);
-
-/** The capture is in the process of being stopped.
- */
-void set_toolbar_for_capture_stopping(void);
-
-/** We have (or don't have) captured packets now.
- *
- * @param have_captured_packets TRUE, if we have captured packets
- */
-void set_toolbar_for_captured_packets(gboolean have_captured_packets);
-
-/** The packet history has changed, we need to update the menu.
- *
- * @param back_history some back history entries available
- * @param forward_history some forward history entries available
- */
-void set_toolbar_for_packet_history(gboolean back_history, gboolean forward_history);
-
-/** The "Colorize Packet List" option has changed.
- */
-void toolbar_colorize_changed(gboolean packet_list_colorize);
-
-#ifdef HAVE_LIBPCAP
-/** The "Auto Scroll in Live Capture" option has changed.
- */
-void toolbar_auto_scroll_live_changed(gboolean auto_scroll_live);
-#endif
-
-/* Enable or disable toolbar items based on whether you have a capture file
- * and, if so, whether you've finished reading it and whether there's stuff
- * in it that hasn't yet been saved to a permanent file.
- * @param cf cfile_t for the capture file in question
- */
-void set_toolbar_for_capture_file(capture_file *cf);
-
-#endif /* __MAIN_TOOLBAR_PRIVATE_H__ */
diff --git a/ui/gtk/main_welcome.c b/ui/gtk/main_welcome.c
deleted file mode 100644
index 41f332c243..0000000000
--- a/ui/gtk/main_welcome.c
+++ /dev/null
@@ -1,1580 +0,0 @@
-/* main_welcome.c
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <errno.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/prefs.h>
-
-#ifdef HAVE_LIBPCAP
-#include "ui/capture.h"
-#include "capture_opts.h"
-#endif
-
-#include <wsutil/file_util.h>
-#include <wsutil/str_util.h>
-#include <wsutil/glib-compat.h>
-#include <version_info.h>
-
-#ifdef HAVE_LIBPCAP
-#include "ui/capture_ui_utils.h"
-#include "ui/iface_lists.h"
-#include "ui/capture_globals.h"
-#endif
-#include "ui/recent.h"
-#include "ui/simple_dialog.h"
-#include <wsutil/utf8_entities.h>
-#include "ui/ws_ui_util.h"
-
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/color_utils.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/menus.h"
-#include "ui/gtk/main_welcome.h"
-#include "ui/gtk/main_welcome_private.h"
-#include "ui/gtk/main_toolbar.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/capture_file_dlg.h"
-#include "ui/gtk/stock_icons.h"
-#ifndef HAVE_GDK_GRESOURCE
-#include "ui/gtk/pixbuf-csource.h"
-#endif
-
-#ifdef HAVE_LIBPCAP
-#include "ui/gtk/capture_dlg.h"
-#include "ui/gtk/capture_if_dlg.h"
-#if GTK_CHECK_VERSION(2,18,0)
-#include "ui/gtk/webbrowser.h"
-#endif
-#endif /* HAVE_LIBPCAP */
-
-#ifdef _WIN32
-#include <tchar.h>
-#include <windows.h>
-#endif
-
-#ifdef HAVE_AIRPCAP
-#include <caputils/airpcap.h>
-#include <caputils/airpcap_loader.h>
-#include "airpcap_gui_utils.h"
-#endif
-
-#include "file.h"
-
-/* XXX */
-static GtkWidget *welcome_hb = NULL;
-static GtkWidget *header_lb = NULL;
-/* Foreground colors are set using Pango markup */
-#if GTK_CHECK_VERSION(3,0,0)
-static GdkRGBA rgba_welcome_bg = {0.901, 0.901, 0.901, 1.0 };
-static GdkRGBA rgba_header_bar_bg = { 0.094, 0.360, 0.792, 1.0 };
-static GdkRGBA rgba_topic_header_bg = { 0.004, 0.224, 0.745, 1.0 };
-static GdkRGBA rgba_topic_content_bg = { 1, 1, 1, 1.0 };
-static GdkRGBA rgba_topic_item_idle_bg;
-static GdkRGBA rgba_topic_item_entered_bg = { 0.827, 0.847, 0.854, 1.0 };
-#else
-static GdkColor welcome_bg = { 0, 0xe6e6, 0xe6e6, 0xe6e6 };
-static GdkColor header_bar_bg = { 0, 0x1818, 0x5c5c, 0xcaca };
-static GdkColor topic_header_bg = { 0, 0x0101, 0x3939, 0xbebe };
-static GdkColor topic_content_bg = { 0, 0xffff, 0xffff, 0xffff };
-static GdkColor topic_item_idle_bg;
-static GdkColor topic_item_entered_bg = { 0, 0xd3d3, 0xd8d8, 0xdada };
-#endif
-static GtkWidget *welcome_file_panel_vb = NULL;
-#ifdef HAVE_LIBPCAP
-static GtkWidget *if_view = NULL; /* contains a view (list) of all the interfaces */
-static GtkWidget *if_scrolled_window; /* a scrolled window that contains the if_view */
-#endif
-
-static GSList *status_messages = NULL;
-
-static GMutex *recent_mtx;
-
-#ifdef HAVE_LIBPCAP
-static void capture_if_start(GtkWidget *w _U_, gpointer data _U_);
-#if GTK_CHECK_VERSION(2,18,0)
-static gboolean activate_link_cb(GtkLabel *label _U_, gchar *uri, gpointer user_data _U_);
-#endif
-#endif
-
-/* The "scroll box dynamic" is a (complicated) pseudo widget to */
-/* place a vertically list of widgets in (currently the interfaces and recent files). */
-/* Once this list get's higher than a specified amount, */
-/* it is moved into a scrolled_window. */
-/* This is all complicated, the scrolled window is a bit ugly, */
-/* the sizes might not be the same on all systems, ... */
-/* ... but that's the best what we currently have */
-#define SCROLL_BOX_CHILD_BOX "ScrollBoxDynamic_ChildBox"
-#define SCROLL_BOX_MAX_CHILDS "ScrollBoxDynamic_MaxChilds"
-#define SCROLL_BOX_SCROLLW_Y_SIZE "ScrollBoxDynamic_Scrollw_Y_Size"
-#define SCROLL_BOX_SCROLLW "ScrollBoxDynamic_Scrollw"
-#define TREE_VIEW_INTERFACES "TreeViewInterfaces"
-#define CAPTURE_VIEW "CaptureView"
-#define CAPTURE_LABEL "CaptureLabel"
-#define CAPTURE_HB_BOX_INTERFACE_LIST "CaptureHorizontalBoxInterfaceList"
-#define CAPTURE_HB_BOX_START "CaptureHorizontalBoxStart"
-#define CAPTURE_HB_BOX_CAPTURE "CaptureHorizontalBoxCapture"
-#define CAPTURE_HB_BOX_REFRESH "CaptureHorizontalBoxRefresh"
-
-#ifdef HAVE_LIBPCAP
-static void
-welcome_header_push_msg(const gchar *msg_format, ...)
- G_GNUC_PRINTF(1, 2);
-#endif
-
-static GtkWidget *
-scroll_box_dynamic_new(GtkWidget *child_box, guint max_childs, guint scrollw_y_size) {
- GtkWidget * parent_box;
-
-
- parent_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(parent_box), GTK_WIDGET(child_box), TRUE, TRUE, 0);
- g_object_set_data(G_OBJECT(parent_box), SCROLL_BOX_CHILD_BOX, child_box);
- g_object_set_data(G_OBJECT(parent_box), SCROLL_BOX_MAX_CHILDS, GINT_TO_POINTER(max_childs));
- g_object_set_data(G_OBJECT(parent_box), SCROLL_BOX_SCROLLW_Y_SIZE, GINT_TO_POINTER(scrollw_y_size));
- gtk_widget_show_all(parent_box);
-
- return parent_box;
-}
-
-
-static GtkWidget *
-scroll_box_dynamic_add(GtkWidget *parent_box)
-{
- GtkWidget *child_box;
- GtkWidget *scrollw;
- guint max_cnt;
- guint curr_cnt;
- guint scrollw_y_size;
- GList *childs;
-
- child_box = (GtkWidget *)g_object_get_data(G_OBJECT(parent_box), SCROLL_BOX_CHILD_BOX);
- max_cnt = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(parent_box), SCROLL_BOX_MAX_CHILDS));
-
- /* get the current number of children */
- childs = gtk_container_get_children(GTK_CONTAINER(child_box));
- curr_cnt = g_list_length(childs);
- g_list_free(childs);
-
- /* have we just reached the max? */
- if(curr_cnt == max_cnt) {
- /* create the scrolled window */
- /* XXX - there's no way to get rid of the shadow frame - except for creating an own widget :-( */
- scrollw = scrolled_window_new(NULL, NULL);
- scrollw_y_size = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(parent_box), SCROLL_BOX_SCROLLW_Y_SIZE));
- gtk_widget_set_size_request(scrollw, -1, scrollw_y_size);
-
- g_object_set_data(G_OBJECT(parent_box), SCROLL_BOX_SCROLLW, scrollw);
- gtk_box_pack_start(GTK_BOX(parent_box), scrollw, TRUE, TRUE, 0);
-
- /* move child_box from parent_box into scrolled window */
- g_object_ref(child_box);
- gtk_container_remove(GTK_CONTAINER(parent_box), child_box);
-#if ! GTK_CHECK_VERSION(3,8,0)
- gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrollw), child_box);
-#else
- gtk_container_add(GTK_CONTAINER(scrollw), child_box);
-#endif
- gtk_widget_show_all(scrollw);
- }
-
- return child_box;
-}
-
-
-static GtkWidget *
-scroll_box_dynamic_reset(GtkWidget *parent_box)
-{
- GtkWidget *child_box, *scrollw;
-
-
- child_box = (GtkWidget *)g_object_get_data(G_OBJECT(parent_box), SCROLL_BOX_CHILD_BOX);
- scrollw = (GtkWidget *)g_object_get_data(G_OBJECT(parent_box), SCROLL_BOX_SCROLLW);
-
- if(scrollw != NULL) {
- /* move the child_box back from scrolled window into the parent_box */
- g_object_ref(child_box);
- gtk_container_remove(GTK_CONTAINER(parent_box), scrollw);
- g_object_set_data(G_OBJECT(parent_box), SCROLL_BOX_SCROLLW, NULL);
- gtk_box_pack_start(GTK_BOX(parent_box), child_box, TRUE, TRUE, 0);
- }
-
- return child_box;
-}
-
-
-/* mouse entered this widget - change background color */
-static gboolean
-welcome_item_enter_cb(GtkWidget *eb, GdkEventCrossing *event _U_, gpointer user_data _U_)
-{
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_override_background_color(eb, GTK_STATE_FLAG_NORMAL, &rgba_topic_item_entered_bg);
-#else
- gtk_widget_modify_bg(eb, GTK_STATE_NORMAL, &topic_item_entered_bg);
-#endif
- return FALSE;
-}
-
-
-/* mouse has left this widget - change background color */
-static gboolean
-welcome_item_leave_cb(GtkWidget *eb, GdkEventCrossing *event _U_, gpointer user_data _U_)
-{
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_override_background_color(eb, GTK_STATE_FLAG_NORMAL, &rgba_topic_item_idle_bg);
-#else
- gtk_widget_modify_bg(eb, GTK_STATE_NORMAL, &topic_item_idle_bg);
-#endif
- return FALSE;
-}
-
-
-typedef gboolean (*welcome_button_callback_t) (GtkWidget *widget,
- GdkEventButton *event,
- gpointer user_data);
-
-/* create a "button widget" */
-static GtkWidget *
-welcome_button(const gchar *stock_item,
- const gchar *title, const gchar *subtitle, const gchar *tooltip,
- welcome_button_callback_t welcome_button_callback, gpointer welcome_button_callback_data)
-{
- GtkWidget *eb, *w, *item_hb, *text_vb;
- gchar *formatted_text;
-
- item_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1, FALSE);
-
- /* event box (for background color and events) */
- eb = gtk_event_box_new();
- gtk_container_add(GTK_CONTAINER(eb), item_hb);
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_override_background_color(eb, GTK_STATE_FLAG_NORMAL, &rgba_topic_item_idle_bg);
-#else
- gtk_widget_modify_bg(eb, GTK_STATE_NORMAL, &topic_item_idle_bg);
-#endif
- if(tooltip != NULL) {
- gtk_widget_set_tooltip_text(eb, tooltip);
- }
-
- g_signal_connect(eb, "enter-notify-event", G_CALLBACK(welcome_item_enter_cb), NULL);
- g_signal_connect(eb, "leave-notify-event", G_CALLBACK(welcome_item_leave_cb), NULL);
- g_signal_connect(eb, "button-release-event", G_CALLBACK(welcome_button_callback), welcome_button_callback_data);
-
- /* icon */
- w = ws_gtk_image_new_from_stock(stock_item, GTK_ICON_SIZE_LARGE_TOOLBAR);
- gtk_box_pack_start(GTK_BOX(item_hb), w, FALSE, FALSE, 5);
-
- text_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
-
- /* title */
- w = gtk_label_new(title);
- gtk_misc_set_alignment (GTK_MISC(w), 0.0f, 0.5f);
- formatted_text = g_strdup_printf("<span weight=\"bold\" size=\"x-large\" foreground=\"black\">%s</span>", title);
- gtk_label_set_markup(GTK_LABEL(w), formatted_text);
- g_free(formatted_text);
- gtk_box_pack_start(GTK_BOX(text_vb), w, FALSE, FALSE, 1);
-
- /* subtitle */
- w = gtk_label_new(subtitle);
- gtk_misc_set_alignment (GTK_MISC(w), 0.0f, 0.5f);
- formatted_text = g_strdup_printf("<span size=\"small\" foreground=\"black\">%s</span>", subtitle);
- gtk_label_set_markup(GTK_LABEL(w), formatted_text);
- g_free(formatted_text);
- gtk_box_pack_start(GTK_BOX(text_vb), w, FALSE, FALSE, 1);
-
- gtk_box_pack_start(GTK_BOX(item_hb), text_vb, TRUE, TRUE, 5);
-
- return eb;
-}
-
-
-/* Hack to handle welcome-button "button-release-event" callback */
-/* 1. Dispatch to desired actual callback */
-/* 2. Return TRUE for the event callback. */
-/* user_data: actual (no arg) callback fcn to be invoked. */
-static gboolean
-welcome_button_callback_helper(GtkWidget *w, GdkEventButton *event _U_, gpointer user_data)
-{
- void (*funct)(GtkWidget *, gpointer) = (void (*)(GtkWidget *,gpointer))user_data;
- (*funct)(w, NULL);
- return TRUE;
-}
-
-
-void
-welcome_header_set_message(gchar *msg) {
- GString *message;
- time_t secs = time(NULL);
- struct tm *now = localtime(&secs);
-
- message = g_string_new("<span weight=\"bold\" size=\"x-large\" foreground=\"white\">");
-
- if (msg) {
- g_string_append(message, msg);
- } else { /* Use our default header */
- if (now != NULL && ((now->tm_mon == 3 && now->tm_mday == 1) || (now->tm_mon == 6 && now->tm_mday == 14))) {
- g_string_append(message, "Sniffing the glue that holds the Internet together");
- } else {
- g_string_append(message, prefs.gui_start_title);
- }
-
- if ((prefs.gui_version_placement == version_welcome_only) ||
- (prefs.gui_version_placement == version_both)) {
- g_string_append_printf(message, "</span>\n<span size=\"large\" foreground=\"white\">Version %s",
- get_ws_vcs_version_info());
- }
- }
-
- g_string_append(message, "</span>");
-
- gtk_label_set_markup(GTK_LABEL(header_lb), message->str);
- g_string_free(message, TRUE);
-}
-
-
-/* create the banner "above our heads" */
-static GtkWidget *
-welcome_header_new(void)
-{
- GtkWidget *item_vb;
- GtkWidget *item_hb;
- GtkWidget *eb;
- GtkWidget *icon;
-
- item_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
-
- /* colorize vbox */
- eb = gtk_event_box_new();
- gtk_container_add(GTK_CONTAINER(eb), item_vb);
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_override_background_color(eb, GTK_STATE_FLAG_NORMAL, &rgba_header_bar_bg);
-#else
- gtk_widget_modify_bg(eb, GTK_STATE_NORMAL, &header_bar_bg);
-#endif
- item_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(item_vb), item_hb, FALSE, FALSE, 10);
-
-#ifdef HAVE_GDK_GRESOURCE
- icon = pixbuf_to_widget("/org/wireshark/image/wssplash_dev.png");
-#else
- icon = pixbuf_to_widget(wssplash_pb_data);
-#endif
- gtk_box_pack_start(GTK_BOX(item_hb), icon, FALSE, FALSE, 10);
-
- header_lb = gtk_label_new(NULL);
- welcome_header_set_message(NULL);
- gtk_label_set_selectable(GTK_LABEL(header_lb), TRUE);
- gtk_misc_set_alignment(GTK_MISC(header_lb), 0.0f, 0.5f);
- gtk_box_pack_start(GTK_BOX(item_hb), header_lb, TRUE, TRUE, 5);
-
- gtk_widget_show_all(eb);
-
- return eb;
-}
-
-#ifdef HAVE_LIBPCAP
-static void
-welcome_header_push_msg(const gchar *msg_format, ...) {
- va_list ap;
- gchar *msg;
-
- va_start(ap, msg_format);
- msg = g_strdup_vprintf(msg_format, ap);
- va_end(ap);
-
- status_messages = g_slist_append(status_messages, msg);
-
- welcome_header_set_message(msg);
-
- gtk_widget_hide(welcome_hb);
-}
-#endif
-
-
-static void
-welcome_header_pop_msg(void) {
- gchar *msg = NULL;
-
- if (status_messages) {
- g_free(status_messages->data);
- status_messages = g_slist_delete_link(status_messages, status_messages);
- }
-
- if (status_messages) {
- msg = (gchar *)status_messages->data;
- }
-
- welcome_header_set_message(msg);
-
- if (!status_messages) {
- gtk_widget_show(welcome_hb);
- }
-}
-
-
-/* create a "topic header widget" */
-static GtkWidget *
-welcome_topic_header_new(const char *header)
-{
- GtkWidget *w;
- GtkWidget *eb;
- gchar *formatted_message;
-
-
- w = gtk_label_new(header);
- formatted_message = g_strdup_printf("<span weight=\"bold\" size=\"x-large\" foreground=\"white\">%s</span>", header);
- gtk_label_set_markup(GTK_LABEL(w), formatted_message);
- g_free(formatted_message);
-
- /* colorize vbox */
- eb = gtk_event_box_new();
- gtk_container_add(GTK_CONTAINER(eb), w);
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_override_background_color(eb, GTK_STATE_FLAG_NORMAL, &rgba_topic_header_bg);
-#else
- gtk_widget_modify_bg(eb, GTK_STATE_NORMAL, &topic_header_bg);
-#endif
- return eb;
-}
-
-
-/* create a "topic widget" */
-static GtkWidget *
-welcome_topic_new(const char *header, GtkWidget **to_fill)
-{
- GtkWidget *topic_vb;
- GtkWidget *layout_vb;
- GtkWidget *topic_eb;
- GtkWidget *topic_header;
-
-
- topic_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
-
- topic_header = welcome_topic_header_new(header);
- gtk_box_pack_start(GTK_BOX(topic_vb), topic_header, FALSE, FALSE, 0);
-
- layout_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 5, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(layout_vb), 10);
- gtk_box_pack_start(GTK_BOX(topic_vb), layout_vb, FALSE, FALSE, 0);
-
- /* colorize vbox (we need an event box for this!) */
- topic_eb = gtk_event_box_new();
- gtk_container_add(GTK_CONTAINER(topic_eb), topic_vb);
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_override_background_color(topic_eb, GTK_STATE_FLAG_NORMAL, &rgba_topic_content_bg);
-#else
- gtk_widget_modify_bg(topic_eb, GTK_STATE_NORMAL, &topic_content_bg);
-#endif
- *to_fill = layout_vb;
-
- return topic_eb;
-}
-
-
-/* a file link was pressed */
-static gboolean
-welcome_filename_link_press_cb(GtkWidget *widget _U_, GdkEventButton *event _U_, gpointer data)
-{
- menu_open_filename((gchar *)data);
-
- return FALSE;
-}
-
-typedef struct _recent_item_status {
- gchar *filename;
- GtkWidget *label;
- GObject *menu_item;
- GString *str;
- gboolean stat_done;
- int err;
- guint timer;
-} recent_item_status;
-
-/*
- * Fetch the status of a file.
- * This function might be called as a thread. We can't use any drawing
- * routines here: https://developer.gnome.org/gdk3/stable/gdk3-Threads.html
- */
-static void *
-get_recent_item_status(void *data)
-{
- recent_item_status *ri_stat = (recent_item_status *) data;
- ws_statb64 stat_buf;
- gchar *size_str;
- int err;
-
- if (!ri_stat) {
- return NULL;
- }
-
- /*
- * Add file size. We use binary prefixes instead of IEC because that's what
- * most OSes use.
- */
- err = ws_stat64(ri_stat->filename, &stat_buf);
- g_mutex_lock(recent_mtx);
- ri_stat->err = err;
- if(err == 0) {
- size_str = format_size(stat_buf.st_size, (format_size_flags_e)(format_size_unit_bytes|format_size_prefix_si));
-
- /* pango format string */
- g_string_prepend(ri_stat->str, "<span foreground='blue'>");
- g_string_append_printf(ri_stat->str, " (%s)</span>", size_str);
- g_free(size_str);
- } else {
- g_string_append(ri_stat->str, " [not found]");
- }
-
- if (!ri_stat->label) { /* The widget went away while we were busy. */
- g_free(ri_stat->filename);
- g_string_free(ri_stat->str, TRUE);
- g_free(ri_stat);
- } else {
- ri_stat->stat_done = TRUE;
- }
- g_mutex_unlock(recent_mtx);
-
- return NULL;
-}
-
-/* Timeout callback for recent items */
-static gboolean
-update_recent_items(gpointer data)
-{
- recent_item_status *ri_stat = (recent_item_status *) data;
- gboolean again = TRUE;
-
- if (!ri_stat) {
- return FALSE;
- }
-
- g_mutex_lock(recent_mtx);
- if (ri_stat->stat_done) {
- again = FALSE;
- gtk_label_set_markup(GTK_LABEL(ri_stat->label), ri_stat->str->str);
- if (ri_stat->err == 0) {
- gtk_widget_set_sensitive(ri_stat->label, TRUE);
- gtk_action_set_sensitive((GtkAction *) ri_stat->menu_item, TRUE);
- }
- ri_stat->timer = 0;
- }
- /* Else append some sort of Unicode or ASCII animation to the label? */
- g_mutex_unlock(recent_mtx);
- return again;
-}
-
-static void welcome_filename_destroy_cb(GtkWidget *w _U_, gpointer data) {
- recent_item_status *ri_stat = (recent_item_status *) data;
-
- if (!ri_stat) {
- return;
- }
-
- g_mutex_lock(recent_mtx);
- if (ri_stat->timer) {
- g_source_remove(ri_stat->timer);
- ri_stat->timer = 0;
- }
-
- g_object_unref(ri_stat->menu_item);
-
- if (ri_stat->stat_done) {
- g_free(ri_stat->filename);
- g_string_free(ri_stat->str, TRUE);
- g_free(ri_stat);
- } else {
- ri_stat->label = NULL;
- }
- g_mutex_unlock(recent_mtx);
-}
-
-/* create a "file link widget" */
-static GtkWidget *
-welcome_filename_link_new(const gchar *filename, GtkWidget **label, GObject *menu_item)
-{
- GtkWidget *w;
- GtkWidget *eb;
- GString *str;
- gchar *str_escaped;
- glong uni_len;
- gsize uni_start, uni_end;
- const glong max = 60;
- recent_item_status *ri_stat;
-
- /* filename */
- str = g_string_new(filename);
- uni_len = g_utf8_strlen(str->str, str->len);
-
- /* cut max filename length */
- if (uni_len > max) {
- uni_start = g_utf8_offset_to_pointer(str->str, 20) - str->str;
- uni_end = g_utf8_offset_to_pointer(str->str, uni_len - max) - str->str;
- g_string_erase(str, uni_start, uni_end);
- g_string_insert(str, uni_start, " " UTF8_HORIZONTAL_ELLIPSIS " ");
- }
-
- /* escape the possibly shortened filename before adding pango language */
- str_escaped=g_markup_escape_text(str->str, -1);
- g_string_free(str, TRUE);
-
- /* label */
- w = gtk_label_new(str_escaped);
- *label = w;
- gtk_misc_set_padding(GTK_MISC(w), 5, 2);
- gtk_misc_set_alignment (GTK_MISC(w), 0.0f, 0.0f);
- gtk_widget_set_sensitive(w, FALSE);
-
- ri_stat = (recent_item_status *)g_malloc(sizeof(recent_item_status));
- ri_stat->filename = g_strdup(filename);
- ri_stat->label = w;
- ri_stat->menu_item = menu_item;
- ri_stat->str = g_string_new(str_escaped);
- ri_stat->stat_done = FALSE;
- ri_stat->timer = 0;
- g_object_ref(G_OBJECT(menu_item));
- g_signal_connect(w, "destroy", G_CALLBACK(welcome_filename_destroy_cb), ri_stat);
- g_free(str_escaped);
-
- /* XXX - Add the filename here? */
- g_thread_new("Recent item status", get_recent_item_status, ri_stat);
- ri_stat->timer = g_timeout_add(200, update_recent_items, ri_stat);
-
- /* event box */
- eb = gtk_event_box_new();
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_override_background_color(eb, GTK_STATE_FLAG_NORMAL, &rgba_topic_item_idle_bg);
-#else
- gtk_widget_modify_bg(eb, GTK_STATE_NORMAL, &topic_item_idle_bg);
-#endif
- gtk_container_add(GTK_CONTAINER(eb), w);
- gtk_widget_set_tooltip_text(eb, filename);
-
- g_signal_connect(eb, "enter-notify-event", G_CALLBACK(welcome_item_enter_cb), w);
- g_signal_connect(eb, "leave-notify-event", G_CALLBACK(welcome_item_leave_cb), w);
- g_signal_connect(eb, "button-press-event", G_CALLBACK(welcome_filename_link_press_cb), (gchar *) filename);
-
- return eb;
-}
-
-
-/* reset the list of recent files */
-void
-main_welcome_reset_recent_capture_files(void)
-{
- GtkWidget *child_box;
- GList* child_list;
- GList* child_list_item;
-
-
- if(welcome_file_panel_vb) {
- child_box = scroll_box_dynamic_reset(welcome_file_panel_vb);
- child_list = gtk_container_get_children(GTK_CONTAINER(child_box));
- child_list_item = child_list;
-
- while(child_list_item) {
- gtk_container_remove(GTK_CONTAINER(child_box), (GtkWidget *)child_list_item->data);
- child_list_item = g_list_next(child_list_item);
- }
-
- g_list_free(child_list);
- }
-}
-
-
-/* add a new file to the list of recent files */
-void
-main_welcome_add_recent_capture_file(const char *widget_cf_name, GObject *menu_item)
-{
- GtkWidget *w;
- GtkWidget *child_box;
- GtkWidget *label;
-
-
- w = welcome_filename_link_new(widget_cf_name, &label, menu_item);
- child_box = scroll_box_dynamic_add(welcome_file_panel_vb);
- gtk_box_pack_start(GTK_BOX(child_box), w, FALSE, FALSE, 0);
- gtk_widget_show_all(w);
- gtk_widget_show_all(child_box);
-}
-
-#ifdef HAVE_LIBPCAP
-static gboolean
-on_selection_changed(GtkTreeSelection *selection _U_,
- GtkTreeModel *model,
- GtkTreePath *path,
- gboolean path_currently_selected,
- gpointer data _U_)
-{
- GtkTreeIter iter;
- gchar *if_name;
- guint i;
- interface_t device;
-
- gtk_tree_model_get_iter (model, &iter, path);
- gtk_tree_model_get (model, &iter, IFACE_NAME, &if_name, -1);
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- if (strcmp(device.name, if_name) == 0) {
- if (path_currently_selected) {
- if (device.selected) {
- device.selected = FALSE;
- global_capture_opts.num_selected--;
- }
- } else {
- if (!device.selected) {
- device.selected = TRUE;
- global_capture_opts.num_selected++;
- }
- }
- if (capture_dlg_window_present()) {
- enable_selected_interface(g_strdup(if_name), device.selected);
- }
- if (interfaces_dialog_window_present()) {
- update_selected_interface(g_strdup(if_name));
- }
- global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, i);
- g_array_insert_val(global_capture_opts.all_ifaces, i, device);
- break;
- }
- }
- set_sensitivity_for_start_icon();
- return TRUE;
-}
-
-void
-set_sensitivity_for_start_icon(void)
-{
-#ifdef HAVE_LIBPCAP
- gboolean enable = (global_capture_opts.num_selected > 0);
-
- set_start_button_sensitive(enable);
- set_menus_capture_start_sensitivity(enable);
-#endif
-}
-
-static gboolean
-activate_ifaces(GtkTreeModel *model, GtkTreePath *path _U_, GtkTreeIter *iter,
- gpointer userdata)
-{
- gchar *if_name;
- GtkWidget *view;
- GtkTreeSelection *selection;
- selected_name_t *entry = (selected_name_t *)userdata;
-
- view = (GtkWidget *)g_object_get_data(G_OBJECT(welcome_hb), TREE_VIEW_INTERFACES);
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
- gtk_tree_model_get (model, iter, IFACE_NAME, &if_name, -1);
- if (strcmp(if_name, entry->name) == 0) {
- if (entry->activate) {
- gtk_tree_selection_select_iter(selection, iter);
- } else {
- gtk_tree_selection_unselect_iter(selection, iter);
- }
- return TRUE;
- }
- return FALSE;
-}
-
-void
-change_interface_selection(gchar* name, gboolean activate)
-{
- GtkWidget *view;
- GtkTreeModel *model;
- selected_name_t entry;
-
- view = (GtkWidget *)g_object_get_data(G_OBJECT(welcome_hb), TREE_VIEW_INTERFACES);
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
- entry.name = g_strdup(name);
- entry.activate = activate;
- gtk_tree_model_foreach(GTK_TREE_MODEL(model), (GtkTreeModelForeachFunc)(activate_ifaces), (gpointer) &entry);
-}
-
-void
-change_selection_for_all(gboolean enable)
-{
- guint i;
- gboolean all = FALSE;
- 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);
- all = strcmp(device.name, "any");
- if (all) {
- change_interface_selection(device.name, enable);
- } else {
- change_interface_selection(device.name, FALSE);
- }
- }
-}
-#endif
-
-#ifdef HAVE_LIBPCAP
-void
-change_interface_name(gchar *oldname, guint indx)
-{
- GtkWidget *view;
- GtkTreeModel *model;
- GtkTreeIter iter;
- interface_t device;
- GtkTreeSelection *entry;
- gchar *optname;
-
- view = (GtkWidget *)g_object_get_data(G_OBJECT(welcome_hb), TREE_VIEW_INTERFACES);
- entry = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
-
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, indx);
- if (gtk_tree_model_get_iter_first (model, &iter)) {
- do {
- gtk_tree_model_get(model, &iter, IFACE_NAME, &optname, -1);
- if (strcmp(optname, oldname) == 0) {
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, ICON, gtk_image_get_pixbuf(GTK_IMAGE(capture_get_if_icon(&device))), IFACE_DESCR, device.display_name, IFACE_NAME, device.name, -1);
- if (device.selected) {
- gtk_tree_selection_select_iter(entry, &iter);
- }
- break;
- }
- } while (gtk_tree_model_iter_next(model, &iter));
- g_free(optname);
- }
-}
-#endif
-
-#ifdef HAVE_PCAP_REMOTE
-void
-add_interface_to_list(guint indx)
-{
- GtkWidget *view, *icon;
- GtkTreeModel *model;
- GtkTreeIter iter;
- gint size;
- gchar *lines;
- interface_t device;
-
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, indx);
-#ifdef HAVE_GDK_GRESOURCE
- icon = pixbuf_to_widget("/org/wireshark/image/toolbar/remote_sat_16.png");
-#else
- icon = pixbuf_to_widget(remote_sat_pb_data);
-#endif
- view = (GtkWidget *)g_object_get_data(G_OBJECT(welcome_hb), TREE_VIEW_INTERFACES);
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
- size = gtk_tree_model_iter_n_children(model, NULL);
- lines = g_strdup_printf("%d", size-1);
- if (gtk_tree_model_get_iter_from_string(model, &iter, lines)) {
- gtk_list_store_append (GTK_LIST_STORE(model), &iter);
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, ICON, gtk_image_get_pixbuf(GTK_IMAGE(icon)), IFACE_DESCR, device.display_name, IFACE_NAME, device.name, -1);
- }
-}
-#endif
-
-#ifdef HAVE_LIBPCAP
-static void
-clear_capture_box(void)
-{
- GtkWidget *item_hb;
-
- item_hb = (GtkWidget *)g_object_get_data(G_OBJECT(welcome_hb), CAPTURE_HB_BOX_INTERFACE_LIST);
- if (item_hb) {
- gtk_widget_destroy(item_hb);
- }
- item_hb = (GtkWidget *)g_object_get_data(G_OBJECT(welcome_hb), CAPTURE_HB_BOX_START);
- if (item_hb) {
- gtk_widget_destroy(item_hb);
- }
- item_hb = (GtkWidget *)g_object_get_data(G_OBJECT(welcome_hb), CAPTURE_HB_BOX_CAPTURE);
- if (item_hb) {
- gtk_widget_destroy(item_hb);
- }
- item_hb = (GtkWidget *)g_object_get_data(G_OBJECT(welcome_hb), CAPTURE_HB_BOX_REFRESH);
- if (item_hb) {
- gtk_widget_destroy(item_hb);
- }
- if (if_scrolled_window) {
- gtk_widget_destroy(if_scrolled_window);
- if_scrolled_window = NULL;
- if_view = NULL;
- }
-}
-
-static void
-update_interface_scrolled_window_height(void)
-{
- /* set the height of the scroll window that shows the interfaces
- * based on the number of visible interfaces - up to a maximum of 10 interfaces */
- guint i;
- interface_t device;
- int visible_interface_count=0;
-
- if(if_scrolled_window==NULL){
- 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.hidden) {
- visible_interface_count++;
- }
- }
- if(visible_interface_count>10){
- /* up to 10 interfaces will be visible at one time */
- visible_interface_count=10;
- }
- if(visible_interface_count<2){
- /* minimum space for two interfaces */
- visible_interface_count=2;
- }
- gtk_widget_set_size_request(if_scrolled_window, FALSE, visible_interface_count*21+4);
-}
-
-static void
-update_capture_box(void)
-{
- guint i;
- GtkListStore *store;
- GtkTreeIter iter;
- GtkTreeSelection *entry;
- interface_t device;
- gboolean changed = FALSE;
-
- store = gtk_list_store_new(NUMCOLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING);
-
- gtk_list_store_clear(store);
- gtk_tree_view_set_model(GTK_TREE_VIEW(if_view), GTK_TREE_MODEL (store));
- entry = gtk_tree_view_get_selection(GTK_TREE_VIEW(if_view));
- 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) {
- gtk_list_store_append (store, &iter);
- gtk_list_store_set (store, &iter, ICON, gtk_image_get_pixbuf(GTK_IMAGE(capture_get_if_icon(&device))), IFACE_DESCR, device.display_name, IFACE_NAME, device.name, -1);
- if (device.selected) {
- gtk_tree_selection_select_iter(entry, &iter);
- }
- }
- }
- update_interface_scrolled_window_height();
- changed = TRUE;
- gtk_tree_selection_set_select_function(GTK_TREE_SELECTION(entry), on_selection_changed, (gpointer)&changed, NULL);
-}
-
-/*
- * We've been asked to rescan the system looking for interfaces.
- */
-static void
-refresh_interfaces_cb(GtkWidget *w _U_, gpointer user_data _U_)
-{
- clear_capture_box();
- refresh_local_interface_lists();
-}
-
-static void
-fill_capture_box(void)
-{
- GtkWidget *box_to_fill, *item_hb_refresh;
- GtkWidget *item_hb_interface_list, *item_hb_capture, *item_hb_start, *label, *w;
- GtkTreeSelection *selection;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
- int error = 0;
- gchar *label_text = NULL, *err_str = NULL;
-#ifdef _WIN32
- DWORD reg_ret;
- DWORD chimney_enabled = 0;
- DWORD ce_size = sizeof(chimney_enabled);
-#endif
-
- label = (GtkWidget *)g_object_get_data(G_OBJECT(welcome_hb), CAPTURE_LABEL);
- if (label) {
- gtk_widget_destroy(label);
- }
- box_to_fill = (GtkWidget *)g_object_get_data(G_OBJECT(welcome_hb), CAPTURE_VIEW);
- if (global_capture_opts.all_ifaces->len > 0) {
- item_hb_interface_list = welcome_button(WIRESHARK_STOCK_CAPTURE_INTERFACES,
- "Interface List",
- "Live list of the capture interfaces\n(counts incoming packets)",
- "Same as Capture/Interfaces menu or toolbar item",
- welcome_button_callback_helper, capture_if_cb);
- gtk_box_pack_start(GTK_BOX(box_to_fill), item_hb_interface_list, FALSE, FALSE, 5);
- if_scrolled_window = gtk_scrolled_window_new (NULL, NULL);
- update_interface_scrolled_window_height();
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(if_scrolled_window), GTK_SHADOW_IN);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(if_scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- g_object_set_data(G_OBJECT(welcome_hb), CAPTURE_HB_BOX_INTERFACE_LIST, item_hb_interface_list);
-
- if_view = gtk_tree_view_new ();
- g_object_set(G_OBJECT(if_view), "headers-visible", FALSE, NULL);
- g_signal_connect(if_view, "row-activated", G_CALLBACK(options_interface_cb), (gpointer)welcome_hb);
- g_object_set_data(G_OBJECT(welcome_hb), TREE_VIEW_INTERFACES, if_view);
- column = gtk_tree_view_column_new();
- renderer = gtk_cell_renderer_pixbuf_new();
- gtk_tree_view_column_pack_start(column, renderer, FALSE);
- gtk_tree_view_column_set_attributes(column, renderer, "pixbuf", ICON, NULL);
- renderer = gtk_cell_renderer_text_new();
- gtk_tree_view_column_pack_start(column, renderer, TRUE);
- gtk_tree_view_column_set_attributes(column, renderer, "text", IFACE_DESCR, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(if_view), column);
- gtk_tree_view_column_set_resizable(gtk_tree_view_get_column(GTK_TREE_VIEW(if_view), 0), TRUE);
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes ("",
- GTK_CELL_RENDERER(renderer),
- "text", IFACE_NAME,
- NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(if_view), column);
- gtk_tree_view_column_set_visible(column, FALSE);
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(if_view));
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
- item_hb_start = welcome_button(WIRESHARK_STOCK_CAPTURE_START,
- "Start",
- "Choose one or more interfaces to capture from, then <b>Start</b>",
- "Same as Capture/Interfaces with default options",
- (welcome_button_callback_t)capture_if_start, (gpointer)if_view);
- gtk_box_pack_start(GTK_BOX(box_to_fill), item_hb_start, FALSE, FALSE, 5);
- update_capture_box();
- gtk_container_add (GTK_CONTAINER (if_scrolled_window), if_view);
- gtk_container_add(GTK_CONTAINER(box_to_fill), if_scrolled_window);
- g_object_set_data(G_OBJECT(welcome_hb), CAPTURE_HB_BOX_START, item_hb_start);
-
- item_hb_capture = welcome_button(WIRESHARK_STOCK_CAPTURE_OPTIONS,
- "Capture Options",
- "Start a capture with detailed options",
- "Same as Capture/Options menu or toolbar item",
- welcome_button_callback_helper, capture_prep_cb);
- gtk_box_pack_start(GTK_BOX(box_to_fill), item_hb_capture, FALSE, FALSE, 5);
- g_object_set_data(G_OBJECT(welcome_hb), CAPTURE_HB_BOX_CAPTURE, item_hb_capture);
-#ifdef _WIN32
- /* Check for chimney offloading */
- reg_ret = RegQueryValueEx(HKEY_LOCAL_MACHINE,
- _T("SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\EnableTCPChimney"),
- NULL, NULL, (LPBYTE) &chimney_enabled, &ce_size);
- if (reg_ret == ERROR_SUCCESS && chimney_enabled) {
- welcome_button(WIRESHARK_STOCK_WIKI,
- "Offloading Detected",
- "TCP Chimney offloading is enabled. You \nmight not capture much data.",
- topic_online_url(ONLINEPAGE_CHIMNEY),
- topic_menu_cb, GINT_TO_POINTER(ONLINEPAGE_CHIMNEY));
- gtk_box_pack_start(GTK_BOX(box_to_fill), item_hb_capture, FALSE, FALSE, 5);
- }
-#endif /* _WIN32 */
- } else {
- if (if_view) {
- clear_capture_box();
- }
-
- /* run capture_interface_list(), not to get the interfaces, but to detect
- * any errors, if there is an error, display an appropriate message in the gui */
- capture_interface_list(&error, &err_str,main_window_update);
- switch (error) {
-
- case 0:
- label_text = g_strdup("No interface can be used for capturing in "
- "this system with the current configuration.\n"
- "\n"
- "See Capture Help below for details.");
- break;
-
- case CANT_GET_INTERFACE_LIST:
- label_text = g_strdup_printf("No interface can be used for capturing in "
- "this system with the current configuration.\n\n"
- "(%s)\n"
- "\n"
- "See Capture Help below for details.",
- err_str);
- break;
-
- case DONT_HAVE_PCAP:
- label_text = g_strdup("WinPcap doesn't appear to be installed. "
- "In order to capture packets, WinPcap "
- "must be installed; see\n"
- "\n"
-#if GTK_CHECK_VERSION(2,18,0)
- " <a href=\"https://www.winpcap.org/\">https://www.winpcap.org/</a>\n"
-#else
- " https://www.winpcap.org/\n"
-#endif
- "\n"
- "for a downloadable version of WinPcap "
- "and for instructions on how to install "
- "WinPcap.");
- break;
-
- default:
- label_text = g_strdup_printf("Error = %d; this \"can't happen\".", error);
- break;
- }
- g_free(err_str);
- w = gtk_label_new(label_text);
- gtk_label_set_markup(GTK_LABEL(w), label_text);
- gtk_label_set_line_wrap(GTK_LABEL(w), TRUE);
- g_free (label_text);
- gtk_misc_set_alignment (GTK_MISC(w), 0.0f, 0.0f);
- gtk_box_pack_start(GTK_BOX(box_to_fill), w, FALSE, FALSE, 5);
-#if GTK_CHECK_VERSION(2,18,0)
- g_signal_connect(w, "activate-link", G_CALLBACK(activate_link_cb), NULL);
-#endif
- g_object_set_data(G_OBJECT(welcome_hb), CAPTURE_LABEL, w);
- if (error == CANT_GET_INTERFACE_LIST || error == 0) {
- item_hb_refresh = welcome_button(GTK_STOCK_REFRESH,
- "Refresh Interfaces",
- "Get a new list of the local interfaces.",
- "Click the title to get a new list of interfaces",
- welcome_button_callback_helper, refresh_interfaces_cb);
- gtk_box_pack_start(GTK_BOX(box_to_fill), item_hb_refresh, FALSE, FALSE, 5);
- g_object_set_data(G_OBJECT(welcome_hb), CAPTURE_HB_BOX_REFRESH, item_hb_refresh);
- }
- }
-}
-#endif /* HAVE_LIBPCAP */
-
-
-/* reload the list of interfaces */
-void
-welcome_if_panel_reload(void)
-{
-#ifdef HAVE_LIBPCAP
- if (welcome_hb) {
- /* If we have a list of interfaces, and if the current interface
- list is non-empty, just update the interface list. Otherwise,
- create it (as we didn't have it) or destroy it (as we won't
- have it). */
- if (if_view && if_scrolled_window && global_capture_opts.all_ifaces->len > 0) {
- update_capture_box();
- } else {
- GtkWidget *item_hb;
- item_hb = (GtkWidget *)g_object_get_data(G_OBJECT(welcome_hb), CAPTURE_HB_BOX_REFRESH);
- if (item_hb) {
- gtk_widget_destroy(item_hb);
- }
- fill_capture_box();
- }
- gtk_widget_show_all(welcome_hb);
- }
-#endif /* HAVE_LIBPCAP */
-}
-
-#ifdef HAVE_LIBPCAP
-static void
-capture_if_start(GtkWidget *w _U_, gpointer data _U_)
-{
-#ifdef HAVE_AIRPCAP
- interface_t device;
- guint i;
-#endif
- if (global_capture_opts.num_selected == 0) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "You didn't specify an interface on which to capture packets.");
- return;
- }
-
- /* XXX - remove this? */
- if (global_capture_opts.save_file) {
- g_free(global_capture_opts.save_file);
- global_capture_opts.save_file = NULL;
- }
-#ifdef HAVE_AIRPCAP /* TODO: don't let it depend on interface_opts */
- for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
- airpcap_if_active = get_airpcap_if_from_name(g_airpcap_if_list, device.name);
- airpcap_if_selected = airpcap_if_active;
- if (airpcap_if_selected) {
- break;
- }
- }
- if (airpcap_if_active)
- airpcap_set_toolbar_start_capture(airpcap_if_active);
-#endif
- capture_start_cb(NULL, NULL);
-}
-#endif
-
-#ifdef HAVE_LIBPCAP
-#if GTK_CHECK_VERSION(2,18,0)
-static gboolean
-activate_link_cb(GtkLabel *label _U_, gchar *uri, gpointer user_data _U_)
-{
- return browser_open_url(uri);
-}
-#endif
-#endif
-
-/* create the welcome page */
-GtkWidget *
-welcome_new(void)
-{
- GtkWidget *welcome_scrollw;
- GtkWidget *welcome_eb;
- GtkWidget *welcome_vb;
- GtkWidget *column_vb;
- GtkWidget *item_hb;
- GtkWidget *w;
- GtkWidget *header;
- GtkWidget *topic_vb;
- GtkWidget *topic_to_fill;
- GtkWidget *topic_capture_to_fill;
- gchar *label_text;
- GtkWidget *file_child_box;
-
- /* prepare colors */
-#if GTK_CHECK_VERSION(3,0,0)
- rgba_topic_item_idle_bg = rgba_topic_content_bg;
-#else
- topic_item_idle_bg = topic_content_bg;
-#endif
- welcome_scrollw = scrolled_window_new(NULL, NULL);
-
- welcome_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
-
- welcome_eb = gtk_event_box_new();
- gtk_container_add(GTK_CONTAINER(welcome_eb), welcome_vb);
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_override_background_color(welcome_eb, GTK_STATE_FLAG_NORMAL, &rgba_welcome_bg);
-#else
- gtk_widget_modify_bg(welcome_eb, GTK_STATE_NORMAL, &welcome_bg);
-#endif
- /* header */
- header = welcome_header_new();
- gtk_box_pack_start(GTK_BOX(welcome_vb), header, FALSE, FALSE, 0);
-
- /* content */
- welcome_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(welcome_hb), 10);
- gtk_box_pack_start(GTK_BOX(welcome_vb), welcome_hb, TRUE, TRUE, 0);
-
-
- /* column capture */
- column_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 10, FALSE);
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_override_background_color(column_vb, GTK_STATE_FLAG_NORMAL, &rgba_welcome_bg);
-#else
- gtk_widget_modify_bg(column_vb, GTK_STATE_NORMAL, &welcome_bg);
-#endif
- gtk_box_pack_start(GTK_BOX(welcome_hb), column_vb, TRUE, TRUE, 0);
-
- /* capture topic */
- topic_vb = welcome_topic_new("Capture", &topic_capture_to_fill);
- gtk_box_pack_start(GTK_BOX(column_vb), topic_vb, TRUE, TRUE, 0);
- g_object_set_data(G_OBJECT(welcome_hb), CAPTURE_VIEW, topic_capture_to_fill);
-
-#ifdef HAVE_LIBPCAP
- fill_in_local_interfaces(main_window_update);
- fill_capture_box();
-
- /* capture help topic */
- topic_vb = welcome_topic_new("Capture Help", &topic_to_fill);
- gtk_box_pack_start(GTK_BOX(column_vb), topic_vb, TRUE, TRUE, 0);
-
- item_hb = welcome_button(WIRESHARK_STOCK_WIKI,
- "How to Capture",
- "Step by step to a successful capture setup",
- topic_online_url(ONLINEPAGE_CAPTURE_SETUP),
- topic_menu_cb, GINT_TO_POINTER(ONLINEPAGE_CAPTURE_SETUP));
- gtk_box_pack_start(GTK_BOX(topic_to_fill), item_hb, FALSE, FALSE, 5);
-
- item_hb = welcome_button(WIRESHARK_STOCK_WIKI,
- "Network Media",
- "Specific information for capturing on:\nEthernet, WLAN, ...",
- topic_online_url(ONLINEPAGE_NETWORK_MEDIA),
- topic_menu_cb, GINT_TO_POINTER(ONLINEPAGE_NETWORK_MEDIA));
- gtk_box_pack_start(GTK_BOX(topic_to_fill), item_hb, FALSE, FALSE, 5);
-#else
- label_text = g_strdup("<span foreground=\"black\">Capturing is not compiled into\nthis version of Wireshark.</span>");
- w = gtk_label_new(label_text);
- gtk_label_set_markup(GTK_LABEL(w), label_text);
- g_free (label_text);
- gtk_misc_set_alignment (GTK_MISC(w), 0.0f, 0.0f);
- gtk_box_pack_start(GTK_BOX(topic_capture_to_fill), w, FALSE, FALSE, 5);
-#endif /* HAVE_LIBPCAP */
-
- /* fill bottom space */
- w = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(topic_capture_to_fill), w, TRUE, TRUE, 0);
-
-
- /* column files */
- topic_vb = welcome_topic_new("Files", &topic_to_fill);
- gtk_box_pack_start(GTK_BOX(welcome_hb), topic_vb, TRUE, TRUE, 0);
-
- item_hb = welcome_button(GTK_STOCK_OPEN,
- "Open",
- "Open a previously captured file",
- "Same as File/Open menu or toolbar item",
- welcome_button_callback_helper, file_open_cmd_cb);
- gtk_box_pack_start(GTK_BOX(topic_to_fill), item_hb, FALSE, FALSE, 5);
-
- /* prepare list of recent files (will be filled in later) */
- label_text = g_strdup("<span foreground=\"black\">Open Recent:</span>");
- w = gtk_label_new(label_text);
- gtk_label_set_markup(GTK_LABEL(w), label_text);
- g_free (label_text);
- gtk_misc_set_alignment (GTK_MISC(w), 0.0f, 0.0f);
- gtk_box_pack_start(GTK_BOX(topic_to_fill), w, FALSE, FALSE, 5);
-
- file_child_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 1, FALSE);
- /* 17 file items or 300 pixels height is about the size */
- /* that still fits on a screen of about 1000*700 */
- welcome_file_panel_vb = scroll_box_dynamic_new(GTK_WIDGET(file_child_box), 17, 300);
- gtk_box_pack_start(GTK_BOX(topic_to_fill), welcome_file_panel_vb, FALSE, FALSE, 0);
-
- item_hb = welcome_button(WIRESHARK_STOCK_WIKI,
- "Sample Captures",
- "A rich assortment of example capture files on the wiki",
- topic_online_url(ONLINEPAGE_SAMPLE_CAPTURES),
- topic_menu_cb, GINT_TO_POINTER(ONLINEPAGE_SAMPLE_CAPTURES));
- gtk_box_pack_start(GTK_BOX(topic_to_fill), item_hb, FALSE, FALSE, 5);
-
- /* fill bottom space */
- w = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(topic_to_fill), w, TRUE, TRUE, 0);
-
-
- /* column online */
- column_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 10, FALSE);
- gtk_box_pack_start(GTK_BOX(welcome_hb), column_vb, TRUE, TRUE, 0);
-
- /* topic online */
- topic_vb = welcome_topic_new("Online", &topic_to_fill);
- gtk_box_pack_start(GTK_BOX(column_vb), topic_vb, TRUE, TRUE, 0);
-
- item_hb = welcome_button(GTK_STOCK_HOME,
- "Website",
- "Visit the project's website",
- topic_online_url(ONLINEPAGE_HOME),
- topic_menu_cb, GINT_TO_POINTER(ONLINEPAGE_HOME));
- gtk_box_pack_start(GTK_BOX(topic_to_fill), item_hb, FALSE, FALSE, 5);
-
-#ifdef HHC_DIR
- item_hb = welcome_button(GTK_STOCK_HELP,
- "User's Guide",
- "The User's Guide "
- "(local version, if installed)",
- "Locally installed (if installed) otherwise online version",
- topic_menu_cb, GINT_TO_POINTER(HELP_CONTENT));
-#else
- item_hb = welcome_button(GTK_STOCK_HELP,
- "User's Guide",
- "The User's Guide "
- "(online version)",
- topic_online_url(ONLINEPAGE_USERGUIDE),
- topic_menu_cb, GINT_TO_POINTER(ONLINEPAGE_USERGUIDE));
-#endif
- gtk_box_pack_start(GTK_BOX(topic_to_fill), item_hb, FALSE, FALSE, 5);
-
- item_hb = welcome_button(WIRESHARK_STOCK_WIKI,
- "Security",
- "Work with Wireshark as securely as possible",
- topic_online_url(ONLINEPAGE_SECURITY),
- topic_menu_cb, GINT_TO_POINTER(ONLINEPAGE_SECURITY));
- gtk_box_pack_start(GTK_BOX(topic_to_fill), item_hb, FALSE, FALSE, 5);
-
-#if 0
- /* XXX - add this, once the Windows update functionality is implemented */
- /* topic updates */
- topic_vb = welcome_topic_new("Updates", &topic_to_fill);
- gtk_box_pack_start(GTK_BOX(column_vb), topic_vb, TRUE, TRUE, 0);
-
- label_text = g_strdup("<span foreground=\"black\">No updates available.</span>");
- w = gtk_label_new(label_text);
- gtk_label_set_markup(GTK_LABEL(w), label_text);
- g_free (label_text);
- gtk_box_pack_start(GTK_BOX(topic_to_fill), w, TRUE, TRUE, 0);
-#endif
-
-
- /* the end */
- gtk_widget_show_all(welcome_eb);
-
-#if ! GTK_CHECK_VERSION(3,8,0)
- gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(welcome_scrollw), welcome_eb);
-#else
- gtk_container_add(GTK_CONTAINER(welcome_scrollw), welcome_eb);
-#endif
- gtk_widget_show_all(welcome_scrollw);
-
-#if GLIB_CHECK_VERSION(2,31,0)
- recent_mtx = (GMutex *)g_malloc(sizeof(GMutex));
- g_mutex_init(recent_mtx);
-#else
- recent_mtx = g_mutex_new();
-#endif
-
- return welcome_scrollw;
-}
-
-GtkWidget *
-get_welcome_window(void)
-{
- return welcome_hb;
-}
-
-static void
-welcome_cf_file_closing_cb(capture_file *cf _U_)
-{
- welcome_header_pop_msg();
-}
-
-void
-welcome_cf_callback(gint event, gpointer data, gpointer user_data _U_)
-{
- switch(event) {
- case(cf_cb_file_opened):
- break;
- case(cf_cb_file_closing):
- welcome_cf_file_closing_cb((capture_file *)data);
- break;
- case(cf_cb_file_closed):
- break;
- case(cf_cb_file_read_started):
- break;
- case(cf_cb_file_read_finished):
- break;
- case(cf_cb_file_reload_started):
- break;
- case(cf_cb_file_reload_finished):
- break;
- case(cf_cb_file_rescan_started):
- break;
- case(cf_cb_file_rescan_finished):
- break;
- case(cf_cb_file_retap_started):
- break;
- case(cf_cb_file_retap_finished):
- break;
- case(cf_cb_file_fast_save_finished):
- break;
- case(cf_cb_packet_selected):
- break;
- case(cf_cb_packet_unselected):
- break;
- case(cf_cb_field_unselected):
- break;
- case(cf_cb_file_save_started):
- break;
- case(cf_cb_file_save_finished):
- break;
- case(cf_cb_file_save_failed):
- break;
- case(cf_cb_file_save_stopped):
- break;
- case(cf_cb_file_export_specified_packets_started):
- break;
- case(cf_cb_file_export_specified_packets_finished):
- break;
- case(cf_cb_file_export_specified_packets_failed):
- break;
- case(cf_cb_file_export_specified_packets_stopped):
- break;
- default:
- g_warning("welcome_cf_callback: event %u unknown", event);
- g_assert_not_reached();
- }
-}
-
-#ifdef HAVE_LIBPCAP
-static void
-welcome_capture_update_started_cb(capture_session *cap_session _U_)
-{
- welcome_header_pop_msg();
-}
-
-static void
-welcome_capture_fixed_started_cb(capture_session *cap_session)
-{
- capture_options *capture_opts = cap_session->capture_opts;
- GString *interface_names;
-
- welcome_header_pop_msg();
-
- interface_names = get_iface_list_string(capture_opts, 0);
- welcome_header_push_msg("Capturing on %s", interface_names->str);
- g_string_free(interface_names, TRUE);
-}
-
-static void
-welcome_capture_fixed_finished_cb(capture_session *cap_session _U_)
-{
- welcome_header_pop_msg();
-}
-
-static void
-welcome_capture_prepared_cb(capture_session *cap_session _U_)
-{
- static const gchar msg[] = " Waiting for capture input data ...";
- welcome_header_push_msg(msg);
-}
-
-static void
-welcome_capture_failed_cb(capture_session *cap_session _U_)
-{
- welcome_header_pop_msg();
-}
-
-void
-welcome_capture_callback(gint event, capture_session *cap_session,
- gpointer user_data _U_)
-{
- switch(event) {
- case(capture_cb_capture_prepared):
- welcome_capture_prepared_cb(cap_session);
- break;
- case(capture_cb_capture_update_started):
- welcome_capture_update_started_cb(cap_session);
- break;
- case(capture_cb_capture_update_continue):
- break;
- case(capture_cb_capture_update_finished):
- break;
- case(capture_cb_capture_fixed_started):
- welcome_capture_fixed_started_cb(cap_session);
- break;
- case(capture_cb_capture_fixed_continue):
- break;
- case(capture_cb_capture_fixed_finished):
- welcome_capture_fixed_finished_cb(cap_session);
- break;
- case(capture_cb_capture_stopping):
- /* Beware: this state won't be called, if the capture child
- * closes the capturing on its own! */
- break;
- case(capture_cb_capture_failed):
- welcome_capture_failed_cb(cap_session);
- break;
- default:
- g_warning("welcome_capture_callback: event %u unknown", event);
- g_assert_not_reached();
- }
-}
-#endif /* HAVE_LIBPCAP */
-
-/*
- * Editor modelines - https://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/main_welcome.h b/ui/gtk/main_welcome.h
deleted file mode 100644
index 0793b30daf..0000000000
--- a/ui/gtk/main_welcome.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* main_welcome.h
- * Welcome "page"
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __MAIN_WELCOME_H__
-#define __MAIN_WELCOME_H__
-
-#include "ui/gtk/capture_dlg.h"
-
-enum
-{
- ICON = 0,
- IFACE_DESCR,
- IFACE_NAME,
- NUMCOLUMNS
-};
-
-typedef struct selected_name_s {
- gchar *name;
- gboolean activate;
-} selected_name_t;
-
-/* reset the list of recently used files */
-void main_welcome_reset_recent_capture_files(void);
-
-/* add a new file to the list of recently used files */
-void main_welcome_add_recent_capture_file(const char *widget_cf_name, GObject *menu_item);
-
-/* reload the list of interfaces */
-void welcome_if_panel_reload(void);
-
-void welcome_header_set_message(gchar *msg);
-
-GtkWidget* get_welcome_window(void);
-
-void change_interface_selection(gchar* name, gboolean activate);
-
-void change_selection_for_all(gboolean enable);
-
-void update_welcome_list(void);
-
-void set_sensitivity_for_start_icon(void);
-
-#ifdef HAVE_PCAP_REMOTE
-void add_interface_to_list(guint index);
-#endif
-
-#ifdef HAVE_LIBPCAP
-void change_interface_name(gchar *oldname, guint index);
-#endif
-#endif /* __MAIN_WELCOME_H__ */
diff --git a/ui/gtk/main_welcome_private.h b/ui/gtk/main_welcome_private.h
deleted file mode 100644
index 2b8eaec5d2..0000000000
--- a/ui/gtk/main_welcome_private.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* main_welcome_private.h
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __MAIN_WELCOME_PRIVATE_H__
-#define __MAIN_WELCOME_PRIVATE_H__
-
-/*** PRIVATE INTERFACE BETWEEN main.c AND main_welcome.c DON'T USE OR TOUCH :-)*/
-
-GtkWidget *welcome_new(void);
-void welcome_cf_callback(gint event, gpointer data, gpointer user_data);
-#ifdef HAVE_LIBPCAP
-void welcome_capture_callback(gint event, capture_session *cap_session,
- gpointer user_data);
-#endif
-
-#endif /* __MAIN_WELCOME_PRIVATE_H__ */
diff --git a/ui/gtk/manual_addr_resolv.c b/ui/gtk/manual_addr_resolv.c
deleted file mode 100644
index fbb28d3782..0000000000
--- a/ui/gtk/manual_addr_resolv.c
+++ /dev/null
@@ -1,212 +0,0 @@
-/* manual_addr_resolv.c
- * Dialog box for manual address resolve
- * Copyright 2010 Stig Bjorlykke <stig@bjorlykke.org>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include "epan/addr_resolv.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/menus.h"
-#include "ui/gtk/manual_addr_resolv.h"
-#include "ui/gtk/packet_win.h"
-#include "simple_dialog.h"
-
-#include "globals.h"
-
-GtkWidget *man_addr_resolv_dlg = NULL;
-
-static void
-man_addr_ill_addr_cb(gpointer dialog _U_, gint btn _U_, gpointer data _U_)
-{
- gtk_window_present(GTK_WINDOW(man_addr_resolv_dlg));
-}
-
-static void
-man_addr_resolv_ok(GtkWidget *w _U_, gpointer data _U_)
-{
- GtkWidget *addr_cb, *name_te, *resolv_cb;
- const gchar *name;
- gchar *addr;
- gboolean active, redissect = FALSE;
-
- addr_cb = (GtkWidget *)g_object_get_data(G_OBJECT(man_addr_resolv_dlg), "address");
- name_te = (GtkWidget *)g_object_get_data(G_OBJECT(man_addr_resolv_dlg), "name");
-
- addr = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(addr_cb));
- name = gtk_entry_get_text(GTK_ENTRY(name_te));
-
- if (strlen(addr) && strlen(name)) {
- if (!cf_add_ip_name_from_string(&cfile, addr, name)) {
- GtkWidget *dialog = (GtkWidget *)simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Illegal IP address: \"%s\".", addr);
- simple_dialog_set_cb(dialog, man_addr_ill_addr_cb, NULL);
- g_free(addr);
- return;
- } else {
- redissect = TRUE;
- main_update_for_unsaved_changes(&cfile);
- }
- }
- g_free(addr);
-
- resolv_cb = (GtkWidget *)g_object_get_data(G_OBJECT(man_addr_resolv_dlg), "resolv");
- active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(resolv_cb));
- if (!gbl_resolv_flags.network_name && active) {
- /* Name resolution for Network Layer activated */
- gbl_resolv_flags.network_name = TRUE;
- menu_name_resolution_changed();
- redissect = TRUE;
- }
-
- if (redissect) {
- redissect_packets();
- redissect_all_packet_windows();
- }
- window_destroy(man_addr_resolv_dlg);
- man_addr_resolv_dlg = NULL;
-}
-
-static void
-changed_cb(GtkWidget *w _U_, GtkWidget *ok_bt)
-{
- const gchar *name;
- gchar *addr;
- GtkWidget *addr_cb, *name_cb, *resolv_cb;
- gboolean active;
-
- name_cb = (GtkWidget *)g_object_get_data(G_OBJECT(man_addr_resolv_dlg), "name");
- addr_cb = (GtkWidget *)g_object_get_data(G_OBJECT(man_addr_resolv_dlg), "address");
- resolv_cb = (GtkWidget *)g_object_get_data(G_OBJECT(man_addr_resolv_dlg), "resolv");
-
- name = gtk_entry_get_text(GTK_ENTRY(name_cb));
- addr = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(addr_cb));
- active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(resolv_cb));
-
- gtk_widget_set_sensitive(ok_bt, strlen(name) > 0 && strlen(addr) && active ? TRUE : FALSE);
- g_free(addr);
-}
-
-void
-manual_addr_resolv_dlg(GtkWidget *w _U_, gpointer data)
-{
- GtkWidget *vbox, *bbox, *grid, *sep;
- GtkWidget *ok_bt, *close_bt, *help_bt;
- GtkWidget *addr_lb, *addr_cb;
- GtkWidget *name_lb, *name_te, *resolv_cb;
- GList *addr_list = NULL;
-
- man_addr_resolv_dlg = dlg_window_new("Manual Address Resolve");
- gtk_window_set_default_size(GTK_WINDOW(man_addr_resolv_dlg), 310, 80);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_add(GTK_CONTAINER(man_addr_resolv_dlg), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 6);
-
- grid = ws_gtk_grid_new();
- gtk_box_pack_start(GTK_BOX(vbox), grid, TRUE, TRUE, 0);
-
- addr_lb = gtk_label_new("Address:");
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), addr_lb, 0, 0, 1, 1);
-
- addr_cb = gtk_combo_box_text_new_with_entry();
- if (data) {
- GList *addr_entry;
- addr_list = get_ip_address_list_from_packet_list_row(data);
- for (addr_entry = addr_list; addr_entry != NULL; addr_entry = g_list_next(addr_entry)) {
- gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(addr_cb), (const gchar *)addr_entry->data);
- g_free(addr_entry->data);
- }
- g_list_free(addr_entry);
- gtk_combo_box_set_active(GTK_COMBO_BOX(addr_cb), 0);
- }
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), addr_cb, 1, 0, 1, 1);
- g_object_set_data(G_OBJECT(man_addr_resolv_dlg), "address", addr_cb);
-
- name_lb = gtk_label_new("Name:");
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), name_lb, 0, 1, 1, 1);
-
- name_te = gtk_entry_new();
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), name_te, 1, 1, 1, 1);
- g_object_set_data(G_OBJECT(man_addr_resolv_dlg), "name", name_te);
-
- sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_start(GTK_BOX(vbox), sep, TRUE, TRUE, 0);
-
- resolv_cb = gtk_check_button_new_with_mnemonic("Enable network name resolution");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(resolv_cb), gbl_resolv_flags.network_name);
- gtk_widget_set_sensitive(resolv_cb, !gbl_resolv_flags.network_name);
-
- gtk_widget_set_tooltip_text(resolv_cb, "Perform network layer name resolution.");
- g_object_set_data(G_OBJECT(man_addr_resolv_dlg), "resolv", resolv_cb);
- gtk_box_pack_start(GTK_BOX(vbox), resolv_cb, TRUE, TRUE, 0);
-
- /* Button row. */
- bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CLOSE, GTK_STOCK_HELP, NULL);
- gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(man_addr_resolv_ok), NULL);
- gtk_widget_set_sensitive(ok_bt, FALSE);
-
- g_signal_connect(name_te, "changed", G_CALLBACK(changed_cb), ok_bt);
- g_signal_connect(addr_cb, "changed", G_CALLBACK(changed_cb), ok_bt);
- g_signal_connect(resolv_cb, "toggled", G_CALLBACK(changed_cb), ok_bt);
- dlg_set_activate(name_te, ok_bt);
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(man_addr_resolv_dlg, close_bt, window_cancel_button_cb);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_MANUAL_ADDR_RESOLVE_DIALOG);
-
- gtk_widget_grab_default(ok_bt);
- g_signal_connect(man_addr_resolv_dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
-
- if (addr_list) {
- /* We have column data, activate name box */
- gtk_widget_grab_focus(name_te);
- }
- gtk_widget_show_all(man_addr_resolv_dlg);
- window_present(man_addr_resolv_dlg);
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local Variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/manual_addr_resolv.h b/ui/gtk/manual_addr_resolv.h
deleted file mode 100644
index 173f6f898c..0000000000
--- a/ui/gtk/manual_addr_resolv.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* manual_addr_resolv.h
- * Dialog box for manual address resolve
- * Copyright 2010 Stig Bjorlykke <stig@bjorlykke.org>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __MANUAL_ADDR_RESOLV_H__
-#define __MANUAL_ADDR_RESOLV_H__
-
-void manual_addr_resolv_dlg (GtkWidget *w _U_, gpointer data);
-
-#endif /* __MANUAL_ADDR_RESOLV_H__ */
diff --git a/ui/gtk/mcast_stream_dlg.c b/ui/gtk/mcast_stream_dlg.c
deleted file mode 100644
index 355c1b18b2..0000000000
--- a/ui/gtk/mcast_stream_dlg.c
+++ /dev/null
@@ -1,858 +0,0 @@
-/* mcast_stream_dlg.c
- *
- * Copyright 2006, Iskratel , Slovenia
- * By Jakob Bratkovic <j.bratkovic@iskratel.si> and
- * Miha Jemec <m.jemec@iskratel.si>
- *
- * based on rtp_stream_dlg.c
- * Copyright 2003, Alcatel Business Systems
- * By Lars Ruoff <lars.ruoff@gmx.net>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <locale.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/addr_resolv.h>
-
-#include "../../globals.h"
-#include <epan/stat_groups.h>
-#include "ui/simple_dialog.h"
-
-#include "ui/gtk/gui_stat_menu.h"
-#include "ui/gtk/mcast_stream_dlg.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/old-gtk-compat.h"
-#include "ui/gtk/stock_icons.h"
-
-static void mcaststream_tap_reset(mcaststream_tapinfo_t *tapinfo);
-static void mcaststream_tap_draw(mcaststream_tapinfo_t *tapinfo);
-
-/****************************************************************************/
-/* the one and only global mcaststream_tapinfo_t structure for tshark and wireshark.
- */
-static mcaststream_tapinfo_t the_tapinfo_struct =
- {NULL, mcaststream_tap_reset, mcaststream_tap_draw, NULL, 0, NULL, FALSE};
-
-/* Capture callback data keys */
-#define E_MCAST_ENTRY_1 "burst_interval"
-#define E_MCAST_ENTRY_2 "burst_alarm"
-#define E_MCAST_ENTRY_3 "ws_buffer_alarm"
-#define E_MCAST_ENTRY_4 "stream_speed"
-#define E_MCAST_ENTRY_5 "total_speed"
-
-static const gchar FWD_LABEL_TEXT[] = "Select a stream with left mouse button";
-static const gchar PAR_LABEL_TEXT[] = "\nBurst int: ms Burst alarm: pps Buffer alarm: KB Stream empty speed: Mbps Total empty speed: Mbps\n";
-
-/****************************************************************************/
-static GtkWidget *mcast_stream_dlg = NULL;
-static GtkWidget *mcast_params_dlg = NULL;
-
-static GtkListStore *list_store = NULL;
-static GtkTreeIter list_iter;
-static GtkWidget *list_w = NULL;
-static GtkWidget *top_label = NULL;
-static GtkWidget *label_fwd = NULL;
-static GtkWidget *label_par = NULL;
-static GtkWidget *bt_filter = NULL;
-
-static mcast_stream_info_t *selected_stream_fwd = NULL; /* current selection */
-static GList *last_list = NULL;
-
-static guint32 streams_nb = 0; /* number of displayed streams */
-
-enum
-{
- MC_COL_SRC_ADDR,
- MC_COL_SRC_PORT,
- MC_COL_DST_ADDR,
- MC_COL_DST_PORT,
- MC_COL_PACKETS,
- MC_COL_PPS,
- MC_COL_AVG_BW,
- MC_COL_MAX_BW,
- MC_COL_MAX_BURST,
- MC_COL_BURST_ALARM,
- MC_COL_MAX_BUFFER,
- MC_COL_BUFFER_ALARM,
- MC_COL_DATA,
- NUM_COLS /* The number of columns */
-};
-
-/****************************************************************************/
-/* CALLBACKS */
-/****************************************************************************/
-static void
-mcaststream_on_destroy(GObject *object _U_, gpointer user_data _U_)
-{
- /* Remove the stream tap listener */
- remove_tap_listener_mcast_stream(&the_tapinfo_struct);
-
- /* Is there a params window open? */
- if (mcast_params_dlg != NULL)
- window_destroy(mcast_params_dlg);
-
- /* Clean up memory used by stream tap */
- mcaststream_reset(mcaststream_dlg_get_tapinfo());
-
- /* Note that we no longer have a "Mcast Streams" dialog box. */
- mcast_stream_dlg = NULL;
-}
-
-
-/****************************************************************************/
-static void
-mcaststream_on_unselect(GtkButton *button _U_, gpointer user_data _U_)
-{
- GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list_w));
-
- gtk_tree_selection_unselect_all(selection);
-
- selected_stream_fwd = NULL;
- gtk_label_set_text(GTK_LABEL(label_fwd), FWD_LABEL_TEXT);
- gtk_widget_set_sensitive(bt_filter, FALSE);
-}
-
-
-/****************************************************************************/
-static void
-mcaststream_on_filter(GtkButton *button _U_, gpointer user_data _U_)
-{
- gchar *filter_string_fwd;
- gchar ip_version[3];
- char *src_addr, *dst_addr;
-
- if (selected_stream_fwd == NULL)
- return;
-
- if (selected_stream_fwd->src_addr.type == AT_IPv6) {
- g_strlcpy(ip_version,"v6",sizeof(ip_version));
- } else {
- ip_version[0] = '\0';
- }
-
- src_addr = (char*)address_to_str(NULL, &(selected_stream_fwd->src_addr));
- dst_addr = (char*)address_to_str(NULL, &(selected_stream_fwd->dest_addr));
- filter_string_fwd = wmem_strdup_printf(NULL,
- "(ip%s.src==%s && udp.srcport==%u && ip%s.dst==%s && udp.dstport==%u)",
- ip_version,
- src_addr,
- selected_stream_fwd->src_port,
- ip_version,
- dst_addr,
- selected_stream_fwd->dest_port);
-
- gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), filter_string_fwd);
- wmem_free(NULL, filter_string_fwd);
- wmem_free(NULL, src_addr);
- wmem_free(NULL, dst_addr);
-
-#if 0
- main_filter_packets(&cfile, filter_string, FALSE);
- mcaststream_dlg_update(mcaststream_dlg_get_tapinfo()->strinfo_list);
-#endif
-}
-
-/****************************************************************************/
-/* when the user selects a row in the stream list */
-static void
-mcaststream_on_select_row(GtkTreeSelection *selection, gpointer data _U_)
-{
- gchar label_text[80];
- char *src_addr, *dst_addr;
-
- if (gtk_tree_selection_get_selected(selection, NULL, &list_iter))
- {
- gtk_tree_model_get(GTK_TREE_MODEL(list_store), &list_iter, MC_COL_DATA, &selected_stream_fwd, -1);
- src_addr = address_to_display(NULL, &(selected_stream_fwd->src_addr));
- dst_addr = address_to_display(NULL, &(selected_stream_fwd->dest_addr));
- g_snprintf(label_text, sizeof(label_text), "Selected: %s:%u -> %s:%u",
- src_addr,
- selected_stream_fwd->src_port,
- dst_addr,
- selected_stream_fwd->dest_port
- );
- gtk_label_set_text(GTK_LABEL(label_fwd), label_text);
- gtk_widget_set_sensitive(bt_filter, TRUE);
-
- wmem_free(NULL, src_addr);
- wmem_free(NULL, dst_addr);
- } else {
- selected_stream_fwd = NULL;
- gtk_label_set_text(GTK_LABEL(label_fwd), FWD_LABEL_TEXT);
- gtk_widget_set_sensitive(bt_filter, FALSE);
- }
-}
-
-
-/****************************************************************************/
-/* INTERFACE */
-/****************************************************************************/
-static void
-mcast_params_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
-{
- /* Note that we no longer have a mcast params dialog box. */
- mcast_params_dlg = NULL;
-}
-
-
-static void
-mcast_params_ok_cb(GtkWidget *ok_bt _U_, gpointer parent_w)
-{
- GtkWidget *fnumber_te;
- const gchar *fnumber_text;
- gint32 fnumber;
- char *p;
-
- fnumber_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_MCAST_ENTRY_1);
- fnumber_text = gtk_entry_get_text(GTK_ENTRY(fnumber_te));
- fnumber = (gint)strtol(fnumber_text, &p, 10);
- if ( ((p == fnumber_text) || (*p != '\0')) || (fnumber <= 0) || (fnumber > 1000) ) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The burst interval should be between 1 and 1000 ms.");
- return;
- }
- mcast_stream_burstint = fnumber;
-
- fnumber_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_MCAST_ENTRY_2);
- fnumber_text = gtk_entry_get_text(GTK_ENTRY(fnumber_te));
- fnumber = (gint)strtol(fnumber_text, &p, 10);
- if ( ((p == fnumber_text) || (*p != '\0')) || (fnumber <= 0) ) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The burst alarm threshold you entered isn't valid.");
- return;
- }
- mcast_stream_trigger = fnumber;
-
- fnumber_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_MCAST_ENTRY_3);
- fnumber_text = gtk_entry_get_text(GTK_ENTRY(fnumber_te));
- fnumber = (gint)strtol(fnumber_text, &p, 10);
- if ( ((p == fnumber_text) || (*p != '\0')) || (fnumber <= 0) ) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The buffer alarm threshold you entered isn't valid.");
- return;
- }
- mcast_stream_bufferalarm = fnumber;
-
- fnumber_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_MCAST_ENTRY_4);
- fnumber_text = gtk_entry_get_text(GTK_ENTRY(fnumber_te));
- fnumber = (gint)strtol(fnumber_text, &p, 10);
- if ( ((p == fnumber_text) || (*p != '\0')) || (fnumber <= 0) || (fnumber > 10000000) ) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The stream empty speed should be between 1 and 10000000");
- return;
- }
- mcast_stream_emptyspeed = fnumber;
-
- fnumber_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_MCAST_ENTRY_5);
- fnumber_text = gtk_entry_get_text(GTK_ENTRY(fnumber_te));
- fnumber = (gint)strtol(fnumber_text, &p, 10);
- if ( ((p == fnumber_text) || (*p != '\0')) || (fnumber <= 0) || (fnumber > 10000000) ) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The total empty speed should be between 1 and 10000000");
- return;
- }
- mcast_stream_cumulemptyspeed = fnumber;
-
- window_destroy(GTK_WIDGET(parent_w));
-
- /* Clean up memory used by stream tap */
- mcaststream_reset((mcaststream_tapinfo_t*)mcaststream_dlg_get_tapinfo());
- /* retap all packets */
- cf_retap_packets(&cfile);
-
-}
-
-
-static void
-mcast_on_params(GtkButton *button _U_, gpointer data _U_)
-{
- GtkWidget *main_vb;
- GtkWidget *label, *hbuttonbox, *grid;
- GtkWidget *ok_bt, *cancel_bt;
- GtkWidget *entry1, *entry2, *entry3, *entry4, *entry5;
- gchar label_text[51];
-
- if (mcast_params_dlg != NULL) {
- /* There's already a Params dialog box; reactivate it. */
- reactivate_window(mcast_params_dlg);
- return;
- }
-
- mcast_params_dlg = dlg_window_new("Wireshark: Set parameters for Multicast Stream Analysis");
- gtk_window_set_destroy_with_parent(GTK_WINDOW(mcast_params_dlg), TRUE);
- gtk_window_set_default_size(GTK_WINDOW(mcast_params_dlg), 210, 210);
-
- gtk_widget_show(mcast_params_dlg);
-
- /* Container for each row of widgets */
- main_vb =ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 2);
- gtk_container_add(GTK_CONTAINER(mcast_params_dlg), main_vb);
- gtk_widget_show(main_vb);
-
- grid = ws_gtk_grid_new();
- gtk_box_pack_start(GTK_BOX(main_vb), grid, TRUE, TRUE, 0);
- label = gtk_label_new(" Burst measurement interval (ms) ");
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 0, 0, 1, 1);
- entry1 = gtk_entry_new();
- g_snprintf(label_text, sizeof(label_text), "%u", mcast_stream_burstint);
- gtk_entry_set_text(GTK_ENTRY(entry1), label_text);
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), entry1, 1, 0, 1, 1);
- label = gtk_label_new(" Burst alarm threshold (packets) ");
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 0, 1, 1, 1);
- entry2 = gtk_entry_new();
- g_snprintf(label_text, sizeof(label_text), "%u", mcast_stream_trigger);
- gtk_entry_set_text(GTK_ENTRY(entry2), label_text);
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), entry2, 1, 1, 1, 1);
- label = gtk_label_new(" Buffer alarm threshold (bytes) ");
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 0, 2, 1, 1);
- entry3 = gtk_entry_new();
- g_snprintf(label_text, sizeof(label_text), "%u", mcast_stream_bufferalarm);
- gtk_entry_set_text(GTK_ENTRY(entry3), label_text);
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), entry3, 1, 2, 1, 1);
- label = gtk_label_new(" Stream empty speed (kbit/s) ");
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 0, 3, 1, 1);
- entry4 = gtk_entry_new();
- g_snprintf(label_text, sizeof(label_text), "%u", mcast_stream_emptyspeed);
- gtk_entry_set_text(GTK_ENTRY(entry4), label_text);
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), entry4, 1, 3, 1, 1);
- label = gtk_label_new(" Total empty speed (kbit/s) ");
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 0, 4, 1, 1);
- entry5 = gtk_entry_new();
- g_snprintf(label_text, sizeof(label_text), "%u", mcast_stream_cumulemptyspeed);
- gtk_entry_set_text(GTK_ENTRY(entry5), label_text);
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), entry5, 1, 4, 1, 1);
-
- gtk_widget_show (grid);
-
- /* button row */
- hbuttonbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), hbuttonbox, 0, 5, 2, 1);
- ok_bt = ws_gtk_button_new_from_stock(GTK_STOCK_OK);
- gtk_container_add (GTK_CONTAINER(hbuttonbox), ok_bt);
- cancel_bt = ws_gtk_button_new_from_stock(GTK_STOCK_CANCEL);
- gtk_container_add (GTK_CONTAINER(hbuttonbox), cancel_bt);
- gtk_widget_set_can_default(cancel_bt, TRUE);
- gtk_button_box_set_layout(GTK_BUTTON_BOX(hbuttonbox), GTK_BUTTONBOX_END);
- gtk_box_set_spacing(GTK_BOX(hbuttonbox), 0);
-
- g_signal_connect(mcast_params_dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(mcast_params_dlg, "destroy", G_CALLBACK(mcast_params_destroy_cb), NULL);
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(mcast_params_ok_cb), mcast_params_dlg);
- window_set_cancel_button(mcast_params_dlg, cancel_bt, window_cancel_button_cb);
-
- /* Attach pointers to needed widgets */
- g_object_set_data(G_OBJECT(mcast_params_dlg), E_MCAST_ENTRY_1, entry1);
- g_object_set_data(G_OBJECT(mcast_params_dlg), E_MCAST_ENTRY_2, entry2);
- g_object_set_data(G_OBJECT(mcast_params_dlg), E_MCAST_ENTRY_3, entry3);
- g_object_set_data(G_OBJECT(mcast_params_dlg), E_MCAST_ENTRY_4, entry4);
- g_object_set_data(G_OBJECT(mcast_params_dlg), E_MCAST_ENTRY_5, entry5);
-
- gtk_widget_show_all(mcast_params_dlg);
- window_present(mcast_params_dlg);
-}
-
-
-/****************************************************************************/
-/* append a line to list */
-static void
-add_to_list_store(mcast_stream_info_t* strinfo)
-{
- gchar label_text[256];
- gchar *data[NUM_COLS];
- int i;
- char *savelocale;
- char *src_addr, *dst_addr;
-
- /* save the current locale */
- savelocale = g_strdup(setlocale(LC_NUMERIC, NULL));
- /* switch to "C" locale to avoid problems with localized decimal separators
- in g_snprintf("%f") functions */
- setlocale(LC_NUMERIC, "C");
-
- src_addr = address_to_display(NULL, &(strinfo->src_addr));
- dst_addr = address_to_display(NULL, &(strinfo->dest_addr));
- data[0] = g_strdup(src_addr);
- data[1] = g_strdup_printf("%u", strinfo->src_port);
- data[2] = g_strdup(dst_addr);
- data[3] = g_strdup_printf("%u", strinfo->dest_port);
- data[4] = g_strdup_printf("%u", strinfo->npackets);
- data[5] = g_strdup_printf("%.1f /s", strinfo->apackets);
- data[6] = g_strdup_printf("%2.1f Mbps", strinfo->average_bw/1000000);
- data[7] = g_strdup_printf("%2.1f Mbps", strinfo->element.maxbw/1000000);
- data[8] = g_strdup_printf("%u / %dms", strinfo->element.topburstsize, mcast_stream_burstint);
- data[9] = g_strdup_printf("%u", strinfo->element.numbursts);
- data[10] = g_strdup_printf("%.1f KB", (float)strinfo->element.topbuffusage/1000);
- data[11] = g_strdup_printf("%u", strinfo->element.numbuffalarms);
-
- /* restore previous locale setting */
- setlocale(LC_NUMERIC, savelocale);
- g_free(savelocale);
-
- /* Acquire an iterator */
- gtk_list_store_append(list_store, &list_iter);
-
- /* Fill the new row */
- gtk_list_store_set(list_store, &list_iter,
- MC_COL_SRC_ADDR, data[0],
- MC_COL_SRC_PORT, data[1],
- MC_COL_DST_ADDR, data[2],
- MC_COL_DST_PORT, data[3],
- MC_COL_PACKETS, data[4],
- MC_COL_PPS, data[5],
- MC_COL_AVG_BW, data[6],
- MC_COL_MAX_BW, data[7],
- MC_COL_MAX_BURST, data[8],
- MC_COL_BURST_ALARM, data[9],
- MC_COL_MAX_BUFFER, data[10],
- MC_COL_BUFFER_ALARM, data[11],
- MC_COL_DATA, strinfo,
- -1);
-
- for (i = 0; i < NUM_COLS-1; i++)
- g_free(data[i]);
- wmem_free(NULL, src_addr);
- wmem_free(NULL, dst_addr);
-
- /* Update the top label with the number of detected streams */
- g_snprintf(label_text, sizeof(label_text),
- "Detected %d Multicast streams, Average Bw: %.1f Mbps Max Bw: %.1f Mbps Max burst: %d / %dms Max buffer: %.1f KB",
- ++streams_nb,
- mcaststream_dlg_get_tapinfo()->allstreams->average_bw/1000000, mcaststream_dlg_get_tapinfo()->allstreams->element.maxbw/1000000,
- mcaststream_dlg_get_tapinfo()->allstreams->element.topburstsize, mcast_stream_burstint,
- (float)(mcaststream_dlg_get_tapinfo()->allstreams->element.topbuffusage)/1000);
- gtk_label_set_text(GTK_LABEL(top_label), label_text);
-
- g_snprintf(label_text, sizeof(label_text), "\nBurst int: %u ms Burst alarm: %u pps Buffer alarm: %u Bytes Stream empty speed: %u Kbps Total empty speed: %u Kbps\n",
- mcast_stream_burstint, mcast_stream_trigger, mcast_stream_bufferalarm, mcast_stream_emptyspeed, mcast_stream_cumulemptyspeed);
- gtk_label_set_text(GTK_LABEL(label_par), label_text);
-}
-
-/****************************************************************************/
-/* Create list view */
-static void
-create_list_view(void)
-{
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
- GtkTreeSortable *sortable;
- GtkTreeView *list_view;
- GtkTreeSelection *selection;
-
- /* Create the store */
- list_store = gtk_list_store_new(NUM_COLS, /* Total number of columns */
- G_TYPE_STRING, /* Source address */
- G_TYPE_STRING, /* Source port */
- G_TYPE_STRING, /* Destination address */
- G_TYPE_STRING, /* Destination port */
- G_TYPE_STRING, /* Packets */
- G_TYPE_STRING, /* Packets per second */
- G_TYPE_STRING, /* Average bandwidth */
- G_TYPE_STRING, /* Max. bandwidth */
- G_TYPE_STRING, /* Max. burst */
- G_TYPE_STRING, /* Burst alarms */
- G_TYPE_STRING, /* Max. buffers */
- G_TYPE_STRING, /* Buffer alarms */
- G_TYPE_POINTER /* Data */
- );
-
- /* Create a view */
- list_w = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store));
-
- list_view = GTK_TREE_VIEW(list_w);
- sortable = GTK_TREE_SORTABLE(list_store);
-
- /* Speed up the list display */
- gtk_tree_view_set_fixed_height_mode(list_view, TRUE);
-
- /* Setup the sortable columns */
- gtk_tree_sortable_set_sort_column_id(sortable, MC_COL_SRC_ADDR, GTK_SORT_ASCENDING);
- gtk_tree_view_set_headers_clickable(list_view, FALSE);
-
- /* The view now holds a reference. We can get rid of our own reference */
- g_object_unref(G_OBJECT(list_store));
-
- /*
- * Create the first column packet, associating the "text" attribute of the
- * cell_renderer to the first column of the model
- */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Src IP addr", renderer,
- "text", MC_COL_SRC_ADDR,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, MC_COL_SRC_ADDR);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 60);
- gtk_tree_view_column_set_fixed_width(column, 100);
- /* Add the column to the view. */
- gtk_tree_view_append_column(list_view, column);
-
- /* Source port */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Src port", renderer,
- "text", MC_COL_SRC_PORT,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, MC_COL_SRC_PORT);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 60);
- gtk_tree_view_column_set_fixed_width(column, 80);
- gtk_tree_view_append_column(list_view, column);
-
- /* Destination address */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Dst IP addr", renderer,
- "text", MC_COL_DST_ADDR,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, MC_COL_DST_ADDR);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 60);
- gtk_tree_view_column_set_fixed_width(column, 100);
- gtk_tree_view_append_column(list_view, column);
-
- /* Destination port */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Dst port", renderer,
- "text", MC_COL_DST_PORT,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, MC_COL_DST_PORT);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 60);
- gtk_tree_view_column_set_fixed_width(column, 80);
- gtk_tree_view_append_column(list_view, column);
-
- /* Packets */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Packets", renderer,
- "text", MC_COL_PACKETS,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, MC_COL_PACKETS);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 60);
- gtk_tree_view_column_set_fixed_width(column, 80);
- gtk_tree_view_append_column(list_view, column);
-
- /* Packets/s */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Packets/s", renderer,
- "text", MC_COL_PPS,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, MC_COL_PPS);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 60);
- gtk_tree_view_column_set_fixed_width(column, 90);
- gtk_tree_view_append_column(list_view, column);
-
- /* Average bandwidth */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Avg Bw", renderer,
- "text", MC_COL_AVG_BW,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, MC_COL_AVG_BW);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 70);
- gtk_tree_view_column_set_fixed_width(column, 80);
- gtk_tree_view_append_column(list_view, column);
-
- /* Max. bandwidth */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Max Bw", renderer,
- "text", MC_COL_MAX_BW,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, MC_COL_MAX_BW);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 70);
- gtk_tree_view_column_set_fixed_width(column, 80);
- gtk_tree_view_append_column(list_view, column);
-
- /* Max. bursts */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Max bursts", renderer,
- "text", MC_COL_MAX_BURST,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, MC_COL_MAX_BURST);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 70);
- gtk_tree_view_column_set_fixed_width(column, 100);
- gtk_tree_view_append_column(list_view, column);
-
- /* Burst alarms*/
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Burst alarms", renderer,
- "text", MC_COL_BURST_ALARM,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, MC_COL_BURST_ALARM);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 90);
- gtk_tree_view_column_set_fixed_width(column, 110);
- gtk_tree_view_append_column(list_view, column);
-
- /* Max. buffers */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Max buffers", renderer,
- "text", MC_COL_MAX_BUFFER,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, MC_COL_MAX_BUFFER);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 90);
- gtk_tree_view_column_set_fixed_width(column, 100);
- gtk_tree_view_append_column(list_view, column);
-
- /* Buffer alarms */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Buffer alarms", renderer,
- "text", MC_COL_BUFFER_ALARM,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, MC_COL_BUFFER_ALARM);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 90);
- gtk_tree_view_column_set_fixed_width(column, 120);
- gtk_tree_view_append_column(list_view, column);
-
- /* Now enable the sorting of each column */
- gtk_tree_view_set_rules_hint(list_view, TRUE);
- gtk_tree_view_set_headers_clickable(list_view, TRUE);
-
- /* Setup the selection handler */
- selection = gtk_tree_view_get_selection(list_view);
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
-
- g_signal_connect(G_OBJECT(selection), "changed", /* (un)select_row */
- G_CALLBACK(mcaststream_on_select_row),
- NULL);
-
-}
-
-
-/****************************************************************************/
-/* Create dialog */
-static void
-mcaststream_dlg_create(void)
-{
- GtkWidget *mcaststream_dlg_w;
- GtkWidget *main_vb;
- GtkWidget *scrolledwindow;
- GtkWidget *hbuttonbox;
- /*GtkWidget *bt_unselect;*/
- GtkWidget *bt_params;
- GtkWidget *bt_close;
-
- gchar *title_name_ptr;
- gchar *win_name;
-
- title_name_ptr = cf_get_display_name(&cfile);
- win_name = g_strdup_printf("%s - UDP Multicast Streams", title_name_ptr);
- g_free(title_name_ptr);
- mcaststream_dlg_w = dlg_window_new(win_name);
-
- gtk_window_set_default_size(GTK_WINDOW(mcaststream_dlg_w), 1150, 400);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(mcaststream_dlg_w), main_vb);
- gtk_container_set_border_width (GTK_CONTAINER (main_vb), 12);
-
- top_label = gtk_label_new ("Detected 0 Multicast streams");
- gtk_box_pack_start (GTK_BOX (main_vb), top_label, FALSE, FALSE, 8);
-
- scrolledwindow = scrolled_window_new (NULL, NULL);
- gtk_box_pack_start (GTK_BOX (main_vb), scrolledwindow, TRUE, TRUE, 0);
-
- create_list_view();
- gtk_container_add(GTK_CONTAINER(scrolledwindow), list_w);
-
- gtk_widget_show(mcaststream_dlg_w);
-
- label_fwd = gtk_label_new (FWD_LABEL_TEXT);
- gtk_box_pack_start (GTK_BOX (main_vb), label_fwd, FALSE, FALSE, 0);
-
- label_par = gtk_label_new (PAR_LABEL_TEXT);
- gtk_box_pack_start (GTK_BOX (main_vb), label_par, FALSE, FALSE, 0);
-
- /* button row */
- hbuttonbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_start (GTK_BOX (main_vb), hbuttonbox, FALSE, FALSE, 0);
- gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox), GTK_BUTTONBOX_END);
- gtk_box_set_spacing (GTK_BOX (hbuttonbox), 0);
-
- /*bt_unselect = gtk_button_new_with_label ("Unselect");
- gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_unselect);
- gtk_widget_set_tooltip_text (bt_unselect, "Undo stream selection");*/
-
- bt_params = gtk_button_new_with_label ("Set parameters");
- gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_params);
- gtk_widget_set_tooltip_text (bt_params, "Set buffer, limit and speed parameters");
-
- bt_filter = gtk_button_new_with_label ("Prepare Filter");
- gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_filter);
- gtk_widget_set_tooltip_text (bt_filter, "Prepare a display filter of the selected stream");
-
- bt_close = ws_gtk_button_new_from_stock(GTK_STOCK_CLOSE);
- gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_close);
- gtk_widget_set_tooltip_text (bt_close, "Close this dialog");
- gtk_widget_set_can_default(bt_close, TRUE);
-
- /*g_signal_connect(bt_unselect, "clicked", G_CALLBACK(mcaststream_on_unselect), NULL);*/
- g_signal_connect(bt_params, "clicked", G_CALLBACK(mcast_on_params), NULL);
- g_signal_connect(bt_filter, "clicked", G_CALLBACK(mcaststream_on_filter), NULL);
- window_set_cancel_button(mcaststream_dlg_w, bt_close, window_cancel_button_cb);
-
- g_signal_connect(mcaststream_dlg_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(mcaststream_dlg_w, "destroy", G_CALLBACK(mcaststream_on_destroy), NULL);
-
- gtk_widget_show_all(mcaststream_dlg_w);
- window_present(mcaststream_dlg_w);
-
- mcaststream_on_unselect(NULL, NULL);
-
- mcast_stream_dlg = mcaststream_dlg_w;
-
- g_free(win_name);
-
-}
-
-
-/****************************************************************************/
-/* PUBLIC */
-/****************************************************************************/
-
-/****************************************************************************/
-/* update the contents of the dialog box clist */
-/* list: pointer to list of mcast_stream_info_t* */
-static void
-mcaststream_dlg_update(GList *list)
-{
- if (mcast_stream_dlg != NULL) {
- gtk_list_store_clear(list_store);
- streams_nb = 0;
-
- list = g_list_first(list);
- while (list)
- {
- add_to_list_store((mcast_stream_info_t*)(list->data));
- list = g_list_next(list);
- }
-
- mcaststream_on_unselect(NULL, NULL);
- }
-
- last_list = list;
-}
-
-static void
-mcaststream_tap_reset(mcaststream_tapinfo_t *tapinfo _U_)
-{
- GtkTreeSelection *selection;
- if (mcast_stream_dlg != NULL) {
- /* Disable selection to avoid mcaststream_on_select_row from
- * triggering and thereby accessing invalid memory. */
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list_w));
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_NONE);
- gtk_list_store_clear(list_store);
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
- streams_nb = 0;
- }
-}
-
-static void
-mcaststream_tap_draw(mcaststream_tapinfo_t *tapinfo)
-{
- if (tapinfo) {
- mcaststream_dlg_update(tapinfo->strinfo_list);
- }
-}
-
-#if 0
-static void
-mcaststream_dlg_mark_packet(mcaststream_tapinfo_t *tapinfo _U_, frame_data *fd) {
- if (!fd) return;
-
- cf_mark_frame(&cfile, fd);
-}
-#endif
-
-/****************************************************************************/
-/* update the contents of the dialog box clist */
-/* list: pointer to list of mcast_stream_info_t* */
-void
-mcaststream_dlg_show(GList *list)
-{
- if (mcast_stream_dlg != NULL) {
- /* There's already a dialog box; reactivate it. */
- reactivate_window(mcast_stream_dlg);
- /* Another list since last call? */
- if (list != last_list) {
- mcaststream_dlg_update(list);
- }
- }
- else {
- /* Create and show the dialog box */
- mcaststream_dlg_create();
- mcaststream_dlg_update(list);
- }
-}
-
-
-/****************************************************************************/
-/* entry point when called via the GTK menu */
-void
-mcaststream_launch(GtkAction *action _U_, gpointer user_data _U_)
-{
- /* Register the tap listener */
- register_tap_listener_mcast_stream(&the_tapinfo_struct);
-
- /* Scan for Mcast streams (redissect all packets) */
- mcaststream_scan(&the_tapinfo_struct, &cfile);
-
- /* Show the dialog box with the list of streams */
- mcaststream_dlg_show(the_tapinfo_struct.strinfo_list);
-
- /* Tap listener will be removed and cleaned up in mcaststream_on_destroy */
-}
-
-mcaststream_tapinfo_t *mcaststream_dlg_get_tapinfo(void) {
- return &the_tapinfo_struct;
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/mcast_stream_dlg.h b/ui/gtk/mcast_stream_dlg.h
deleted file mode 100644
index 819d09d3a9..0000000000
--- a/ui/gtk/mcast_stream_dlg.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* mcast_stream_dlg.h
- *
- * Copyright 2006, Iskratel , Slovenia
- * By Jakob Bratkovic <j.bratkovic@iskratel.si> and
- * Miha Jemec <m.jemec@iskratel.si>
- *
- * based on rtp_stream_dlg.h
- * Copyright 2003, Alcatel Business Systems
- * By Lars Ruoff <lars.ruoff@gmx.net>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __MCAST_STREAM_DLG_H__
-#define __MCAST_STREAM_DLG_H__
-
-#include "ui/mcast_stream.h"
-
-/** @file
- * @ingroup dialog_group
- * "Mcast Stream Analysis" dialog box.
- */
-
-/**
- * Create or reactivate the mcast streams dialog box.
- *
- * @param list pointer to list of mcast_stream_info_t*
- */
-void mcaststream_dlg_show(GList *list);
-
-/**
- * Retrieves a constant reference to the unique info structure of the
- * rtp_streams tap listener.
- * The user should not modify the data pointed to.
- *
- * @return Pointer to an rtpstream_tapinfo_t
- */
-mcaststream_tapinfo_t *mcaststream_dlg_get_tapinfo(void);
-
-#endif /* __MCAST_STREAM_DLG_H__ */
diff --git a/ui/gtk/memory_dlg.c b/ui/gtk/memory_dlg.c
deleted file mode 100644
index d11122c2ae..0000000000
--- a/ui/gtk/memory_dlg.c
+++ /dev/null
@@ -1,740 +0,0 @@
-/* memory_dlg.c
- *
- * Based on
- * io_stat 2002 Ronnie Sahlberg
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-
-#include "config.h"
-
-#include <math.h>
-#include <gtk/gtk.h>
-
-#include "ui/gtk/dlg_utils.h"
-#include "ui/simple_dialog.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/old-gtk-compat.h"
-
-#include "wsutil/str_util.h"
-#include "epan/app_mem_usage.h"
-
-enum {
- MAX_GRAPHS = 10
-};
-
-#define MAX_YSCALE 28
-static guint32 yscale_max[MAX_YSCALE] = {0, 1, 10, 20,
- 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000,
- 50000, 100000, 200000, 500000, 1000000, 2000000,
- 5000000, 10000000, 20000000, 50000000, 100000000,
- 200000000, 500000000, 1000000000, 2000000000};
-
-#define DEFAULT_PIXELS_PER_TICK 5
-
-#define NUM_IO_ITEMS 100000
-typedef struct _io_item_t {
- gsize bytes;
-} io_item_t;
-
-typedef struct _io_stat_graph_t {
- struct _io_stat_t *io;
-
- io_item_t *items[NUM_IO_ITEMS];
- gboolean display;
- GtkWidget *display_button;
-} io_stat_graph_t;
-
-typedef struct _io_stat_t {
- gboolean needs_redraw;
- guint32 num_items; /* total number of items in all intervals (zero relative) */
- guint32 left_x_border;
- guint32 right_x_border;
- nstime_t start_time;
-
- struct _io_stat_graph_t graphs[MAX_GRAPHS];
- GtkWidget *window;
- GtkWidget *draw_area;
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_surface_t *surface;
-#else
- GdkPixmap *pixmap;
-#endif
- int surface_width;
- int surface_height;
- int pixels_per_tick;
-
- guint timer_id;
-} io_stat_t;
-
-#define INTERVAL 1000
-
-static void
-io_stat_reset(io_stat_t *io)
-{
- int i, j;
-
- io->needs_redraw = TRUE;
- for (i=0; i<MAX_GRAPHS; i++) {
- for (j=0; j<NUM_IO_ITEMS; j++) {
- io_item_t *ioi;
- ioi = (io_item_t *)io->graphs[i].items[j];
-
- ioi->bytes = 0;
- }
- }
- io->num_items = 0;
- io->start_time.secs = time(NULL);
- io->start_time.nsecs = 0;
-}
-
-static guint64
-get_it_value(io_stat_t *io, int graph, int idx)
-{
- io_item_t *it;
-
- g_assert(graph < MAX_GRAPHS);
- g_assert(idx < NUM_IO_ITEMS);
-
- it = (io_item_t *)io->graphs[graph].items[idx];
-
- return it->bytes;
-}
-
-static void
-print_interval_string(char *buf, int buf_len, guint32 interval, io_stat_t *io)
-{
- struct tm *tmp;
- time_t sec_val = interval/1000 + io->start_time.secs;
- gint32 nsec_val = interval%1000 + io->start_time.nsecs/1000000;
-
- if (nsec_val >= 1000) {
- sec_val++;
- nsec_val -= 1000;
- }
- tmp = localtime (&sec_val);
- if (tmp != NULL) {
- if (INTERVAL >= 1000) {
- g_snprintf(buf, buf_len, "%02d:%02d:%02d", tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
- } else if (INTERVAL >= 100) {
- g_snprintf(buf, buf_len, "%02d:%02d:%02d.%1d", tmp->tm_hour, tmp->tm_min, tmp->tm_sec, nsec_val/100);
- } else if (INTERVAL >= 10) {
- g_snprintf(buf, buf_len, "%02d:%02d:%02d.%02d", tmp->tm_hour, tmp->tm_min, tmp->tm_sec, nsec_val/10);
- } else {
- g_snprintf(buf, buf_len, "%02d:%02d:%02d.%03d", tmp->tm_hour, tmp->tm_min, tmp->tm_sec, nsec_val);
- }
- } else
- g_snprintf(buf, buf_len, "XX:XX:XX");
-}
-
-static void
-io_stat_draw(io_stat_t *io)
-{
- int i;
- guint32 last_interval, first_interval, interval_delta;
- gint32 current_interval;
- guint32 top_y_border;
- guint32 bottom_y_border;
- PangoLayout *layout;
- int label_width, label_height;
- guint32 draw_width, draw_height;
- GtkAllocation widget_alloc;
-
- /* new variables */
- guint32 num_time_intervals; /* number of intervals relative to 1 */
- guint64 max_value; /* max value of seen data */
- guint32 max_y; /* max value of the Y scale */
- cairo_t *cr;
-
- if (!io->needs_redraw) {
- return;
- }
- io->needs_redraw = FALSE;
- /*
- * Find the length of the intervals we have data for
- * so we know how large arrays we need to malloc()
- */
- num_time_intervals = io->num_items+1;
-
- /* XXX move this check to _packet() */
- if (num_time_intervals > NUM_IO_ITEMS) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "IO-Stat error. There are too many entries, bailing out");
- return;
- }
-
- /*
- * find the max value so we can autoscale the y axis
- */
- max_value = 0;
- for (i=0; i<MAX_GRAPHS; i++) {
- int idx;
-
- if (!io->graphs[i].display) {
- continue;
- }
- for (idx=0; (guint32)(idx) < num_time_intervals; idx++) {
- guint64 val;
-
- val = get_it_value(io, i, idx);
-
- /* keep track of the max value we have encountered */
- if (val>max_value) {
- max_value = val;
- }
- }
- }
-
- /*
- * Clear out old plot
- */
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (io->surface);
-#else
- cr = gdk_cairo_create (io->pixmap);
-#endif
- cairo_set_source_rgb (cr, 1, 1, 1);
- gtk_widget_get_allocation(io->draw_area, &widget_alloc);
- cairo_rectangle (cr, 0, 0, widget_alloc.width,widget_alloc.height);
- cairo_fill (cr);
- cairo_destroy (cr);
- /*
- * Calculate the y scale we should use
- */
- max_y = yscale_max[MAX_YSCALE-1];
- for (i=MAX_YSCALE-1; i>1; i--) {
- if (max_value < yscale_max[i]) {
- max_y = yscale_max[i];
- }
- }
-
- layout = gtk_widget_create_pango_layout(io->draw_area, "99999 T bytes");
- pango_layout_get_pixel_size(layout, &label_width, &label_height);
-
- io->left_x_border = 10;
- io->right_x_border = label_width + 20;
- top_y_border = 10;
- bottom_y_border = label_height + 20;
-
- /*
- * Calculate the size of the drawing area for the actual plot
- */
- draw_width = io->surface_width-io->right_x_border - io->left_x_border;
- draw_height = io->surface_height-top_y_border - bottom_y_border;
-
- /* Draw the y axis and labels
- * (we always draw the y scale with 11 ticks along the axis)
- */
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create(io->surface);
-#else
- cr = gdk_cairo_create(io->pixmap);
-#endif
- cairo_set_line_width(cr, 1.0);
- cairo_move_to(cr, io->surface_width-io->right_x_border+1.5, top_y_border + 0.5);
- cairo_line_to(cr, io->surface_width-io->right_x_border+1.5, io->surface_height-bottom_y_border + 0.5);
- cairo_stroke(cr);
-
- for (i=0; i<=10; i++) {
- int xwidth, lwidth, ypos;
-
- xwidth = 5;
- if (!(i%5)) {
- /* first, middle and last tick are slightly longer */
- xwidth = 10;
- }
- ypos = io->surface_height-bottom_y_border-draw_height*i/10;
- /* draw the tick */
- cairo_move_to(cr, io->surface_width-io->right_x_border+1.5, ypos+0.5);
- cairo_line_to(cr, io->surface_width-io->right_x_border+1.5+xwidth,ypos+0.5);
- cairo_stroke(cr);
- /* draw the labels */
- if (xwidth == 10) {
- guint32 value = (max_y/10)*i;
- char *label_tmp;
-
- label_tmp = format_size(value, format_size_unit_bytes);
-
- pango_layout_set_text(layout, label_tmp, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-
- cairo_move_to (cr, io->surface_width-io->right_x_border+15+label_width-lwidth, ypos-label_height/2);
- pango_cairo_show_layout (cr, layout);
-
- g_free(label_tmp);
- }
- }
-
- last_interval = (io->num_items) * INTERVAL;
-
- /*XXX*/
- /* plot the x-scale */
- cairo_move_to(cr, io->left_x_border+0.5, io->surface_height-bottom_y_border+1.5);
- cairo_line_to(cr, io->surface_width-io->right_x_border+1.5,io->surface_height-bottom_y_border+1.5);
- cairo_stroke(cr);
- if ((last_interval/INTERVAL) >= draw_width/io->pixels_per_tick) {
- first_interval = (last_interval/INTERVAL)-draw_width/io->pixels_per_tick+1;
- first_interval *= INTERVAL;
- } else {
- first_interval = 0;
- }
-
- interval_delta = (100/io->pixels_per_tick)*INTERVAL;
- for (current_interval = last_interval;
- current_interval >= (gint32)first_interval;
- current_interval = current_interval-INTERVAL) {
- int x, xlen;
-
- /* if pixels_per_tick is 1 or 2, only draw every 10 ticks */
- /* if pixels_per_tick is 5, only draw every 5 ticks */
- if (((io->pixels_per_tick < 5) && (current_interval % (10*INTERVAL))) ||
- ((io->pixels_per_tick == 5) && (current_interval % (5*INTERVAL)))) {
- continue;
- }
-
- if (!(current_interval%interval_delta)) {
- xlen = 10;
- } else if (!(current_interval%(interval_delta/2))) {
- xlen = 8;
- } else {
- xlen = 5;
- }
- x = draw_width+io->left_x_border-((last_interval-current_interval)/INTERVAL)*io->pixels_per_tick;
- cairo_move_to(cr, x-1-io->pixels_per_tick/2+0.5, io->surface_height-bottom_y_border+1.5);
- cairo_line_to(cr, x-1-io->pixels_per_tick/2+0.5, io->surface_height-bottom_y_border+xlen+1.5);
- cairo_stroke(cr);
- if (xlen == 10) {
- char label_string[64];
- int lwidth, x_pos;
- print_interval_string (label_string, sizeof(label_string), current_interval, io);
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-
- if ((x-1-io->pixels_per_tick/2-lwidth/2) < 5) {
- x_pos = 5;
- } else if ((x-1-io->pixels_per_tick/2+lwidth/2) > (io->surface_width-5)) {
- x_pos = io->surface_width-lwidth-5;
- } else {
- x_pos = x-1-io->pixels_per_tick/2-lwidth/2;
- }
- cairo_move_to (cr, x_pos, io->surface_height-bottom_y_border+15);
- pango_cairo_show_layout (cr, layout);
- }
-
- }
- cairo_destroy (cr);
- cr = NULL;
- g_object_unref(G_OBJECT(layout));
-
- /*
- * Loop over all graphs and draw them
- */
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (io->surface);
-#else
- cr = gdk_cairo_create (io->pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
-
- for (i=MAX_GRAPHS-1; i>=0; i--) {
- guint64 val;
- guint32 interval, x_pos, y_pos, prev_x_pos, prev_y_pos;
-
- if (!io->graphs[i].display) {
- continue;
- }
-
- /* initialize prev x/y to the value of the first interval */
- prev_x_pos = draw_width-1 -
- io->pixels_per_tick * ((last_interval - first_interval) / INTERVAL) +
- io->left_x_border;
- val = get_it_value(io, i, first_interval / INTERVAL);
-
- if (val>max_y) {
- prev_y_pos = 0;
- } else {
- prev_y_pos = (guint32)(draw_height-1-(val*draw_height)/max_y+top_y_border);
- }
-
- for (interval = first_interval;
- interval < last_interval;
- interval += INTERVAL) {
- x_pos = draw_width-1-io->pixels_per_tick*((last_interval-interval)/INTERVAL)+io->left_x_border;
-
- val = get_it_value(io, i, interval/INTERVAL);
- /* Moving average calculation */
-
- if (val>max_y) {
- y_pos = 0;
- } else {
- y_pos = (guint32)(draw_height - 1 -
- ((val * draw_height) / max_y) +
- top_y_border);
- }
-
- /* Don't draw anything if the segment entirely above the top of the graph
- */
- if ( (prev_y_pos != 0) || (y_pos != 0) ) {
- static GdkRGBA red_color = {1.0, 0.0, 0.1, 1.0};
-
- cairo_move_to(cr, prev_x_pos+0.5, prev_y_pos+0.5);
- cairo_line_to(cr, x_pos+0.5, y_pos+0.5);
- gdk_cairo_set_source_rgba(cr, &red_color);
- cairo_stroke(cr);
- }
-
- prev_y_pos = y_pos;
- prev_x_pos = x_pos;
- }
- }
- cairo_destroy(cr);
-
- cr = gdk_cairo_create(gtk_widget_get_window(io->draw_area));
-
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface(cr, io->surface, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap(cr, io->pixmap, 0, 0);
-#endif
- cairo_rectangle(cr, 0, 0, io->surface_width, io->surface_height);
- cairo_fill (cr);
-
- cairo_destroy (cr);
-}
-
-static void
-io_stat_redraw(io_stat_t *io)
-{
- io->needs_redraw = TRUE;
- io_stat_draw(io);
-}
-
-
-static void
-draw_area_destroy_cb(GtkWidget *widget _U_, gpointer user_data)
-{
- io_stat_t *io = (io_stat_t *)user_data;
- int i,j;
-
- for (i=0; i<MAX_GRAPHS; i++) {
- if (io->graphs[i].display) {
-
- for (j=0; j<NUM_IO_ITEMS; j++) {
- g_free(io->graphs[i].items[j]);
- io->graphs[i].items[j] = NULL;
- }
- }
- }
-
- g_source_remove(io->timer_id);
-
- g_free(io);
-}
-
-/* create a new backing pixmap of the appropriate size */
-static gboolean
-draw_area_configure_event(GtkWidget *widget, GdkEventConfigure *event _U_, gpointer user_data)
-{
- io_stat_t *io = (io_stat_t *)user_data;
- GtkAllocation widget_alloc;
- cairo_t *cr;
-
-#if GTK_CHECK_VERSION(2,22,0)
- if (io->surface) {
- cairo_surface_destroy (io->surface);
- io->surface = NULL;
- }
-#else
- if (io->pixmap) {
- g_object_unref(io->pixmap);
- io->pixmap = NULL;
- }
-#endif
-
- gtk_widget_get_allocation(widget, &widget_alloc);
-#if GTK_CHECK_VERSION(2,22,0)
- io->surface = gdk_window_create_similar_surface (gtk_widget_get_window(widget),
- CAIRO_CONTENT_COLOR,
- widget_alloc.width,
- widget_alloc.height);
-
-#else
- io->pixmap = gdk_pixmap_new(gtk_widget_get_window(widget),
- widget_alloc.width,
- widget_alloc.height,
- -1);
-#endif
- io->surface_width = widget_alloc.width;
- io->surface_height = widget_alloc.height;
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create(io->surface);
-#else
- cr = gdk_cairo_create(io->pixmap);
-#endif
- cairo_rectangle(cr, 0, 0, widget_alloc.width, widget_alloc.height);
- cairo_set_source_rgb(cr, 1, 1, 1);
- cairo_fill(cr);
- cairo_destroy(cr);
-
- io_stat_redraw(io);
- return TRUE;
-}
-
-#if GTK_CHECK_VERSION(3,0,0)
-static gboolean
-draw_area_draw(GtkWidget *widget, cairo_t *cr, gpointer user_data)
-{
- io_stat_t *io = (io_stat_t *)user_data;
- GtkAllocation allocation;
-
- gtk_widget_get_allocation(widget, &allocation);
- cairo_set_source_surface(cr, io->surface, 0, 0);
- cairo_rectangle(cr, 0, 0, allocation.width, allocation.width);
- cairo_fill (cr);
-
- return FALSE;
-}
-#else
-/* redraw the screen from the backing pixmap */
-static gboolean
-draw_area_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer user_data)
-{
- io_stat_t *io = (io_stat_t *)user_data;
- cairo_t *cr = gdk_cairo_create (gtk_widget_get_window(widget));
-
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, io->surface, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, io->pixmap, 0, 0);
-#endif
- cairo_rectangle (cr, event->area.x, event->area.y, event->area.width, event->area.height);
- cairo_fill (cr);
-
- cairo_destroy (cr);
-
- return FALSE;
-}
-#endif
-static void
-create_draw_area(io_stat_t *io, GtkWidget *box)
-{
- io->draw_area = gtk_drawing_area_new();
- g_signal_connect(io->draw_area, "destroy", G_CALLBACK(draw_area_destroy_cb), io);
-
- gtk_widget_set_size_request(io->draw_area, io->surface_width, io->surface_height);
-
- /* signals needed to handle backing pixmap */
-#if GTK_CHECK_VERSION(3,0,0)
- g_signal_connect(io->draw_area, "draw", G_CALLBACK(draw_area_draw), io);
-#else
- g_signal_connect(io->draw_area, "expose-event", G_CALLBACK(draw_area_expose_event), io);
-#endif
- g_signal_connect(io->draw_area, "configure-event", G_CALLBACK(draw_area_configure_event), io);
- gtk_widget_add_events (io->draw_area, GDK_BUTTON_PRESS_MASK);
-
- gtk_widget_show(io->draw_area);
- gtk_box_pack_start(GTK_BOX(box), io->draw_area, TRUE, TRUE, 0);
-}
-
-static void
-filter_callback(GtkWidget *widget _U_, gpointer user_data)
-{
- io_stat_graph_t *gio = (io_stat_graph_t *)user_data;
-
- /* this graph is not active, just update display and redraw */
- if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gio->display_button))) {
- gio->display = FALSE;
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gio->display_button), FALSE);
- } else {
- gio->display = TRUE;
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gio->display_button), TRUE);
- }
-
- gdk_window_raise(gtk_widget_get_window(gio->io->window));
- io_stat_redraw(gio->io);
-}
-
-static void
-create_filter_area(io_stat_t *io, GtkWidget *box)
-{
- GtkWidget *frame;
- GtkWidget *hbox;
- int i;
-
- frame = gtk_frame_new("Memory Graphs");
- gtk_box_pack_start(GTK_BOX(box), frame, TRUE, TRUE, 0);
- gtk_widget_show(frame);
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1, FALSE);
- gtk_container_add(GTK_CONTAINER(frame), hbox);
- gtk_container_set_border_width(GTK_CONTAINER(hbox), 3);
- gtk_widget_show(hbox);
-
- for (i=0; i<MAX_GRAPHS; i++) {
- const char *label = memory_usage_get(i, NULL);
- GtkWidget *display_button;
-
- if (!label)
- break;
-
- display_button = gtk_toggle_button_new_with_label(label);
- gtk_box_pack_start(GTK_BOX(hbox), display_button, FALSE, FALSE, 0);
- g_signal_connect(display_button, "toggled", G_CALLBACK(filter_callback), &io->graphs[i]);
- gtk_widget_show(display_button);
-
- io->graphs[i].display_button = display_button;
- }
-}
-
-static void
-init_io_stat_window(io_stat_t *io)
-{
- GtkWidget *vbox;
- GtkWidget *hbox;
- GtkWidget *bbox;
- GtkWidget *close_bt;
-
- /* create the main window, transient_for top_level */
- io->window = dlg_window_new("Wireshark memory usage");
- gtk_window_set_destroy_with_parent (GTK_WINDOW(io->window), TRUE);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(io->window), vbox);
- gtk_widget_show(vbox);
-
- create_draw_area(io, vbox);
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
- gtk_container_set_border_width(GTK_CONTAINER(hbox), 3);
- gtk_widget_show(hbox);
-
- create_filter_area(io, hbox);
-
- bbox = dlg_button_row_new(GTK_STOCK_CLOSE, NULL);
- gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
- gtk_widget_show(bbox);
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(io->window, close_bt, window_cancel_button_cb);
- gtk_widget_set_tooltip_text(close_bt, "Close this dialog");
-
- gtk_widget_show(io->window);
- window_present(io->window);
-}
-
-
-static gboolean
-call_it(gpointer user_data)
-{
- io_stat_t *io = (io_stat_t *) user_data;
- char buf[64];
- char *tmp;
- int idx, i;
-
- io->needs_redraw = TRUE;
-
- idx = io->num_items++;
-
- /* some sanity checks */
- if ((idx < 0) || (idx >= NUM_IO_ITEMS)) {
- io->num_items = NUM_IO_ITEMS-1;
- return FALSE;
- }
-
-
- for (i = 0; i < MAX_GRAPHS; i++) {
- const char *label;
-
- label = memory_usage_get(i, &io->graphs[i].items[idx]->bytes);
-
- if (!label)
- break;
-
- tmp = format_size(io->graphs[i].items[idx]->bytes, format_size_unit_bytes);
- g_snprintf(buf, sizeof(buf), "%s [%s]", label, tmp);
- gtk_button_set_label(GTK_BUTTON(io->graphs[i].display_button), buf);
- g_free(tmp);
- }
-
- io_stat_draw(io);
-
- return TRUE;
-}
-
-void
-memory_stat_init(void)
-{
- io_stat_t *io;
- int i = 0, j = 0;
-
- io = g_new(io_stat_t,1);
- io->needs_redraw = TRUE;
- io->window = NULL;
- io->draw_area = NULL;
-#if GTK_CHECK_VERSION(2,22,0)
- io->surface = NULL;
-#else
- io->pixmap = NULL;
-#endif
- io->surface_width = 500;
- io->surface_height = 200;
- io->pixels_per_tick = DEFAULT_PIXELS_PER_TICK;
- io->num_items = 0;
- io->left_x_border = 0;
- io->right_x_border = 500;
- io->start_time.secs = time(NULL);
- io->start_time.nsecs = 0;
-
- for (i=0; i<MAX_GRAPHS; i++) {
- io->graphs[i].display = 0;
- io->graphs[i].display_button = NULL;
- io->graphs[i].io = io;
-
- for (j=0; j<NUM_IO_ITEMS; j++) {
- io->graphs[i].items[j] = g_new(io_item_t,1);
- }
- }
- io_stat_reset(io);
-
- /* build the GUI */
- init_io_stat_window(io);
- io->graphs[0].display = TRUE;
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(io->graphs[0].display_button), TRUE);
-
- gdk_window_raise(gtk_widget_get_window(io->window));
- io_stat_redraw(io);
-
- io->timer_id = g_timeout_add(INTERVAL, call_it, io);
-}
-
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/menus.h b/ui/gtk/menus.h
deleted file mode 100644
index f747a78530..0000000000
--- a/ui/gtk/menus.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/* menus.h
- * Menu definitions
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __MENUS_H__
-#define __MENUS_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/* Open a file(name)
- (will not ask to close existing capture file!) */
-extern void menu_open_filename(gchar *cf_name);
-
-/** @file
- * Menubar and context menus.
- * @ingroup main_window_group
- */
-
-/** One of the name resolution menu items changed. */
-extern void menu_name_resolution_changed(void);
-
-/* Reset preferences menu on profile or preference change. */
-extern void menu_prefs_reset(void);
-
-extern void rebuild_visible_columns_menu (void);
-
-/** Create a new menu.
- *
- * @param accel the created accelerator group
- * @return the new menu
- */
-extern GtkWidget *main_menu_new(GtkAccelGroup **accel);
-
-/** Set object data of menu, like g_object_set_data().
- *
- * @param path the path of the menu item
- * @param key the key to set
- * @param data the data to set
- */
-extern void set_menu_object_data(const gchar *path, const gchar *key, gpointer data);
-
-/** The popup menu handler.
- *
- * @param widget the parent widget
- * @param event the GdkEvent
- * @param data the corresponding menu
- */
-extern gboolean popup_menu_handler(GtkWidget *widget, GdkEvent *event, gpointer data);
-
-/** The current file has changed, we need to update the file set menu items.
- *
- * @param file_set the current file is part of a file set
- * @param previous_file the previous file set (or NULL)
- * @param next_file the next file set (or NULL)
- */
-extern void set_menus_for_file_set(gboolean file_set, gboolean previous_file, gboolean next_file);
-
-/** The popup menu. */
-extern GtkWidget *popup_menu_object;
-
-/* Update the packet list heading menu to indicate default
- column justification. */
-void menus_set_column_align_default (gboolean right_justify);
-
-/* Update the packet list heading menu to indicate if column can be resolved. */
-void menus_set_column_resolved (gboolean resolved, gboolean can_resolve);
-
-/* Fetch the statusbar profiles edit submenu */
-extern GtkWidget *menus_get_profiles_rename_menu (void);
-
-/* Fetch the statusbar profiles delete submenu */
-extern GtkWidget *menus_get_profiles_delete_menu (void);
-
-/* Fetch the statusbar profiles change submenu */
-extern GtkWidget *menus_get_profiles_change_menu (void);
-
-/* Enable or disable menu items based on whether a tree row is selected
- and and on whether a "Match Selected" can be done. */
-void set_menus_for_selected_tree_row(capture_file *cf);
-
-/* Enable or disable menu items based on whether a packet is selected. */
-void set_menus_for_selected_packet(capture_file *cf);
-
-/* Enable or disable menu items based on configuration profile */
-void set_menus_for_profiles(gboolean default_profile);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __MENUS_H__ */
diff --git a/ui/gtk/mtp3_summary.c b/ui/gtk/mtp3_summary.c
deleted file mode 100644
index 79ec05640f..0000000000
--- a/ui/gtk/mtp3_summary.c
+++ /dev/null
@@ -1,563 +0,0 @@
-/* mtp3_summary.c
- * Routines for MTP3 Statictics summary window
- *
- * Copyright 2004, Michael Lum <mlum [AT] telostech.com>
- * In association with Telos Technology Inc.
- *
- * Modified from gsm_map_summary.c
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/packet_info.h>
-#include <epan/stat_groups.h>
-#include <epan/tap.h>
-#include <epan/value_string.h>
-
-#include <epan/dissectors/packet-mtp3.h>
-
-#include "globals.h"
-
-#include "ui/simple_dialog.h"
-#include "ui/summary.h"
-
-#include "ui/gtk/gui_stat_menu.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_utils.h"
-
-void register_tap_listener_gtk_mtp3_summary(void);
-
-#define SUM_STR_MAX 1024
-
-typedef struct _mtp3_stat_si_code_t {
- int num_msus;
- int size;
-} mtp3_stat_si_code_t;
-
-typedef struct _mtp3_stat_t {
- mtp3_addr_pc_t addr_opc;
- mtp3_addr_pc_t addr_dpc;
- mtp3_stat_si_code_t mtp3_si_code[MTP3_NUM_SI_CODE];
-} mtp3_stat_t;
-
-typedef struct _my_columns_t {
- guint32 value;
- const gchar *strptr;
- GtkJustification just;
-} my_columns_t;
-
-enum
-{
- SI_COLUMN,
- NUM_MSUS_COLUMN,
- NUM_MSUS_SEC_COLUMN,
- NUM_BYTES_COLUMN,
- NUM_BYTES_MSU_COLUMN,
- NUM_BYTES_SEC_COLUMN,
- N_COLUMN /* The number of columns */
-};
-
-/*
- * I don't like it but I don't have time to create
- * the code for a dynamic size solution
- */
-#define MTP3_MAX_NUM_OPC_DPC 50
-
-static mtp3_stat_t mtp3_stat[MTP3_MAX_NUM_OPC_DPC];
-static guint8 mtp3_num_used;
-
-/* Create list */
-static GtkWidget *
-create_list(void)
-{
-
- GtkListStore *list_store;
- GtkWidget *list;
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
- GtkTreeSortable *sortable;
- GtkTreeView *list_view;
- GtkTreeSelection *selection;
-
- /* Create the store */
- list_store = gtk_list_store_new(N_COLUMN, /* Total number of columns XXX*/
- G_TYPE_STRING, /* SI */
- G_TYPE_INT, /* Num MSUs */
- G_TYPE_STRING, /* MSUs/sec */
- G_TYPE_INT, /* Num Bytes */
- G_TYPE_STRING, /* Bytes/MSU */
- G_TYPE_STRING); /* Bytes/sec */
-
- /* Create a view */
- list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
-
- list_view = GTK_TREE_VIEW(list);
- sortable = GTK_TREE_SORTABLE(list_store);
-
- /* Speed up the list display */
- gtk_tree_view_set_fixed_height_mode(list_view, TRUE);
-
- /* Setup the sortable columns */
- gtk_tree_sortable_set_sort_column_id(sortable, SI_COLUMN, GTK_SORT_ASCENDING);
- gtk_tree_view_set_headers_clickable(list_view, FALSE);
-
- /* The view now holds a reference. We can get rid of our own reference */
- g_object_unref (G_OBJECT (list_store));
-
- /*
- * Create the first column packet, associating the "text" attribute of the
- * cell_renderer to the first column of the model
- */
- /* 1:st column */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("SI", renderer,
- "text", SI_COLUMN,
- NULL);
-
- gtk_tree_view_column_set_sort_column_id(column, SI_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 110);
-
- /* Add the column to the view. */
- gtk_tree_view_append_column (list_view, column);
-
- /* 2:nd column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Num MSUs", renderer,
- "text", NUM_MSUS_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, NUM_MSUS_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 100);
- gtk_tree_view_append_column (list_view, column);
-
- /* 3:d column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("MSUs/sec", renderer,
- "text", NUM_MSUS_SEC_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, NUM_MSUS_SEC_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 100);
- gtk_tree_view_append_column (list_view, column);
-
- /* 4:d column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Num Bytes", renderer,
- "text", NUM_BYTES_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, NUM_BYTES_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 100);
- gtk_tree_view_append_column (list_view, column);
-
- /* 5:th column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Bytes/MSU", renderer,
- "text", NUM_BYTES_MSU_COLUMN,
- NULL);
-
-
- gtk_tree_view_column_set_sort_column_id(column, NUM_BYTES_MSU_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 100);
- gtk_tree_view_append_column (list_view, column);
-
- /* 6:th column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Bytes/sec", renderer,
- "text", NUM_BYTES_SEC_COLUMN,
- NULL);
-
- gtk_tree_view_column_set_sort_column_id(column, NUM_BYTES_SEC_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 100);
- gtk_tree_view_append_column (list_view, column);
-
- /* Now enable the sorting of each column */
- gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(list_view), TRUE);
- gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(list_view), TRUE);
-
- /* Setup the selection handler */
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
-
- return list;
-
-}
-
-static void
-add_string_to_box(gchar *str, GtkWidget *box)
-{
- GtkWidget *lb;
- lb = gtk_label_new(str);
- gtk_misc_set_alignment(GTK_MISC(lb), 0.0f, 0.5f);
- gtk_box_pack_start(GTK_BOX(box), lb,FALSE,FALSE, 0);
- gtk_widget_show(lb);
-}
-
-
-
-static void
-mtp3_sum_draw(
- GtkWidget *table,
- double seconds,
- int *tot_num_msus_p,
- double *tot_num_bytes_p)
-{
- char *entries[N_COLUMN];
- int i, j;
- int num_msus;
- int num_bytes;
- GtkListStore *list_store;
- GtkTreeIter iter;
-
- *tot_num_msus_p = 0;
- *tot_num_bytes_p = 0;
-
- list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (table))); /* Get store */
-
- for (i=0; i < MTP3_NUM_SI_CODE; i++)
- {
- j = 0;
- num_msus = 0;
- num_bytes = 0;
-
- while (j < mtp3_num_used)
- {
- num_msus += mtp3_stat[j].mtp3_si_code[i].num_msus;
- num_bytes += mtp3_stat[j].mtp3_si_code[i].size;
-
- j++;
- }
-
- *tot_num_msus_p += num_msus;
- *tot_num_bytes_p += num_bytes;
-
- entries[2] = (seconds) ? g_strdup_printf("%.2f", (double)num_msus/seconds) : g_strdup("N/A");
- entries[4] = (num_msus) ? g_strdup_printf("%.2f", (double)num_bytes/num_msus) : g_strdup("N/A");
- entries[5] = (seconds) ? g_strdup_printf("%.2f", (double)num_bytes/seconds) : g_strdup("N/A");
-
- gtk_list_store_insert_with_values( list_store , &iter, G_MAXINT,
- SI_COLUMN, mtp3_service_indicator_code_short_vals[i].strptr,
- NUM_MSUS_COLUMN, num_msus,
- NUM_MSUS_SEC_COLUMN, entries[2],
- NUM_BYTES_COLUMN, num_bytes,
- NUM_BYTES_MSU_COLUMN, entries[4],
- NUM_BYTES_SEC_COLUMN, entries[5],
- -1);
-
- g_free(entries[2]);
- g_free(entries[4]);
- g_free(entries[5]);
- }
-}
-
-
-void
-mtp3_sum_gtk_sum_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- summary_tally summary;
- GtkWidget *sum_open_w;
- GtkWidget *main_vb, *file_fr, *data_fr, *file_box;
- GtkWidget *data_box, *bbox, *close_bt;
- GtkWidget *tot_fr, *tot_box;
- GtkWidget *table, *table_fr;
-
- gchar string_buff[SUM_STR_MAX];
- const char *file_type;
- double seconds;
- int tot_num_msus;
- double tot_num_bytes;
-
- if (cfile.state == FILE_CLOSED) {
- return;
- }
-
- /* initialize the tally */
- summary_fill_in(&cfile, &summary);
-
- /* initial computations */
- seconds = summary.stop_time - summary.start_time;
-
- sum_open_w = dlg_window_new("MTP3 Statistics: Summary"); /* transient_for top_level */
- gtk_window_set_destroy_with_parent (GTK_WINDOW(sum_open_w), TRUE);
-
- /* Container for each row of widgets */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_container_add(GTK_CONTAINER(sum_open_w), main_vb);
- gtk_widget_show(main_vb);
-
- /* File frame */
- file_fr = gtk_frame_new("File");
- gtk_box_pack_start(GTK_BOX(main_vb), file_fr, TRUE, TRUE, 0);
- gtk_widget_show(file_fr);
-
- file_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_add(GTK_CONTAINER(file_fr), file_box);
- gtk_widget_show(file_box);
-
- /* filename */
- g_snprintf(string_buff, SUM_STR_MAX, "Name: %s", ((summary.filename) ? summary.filename : "None"));
- add_string_to_box(string_buff, file_box);
-
- /* length */
- g_snprintf(string_buff, SUM_STR_MAX, "Length: %" G_GINT64_MODIFIER "d", summary.file_length);
- add_string_to_box(string_buff, file_box);
-
- /* format */
- file_type = wtap_file_type_subtype_string(summary.file_type);
- g_snprintf(string_buff, SUM_STR_MAX, "Format: %s", (file_type ? file_type : "N/A"));
- add_string_to_box(string_buff, file_box);
-
- if (summary.snap != 0) {
- /* snapshot length */
- g_snprintf(string_buff, SUM_STR_MAX, "Snapshot length: %u", summary.snap);
- add_string_to_box(string_buff, file_box);
- }
-
- /* Data frame */
- data_fr = gtk_frame_new("Data");
- gtk_box_pack_start(GTK_BOX(main_vb), data_fr, TRUE, TRUE, 0);
- gtk_widget_show(data_fr);
-
- data_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_add(GTK_CONTAINER(data_fr), data_box);
- gtk_widget_show(data_box);
-
- /*
- * We must have no un-time-stamped packets (i.e., the number of
- * time-stamped packets must be the same as the number of packets),
- * and at least two time-stamped packets, in order for the elapsed
- * time to be valid.
- */
- if (summary.packet_count_ts == summary.packet_count &&
- summary.packet_count_ts >= 2) {
- /* seconds */
- g_snprintf(string_buff, SUM_STR_MAX, "Elapsed time: %.3f seconds", summary.elapsed_time);
- add_string_to_box(string_buff, data_box);
-
- g_snprintf(string_buff, SUM_STR_MAX, "Between first and last packet: %.3f seconds", seconds);
- add_string_to_box(string_buff, data_box);
- }
-
- /* Packet count */
- g_snprintf(string_buff, SUM_STR_MAX, "Packet count: %i", summary.packet_count);
- add_string_to_box(string_buff, data_box);
-
- /* MTP3 SPECIFIC */
- table_fr = gtk_frame_new("Service Indicator (SI) Totals");
- gtk_box_pack_start(GTK_BOX(main_vb), table_fr, TRUE, TRUE, 0);
- gtk_widget_show(table_fr);
-
- table = create_list();
-
- gtk_container_add(GTK_CONTAINER(table_fr), table);
- gtk_widget_show(table);
-
-
- mtp3_sum_draw(table, seconds, &tot_num_msus, &tot_num_bytes);
-
- /* Totals frame */
- tot_fr = gtk_frame_new("Totals");
- gtk_box_pack_start(GTK_BOX(main_vb), tot_fr, TRUE, TRUE, 0);
- gtk_widget_show(tot_fr);
-
- tot_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_add(GTK_CONTAINER(tot_fr), tot_box);
- gtk_widget_show(tot_box);
-
- g_snprintf(string_buff, SUM_STR_MAX, "Total MSUs: %u", tot_num_msus);
- add_string_to_box(string_buff, tot_box);
-
- /*
- * We must have no un-time-stamped packets (i.e., the number of
- * time-stamped packets must be the same as the number of packets),
- * and at least two time-stamped packets, in order for the elapsed
- * time to be valid.
- */
- if (summary.packet_count_ts == summary.packet_count &&
- summary.packet_count_ts >= 2) {
- if (seconds) {
- g_snprintf(string_buff, SUM_STR_MAX, "MSUs/second: %.2f", tot_num_msus/seconds);
- }
- else {
- g_snprintf(string_buff, SUM_STR_MAX, "MSUs/second: N/A");
- }
- add_string_to_box(string_buff, tot_box);
- }
-
- g_snprintf(string_buff, SUM_STR_MAX, "Total Bytes: %.0f", tot_num_bytes);
- add_string_to_box(string_buff, tot_box);
-
- if (tot_num_msus) {
- g_snprintf(string_buff, SUM_STR_MAX, "Average Bytes/MSU: %.2f", tot_num_bytes/tot_num_msus);
- }
- else {
- g_snprintf(string_buff, SUM_STR_MAX, "Average Bytes/MSU: N/A");
- }
- add_string_to_box(string_buff, tot_box);
-
- /*
- * We must have no un-time-stamped packets (i.e., the number of
- * time-stamped packets must be the same as the number of packets),
- * and at least two time-stamped packets, in order for the elapsed
- * time to be valid.
- */
- if (summary.packet_count_ts == summary.packet_count &&
- summary.packet_count_ts >= 2) {
- if (seconds) {
- g_snprintf(string_buff, SUM_STR_MAX, "Bytes/second: %.2f", tot_num_bytes/seconds);
- }
- else {
- g_snprintf(string_buff, SUM_STR_MAX, "Bytes/second: N/A");
- }
- add_string_to_box(string_buff, tot_box);
- }
-
- /* Button row. */
- bbox = dlg_button_row_new(GTK_STOCK_CLOSE, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 0);
- gtk_widget_show(bbox);
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(sum_open_w, close_bt, window_cancel_button_cb);
-
- g_signal_connect(sum_open_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
-
- gtk_widget_show_all(sum_open_w);
- window_present(sum_open_w);
-}
-
-static void
-mtp3_summary_reset(
- void *tapdata)
-{
- mtp3_stat_t (*stat_p)[MTP3_MAX_NUM_OPC_DPC] = (mtp3_stat_t(*)[MTP3_MAX_NUM_OPC_DPC])tapdata;
-
- mtp3_num_used = 0;
- memset(stat_p, 0, MTP3_MAX_NUM_OPC_DPC * sizeof(mtp3_stat_t));
-}
-
-
-static gboolean
-mtp3_summary_packet(
- void *tapdata,
- packet_info *pinfo _U_,
- epan_dissect_t *edt _U_,
- const void *data)
-{
- mtp3_stat_t (*stat_p)[MTP3_MAX_NUM_OPC_DPC] = (mtp3_stat_t(*)[MTP3_MAX_NUM_OPC_DPC])tapdata;
- const mtp3_tap_rec_t *data_p = (const mtp3_tap_rec_t *)data;
- int i;
-
- if (data_p->mtp3_si_code >= MTP3_NUM_SI_CODE)
- {
- /*
- * we thought this si_code was not used ?
- * is MTP3_NUM_SI_CODE out of date ?
- */
- return(FALSE);
- }
-
- /*
- * look for opc/dpc pair
- */
- i = 0;
- while (i < mtp3_num_used)
- {
- if (memcmp(&data_p->addr_opc, &(*stat_p)[i].addr_opc, sizeof(mtp3_addr_pc_t)) == 0)
- {
- if (memcmp(&data_p->addr_dpc, &(*stat_p)[i].addr_dpc, sizeof(mtp3_addr_pc_t)) == 0)
- {
- break;
- }
- }
-
- i++;
- }
-
- if (i == mtp3_num_used)
- {
- if (mtp3_num_used == MTP3_MAX_NUM_OPC_DPC)
- {
- /*
- * too many
- */
- return(FALSE);
- }
-
- mtp3_num_used++;
- }
-
- (*stat_p)[i].addr_opc = data_p->addr_opc;
- (*stat_p)[i].addr_dpc = data_p->addr_dpc;
- (*stat_p)[i].mtp3_si_code[data_p->mtp3_si_code].num_msus++;
- (*stat_p)[i].mtp3_si_code[data_p->mtp3_si_code].size += data_p->size;
-
- return(TRUE);
-}
-
-void
-register_tap_listener_gtk_mtp3_summary(void)
-{
- GString *err_p;
-
- memset((void *) &mtp3_stat, 0, sizeof(mtp3_stat));
-
- err_p =
- register_tap_listener("mtp3", &mtp3_stat, NULL, 0,
- mtp3_summary_reset,
- mtp3_summary_packet,
- NULL);
-
- if (err_p != NULL)
- {
- simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK, "%s", err_p->str);
- g_string_free(err_p, TRUE);
-
- exit(1);
- }
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/old-gtk-compat.h b/ui/gtk/old-gtk-compat.h
deleted file mode 100644
index 2d4ba346d2..0000000000
--- a/ui/gtk/old-gtk-compat.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Definitions to provide some functions that are not present in older
- * GTK versions (down to 2.12.0)
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef OLD_GTK_COMPAT_H
-#define OLD_GTK_COMPAT_H
-
-#if !GTK_CHECK_VERSION (2, 14, 0)
-# define gtk_widget_get_window(widget) (widget)->window
-# define gtk_color_selection_dialog_get_color_selection(dialog) (dialog)->colorsel
-# define gtk_selection_data_get_length(seldata) (seldata)->length
-# define gtk_selection_data_get_data(seldata) (seldata)->data
-# define gtk_adjustment_set_upper(adj, val) (adj)->upper = val
-# define gtk_adjustment_get_upper(adj) (adj)->upper
-# define gtk_adjustment_get_lower(adj) (adj)->lower
-# define gtk_adjustment_set_step_increment(adj, val) (adj)->step_increment = val
-# define gtk_adjustment_get_step_increment(adj) (adj)->step_increment
-# define gtk_adjustment_set_page_increment(adj, val) (adj)->page_increment = val
-# define gtk_adjustment_get_page_increment(adj) (adj)->page_increment
-# define gtk_adjustment_set_page_size(adj, val) (adj)->page_size = val
-# define gtk_adjustment_get_page_size(adj) (adj)->page_size
-# define gtk_dialog_get_content_area(dialog) (dialog)->vbox
-# define gtk_dialog_get_action_area(dialog) (dialog)->action_area
-#endif
-
-#if !GTK_CHECK_VERSION (2, 16, 0)
-# define GTK_ORIENTABLE(x) GTK_TOOLBAR(x)
-# define gtk_orientable_set_orientation(x,y) gtk_toolbar_set_orientation(x,y)
-#endif
-
-#if !GTK_CHECK_VERSION (2, 18, 0)
-# define gtk_widget_get_has_window(x) (!GTK_WIDGET_NO_WINDOW(x))
-# define gtk_widget_get_visible(x) GTK_WIDGET_VISIBLE(x)
-# define gtk_widget_get_state(x) GTK_WIDGET_STATE(x)
-# define gtk_widget_get_allocation(x,y) *(y) = (x)->allocation
-# define gtk_widget_set_allocation(x, y) (x)->allocation = *(y)
-# define gtk_widget_get_sensitive(x) GTK_WIDGET_SENSITIVE(x)
-# define gtk_widget_is_drawable(x) GDK_IS_DRAWABLE(x)
-# define gtk_widget_set_window(x, y) (x)->window = (y)
-# define gtk_widget_set_can_default(w,y) if(y==TRUE){GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);}else{GTK_WIDGET_UNSET_FLAGS (w, GTK_CAN_DEFAULT);}
-# define gtk_widget_set_can_focus(w,y) if(y==TRUE){GTK_WIDGET_SET_FLAGS (w, GTK_CAN_FOCUS);}else{GTK_WIDGET_UNSET_FLAGS (w, GTK_CAN_FOCUS);}
-# define WS_GTK_WIDGET_SET_FLAGS GTK_WIDGET_SET_FLAGS
-#endif
-
-#if !GTK_CHECK_VERSION (2, 20, 0)
-# define gtk_widget_get_realized(x) GTK_WIDGET_REALIZED(x)
-# define _gtk_widget_set_realized_true(x) GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED)
-#else
-# define _gtk_widget_set_realized_true(x) gtk_widget_set_realized(x, TRUE)
-#endif
-
-#if !GTK_CHECK_VERSION (2, 22, 0)
-/* Make checkAPIs.pl happy by providing "Wireshark" macros for
- * GTK APIs that have been deprecated
- */
-#define ws_gdk_cairo_set_source_pixmap gdk_cairo_set_source_pixmap
-#endif
-
-#if !GTK_CHECK_VERSION (2, 24, 0)
-# define GTK_COMBO_BOX_TEXT(x) GTK_COMBO_BOX(x)
-# define gtk_combo_box_text_get_active_text(x) gtk_combo_box_get_active_text(x)
-# define gtk_combo_box_text_new() gtk_combo_box_new_text()
-# define gtk_combo_box_text_insert_text(x,y,z) gtk_combo_box_insert_text(x,y,z)
-# define gtk_combo_box_text_append_text(x,y) gtk_combo_box_append_text(x,y)
-# define gtk_combo_box_text_remove(x,y) gtk_combo_box_remove_text(x,y)
-# define gtk_combo_box_text_new_with_entry() gtk_combo_box_entry_new_text()
-# define gtk_combo_box_text_prepend_text(x,y) gtk_combo_box_prepend_text(x,y)
-/* Make checkAPIs.pl happy by providing "Wireshark" macros for
- * GTK APIs that have been deprecated
- */
-#define ws_gdk_drawable_get_size gdk_drawable_get_size
-#endif
-
-#if !GTK_CHECK_VERSION (3, 0, 0)
-# define gtk_widget_get_preferred_size(x,y,z) gtk_widget_size_request(x,y)
-# define GtkStyleContext GtkStyle
-# define gtk_widget_get_style_context(x) gtk_widget_get_style(x)
-# define gtk_style_context_get_color(x,y,z) gdkcolor_to_color_t(&z, &x->text[y])
-# define gtk_style_context_get_color_background(x,y,z) gdkcolor_to_color_t(&z, &x->base[y])
-# if GTK_CHECK_VERSION (2, 14, 0) && defined(GSEAL_ENABLE)
- /* This is too late, see https://bugzilla.gnome.org/show_bug.cgi?id=641089
- * According to
- * http://ftp.acc.umu.se/pub/GNOME/sources/gtk+/2.13/gtk+-2.13.4.changes
- * access to the button element was sealed during 2.13. They also admit that
- * they missed a use case and thus failed to provide an accessor function:
- * http://mail.gnome.org/archives/commits-list/2010-December/msg00578.html
- * An accessor function was finally added in 3.0.
- */
-# define gtk_tree_view_column_get_button(x) x->_g_sealed__button
-# else
-# define gtk_tree_view_column_get_button(x) x->button
-# endif
-
-/* Make checkAPIs.pl happy by providing "Wireshark" macros for
- * GTK APIs that have been deprecated
- */
-#define ws_gtk_hbox_new gtk_hbox_new
-#define ws_gtk_vbox_new gtk_vbox_new
-#define ws_gtk_hbutton_box_new gtk_hbutton_box_new
-#endif
-
-#endif
diff --git a/ui/gtk/packet_history.c b/ui/gtk/packet_history.c
deleted file mode 100644
index 9e5b7a05b7..0000000000
--- a/ui/gtk/packet_history.c
+++ /dev/null
@@ -1,193 +0,0 @@
-/* packet_history.c
- * packet history related functions 2004 Ulf Lamping
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <gtk/gtk.h>
-
-#include "ui/gtk/main.h"
-#include "ui/gtk/packet_history.h"
-
-#include "globals.h"
-
-static GList *history_current = NULL;
-static GList *history_list = NULL;
-static gboolean ignore_jump = FALSE;
-
-
-#if 0
-/* print the complete packet history to console */
-static void history_print(void) {
- GList *current = g_list_first(history_list);
-
- printf(" List:\n");
-
- while(current) {
- if(current == history_current) {
- printf(" Row: %u *\n", GPOINTER_TO_INT(current->data));
- } else {
- printf(" Row: %u\n", GPOINTER_TO_INT(current->data));
- }
- current = g_list_next(current);
- }
-}
-#endif
-
-
-/* adjust menu and toolbar sensitivity depending on the history entries */
-static void adjust_menus(void) {
-
- if(history_current) {
- main_set_for_packet_history(
- (g_list_previous(history_current) != NULL),
- (g_list_next(history_current) != NULL));
- } else {
- /* we don't have any history */
- main_set_for_packet_history(FALSE, FALSE);
- }
-
- /* history_print(); */
-}
-
-
-/* clear the history list from the given entry to the end of the list */
-static void clear_list(GList *current) {
- GList *next_packet;
-
-
- while(current) {
- next_packet = g_list_next(current);
- history_list = g_list_remove(history_list, current->data);
- current = next_packet;
- }
-}
-
-
-/* add an entry to the history list */
-void packet_history_add(gint row) {
-
- if(row < 1) {
- /* Not a valid row number */
- return;
- }
-
- if(ignore_jump) {
- /* we jumping back and forward in history, so don't change list */
- return;
- }
-
- if (history_current) {
- /* clear list behind current position */
- clear_list(g_list_next(history_current));
-
- /* ignore duplicates */
- if(GPOINTER_TO_INT(history_current->data) == row) {
- adjust_menus();
- return;
- }
- }
-
- /* add row */
- history_list = g_list_append(history_list, GINT_TO_POINTER(row));
- history_current = g_list_last(history_list);
-
- adjust_menus();
-}
-
-
-void packet_history_clear(void) {
-
- /* clear "old" list */
- clear_list(history_list);
- history_current = NULL;
-
- /* add the currently selected first row */
- packet_history_add(0);
-
- adjust_menus();
-}
-
-
-static void packet_history_back(void) {
- GList *previous;
-
- if(history_current) {
- previous = g_list_previous(history_current);
-
- /* do we have a previous entry */
- if(previous) {
- history_current = previous;
-
- /* goto that packet but don't change history */
- ignore_jump = TRUE;
- cf_goto_frame(&cfile, GPOINTER_TO_INT(previous->data));
- ignore_jump = FALSE;
- }
- }
-
- adjust_menus();
-}
-
-
-static void packet_history_forward(void) {
- GList *next;
-
- if(history_current) {
- next = g_list_next(history_current);
-
- /* do we have a forward entry? */
- if(next) {
- history_current = next;
-
- /* goto that packet but don't change history */
- ignore_jump = TRUE;
- cf_goto_frame(&cfile, GPOINTER_TO_INT(next->data));
- ignore_jump = FALSE;
- }
- }
-
- adjust_menus();
-}
-
-
-void history_forward_cb(GtkWidget *widget _U_, gpointer data _U_) {
- packet_history_forward();
-}
-
-
-void history_back_cb(GtkWidget *widget _U_, gpointer data _U_) {
- packet_history_back();
-}
-
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/packet_history.h b/ui/gtk/packet_history.h
deleted file mode 100644
index a504018dcb..0000000000
--- a/ui/gtk/packet_history.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* packet_history.h
- * packet history related functions 2004 Ulf Lamping
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __PACKET_HISTORY_H__
-#define __PACKET_HISTORY_H__
-
-extern void packet_history_add(gint row);
-
-extern void packet_history_clear(void);
-
-extern void history_forward_cb(GtkWidget *widget, gpointer data);
-
-extern void history_back_cb(GtkWidget *widget, gpointer data);
-
-#endif /* __PACKET_HISTORY_H__ */
diff --git a/ui/gtk/packet_list.c b/ui/gtk/packet_list.c
deleted file mode 100644
index 566e2e4abf..0000000000
--- a/ui/gtk/packet_list.c
+++ /dev/null
@@ -1,1733 +0,0 @@
-/* packet_list.c
- * Routines to implement a new GTK2 packet list using our custom model
- * Copyright 2008-2009, Stephen Fisher (see AUTHORS file)
- * Co-authors Anders Broman, Kovarththanan Rajaratnam and Stig Bjorlykke.
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/prefs.h>
-#include <epan/packet.h>
-#include <epan/column.h>
-#include <epan/strutil.h>
-#include <epan/plugin_if.h>
-
-#include "ui/main_statusbar.h"
-#include "ui/packet_list_utils.h"
-#include "ui/preference_utils.h"
-#include "ui/recent.h"
-#include "ui/recent_utils.h"
-
-#include "packet_list_store.h"
-#include "ui/gtk/packet_list.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/font_utils.h"
-#include "ui/gtk/packet_history.h"
-#include "ui/gtk/keys.h"
-#include "ui/gtk/menus.h"
-#include <epan/color_filters.h>
-#include "ui/gtk/color_utils.h"
-#include "ui/gtk/packet_win.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/filter_dlg.h"
-#include "ui/gtk/filter_autocomplete.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-#include <wsutil/str_util.h>
-
-#include "globals.h"
-
-#define COLUMN_WIDTH_MIN 40
-#define MAX_COMMENTS_TO_FETCH 20000000 /* Arbitrary */
-
-#define COL_EDIT_COLUMN "column"
-#define COL_EDIT_FORMAT_CMB "format_cmb"
-#define COL_EDIT_TITLE_TE "title_te"
-#define COL_EDIT_FIELD_LB "field_lb"
-#define COL_EDIT_FIELD_TE "field_te"
-#define COL_EDIT_OCCURRENCE_LB "occurrence_lb"
-#define COL_EDIT_OCCURRENCE_TE "occurrente_te"
-
-static PacketList *packetlist;
-static gboolean last_at_end = FALSE;
-static gboolean enable_color;
-static gulong column_changed_handler_id;
-
-static GtkWidget *create_view_and_model(void);
-static void scroll_to_and_select_iter(GtkTreeModel *model, GtkTreeSelection *selection, GtkTreeIter *iter);
-static void packet_list_select_cb(GtkTreeView *tree_view, gpointer data _U_);
-static void packet_list_double_click_cb(GtkTreeView *treeview,
- GtkTreePath *path _U_,
- GtkTreeViewColumn *col _U_,
- gpointer userdata _U_);
-static void show_cell_data_func(GtkTreeViewColumn *col,
- GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer data);
-static gint row_number_from_iter(GtkTreeIter *iter);
-static void scroll_to_current(void);
-static gboolean query_packet_list_tooltip_cb(GtkWidget *widget, gint x, gint y, gboolean keyboard_tip, GtkTooltip *tooltip, gpointer data _U_);
-
-GtkWidget *
-packet_list_create(void)
-{
- GtkWidget *view, *scrollwin;
-
- scrollwin = scrolled_window_new(NULL, NULL);
-
- view = create_view_and_model();
-
- gtk_container_add(GTK_CONTAINER(scrollwin), view);
-
- g_object_set_data(G_OBJECT(popup_menu_object), E_MPACKET_LIST_KEY, view);
-
- return scrollwin;
-}
-
-/** @todo XXX - implement a smarter solution for recreating the packet list */
-void
-packet_list_recreate(void)
-{
- g_signal_handler_block(packetlist->view, column_changed_handler_id);
- gtk_widget_destroy(pkt_scrollw);
-
- prefs.num_cols = g_list_length(prefs.col_list);
-
- col_cleanup(&cfile.cinfo);
- build_column_format_array(&cfile.cinfo, prefs.num_cols, FALSE);
-
- pkt_scrollw = packet_list_create();
- gtk_widget_show_all(pkt_scrollw);
-
- main_widgets_rearrange();
-
- if(cfile.state != FILE_CLOSED)
- redissect_packets();
-}
-
-guint
-packet_list_append(column_info *cinfo _U_, frame_data *fdata)
-{
- /* fdata should be filled with the stuff we need
- * strings are built at display time.
- */
- GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(packetlist->view));
- guint visible_pos = packet_list_append_record(packetlist, fdata);
- if(model)
- /* If the model is connected there is no packetsbar_update from "thaw */
- packets_bar_update();
- /* Return the _visible_ position */
-
- return visible_pos;
-}
-
-static void
-col_title_change_ok (GtkWidget *w, gpointer parent_w)
-{
- GtkTreeViewColumn *col;
- const gchar *title, *name, *occurrence_text;
- gint col_id, cur_fmt, occurrence, col_width;
- gchar *escaped_title;
- gboolean recreate = FALSE;
-
- col = (GtkTreeViewColumn *)g_object_get_data (G_OBJECT(w), COL_EDIT_COLUMN);
- col_id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(col), E_MPACKET_LIST_COL_KEY));
-
- title = gtk_entry_get_text(GTK_ENTRY(g_object_get_data (G_OBJECT(w), COL_EDIT_TITLE_TE)));
- name = gtk_entry_get_text(GTK_ENTRY(g_object_get_data (G_OBJECT(w), COL_EDIT_FIELD_TE)));
- cur_fmt = gtk_combo_box_get_active(GTK_COMBO_BOX(g_object_get_data (G_OBJECT(w), COL_EDIT_FORMAT_CMB)));
- occurrence_text = gtk_entry_get_text(GTK_ENTRY(g_object_get_data (G_OBJECT(w), COL_EDIT_OCCURRENCE_TE)));
- occurrence = (gint)strtol(occurrence_text, NULL, 10);
-
- escaped_title = ws_strdup_escape_char(title, '_');
- gtk_tree_view_column_set_title(col, escaped_title);
- g_free(escaped_title);
-
- if (strcmp (title, get_column_title(col_id)) != 0) {
- set_column_title (col_id, title);
- }
-
- if (cur_fmt != get_column_format(col_id)) {
- set_column_format (col_id, cur_fmt);
- recreate = TRUE;
- }
-
- if (cur_fmt == COL_CUSTOM) {
- const gchar *custom_fields = get_column_custom_fields(col_id);
- if ((custom_fields && strcmp (name, custom_fields) != 0) || (custom_fields == NULL)) {
- set_column_custom_fields(col_id, name);
- recreate = TRUE;
- }
-
- if (occurrence != get_column_custom_occurrence(col_id)) {
- set_column_custom_occurrence (col_id, occurrence);
- recreate = TRUE;
- }
- }
-
- col_width = get_default_col_size (packetlist->view, title);
- gtk_tree_view_column_set_min_width(col, col_width);
-
- if (!prefs.gui_use_pref_save) {
- prefs_main_write();
- }
-
- rebuild_visible_columns_menu ();
-
- if (recreate) {
- packet_list_recreate();
- }
-
- packet_list_resize_column (col_id);
- window_destroy(GTK_WIDGET(parent_w));
-}
-
-static void
-col_title_change_cancel (GtkWidget *w _U_, gpointer parent_w)
-{
- window_destroy(GTK_WIDGET(parent_w));
-}
-
-static void
-col_details_format_changed_cb(GtkWidget *w, gpointer data _U_)
-{
- GtkWidget *field_lb, *field_te, *occurrence_lb, *occurrence_te;
- gint cur_fmt;
-
- field_lb = (GtkWidget *)g_object_get_data (G_OBJECT(w), COL_EDIT_FIELD_LB);
- field_te = (GtkWidget *)g_object_get_data (G_OBJECT(w), COL_EDIT_FIELD_TE);
- occurrence_lb = (GtkWidget *)g_object_get_data (G_OBJECT(w), COL_EDIT_OCCURRENCE_LB);
- occurrence_te = (GtkWidget *)g_object_get_data (G_OBJECT(w), COL_EDIT_OCCURRENCE_TE);
-
- cur_fmt = gtk_combo_box_get_active(GTK_COMBO_BOX(w));
-
- if (cur_fmt == COL_CUSTOM) {
- /* Changing to custom */
- gtk_widget_set_sensitive(field_lb, TRUE);
- gtk_widget_set_sensitive(field_te, TRUE);
- gtk_widget_set_sensitive(occurrence_lb, TRUE);
- gtk_widget_set_sensitive(occurrence_te, TRUE);
- } else {
- /* Changing to non-custom */
- gtk_widget_set_sensitive(field_lb, FALSE);
- gtk_widget_set_sensitive(field_te, FALSE);
- gtk_widget_set_sensitive(occurrence_lb, FALSE);
- gtk_widget_set_sensitive(occurrence_te, FALSE);
- }
-}
-
-static void
-col_details_edit_dlg (gint col_id, GtkTreeViewColumn *col)
-{
- const gchar *title = gtk_tree_view_column_get_title(col);
- gchar *unescaped_title = ws_strdup_unescape_char(title, '_');
-
- GtkWidget *label, *field_lb, *occurrence_lb;
- GtkWidget *title_te, *format_cmb, *field_te, *occurrence_te;
- GtkWidget *win, *main_grid, *main_vb, *bbox, *cancel_bt, *ok_bt;
- char custom_occurrence_str[8];
- gint cur_fmt, i;
-
- win = dlg_window_new("Wireshark: Edit Column Details");
-
- gtk_window_set_resizable(GTK_WINDOW(win),FALSE);
- gtk_window_resize(GTK_WINDOW(win), 400, 100);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- gtk_container_add(GTK_CONTAINER(win), main_vb);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 6);
-
- main_grid = ws_gtk_grid_new();
- gtk_box_pack_start(GTK_BOX(main_vb), main_grid, FALSE, FALSE, 0);
- ws_gtk_grid_set_column_spacing(GTK_GRID(main_grid), 10);
- ws_gtk_grid_set_row_spacing(GTK_GRID(main_grid), 5);
-
- label = gtk_label_new("Title:");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), label, 0, 0, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(label), 1.0f, 0.5f);
- gtk_widget_set_tooltip_text(label, "Packet list column title.");
-
- title_te = gtk_entry_new();
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), title_te, 1, 0, 1, 1);
- gtk_entry_set_text(GTK_ENTRY(title_te), unescaped_title);
- g_free(unescaped_title);
- gtk_widget_set_tooltip_text(title_te, "Packet list column title.");
-
- label = gtk_label_new("Field type:");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), label, 0, 1, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(label), 1.0f, 0.5f);
- gtk_widget_set_tooltip_text(label, "Select which packet information to present in the column.");
-
- format_cmb = gtk_combo_box_text_new();
- for (i = 0; i < NUM_COL_FMTS; i++) {
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(format_cmb), col_format_desc(i));
- }
- g_signal_connect(format_cmb, "changed", G_CALLBACK(col_details_format_changed_cb), NULL);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), format_cmb, 1, 1, 1, 1);
- gtk_widget_set_tooltip_text(format_cmb, "Select which packet information to present in the column.");
-
- field_lb = gtk_label_new("Field name:");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), field_lb, 0, 2, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(field_lb), 1.0f, 0.5f);
- gtk_widget_set_tooltip_text(field_lb,
- "Field name used when field type is \"Custom\". "
- "This string has the same syntax as a display filter string.");
- field_te = gtk_entry_new();
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), field_te, 1, 2, 1, 1);
- g_object_set_data (G_OBJECT(field_te), E_FILT_MULTI_FIELD_NAME_ONLY_KEY, (gpointer)"");
- g_signal_connect(field_te, "changed", G_CALLBACK(filter_te_syntax_check_cb), NULL);
- g_signal_connect(field_te, "key-press-event", G_CALLBACK (filter_string_te_key_pressed_cb), NULL);
- g_signal_connect(win, "key-press-event", G_CALLBACK (filter_parent_dlg_key_pressed_cb), NULL);
- gtk_widget_set_tooltip_text(field_te,
- "Field names used when field type is \"Custom\". "
- "This string has the same syntax as a display filter string.");
-
- occurrence_lb = gtk_label_new("Occurrence:");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), occurrence_lb, 0, 3, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(occurrence_lb), 1.0f, 0.5f);
- gtk_widget_set_tooltip_text (occurrence_lb,
- "Field occurrence to use. "
- "0=all (default), 1=first, 2=second, ..., -1=last.");
-
- occurrence_te = gtk_entry_new();
- gtk_entry_set_max_length (GTK_ENTRY(occurrence_te), 4);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), occurrence_te, 1, 3, 1, 1);
- gtk_widget_set_tooltip_text (occurrence_te,
- "Field occurrence to use. "
- "0=all (default), 1=first, 2=second, ..., -1=last.");
-
- bbox = dlg_button_row_new(GTK_STOCK_CANCEL,GTK_STOCK_OK, NULL);
- gtk_box_pack_end(GTK_BOX(main_vb), bbox, FALSE, FALSE, 0);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- g_object_set_data (G_OBJECT(ok_bt), COL_EDIT_COLUMN, col);
- g_object_set_data (G_OBJECT(ok_bt), COL_EDIT_FORMAT_CMB, format_cmb);
- g_object_set_data (G_OBJECT(ok_bt), COL_EDIT_TITLE_TE, title_te);
- g_object_set_data (G_OBJECT(ok_bt), COL_EDIT_FIELD_TE, field_te);
- g_object_set_data (G_OBJECT(ok_bt), COL_EDIT_OCCURRENCE_TE, occurrence_te);
- g_object_set_data (G_OBJECT(format_cmb), COL_EDIT_FIELD_LB, field_lb);
- g_object_set_data (G_OBJECT(format_cmb), COL_EDIT_FIELD_TE, field_te);
- g_object_set_data (G_OBJECT(format_cmb), COL_EDIT_OCCURRENCE_LB, occurrence_lb);
- g_object_set_data (G_OBJECT(format_cmb), COL_EDIT_OCCURRENCE_TE, occurrence_te);
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(col_title_change_ok), win);
-
- cur_fmt = get_column_format (col_id);
- gtk_combo_box_set_active(GTK_COMBO_BOX(format_cmb), cur_fmt);
- if (cur_fmt == COL_CUSTOM) {
- gtk_entry_set_text(GTK_ENTRY(field_te), get_column_custom_fields(col_id));
- g_snprintf(custom_occurrence_str, sizeof(custom_occurrence_str), "%d", get_column_custom_occurrence(col_id));
- gtk_entry_set_text(GTK_ENTRY(occurrence_te), custom_occurrence_str);
- }
-
- dlg_set_activate(title_te, ok_bt);
- dlg_set_activate(field_te, ok_bt);
- dlg_set_activate(occurrence_te, ok_bt);
-
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- g_signal_connect(cancel_bt, "clicked", G_CALLBACK(col_title_change_cancel), win);
- window_set_cancel_button(win, cancel_bt, NULL);
-
- gtk_widget_grab_default(ok_bt);
- gtk_widget_show_all(win);
-}
-
-/* Process sort request;
- * order: GTK_SORT_ASCENDING or GTK_SORT_DESCENDING
- * sort_indicator: TRUE: set sort_indicator on column; FALSE: don't set ....
- *
- * If necessary, columns are first "columnized" for all rows in the packet-list; If this
- * is not completed (i.e., stopped), then the sort request is aborted.
- */
-static void
-packet_list_sort_column (gint col_id, GtkTreeViewColumn *col, GtkSortType order, gboolean sort_indicator)
-{
- GtkTreeViewColumn *prev_col;
-
- if (col == NULL) {
- col = gtk_tree_view_get_column(GTK_TREE_VIEW(packetlist->view), col_id);
- }
- g_assert(col);
-
- if (!packet_list_do_packet_list_dissect_and_cache_all(packetlist, col_id)) {
- return; /* "stopped": do not try to sort */
- }
-
- prev_col = (GtkTreeViewColumn *)
- g_object_get_data(G_OBJECT(packetlist->view), E_MPACKET_LIST_PREV_COLUMN_KEY);
-
- if (prev_col) {
- gtk_tree_view_column_set_sort_indicator(prev_col, FALSE);
- }
- gtk_tree_view_column_set_sort_indicator(col, sort_indicator);
- gtk_tree_view_column_set_sort_order (col, order);
- g_object_set_data(G_OBJECT(packetlist->view), E_MPACKET_LIST_PREV_COLUMN_KEY, col);
- gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(packetlist), col_id, order); /* triggers sort callback */
-
- scroll_to_current ();
-}
-
-/*
- * We have our own functionality to toggle sort order on a column to avoid
- * having empty sorting arrow widgets in the column header.
- */
-static void
-packet_list_column_clicked_cb (GtkTreeViewColumn *col, gpointer user_data _U_)
-{
- GtkSortType order = gtk_tree_view_column_get_sort_order (col);
- gint col_id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(col), E_MPACKET_LIST_COL_KEY));
-
- if (cfile.state == FILE_READ_IN_PROGRESS)
- return;
-
- if (!gtk_tree_view_column_get_sort_indicator(col)) {
- packet_list_sort_column (col_id, col, GTK_SORT_ASCENDING, TRUE);
- } else if (order == GTK_SORT_ASCENDING) {
- packet_list_sort_column (col_id, col, GTK_SORT_DESCENDING, TRUE);
- } else {
- packet_list_sort_column (0, NULL, GTK_SORT_ASCENDING, FALSE);
- }
-}
-
-static gdouble
-get_xalign_value (gchar xalign, gboolean right_justify)
-{
- double value;
-
- switch (xalign) {
- case COLUMN_XALIGN_RIGHT:
- value = 1.0f;
- break;
- case COLUMN_XALIGN_CENTER:
- value = 0.5f;
- break;
- case COLUMN_XALIGN_LEFT:
- value = 0.0f;
- break;
- case COLUMN_XALIGN_DEFAULT:
- default:
- if (right_justify) {
- value = 1.0f;
- } else {
- value = 0.0f;
- }
- break;
- }
-
- return value;
-}
-
-static void
-packet_list_xalign_column (gint col_id, GtkTreeViewColumn *col, gchar xalign)
-{
- GList *renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT(col));
- gboolean right_justify = right_justify_column(col_id, &cfile);
- gdouble value = get_xalign_value (xalign, right_justify);
- GList *entry;
- GtkCellRenderer *renderer;
-
- entry = g_list_first(renderers);
- while (entry) {
- renderer = (GtkCellRenderer *)entry->data;
- g_object_set(G_OBJECT(renderer), "xalign", value, NULL);
- entry = g_list_next (entry);
- }
- g_list_free (renderers);
-
- if ((xalign == COLUMN_XALIGN_LEFT && !right_justify) ||
- (xalign == COLUMN_XALIGN_RIGHT && right_justify)) {
- /* Default value selected, save default in the recent settings */
- xalign = COLUMN_XALIGN_DEFAULT;
- }
-
- recent_set_column_xalign (col_id, xalign);
- gtk_widget_queue_draw (packetlist->view);
-}
-
-static void
-packet_list_set_visible_column (gint col_id, GtkTreeViewColumn *col, gboolean visible)
-{
- gtk_tree_view_column_set_visible(col, visible);
- set_column_visible(col_id, visible);
-
- if (!prefs.gui_use_pref_save) {
- prefs_main_write();
- }
-
- rebuild_visible_columns_menu ();
- gtk_widget_queue_draw (packetlist->view);
-}
-
-void
-packet_list_toggle_visible_column (gint col_id)
-{
- GtkTreeViewColumn *col =
- gtk_tree_view_get_column(GTK_TREE_VIEW(packetlist->view), col_id);
-
- packet_list_set_visible_column (col_id, col, get_column_visible(col_id) ? FALSE : TRUE);
-}
-
-void
-packet_list_set_all_columns_visible (void)
-{
- GtkTreeViewColumn *col;
- int col_id;
-
- for (col_id = 0; col_id < cfile.cinfo.num_cols; col_id++) {
- col = gtk_tree_view_get_column(GTK_TREE_VIEW(packetlist->view), col_id);
- gtk_tree_view_column_set_visible(col, TRUE);
- set_column_visible(col_id, TRUE);
- }
-
- if (!prefs.gui_use_pref_save) {
- prefs_main_write();
- }
-
- rebuild_visible_columns_menu ();
- gtk_widget_queue_draw (packetlist->view);
-}
-
-static void
-packet_list_remove_column (gint col_id, GtkTreeViewColumn *col _U_)
-{
- column_prefs_remove_nth(col_id);
-
- if (!prefs.gui_use_pref_save) {
- prefs_main_write();
- }
-
- packet_list_recreate();
-}
-
-static void
-packet_list_toggle_resolved (GtkWidget *w, gint col_id)
-{
- /* We have to check for skip-update because we get an emit in menus_set_column_resolved() */
- if (g_object_get_data(G_OBJECT(w), "skip-update") == NULL) {
- set_column_resolved (col_id, get_column_resolved (col_id) ? FALSE : TRUE);
-
- if (!prefs.gui_use_pref_save) {
- prefs_main_write();
- }
-
- packet_list_recreate();
- }
-}
-
-void
-packet_list_column_menu_cb (GtkWidget *w, gpointer user_data _U_, COLUMN_SELECTED_E action)
-{
- GtkTreeViewColumn *col = (GtkTreeViewColumn *)
- g_object_get_data(G_OBJECT(packetlist->view), E_MPACKET_LIST_COLUMN_KEY);
- gint col_id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(col), E_MPACKET_LIST_COL_KEY));
-
- switch (action) {
- case COLUMN_SELECTED_SORT_ASCENDING:
- packet_list_sort_column (col_id, col, GTK_SORT_ASCENDING, TRUE);
- break;
- case COLUMN_SELECTED_SORT_DESCENDING:
- packet_list_sort_column (col_id, col, GTK_SORT_DESCENDING, TRUE);
- break;
- case COLUMN_SELECTED_SORT_NONE:
- packet_list_sort_column (0, NULL, GTK_SORT_ASCENDING, FALSE);
- break;
- case COLUMN_SELECTED_TOGGLE_RESOLVED:
- packet_list_toggle_resolved (w, col_id);
- break;
- case COLUMN_SELECTED_ALIGN_LEFT:
- packet_list_xalign_column (col_id, col, COLUMN_XALIGN_LEFT);
- break;
- case COLUMN_SELECTED_ALIGN_CENTER:
- packet_list_xalign_column (col_id, col, COLUMN_XALIGN_CENTER);
- break;
- case COLUMN_SELECTED_ALIGN_RIGHT:
- packet_list_xalign_column (col_id, col, COLUMN_XALIGN_RIGHT);
- break;
- case COLUMN_SELECTED_ALIGN_DEFAULT:
- packet_list_xalign_column (col_id, col, COLUMN_XALIGN_DEFAULT);
- break;
- case COLUMN_SELECTED_RESIZE:
- packet_list_resize_column (col_id);
- break;
- case COLUMN_SELECTED_CHANGE:
- col_details_edit_dlg (col_id, col);
- break;
- case COLUMN_SELECTED_HIDE:
- packet_list_set_visible_column (col_id, col, FALSE);
- break;
- case COLUMN_SELECTED_REMOVE:
- packet_list_remove_column (col_id, col);
- break;
- default:
- g_assert_not_reached();
- break;
- }
-}
-
-static gboolean
-packet_list_column_button_pressed_cb (GtkWidget *widget, GdkEvent *event, gpointer data)
-{
- GtkWidget *col = (GtkWidget *) data;
- GtkWidget *menu = (GtkWidget *)g_object_get_data(G_OBJECT(popup_menu_object), PM_PACKET_LIST_COL_KEY);
- gint col_id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(col), E_MPACKET_LIST_COL_KEY));
- gboolean right_justify = right_justify_column (col_id, &cfile);
-
- menus_set_column_align_default (right_justify);
- menus_set_column_resolved (get_column_resolved (col_id), resolve_column (col_id, &cfile));
- g_object_set_data(G_OBJECT(packetlist->view), E_MPACKET_LIST_COLUMN_KEY, col);
- return popup_menu_handler (widget, event, menu);
-}
-
-static gboolean packet_list_recreate_delayed(gpointer user_data _U_)
-{
- packet_list_recreate();
- return FALSE;
-}
-
-static void
-column_dnd_changed_cb(GtkTreeView *tree_view, gpointer data _U_)
-{
- GtkTreeViewColumn *column;
- GtkTreeSelection *selection;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GList *columns, *list, *clp, *new_col_list = NULL;
- gint old_col_id, new_col_id = 0;
- fmt_data *cfmt;
-
- selection = gtk_tree_view_get_selection(tree_view);
- if (!gtk_tree_selection_get_selected(selection, &model, &iter))
- return;
-
- list = columns = gtk_tree_view_get_columns(tree_view);
- while (columns) {
- column = (GtkTreeViewColumn *)columns->data;
- old_col_id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(column), E_MPACKET_LIST_COL_KEY));
-
- clp = g_list_nth (prefs.col_list, old_col_id);
- cfmt = (fmt_data *) clp->data;
- new_col_list = g_list_append (new_col_list, cfmt);
- columns = g_list_next (columns);
- new_col_id++;
- }
- g_list_free (list);
- g_list_free (prefs.col_list);
-
- prefs.col_list = new_col_list;
-
- if (!prefs.gui_use_pref_save) {
- prefs_main_write();
- }
-
- /* The columns widget is part of the packets list, delay destruction to
- * avoid triggering a use-after-free (maybe a GTK3 bug?) */
- g_idle_add(packet_list_recreate_delayed, NULL);
-}
-
-static GtkWidget *
-create_view_and_model(void)
-{
- GtkTreeViewColumn *col;
- GtkCellRenderer *renderer;
- gint i, col_width;
- gdouble value;
- gchar *tooltip_text;
- gint col_min_width;
- gchar *escaped_title;
- col_item_t* col_item;
-
- packetlist = packet_list_new();
-
- packetlist->view = tree_view_new(GTK_TREE_MODEL(packetlist));
-
- gtk_tree_view_set_fixed_height_mode(GTK_TREE_VIEW(packetlist->view),
- TRUE);
- g_signal_connect(packetlist->view, "cursor-changed",
- G_CALLBACK(packet_list_select_cb), NULL);
- g_signal_connect(packetlist->view, "row-activated",
- G_CALLBACK(packet_list_double_click_cb), NULL);
- g_signal_connect(packetlist->view, "button_press_event", G_CALLBACK(popup_menu_handler),
- g_object_get_data(G_OBJECT(popup_menu_object), PM_PACKET_LIST_KEY));
- column_changed_handler_id = g_signal_connect(packetlist->view, "columns-changed", G_CALLBACK(column_dnd_changed_cb), NULL);
- g_object_set(packetlist->view, "has-tooltip", TRUE, NULL);
- g_signal_connect(packetlist->view, "query-tooltip",
- G_CALLBACK(query_packet_list_tooltip_cb), NULL);
- g_object_set_data(G_OBJECT(popup_menu_object), E_MPACKET_LIST_KEY, packetlist);
-
- /* g_object_unref(packetlist); */ /* Destroy automatically with view for now */ /* XXX - Messes up freezing & thawing */
-
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_override_font(packetlist->view, user_font_get_regular());
-#else
- gtk_widget_modify_font(packetlist->view, user_font_get_regular());
-#endif
-
- /* We need one extra column to store the entire PacketListRecord */
- for(i = 0; i < cfile.cinfo.num_cols; i++) {
- col_item = &cfile.cinfo.columns[i];
- renderer = gtk_cell_renderer_text_new();
- col = gtk_tree_view_column_new();
- gtk_tree_view_column_pack_start(col, renderer, TRUE);
- value = get_xalign_value(recent_get_column_xalign(i), right_justify_column(i, &cfile));
- g_object_set(G_OBJECT(renderer),
- "xalign", value,
- NULL);
- g_object_set(renderer,
- "ypad", 0,
- NULL);
- gtk_tree_view_column_add_attribute(col, renderer, "text", i);
- gtk_tree_view_column_set_cell_data_func(col, renderer,
- show_cell_data_func,
- GINT_TO_POINTER(i),
- NULL);
-
- escaped_title = ws_strdup_escape_char(col_item->col_title, '_');
- gtk_tree_view_column_set_title(col, escaped_title);
- g_free (escaped_title);
- gtk_tree_view_column_set_clickable(col, TRUE);
- gtk_tree_view_column_set_resizable(col, TRUE);
- gtk_tree_view_column_set_visible(col, get_column_visible(i));
- gtk_tree_view_column_set_sizing(col,GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_reorderable(col, TRUE); /* XXX - Should this be saved in the prefs? */
-
- g_object_set_data(G_OBJECT(col), E_MPACKET_LIST_COL_KEY, GINT_TO_POINTER(i));
- g_signal_connect(col, "clicked", G_CALLBACK(packet_list_column_clicked_cb), NULL);
-
- /*
- * The column can't be adjusted to a size smaller than this
- * XXX The minimum size will be the size of the title
- * should that be limited for long titles?
- */
- col_min_width = get_default_col_size (packetlist->view, cfile.cinfo.columns[i].col_title);
- if(col_min_width<COLUMN_WIDTH_MIN){
- gtk_tree_view_column_set_min_width(col, COLUMN_WIDTH_MIN);
- }else{
- gtk_tree_view_column_set_min_width(col, col_min_width);
- }
-
- /* Set the size the column will be displayed with */
- col_width = recent_get_column_width(i);
- if(col_width < 1) {
- gint fmt;
- const gchar *long_str;
-
- fmt = get_column_format(i);
- long_str = get_column_width_string(fmt, i);
- if(long_str){
- col_width = get_default_col_size (packetlist->view, long_str);
- }else{
- col_width = COLUMN_WIDTH_MIN;
- }
- gtk_tree_view_column_set_fixed_width(col, col_width);
- }else{
- gtk_tree_view_column_set_fixed_width(col, col_width);
- }
-
- gtk_tree_view_append_column(GTK_TREE_VIEW(packetlist->view), col);
-
- tooltip_text = get_column_tooltip(i);
- gtk_widget_set_tooltip_text(gtk_tree_view_column_get_button(col), tooltip_text);
- g_free(tooltip_text);
- g_signal_connect(gtk_tree_view_column_get_button(col), "button_press_event",
- G_CALLBACK(packet_list_column_button_pressed_cb), col);
-
- if (i == 0) { /* Default sort on first column */
- g_object_set_data(G_OBJECT(packetlist->view), E_MPACKET_LIST_COLUMN_KEY, col);
- g_object_set_data(G_OBJECT(packetlist->view), E_MPACKET_LIST_PREV_COLUMN_KEY, col);
- }
- }
-
- rebuild_visible_columns_menu ();
-
- return packetlist->view;
-}
-
-static frame_data *
-packet_list_get_record(GtkTreeModel *model, GtkTreeIter *iter)
-{
- frame_data *fdata;
- /* The last column is reserved for frame_data */
- gint record_column = gtk_tree_model_get_n_columns(model)-1;
-
- gtk_tree_model_get(model, iter,
- record_column,
- &fdata,
- -1);
-
- return fdata;
-}
-
-void
-packet_list_clear(void)
-{
- packet_history_clear();
-
- packet_list_store_clear(packetlist);
- gtk_widget_queue_draw(packetlist->view);
- /* XXX is this correct in all cases?
- * Reset the sort column, use packetlist as model in case the list is frozen.
- */
- packet_list_sort_column(0, NULL, GTK_SORT_ASCENDING, FALSE);
-}
-
-void
-packet_list_freeze(void)
-{
- /* So we don't lose the model by the time we want to thaw it */
- g_object_ref(packetlist);
-
- /* Detach view from model */
- gtk_tree_view_set_model(GTK_TREE_VIEW(packetlist->view), NULL);
-}
-
-void
-packet_list_thaw(void)
-{
- /* Apply model */
- gtk_tree_view_set_model( GTK_TREE_VIEW(packetlist->view), GTK_TREE_MODEL(packetlist));
-
- /* Remove extra reference added by packet_list_freeze() */
- g_object_unref(packetlist);
-
- packets_bar_update();
-}
-
-void
-packet_list_recreate_visible_rows(void)
-{
- packet_list_recreate_visible_rows_list(packetlist);
-}
-
-void packet_list_resize_column(gint col)
-{
- GtkTreeViewColumn *column;
- gint col_width;
- const gchar *long_str;
-
- long_str = packet_list_get_widest_column_string(packetlist, col);
- if(!long_str || strcmp("",long_str)==0)
- /* If we get an empty string leave the width unchanged */
- return;
- column = gtk_tree_view_get_column (GTK_TREE_VIEW(packetlist->view), col);
- col_width = get_default_col_size (packetlist->view, long_str);
- gtk_tree_view_column_set_fixed_width(column, col_width);
-}
-
-static void
-packet_list_resize_columns(void)
-{
- gint progbar_loop_max;
- gint progbar_loop_var;
-
- progbar_loop_max = cfile.cinfo.num_cols;
-
- for (progbar_loop_var = 0; progbar_loop_var < progbar_loop_max; ++progbar_loop_var)
- packet_list_resize_column(progbar_loop_var);
-}
-
-void
-packet_list_resize_columns_cb(GtkWidget *widget _U_, gpointer data _U_)
-{
- packet_list_resize_columns();
-}
-
-static void
-scroll_to_current(void)
-{
- GtkTreeSelection *selection;
- GtkTreeIter iter;
- GtkTreeModel *model;
- GtkWidget *focus = gtk_window_get_focus(GTK_WINDOW(top_level));
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(packetlist->view));
- /* model is filled with the current model as a convenience. */
- if (!gtk_tree_selection_get_selected(selection, &model, &iter))
- return;
-
- scroll_to_and_select_iter(model, selection, &iter);
-
- /* Set the focus back where it was */
- if (focus)
- gtk_window_set_focus(GTK_WINDOW(top_level), focus);
-}
-
-void
-packet_list_next(void)
-{
- GtkTreeSelection *selection;
- GtkTreeIter iter;
- GtkTreeModel *model;
- GtkWidget *focus = gtk_window_get_focus(GTK_WINDOW(top_level));
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(packetlist->view));
- /* model is filled with the current model as a convenience. */
- if (!gtk_tree_selection_get_selected(selection, &model, &iter))
- return;
-
- if (!gtk_tree_model_iter_next(model, &iter))
- return;
-
- scroll_to_and_select_iter(model, selection, &iter);
-
- /* Set the focus back where it was */
- if (focus)
- gtk_window_set_focus(GTK_WINDOW(top_level), focus);
-}
-
-void
-packet_list_prev(void)
-{
- GtkTreeSelection *selection;
- GtkTreeIter iter;
- GtkTreeModel *model;
- GtkTreePath *path;
- GtkWidget *focus = gtk_window_get_focus(GTK_WINDOW(top_level));
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(packetlist->view));
- /* model is filled with the current model as a convenience. */
- if (!gtk_tree_selection_get_selected(selection, &model, &iter))
- return;
-
- path = gtk_tree_model_get_path(model, &iter);
-
- if (!gtk_tree_path_prev(path))
- return;
-
- if (!gtk_tree_model_get_iter(model, &iter, path))
- return;
-
- scroll_to_and_select_iter(model, selection, &iter);
-
- gtk_tree_path_free(path);
-
- /* Set the focus back where it was */
- if (focus)
- gtk_window_set_focus(GTK_WINDOW(top_level), focus);
-}
-
-static void
-scroll_to_and_select_iter(GtkTreeModel *model, GtkTreeSelection *selection, GtkTreeIter *iter)
-{
- GtkTreePath *path;
-
- g_assert(model);
-
- /* Select the row */
- if(!selection)
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(packetlist->view));
- gtk_tree_selection_select_iter (selection, iter);
- path = gtk_tree_model_get_path(model, iter);
- gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(packetlist->view),
- path,
- NULL,
- TRUE, /* use_align */
- 0.5f, /* row_align determines where the row is placed, 0.5 means center */
- 0); /* The horizontal alignment of the column */
-
- /* "cursor-changed" signal triggers packet_list_select_cb() */
- /* which will update the middle and bottom panes. */
- gtk_tree_view_set_cursor(GTK_TREE_VIEW(packetlist->view),
- path,
- NULL,
- FALSE); /* start_editing */
-
- gtk_tree_path_free(path);
-}
-
-void
-packet_list_select_first_row(void)
-{
- GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(packetlist->view));
- GtkTreeIter iter;
-
- if(!gtk_tree_model_get_iter_first(model, &iter))
- return;
-
- scroll_to_and_select_iter(model, NULL, &iter);
- gtk_widget_grab_focus(packetlist->view);
-}
-
-void
-packet_list_select_last_row(void)
-{
- GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(packetlist->view));
- GtkTreeIter iter;
- gint children;
- guint last_row;
-
- if((children = gtk_tree_model_iter_n_children(model, NULL)) == 0)
- return;
-
- last_row = children-1;
- if(!gtk_tree_model_iter_nth_child(model, &iter, NULL, last_row))
- return;
-
- scroll_to_and_select_iter(model, NULL, &iter);
-}
-
-void
-packet_list_moveto_end(void)
-{
- GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(packetlist->view));
- GtkTreeIter iter;
- GtkTreePath *path;
- gint children;
- guint last_row;
-
- if((children = gtk_tree_model_iter_n_children(model, NULL)) == 0)
- return;
-
- last_row = children-1;
- if(!gtk_tree_model_iter_nth_child(model, &iter, NULL, last_row))
- return;
-
- path = gtk_tree_model_get_path(model, &iter);
-
- gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(packetlist->view),
- path,
- NULL,
- TRUE, /* use_align */
- 0.5f, /* row_align determines where the row is placed, 0.5 means center */
- 0); /* The horizontal alignment of the column */
-
- gtk_tree_path_free(path);
-
-}
-
-gboolean
-packet_list_check_end(void)
-{
- gboolean at_end = FALSE;
- GtkAdjustment *adj;
-
-#if GTK_CHECK_VERSION(3,0,0)
- adj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (packetlist->view));
-#else
- adj = gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(packetlist->view));
-#endif
- g_return_val_if_fail(adj != NULL, FALSE);
-
- if (gtk_adjustment_get_value(adj) >= gtk_adjustment_get_upper(adj) - gtk_adjustment_get_page_size(adj)) {
- at_end = TRUE;
- }
-#ifdef HAVE_LIBPCAP
- if (gtk_adjustment_get_value(adj) > 0 && at_end != last_at_end && at_end != auto_scroll_live) {
- main_auto_scroll_live_changed(at_end);
- }
-#endif
- last_at_end = at_end;
- return at_end;
-}
-
-/*
- * Given a frame_data structure, scroll to and select the row in the
- * packet list corresponding to that frame. If there is no such
- * row, return FALSE, otherwise return TRUE.
- */
-gboolean
-packet_list_select_row_from_data(frame_data *fdata_needle)
-{
- GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(packetlist->view));
- GtkTreeIter iter;
-
- /* Initializes iter with the first iterator in the tree (the one at the path "0")
- * and returns TRUE. Returns FALSE if the tree is empty
- */
- if(!gtk_tree_model_get_iter_first(model, &iter))
- return FALSE;
-
- do {
- frame_data *fdata;
-
- fdata = packet_list_get_record(model, &iter);
-
- if(fdata == fdata_needle) {
- scroll_to_and_select_iter(model, NULL, &iter);
-
- return TRUE;
- }
- } while (gtk_tree_model_iter_next(model, &iter));
-
- return FALSE;
-}
-
-void
-packet_list_set_selected_row(gint row)
-{
- GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(packetlist->view));
- GtkTreeIter iter;
- GtkTreeSelection *selection;
- GtkTreePath *path;
-
- path = gtk_tree_path_new_from_indices(row-1, -1);
-
- if (!gtk_tree_model_get_iter(model, &iter, path))
- return;
-
- /* Select the row */
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(packetlist->view));
- gtk_tree_selection_select_iter (selection, &iter);
-
- /* "cursor-changed" signal triggers packet_list_select_cb() */
- /* which will update the middle and bottom panes. */
- gtk_tree_view_set_cursor(GTK_TREE_VIEW(packetlist->view),
- path,
- NULL,
- FALSE); /* start_editing */
-
- gtk_tree_path_free(path);
-}
-
-static gint
-row_number_from_iter(GtkTreeIter *iter)
-{
- gint row;
- gint *indices;
- GtkTreePath *path;
- GtkTreeModel *model;
-
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(packetlist->view));
- path = gtk_tree_model_get_path(model, iter);
- indices = gtk_tree_path_get_indices(path);
- g_assert(indices);
- /* Indices start from 0, but rows start from 1. Hence +1 */
- row = indices[0] + 1;
-
- gtk_tree_path_free(path);
-
- return row;
-}
-
-static void
-packet_list_select_cb(GtkTreeView *tree_view, gpointer data _U_)
-{
- GtkTreeSelection *selection;
- GtkTreeIter iter;
- gint row;
-
- if ((selection = gtk_tree_view_get_selection(tree_view)) == NULL)
- return;
-
- if (!gtk_tree_selection_get_selected(selection, NULL, &iter))
- return;
-
- row = row_number_from_iter(&iter);
-
- /* Check if already selected
- */
- if (cfile.current_frame && cfile.current_row == row)
- return;
-
- /* Remove the hex display tab pages */
- while(gtk_notebook_get_nth_page(GTK_NOTEBOOK(byte_nb_ptr_gbl), 0))
- gtk_notebook_remove_page(GTK_NOTEBOOK(byte_nb_ptr_gbl), 0);
-
- cf_select_packet(&cfile, row);
- /* If searching the tree, set the focus there; otherwise, focus on the packet list */
- if (cfile.search_in_progress && cfile.decode_data) {
- gtk_widget_grab_focus(tree_view_gbl);
- } else {
- gtk_widget_grab_focus(packetlist->view);
- }
-
- /* Add newly selected frame to packet history (breadcrumbs) */
- packet_history_add(row);
-}
-
-static void
-packet_list_double_click_cb(GtkTreeView *treeview, GtkTreePath *path _U_,
- GtkTreeViewColumn *col _U_, gpointer userdata _U_)
-{
- new_packet_window(GTK_WIDGET(treeview), FALSE, FALSE);
-}
-
-gboolean
-packet_list_get_event_row_column(GdkEventButton *event_button,
- gint *physical_row, gint *row, gint *column)
-{
- GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(packetlist->view));
- GtkTreePath *path;
- GtkTreeViewColumn *view_column;
-
- if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(packetlist->view),
- (gint) event_button->x,
- (gint) event_button->y,
- &path, &view_column, NULL, NULL)) {
- GtkTreeIter iter;
- GList *cols;
- gint *indices;
- frame_data *fdata;
-
- /* Fetch indices */
- gtk_tree_model_get_iter(model, &iter, path);
- indices = gtk_tree_path_get_indices(path);
- g_assert(indices);
- /* Indices start from 0. Hence +1 */
- *row = indices[0] + 1;
- gtk_tree_path_free(path);
-
- /* Fetch physical row */
- fdata = packet_list_get_record(model, &iter);
- *physical_row = fdata->num;
-
- /* Fetch column */
- /* XXX -doesn't work if columns are re-arranged? */
- cols = gtk_tree_view_get_columns(GTK_TREE_VIEW(packetlist->view));
- *column = g_list_index(cols, (gpointer) view_column);
- g_list_free(cols);
-
- return TRUE;
- }
- else
- return FALSE;
-}
-
-frame_data *
-packet_list_get_row_data(gint row)
-{
- GtkTreePath *path = gtk_tree_path_new();
- GtkTreeIter iter;
- frame_data *fdata;
-
- g_assert(row > 0);
- gtk_tree_path_append_index(path, row-1);
- gtk_tree_model_get_iter(GTK_TREE_MODEL(packetlist), &iter, path);
-
- fdata = packet_list_get_record(GTK_TREE_MODEL(packetlist), &iter);
-
- gtk_tree_path_free(path);
-
- return fdata;
-}
-
-static void
-show_cell_data_func(GtkTreeViewColumn *col _U_, GtkCellRenderer *renderer,
- GtkTreeModel *model, GtkTreeIter *iter, gpointer data _U_)
-{
- frame_data *fdata = packet_list_get_record(model, iter);
-
- gboolean color_on;
- GdkColor fg_gdk;
- GdkColor bg_gdk;
-
- if (fdata->flags.ignored) {
- color_t_to_gdkcolor(&fg_gdk, &prefs.gui_ignored_fg);
- color_t_to_gdkcolor(&bg_gdk, &prefs.gui_ignored_bg);
- color_on = TRUE;
- } else if (fdata->flags.marked) {
- color_t_to_gdkcolor(&fg_gdk, &prefs.gui_marked_fg);
- color_t_to_gdkcolor(&bg_gdk, &prefs.gui_marked_bg);
- color_on = TRUE;
- } else if (fdata->color_filter) {
- const color_filter_t *color_filter = (const color_filter_t *)fdata->color_filter;
-
- color_t_to_gdkcolor(&fg_gdk, &color_filter->fg_color);
- color_t_to_gdkcolor(&bg_gdk, &color_filter->bg_color);
- color_on = enable_color;
- } else
- color_on = FALSE;
-
- if (color_on) {
- g_object_set(renderer,
- "foreground-gdk", &fg_gdk,
- "foreground-set", TRUE,
- "background-gdk", &bg_gdk,
- "background-set", TRUE,
- NULL);
- } else {
- g_object_set(renderer,
- "foreground-set", FALSE,
- "background-set", FALSE,
- NULL);
- }
-}
-
-void
-packet_list_enable_color(gboolean enable)
-{
- enable_color = enable;
- gtk_widget_queue_draw (packetlist->view);
-}
-
-/* Redraw the packet list *and* currently-selected detail */
-void
-packet_list_queue_draw(void)
-{
- GtkTreeSelection *selection;
- GtkTreeIter iter;
- gint row;
-
- gtk_widget_queue_draw (packetlist->view);
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(packetlist->view));
- if (!gtk_tree_selection_get_selected(selection, NULL, &iter))
- return;
- row = row_number_from_iter(&iter);
- cf_select_packet(&cfile, row);
-}
-
-void
-packet_list_set_font(PangoFontDescription *font)
-{
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_override_font(packetlist->view, font);
-#else
- gtk_widget_modify_font(packetlist->view, font);
-#endif
-}
-
-
-/* call this after last set_frame_mark is done */
-static void
-mark_frames_ready(void)
-{
- packets_bar_update();
- packet_list_queue_draw();
-}
-
-static void
-set_frame_mark(gboolean set, frame_data *fdata)
-{
- if (set)
- cf_mark_frame(&cfile, fdata);
- else
- cf_unmark_frame(&cfile, fdata);
-}
-
-void
-packet_list_mark_frame_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- GtkTreeModel *model;
- GtkTreeSelection *selection;
- GtkTreeIter iter;
- frame_data *fdata;
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(packetlist->view));
- /* model is filled with the current model as a convenience. */
- if (!gtk_tree_selection_get_selected(selection, &model, &iter))
- return;
-
- fdata = packet_list_get_record(model, &iter);
-
- set_frame_mark(!fdata->flags.marked, fdata);
- mark_frames_ready();
-}
-
-static void
-mark_all_displayed_frames(gboolean set)
-{
- /* XXX: we might need a progressbar here */
- guint32 framenum;
- frame_data *fdata;
- for (framenum = 1; framenum <= cfile.count; framenum++) {
- fdata = frame_data_sequence_find(cfile.provider.frames, framenum);
- if( fdata->flags.passed_dfilter )
- set_frame_mark(set, fdata);
- }
-}
-
-void
-packet_list_mark_all_displayed_frames_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- mark_all_displayed_frames(TRUE);
- mark_frames_ready();
-}
-
-void
-packet_list_unmark_all_displayed_frames_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- mark_all_displayed_frames(FALSE);
- mark_frames_ready();
-}
-
-static void
-toggle_mark_all_displayed_frames(void)
-{
- /* XXX: we might need a progressbar here */
- guint32 framenum;
- frame_data *fdata;
- for (framenum = 1; framenum <= cfile.count; framenum++) {
- fdata = frame_data_sequence_find(cfile.provider.frames, framenum);
- if( fdata->flags.passed_dfilter )
- set_frame_mark(!fdata->flags.marked, fdata);
- }
-}
-
-void
-packet_list_toggle_mark_all_displayed_frames_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- toggle_mark_all_displayed_frames();
- mark_frames_ready();
-}
-
-
-static void
-set_frame_ignore(gboolean set, frame_data *fdata)
-{
- if (set)
- cf_ignore_frame(&cfile, fdata);
- else
- cf_unignore_frame(&cfile, fdata);
-}
-
-void
-packet_list_ignore_frame_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- GtkTreeModel *model;
- GtkTreeSelection *selection;
- GtkTreeIter iter;
- frame_data *fdata;
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(packetlist->view));
- /* model is filled with the current model as a convenience. */
- if (!gtk_tree_selection_get_selected(selection, &model, &iter))
- return;
-
- fdata = packet_list_get_record(model, &iter);
- set_frame_ignore(!fdata->flags.ignored, fdata);
- redissect_packets();
-}
-
-static void
-ignore_all_displayed_frames(gboolean set)
-{
- guint32 framenum;
- frame_data *fdata;
-
- /* XXX: we might need a progressbar here */
- for (framenum = 1; framenum <= cfile.count; framenum++) {
- fdata = frame_data_sequence_find(cfile.provider.frames, framenum);
- if( fdata->flags.passed_dfilter )
- set_frame_ignore(set, fdata);
- }
- redissect_packets();
-}
-
-void
-packet_list_ignore_all_displayed_frames_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- if(cfile.displayed_count < cfile.count){
- frame_data *fdata;
- /* Due to performance impact with large captures, don't check the filtered list for
- an ignored frame; just check the first. If a ignored frame exists but isn't first and
- the user wants to unignore all the displayed frames, they will just re-exec the shortcut. */
- fdata = frame_data_sequence_find(cfile.provider.frames, cfile.first_displayed);
- if (fdata->flags.ignored==TRUE) {
- ignore_all_displayed_frames(FALSE);
- } else {
- ignore_all_displayed_frames(TRUE);
- }
- }
-}
-
-static void
-unignore_all_frames(void)
-{
- guint32 framenum;
- frame_data *fdata;
-
- /* XXX: we might need a progressbar here */
- for (framenum = 1; framenum <= cfile.count; framenum++) {
- fdata = frame_data_sequence_find(cfile.provider.frames, framenum);
- set_frame_ignore(FALSE, fdata);
- }
- redissect_packets();
-}
-
-void
-packet_list_unignore_all_frames_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- unignore_all_frames();
-}
-
-
-static void
-untime_reference_all_frames(void)
-{
- /* XXX: we might need a progressbar here */
- guint32 framenum;
- frame_data *fdata;
- for (framenum = 1; framenum <= cfile.count && cfile.ref_time_count > 0; framenum++) {
- fdata = frame_data_sequence_find(cfile.provider.frames, framenum);
- if (fdata->flags.ref_time == 1) {
- set_frame_reftime(FALSE, fdata, cfile.current_row);
- }
- }
-}
-
-void
-packet_list_untime_reference_all_frames_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- untime_reference_all_frames();
-}
-
-
-guint
-packet_list_get_column_id (gint col_num)
-{
- GtkTreeViewColumn *column = gtk_tree_view_get_column (GTK_TREE_VIEW(packetlist->view), col_num);
- gint col_id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(column), E_MPACKET_LIST_COL_KEY));
-
- return col_id;
-}
-
-void
-packet_list_copy_summary_cb(gpointer data _U_, copy_summary_type copy_type)
-{
- gint col;
- gchar *celltext;
- GString* text;
- GtkTreeModel *model;
- GtkTreeSelection *selection;
- GtkTreeIter iter;
- gboolean first_col = TRUE;
-
- if(CS_CSV == copy_type) {
- text = g_string_new("\"");
- } else {
- text = g_string_new("");
- }
-
- if (cfile.current_frame) {
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(packetlist->view));
- /* model is filled with the current model as a convenience. */
- if (!gtk_tree_selection_get_selected(selection, &model, &iter))
- return;
-
- for(col = 0; col < cfile.cinfo.num_cols; ++col) {
- if (get_column_visible(col)) {
- if(!first_col) {
- if(CS_CSV == copy_type) {
- g_string_append(text,"\",\"");
- } else {
- g_string_append_c(text, '\t');
- }
- }
-
- gtk_tree_model_get(model, &iter, packet_list_get_column_id(col), &celltext, -1);
- g_string_append(text,celltext);
- g_free(celltext);
- first_col = FALSE;
- }
- }
- if(CS_CSV == copy_type) {
- g_string_append_c(text,'"');
- }
- copy_to_clipboard(text);
- }
- g_string_free(text,TRUE);
-}
-
-gchar *
-packet_list_get_packet_comment(void)
-{
- GtkTreeModel *model;
- GtkTreeSelection *selection;
- GtkTreeIter iter;
- frame_data *fdata;
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(packetlist->view));
- /* model is filled with the current model as a convenience. */
- if (!gtk_tree_selection_get_selected(selection, &model, &iter))
- return NULL;
-
- fdata = packet_list_get_record(model, &iter);
-
- return cf_get_packet_comment(&cfile, fdata);
-}
-
-void
-packet_list_return_all_comments(GtkTextBuffer *buffer)
-{
- guint32 framenum;
- frame_data *fdata;
- gchar *buf_str;
-
- for (framenum = 1; framenum <= cfile.count ; framenum++) {
- char *pkt_comment;
-
- fdata = frame_data_sequence_find(cfile.provider.frames, framenum);
- pkt_comment = cf_get_packet_comment(&cfile, fdata);
- if (pkt_comment) {
- buf_str = g_strdup_printf("Frame %u: %s \n\n",framenum, pkt_comment);
- gtk_text_buffer_insert_at_cursor (buffer, buf_str, -1);
- g_free(buf_str);
- g_free(pkt_comment);
- }
- if (gtk_text_buffer_get_char_count(buffer) > MAX_COMMENTS_TO_FETCH) {
- buf_str = g_strdup_printf("[ Comment text exceeds %s. Stopping. ]",
- format_size(MAX_COMMENTS_TO_FETCH, (format_size_flags_e)(format_size_unit_bytes|format_size_prefix_si)));
- gtk_text_buffer_insert_at_cursor (buffer, buf_str, -1);
- return;
- }
- }
-}
-
-void
-packet_list_update_packet_comment(gchar *new_packet_comment)
-{
-
- GtkTreeModel *model;
- GtkTreeSelection *selection;
- GtkTreeIter iter;
- frame_data *fdata;
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(packetlist->view));
- /* model is filled with the current model as a convenience. */
- if (!gtk_tree_selection_get_selected(selection, &model, &iter))
- return;
-
- fdata = packet_list_get_record(model, &iter);
-
- /* Check if we are clearing the comment */
- if(strlen(new_packet_comment) == 0) {
- g_free(new_packet_comment);
- new_packet_comment = NULL;
- }
-
- cf_set_user_packet_comment(&cfile, fdata, new_packet_comment);
-
- g_free(new_packet_comment);
-
- /* Update the main window, as we now have unsaved changes. */
- main_update_for_unsaved_changes(&cfile);
-
- packet_list_queue_draw();
-
-}
-
-void
-packet_list_recent_write_all(FILE *rf)
-{
- gint col, width, num_cols, col_fmt;
- GtkTreeViewColumn *tree_column;
- gchar xalign;
-
- fprintf (rf, "%s:", RECENT_KEY_COL_WIDTH);
- num_cols = g_list_length(prefs.col_list);
- for (col = 0; col < num_cols; col++) {
- col_fmt = get_column_format(col);
- if (col_fmt == COL_CUSTOM) {
- fprintf (rf, " \"%%Cus:%s\",", get_column_custom_fields(col));
- } else {
- fprintf (rf, " %s,", col_format_to_string(col_fmt));
- }
- tree_column = gtk_tree_view_get_column(GTK_TREE_VIEW(packetlist->view), col);
- width = gtk_tree_view_column_get_width(tree_column);
- xalign = recent_get_column_xalign (col);
- if (width == 0) {
- /* We have not initialized the packet list yet, use old values */
- width = recent_get_column_width (col);
- }
- fprintf (rf, " %d", width);
- if (xalign != COLUMN_XALIGN_DEFAULT) {
- fprintf (rf, ":%c", xalign);
- }
- if (col != num_cols-1) {
- fprintf (rf, ",");
- }
- }
- fprintf (rf, "\n");
-}
-
-GtkWidget *
-packet_list_get_widget(void)
-{
- g_assert(packetlist);
- g_assert(packetlist->view);
- return packetlist->view;
-}
-
-void
-packet_list_colorize_packets(void)
-{
- packet_list_reset_colorized(packetlist);
- gtk_widget_queue_draw (packetlist->view);
-}
-
-static gboolean
-query_packet_list_tooltip_cb(GtkWidget *widget, gint x, gint y, gboolean keyboard_tip, GtkTooltip *tooltip, gpointer data _U_)
-{
- GtkTreeIter iter;
- GtkTreeView *tree_view = GTK_TREE_VIEW(widget);
- GtkTreeModel *model = gtk_tree_view_get_model(tree_view);
- GtkTreePath *path = NULL;
- GtkTreeViewColumn *column;
- gint col, num_cols;
- frame_data *fdata;
- GtkCellRenderer* renderer=NULL;
- GList *renderer_list;
- gboolean result = FALSE;
-
- if (!gtk_tree_view_get_tooltip_context(tree_view, &x, &y, keyboard_tip, &model, &path, &iter))
- return result;
-
- if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tree_view), x, y, NULL, &column, NULL, NULL)) {
- char *pkt_comment;
-
- num_cols = g_list_length(prefs.col_list);
-
- for (col = 0; col < num_cols; col++) {
- if (gtk_tree_view_get_column(tree_view, col) == column)
- break;
- }
-
- fdata = packet_list_get_record(model, &iter);
- pkt_comment = cf_get_packet_comment(&cfile, fdata);
-
- if (pkt_comment != NULL) {
- gtk_tooltip_set_markup(tooltip, pkt_comment);
- renderer_list = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
- /* get the first renderer */
- if (g_list_first(renderer_list)) {
- renderer = (GtkCellRenderer*)g_list_nth_data(renderer_list, 0);
- gtk_tree_view_set_tooltip_cell (tree_view, tooltip, path, column, renderer);
- }
- g_list_free(renderer_list);
- g_free(pkt_comment);
- result = TRUE;
- }
- }
- gtk_tree_path_free(path);
-
- return result;
-}
-
-/*
- * Editor modelines - http://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/gtk/packet_list.h b/ui/gtk/packet_list.h
deleted file mode 100644
index 9c2a9d1ff5..0000000000
--- a/ui/gtk/packet_list.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/* packet_list.h
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
- */
-
-#ifndef __PACKET_LIST_H__
-#define __PACKET_LIST_H__
-
-#include <gtk/gtk.h>
-
-/** @file
- * @ingroup main_window_group
- */
-
-typedef enum {
- COLUMN_SELECTED_SORT_ASCENDING,
- COLUMN_SELECTED_SORT_DESCENDING,
- COLUMN_SELECTED_SORT_NONE,
- COLUMN_SELECTED_TOGGLE_RESOLVED,
- COLUMN_SELECTED_ALIGN_LEFT,
- COLUMN_SELECTED_ALIGN_CENTER,
- COLUMN_SELECTED_ALIGN_RIGHT,
- COLUMN_SELECTED_ALIGN_DEFAULT,
- COLUMN_SELECTED_RESIZE,
- COLUMN_SELECTED_CHANGE,
- COLUMN_SELECTED_HIDE,
- COLUMN_SELECTED_REMOVE
-} COLUMN_SELECTED_E;
-
-/** Create the packet list */
-GtkWidget *packet_list_create(void);
-/** Recreate the packetr list */
-void packet_list_recreate(void);
-void packet_list_toggle_visible_column (gint col_id);
-void packet_list_set_all_columns_visible (void);
-void packet_list_column_menu_cb (GtkWidget *w, gpointer data, COLUMN_SELECTED_E action);
-void packet_list_resize_columns_cb(GtkWidget *widget _U_, gpointer data _U_);
-gboolean packet_list_get_event_row_column(GdkEventButton *event_button, gint *physical_row, gint *row, gint *column);
-guint packet_list_get_column_id (gint col_num);
-void packet_list_select_last_row(void);
-
-/** Set the font of the packet list window.
- *
- * @param font new font
- */
-extern void packet_list_set_font(PangoFontDescription *font);
-
-/** Mark the currently selected packet.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-extern void packet_list_mark_frame_cb(GtkWidget *widget, gpointer data);
-
-/** Toggle Mark on all displayed packets.
- *
- * @param w parent widget (unused)
- * @param data unused
- */
-extern void packet_list_toggle_mark_all_displayed_frames_cb(GtkWidget *w _U_, gpointer data _U_);
-
-/** Mark all displayed packets.
- *
- * @param w parent widget (unused)
- * @param data unused
- */
-extern void packet_list_mark_all_displayed_frames_cb(GtkWidget *w _U_, gpointer data _U_);
-
-/** UnMark all packets in the capture.
- *
- * @param w parent widget (unused)
- * @param data unused
- */
-extern void packet_list_unmark_all_displayed_frames_cb(GtkWidget *w _U_, gpointer data _U_);
-
-/** Ignore the currently selected packet.
- *
- * @param widget parent widget
- * @param data unused
- */
-extern void packet_list_ignore_frame_cb(GtkWidget *widget, gpointer data);
-
-/** Ignore/Unignore all displayed packets.
- *
- * @param w parent widget (unused)
- * @param data unused
- */
-extern void packet_list_ignore_all_displayed_frames_cb(GtkWidget *w _U_, gpointer data _U_);
-
-/** Un-ignore all packets in the list.
- *
- * @param w parent widget (unused)
- * @param data unused
- */
-extern void packet_list_unignore_all_frames_cb(GtkWidget *w _U_, gpointer data _U_);
-
-/** Un-Time Reference all packets in the capture.
- *
- * @param w parent widget (unused)
- * @param data unused
- */
-extern void packet_list_untime_reference_all_frames_cb(GtkWidget *w _U_, gpointer data _U_);
-
-/** Different modes of copying summary data */
-typedef enum {
- CS_TEXT, /**< Packet summary data (tab separated) */
- CS_CSV /**< Packet summary data (comma separated) */
-} copy_summary_type;
-
-/** Called when user clicks on menu item to copy summary data.
- *
- * @param data Not used.
- * @param copy_type Mode in which to copy data (e.g. tab-separated, CSV)
- */
-void packet_list_copy_summary_cb(gpointer data _U_, copy_summary_type copy_type);
-
-gchar *packet_list_get_packet_comment(void);
-void packet_list_update_packet_comment(gchar *new_packet_comment);
-void packet_list_return_all_comments(GtkTextBuffer *buffer);
-
-GtkWidget * packet_list_get_widget(void);
-void packet_list_colorize_packets(void);
-
-#endif /* __PACKET_LIST_H__ */
diff --git a/ui/gtk/packet_list_store.c b/ui/gtk/packet_list_store.c
deleted file mode 100644
index cf4cde81bc..0000000000
--- a/ui/gtk/packet_list_store.c
+++ /dev/null
@@ -1,1287 +0,0 @@
-/* packet_list_store.c
- * Routines to implement a custom GTK+ list model for Wireshark's packet list
- * Copyright 2008-2009, Stephen Fisher (see AUTHORS file)
- * * Co-authors Anders Broman and Kovarththanan Rajaratnam.
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
- */
-
-/* This code was originally based on the GTK+ Tree View tutorial at
- * http://scentric.net/tutorial */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include "packet_list_store.h"
-
-#include "ui/progress_dlg.h"
-#include "ui/ws_ui_util.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-#include <epan/epan_dissect.h>
-#include <epan/column.h>
-
-#include <epan/color_filters.h>
-#include "frame_tvbuff.h"
-
-#include "globals.h"
-
-/* #define PACKET_PARANOID_CHECKS */
-
-/** PacketListRecord: represents a row */
-typedef struct _PacketListRecord {
- /** The column text for some columns */
- const gchar **col_text;
- /**< The length of the column text strings in 'col_text' */
- gushort *col_text_len;
-
- frame_data *fdata;
-
- /* admin stuff used by the custom list model */
-#ifdef PACKET_PARANOID_CHECKS
- /** position within the physical array */
- guint physical_pos;
-#endif
- /** position within the visible array */
- gint visible_pos;
-
- /** Has this record been colorized? */
- guint colorized : 1;
-
-} PacketListRecord;
-
-static void packet_list_init(PacketList *pkg_tree);
-static void packet_list_class_init(PacketListClass *klass);
-static void packet_list_tree_model_init(GtkTreeModelIface *iface);
-static void packet_list_finalize(GObject *object);
-static GtkTreeModelFlags packet_list_get_flags(GtkTreeModel *tree_model);
-static gint packet_list_get_n_columns(GtkTreeModel *tree_model);
-static GType packet_list_get_column_type(GtkTreeModel *tree_model, gint idx);
-static gboolean packet_list_get_iter(GtkTreeModel *tree_model,
- GtkTreeIter *iter, GtkTreePath *path);
-static GtkTreePath *packet_list_get_path(GtkTreeModel *tree_model,
- GtkTreeIter *iter);
-static void packet_list_get_value(GtkTreeModel *tree_model, GtkTreeIter *iter,
- gint column, GValue *value);
-static gboolean packet_list_iter_next(GtkTreeModel *tree_model,
- GtkTreeIter *iter);
-static gboolean packet_list_iter_children(GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreeIter *parent);
-static gboolean packet_list_iter_has_child(GtkTreeModel *tree_model _U_,
- GtkTreeIter *iter _U_);
-static gint packet_list_iter_n_children(GtkTreeModel *tree_model,
- GtkTreeIter *iter);
-static gboolean packet_list_iter_nth_child(GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreeIter *parent,
- gint n);
-static gboolean packet_list_iter_parent(GtkTreeModel *tree_model _U_,
- GtkTreeIter *iter _U_,
- GtkTreeIter *child _U_);
-
-static gboolean packet_list_sortable_get_sort_column_id(GtkTreeSortable
- *sortable,
- gint *sort_col_id,
- GtkSortType *order);
-static void packet_list_sortable_set_sort_column_id(GtkTreeSortable *sortable,
- gint sort_col_id,
- GtkSortType order);
-static void packet_list_sortable_set_sort_func(GtkTreeSortable *sortable,
- gint sort_col_id,
- GtkTreeIterCompareFunc sort_func,
- gpointer user_data,
- GDestroyNotify destroy_func);
-static void packet_list_sortable_set_default_sort_func(GtkTreeSortable
- *sortable,
- GtkTreeIterCompareFunc
- sort_func,
- gpointer user_data,
- GDestroyNotify
- destroy_func);
-static gboolean packet_list_sortable_has_default_sort_func(GtkTreeSortable
- *sortable);
-static void packet_list_sortable_init(GtkTreeSortableIface *iface);
-static void packet_list_resort(PacketList *packet_list);
-static void packet_list_dissect_and_cache_record(PacketList *packet_list, PacketListRecord *record, gboolean dissect_color );
-
-static GObjectClass *parent_class = NULL;
-
-
-GType
-packet_list_get_type(void)
-{
- static GType packet_list_type = 0;
-
- if(packet_list_type == 0) {
- static const GTypeInfo packet_list_info = {
- sizeof(PacketListClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) packet_list_class_init,
- NULL, /* class finalize */
- NULL, /* class_data */
- sizeof(PacketList),
- 0, /* n_preallocs */
- (GInstanceInitFunc) packet_list_init,
- NULL /* value_table */
- };
-
- static const GInterfaceInfo tree_model_info = {
- (GInterfaceInitFunc) packet_list_tree_model_init,
- NULL,
- NULL
- };
-
- static const GInterfaceInfo tree_sortable_info = {
- (GInterfaceInitFunc) packet_list_sortable_init,
- NULL,
- NULL
- };
-
- /* Register the new derived type with the GObject type system */
- packet_list_type = g_type_register_static(G_TYPE_OBJECT,
- "PacketList",
- &packet_list_info,
- (GTypeFlags)0);
-
- g_type_add_interface_static(packet_list_type,
- GTK_TYPE_TREE_MODEL,
- &tree_model_info);
-
-
- /* Register our GtkTreeModel interface with the type system */
- g_type_add_interface_static(packet_list_type,
- GTK_TYPE_TREE_SORTABLE,
- &tree_sortable_info);
- }
-
- return packet_list_type;
-}
-
-static void
-packet_list_sortable_init(GtkTreeSortableIface *iface)
-{
- iface->get_sort_column_id = packet_list_sortable_get_sort_column_id;
- iface->set_sort_column_id = packet_list_sortable_set_sort_column_id;
- /* The following three functions are not implemented */
- iface->set_sort_func = packet_list_sortable_set_sort_func;
- iface->set_default_sort_func =
- packet_list_sortable_set_default_sort_func;
- iface->has_default_sort_func =
- packet_list_sortable_has_default_sort_func;
-}
-
-static void
-packet_list_class_init(PacketListClass *klass)
-{
- GObjectClass *object_class;
-
- parent_class = (GObjectClass*) g_type_class_peek_parent(klass);
- object_class = (GObjectClass*) klass;
-
- object_class->finalize = packet_list_finalize;
-
-#if !GTK_CHECK_VERSION(3,0,0)
- /* XXX this seems to affect TreeView Application wide
- * Move to main.c ??? as it's not a bad thing(tm)
- */
- gtk_rc_parse_string (
- "style \"PacketList-style\"\n"
- "{\n"
- " GtkTreeView::horizontal-separator = 0\n"
- " GtkTreeView::vertical-separator = 1\n"
- "} widget_class \"*TreeView*\""
- " style \"PacketList-style\"");
-#endif
-
-}
-
-static void
-packet_list_tree_model_init(GtkTreeModelIface *iface)
-{
- iface->get_flags = packet_list_get_flags;
- iface->get_n_columns = packet_list_get_n_columns;
- iface->get_column_type = packet_list_get_column_type;
- iface->get_iter = packet_list_get_iter;
- iface->get_path = packet_list_get_path;
- iface->get_value = packet_list_get_value;
- iface->iter_next = packet_list_iter_next;
- iface->iter_children = packet_list_iter_children;
- iface->iter_has_child = packet_list_iter_has_child;
- iface->iter_n_children = packet_list_iter_n_children;
- iface->iter_nth_child = packet_list_iter_nth_child;
- iface->iter_parent = packet_list_iter_parent;
-}
-
-/* This is called every time a new packet list object instance is created in
- * packet_list_new. Initialize the list structure's fields here. */
-static void
-packet_list_init(PacketList *packet_list)
-{
- gint i, j;
-
- /* To check whether an iter belongs to our model. */
- packet_list->stamp = g_random_int();
-
- packet_list->n_cols = cfile.cinfo.num_cols;
- packet_list->physical_rows = g_ptr_array_new();
- packet_list->visible_rows = g_ptr_array_new();
-
- packet_list->columnized = FALSE;
- packet_list->sort_id = 0; /* defaults to first column for now */
- packet_list->sort_order = GTK_SORT_ASCENDING;
-
- packet_list->col_to_text = g_new(int, packet_list->n_cols);
- for (i = 0, j = 0; i < packet_list->n_cols; i++) {
- if (!col_based_on_frame_data(&cfile.cinfo, i)) {
- packet_list->col_to_text[i] = j;
- j++;
- } else
- packet_list->col_to_text[i] = -1;
- }
- packet_list->n_text_cols = j;
-
-#ifdef PACKET_LIST_STATISTICS
- packet_list->const_strings = 0;
-#endif
-}
-
-/* This function is called just before a packet list is destroyed. Free
- * dynamically allocated memory here. */
-static void
-packet_list_finalize(GObject *object)
-{
- /* PacketList *packet_list = PACKET_LIST(object); */
-
- /* XXX - Free all records and free all memory used by the list */
-
- /* must chain up - finalize parent */
- (* parent_class->finalize) (object);
-}
-
-static GtkTreeModelFlags
-packet_list_get_flags(GtkTreeModel *tree_model)
-{
- g_return_val_if_fail(PACKETLIST_IS_LIST(tree_model),
- (GtkTreeModelFlags)0);
-
- return (GtkTreeModelFlags)(GTK_TREE_MODEL_LIST_ONLY | GTK_TREE_MODEL_ITERS_PERSIST);
-}
-
-static gint
-packet_list_get_n_columns(GtkTreeModel *tree_model)
-{
- PacketList *packet_list;
-
- g_return_val_if_fail(PACKETLIST_IS_LIST(tree_model), 0);
- packet_list = (PacketList *) tree_model;
-
- /* Note: We need one extra column to store the entire frame_data */
- return packet_list->n_cols + 1;
-}
-
-static GType
-packet_list_get_column_type(GtkTreeModel *tree_model, gint idx)
-{
- PacketList *packet_list;
-
- g_return_val_if_fail(PACKETLIST_IS_LIST(tree_model), G_TYPE_INVALID);
- packet_list = (PacketList *) tree_model;
-
- /* Note: We use one extra column to store the entire frame_data */
- g_return_val_if_fail(idx >= 0 && idx < packet_list->n_cols + 1, G_TYPE_INVALID);
-
- if (idx >= 0 && idx < packet_list->n_cols)
- return G_TYPE_STRING;
- else if (idx == packet_list->n_cols)
- return G_TYPE_POINTER;
- else
- return G_TYPE_INVALID;
-}
-
-static gboolean
-packet_list_get_iter(GtkTreeModel *tree_model, GtkTreeIter *iter,
- GtkTreePath *path)
-{
- gint *indices, depth;
-
- g_assert(PACKETLIST_IS_LIST(tree_model));
-
- g_assert(path != NULL);
-
- indices = gtk_tree_path_get_indices(path);
- depth = gtk_tree_path_get_depth(path);
-
- /* we do not allow children since it's just a list */
- g_assert(depth == 1);
-
- return packet_list_iter_nth_child(tree_model, iter, NULL, indices[0]);
-}
-
-static GtkTreePath *
-packet_list_get_path(GtkTreeModel *tree_model, GtkTreeIter *iter)
-{
- GtkTreePath *path;
- PacketListRecord *record;
- PacketList *packet_list;
-
- g_return_val_if_fail(PACKETLIST_IS_LIST(tree_model), NULL);
- packet_list = (PacketList *) tree_model;
-
- g_return_val_if_fail(iter != NULL, NULL);
- g_return_val_if_fail(iter->stamp == packet_list->stamp, NULL);
- g_return_val_if_fail(iter->user_data != NULL, NULL);
-
- record = (PacketListRecord*) iter->user_data;
-
- path = gtk_tree_path_new();
- gtk_tree_path_append_index(path, record->visible_pos);
-
- return path;
-}
-
-static void
-packet_list_get_value(GtkTreeModel *tree_model, GtkTreeIter *iter, gint column,
- GValue *value)
-{
- PacketListRecord *record;
- PacketList *packet_list;
-
- g_return_if_fail(PACKETLIST_IS_LIST(tree_model));
- packet_list = (PacketList *) tree_model;
-
- g_return_if_fail(iter != NULL);
- g_return_if_fail(iter->stamp == packet_list->stamp);
- g_return_if_fail(iter->user_data != NULL);
-
- /* Note: We use one extra column to store the entire frame_data */
- g_return_if_fail(column >= 0 && column < packet_list->n_cols + 1);
-
- record = (PacketListRecord*) iter->user_data;
-
-#ifdef PACKET_PARANOID_CHECKS
- g_return_if_fail(PACKET_LIST_RECORD_INDEX_VALID(packet_list->physical_rows, record->physical_pos));
-#endif
- g_return_if_fail(PACKET_LIST_RECORD_INDEX_VALID(packet_list->visible_rows, record->visible_pos));
-
- if (column >= 0 && column < packet_list->n_cols) {
- int text_column;
-
- g_value_init(value, G_TYPE_STRING);
-
- if (record->col_text == NULL || !record->colorized)
- packet_list_dissect_and_cache_record(packet_list, record, !record->colorized);
-
- text_column = packet_list->col_to_text[column];
- if (text_column == -1) { /* column based on frame_data */
- col_fill_in_frame_data(record->fdata, &cfile.cinfo, column, FALSE);
- g_value_set_string(value, cfile.cinfo.columns[column].col_data);
- } else {
- g_return_if_fail(record->col_text);
- g_value_set_string(value, record->col_text[text_column]);
- }
-
- } else if (column == packet_list->n_cols) {
- g_value_init(value, G_TYPE_POINTER);
- g_value_set_pointer(value, record->fdata);
- }
-}
-
-static PacketListRecord *
-packet_list_iter_next_visible(PacketList *packet_list, PacketListRecord *record)
-{
- PacketListRecord *nextrecord;
- gint next_visible_pos;
-
- g_assert(record->visible_pos >= 0);
- next_visible_pos = record->visible_pos + 1;
-
- /* Is this the last record in the list? */
- if(!PACKET_LIST_RECORD_INDEX_VALID(packet_list->visible_rows, next_visible_pos))
- return NULL;
-
- nextrecord = PACKET_LIST_RECORD_GET(packet_list->visible_rows, next_visible_pos);
-
- g_assert(nextrecord->visible_pos == (record->visible_pos + 1));
-#ifdef PACKET_PARANOID_CHECKS
- g_assert(nextrecord->physical_pos >= (record->physical_pos + 1));
-#endif
-
- return nextrecord;
-}
-
-/* Takes an iter structure and sets it to point to the next row. */
-static gboolean
-packet_list_iter_next(GtkTreeModel *tree_model, GtkTreeIter *iter)
-{
- PacketListRecord *record, *nextrecord;
- PacketList *packet_list;
-
- g_return_val_if_fail(PACKETLIST_IS_LIST(tree_model), FALSE);
- packet_list = (PacketList *) tree_model;
-
- if(iter == NULL)
- return FALSE;
-
- g_return_val_if_fail(iter->stamp == packet_list->stamp, FALSE);
- g_return_val_if_fail(iter->user_data, FALSE);
-
- record = (PacketListRecord*) iter->user_data;
- nextrecord = packet_list_iter_next_visible(packet_list, record);
-
- if (!nextrecord)
- return FALSE;
-
- /* iter->stamp = packet_list->stamp; */
- iter->user_data = nextrecord;
-
- return TRUE;
-}
-
-static gboolean
-packet_list_iter_children(GtkTreeModel *tree_model, GtkTreeIter *iter,
- GtkTreeIter *parent)
-{
- return packet_list_iter_nth_child(tree_model, iter, parent, 0);
-}
-
-static gboolean
-packet_list_iter_has_child(GtkTreeModel *tree_model _U_, GtkTreeIter *iter _U_)
-{
- return FALSE; /* Lists have no children */
-}
-
-static gint
-packet_list_iter_n_children(GtkTreeModel *tree_model, GtkTreeIter *iter)
-{
- PacketList *packet_list;
-
- g_return_val_if_fail(PACKETLIST_IS_LIST(tree_model), 0);
- packet_list = (PacketList *) tree_model;
-
- if(!iter) {
- /* special case: if iter == NULL, return number of top-level rows */
- return PACKET_LIST_RECORD_COUNT(packet_list->visible_rows);
- }
- else {
- g_return_val_if_fail(iter->stamp == packet_list->stamp, 0);
- g_return_val_if_fail(iter->user_data, 0);
- /* Lists have zero children */
- return 0;
- }
-}
-
-static gboolean
-packet_list_iter_nth_child(GtkTreeModel *tree_model, GtkTreeIter *iter,
- GtkTreeIter *parent, gint n)
-{
- PacketListRecord *record;
- PacketList *packet_list;
-
- g_return_val_if_fail(PACKETLIST_IS_LIST(tree_model), FALSE);
- packet_list = (PacketList *) tree_model;
-
- /* A list only has top-level rows */
- if(parent) {
- g_return_val_if_fail(parent->stamp == packet_list->stamp, FALSE);
- g_return_val_if_fail(parent->user_data, FALSE);
- return FALSE;
- }
-
- /* Special case: if parent == NULL, set iter to n-th top-level row. */
- if(!PACKET_LIST_RECORD_INDEX_VALID(packet_list->visible_rows, n))
- return FALSE;
-
- record = PACKET_LIST_RECORD_GET(packet_list->visible_rows, n);
-
- g_assert(record->visible_pos == n);
-
- iter->stamp = packet_list->stamp;
- iter->user_data = record;
-
- return TRUE;
-}
-
-static gboolean
-packet_list_iter_parent(GtkTreeModel *tree_model _U_, GtkTreeIter *iter _U_,
- GtkTreeIter *child _U_)
-{
- return FALSE; /* No parents since no children in a list */
-}
-
-PacketList *
-packet_list_new(void)
-{
- PacketList *newpacketlist;
-
- newpacketlist = (PacketList*) g_object_new(PACKETLIST_TYPE_LIST, NULL);
-
- g_assert(newpacketlist != NULL);
-
- return newpacketlist;
-}
-
-#if 0
-static void
-packet_list_row_deleted(PacketList *packet_list, guint pos)
-{
- GtkTreePath *path;
-
- /* Inform the tree view and other interested objects (such as tree row
- * references) that we have deleted a row */
- path = gtk_tree_path_new();
- gtk_tree_path_append_index(path, pos);
-
- gtk_tree_model_row_deleted(GTK_TREE_MODEL(packet_list), path);
-
- gtk_tree_path_free(path);
-}
-#endif
-
-void
-packet_list_store_clear(PacketList *packet_list)
-{
- g_return_if_fail(packet_list != NULL);
- g_return_if_fail(PACKETLIST_IS_LIST(packet_list));
-
- /* Don't issue a row_deleted signal. We rely on our caller to have disconnected
- * the model from the view.
- for( ; packet_list->num_rows > 0; --packet_list->num_rows)
- packet_list_row_deleted(packet_list, packet_list->num_rows-1);
- */
-
- /* XXX - hold on to these rows and reuse them instead */
- if(packet_list->physical_rows)
- g_ptr_array_free(packet_list->physical_rows, TRUE);
- if(packet_list->visible_rows)
- g_ptr_array_free(packet_list->visible_rows, TRUE);
- packet_list->physical_rows = g_ptr_array_new();
- packet_list->visible_rows = g_ptr_array_new();
-
- packet_list->columnized = FALSE;
-
- /* Generate new number */
- packet_list->stamp = g_random_int();
-
- if (packet_list->string_pool) {
- g_string_chunk_clear(packet_list->string_pool);
- }
-
-#ifdef PACKET_LIST_STATISTICS
- g_warning("Const strings: %u", packet_list->const_strings);
- packet_list->const_strings = 0;
-#endif
-}
-
-gint
-packet_list_append_record(PacketList *packet_list, frame_data *fdata)
-{
- PacketListRecord *newrecord;
-
- g_return_val_if_fail(PACKETLIST_IS_LIST(packet_list), -1);
-
- newrecord = wmem_new(wmem_file_scope(), PacketListRecord);
- newrecord->colorized = FALSE;
- newrecord->col_text_len = NULL;
- newrecord->col_text = NULL;
- newrecord->fdata = fdata;
-#ifdef PACKET_PARANOID_CHECKS
- newrecord->physical_pos = PACKET_LIST_RECORD_COUNT(packet_list->physical_rows);
-#endif
-
- if (fdata->flags.passed_dfilter || fdata->flags.ref_time) {
- newrecord->visible_pos = PACKET_LIST_RECORD_COUNT(packet_list->visible_rows);
- PACKET_LIST_RECORD_APPEND(packet_list->visible_rows, newrecord);
- }
- else
- newrecord->visible_pos = -1;
-
- PACKET_LIST_RECORD_APPEND(packet_list->physical_rows, newrecord);
-
- packet_list->columnized = FALSE; /* XXX, dissect? */
-
- /*
- * Issue a row_inserted signal if the model is connected
- * and the row is visible.
- */
- if (gtk_tree_view_get_model(GTK_TREE_VIEW(packet_list->view)) && newrecord->visible_pos != -1) {
- GtkTreeIter iter;
- GtkTreePath *path;
-
- path = gtk_tree_path_new();
- gtk_tree_path_append_index(path, newrecord->visible_pos);
-
- iter.stamp = packet_list->stamp;
- iter.user_data = newrecord;
-
- gtk_tree_model_row_inserted(GTK_TREE_MODEL(packet_list), path, &iter);
- gtk_tree_path_free(path);
- }
-
- /* XXXX If the model is connected and sort column != frame_num we should
- * probably resort.
- * Don't resort the list for every row, the list will be in packet order any way.
- * packet_list_resort(packet_list);
- */
-
- return newrecord->visible_pos;
-}
-
-#define PACKET_STRING_CHUNK_SIZE (1 * 1024 * 1024)
-static void
-packet_list_change_record(PacketList *packet_list, PacketListRecord *record, gint col, column_info *cinfo)
-{
- gchar *str;
- size_t col_text_len;
- int text_col;
- col_item_t* col_item;
-
- text_col = packet_list->col_to_text[col];
-
- /* Column based on frame_data or it already contains a value */
- if (text_col == -1 || record->col_text[text_col] != NULL)
- return;
-
- col_item = &cfile.cinfo.columns[col];
- switch (col_item->col_fmt) {
- case COL_PROTOCOL:
- case COL_INFO:
- case COL_IF_DIR:
- case COL_DCE_CALL:
- case COL_8021Q_VLAN_ID:
- case COL_EXPERT:
- case COL_FREQ_CHAN:
- if (col_item->col_data && col_item->col_data != col_item->col_buf) {
- col_text_len = strlen(col_item->col_data);
- if (col_text_len > G_MAXUSHORT)
- col_text_len = G_MAXUSHORT;
-
- /* This is a constant string, so we don't have to copy it */
- record->col_text[text_col] = (gchar *) col_item->col_data;
- record->col_text_len[text_col] = (gushort) col_text_len;
-#ifdef PACKET_LIST_STATISTICS
- ++packet_list->const_strings;
-#endif
- break;
- }
- /* !! FALL-THROUGH!! */
-
- case COL_DEF_SRC:
- case COL_RES_SRC: /* COL_DEF_SRC is currently just like COL_RES_SRC */
- case COL_UNRES_SRC:
- case COL_DEF_DL_SRC:
- case COL_RES_DL_SRC:
- case COL_UNRES_DL_SRC:
- case COL_DEF_NET_SRC:
- case COL_RES_NET_SRC:
- case COL_UNRES_NET_SRC:
- case COL_DEF_DST:
- case COL_RES_DST: /* COL_DEF_DST is currently just like COL_RES_DST */
- case COL_UNRES_DST:
- case COL_DEF_DL_DST:
- case COL_RES_DL_DST:
- case COL_UNRES_DL_DST:
- case COL_DEF_NET_DST:
- case COL_RES_NET_DST:
- case COL_UNRES_NET_DST:
- default:
- if(col_item->col_data){
- col_text_len = strlen(col_item->col_data);
- if (col_text_len > G_MAXUSHORT)
- col_text_len = G_MAXUSHORT;
-
- record->col_text_len[text_col] = (gushort) col_text_len;
- }
- if (!record->col_text_len[text_col]) {
- record->col_text[text_col] = "";
-#ifdef PACKET_LIST_STATISTICS
- ++packet_list->const_strings;
-#endif
- break;
- }
-
- if(!packet_list->string_pool)
- packet_list->string_pool = g_string_chunk_new(PACKET_STRING_CHUNK_SIZE);
- if (!get_column_resolved (col) && cinfo->col_expr.col_expr_val[col]) {
- /* Use the unresolved value in col_expr_val */
- str = g_string_chunk_insert_const (packet_list->string_pool, (const gchar *)cinfo->col_expr.col_expr_val[col]);
- } else {
- str = g_string_chunk_insert_const (packet_list->string_pool, (const gchar *)col_item->col_data);
- }
- record->col_text[text_col] = str;
- break;
- }
-}
-
-static gboolean
-packet_list_sortable_get_sort_column_id(GtkTreeSortable *sortable,
- gint *sort_col_id,
- GtkSortType *order)
-{
- PacketList *packet_list;
-
- g_return_val_if_fail(sortable != NULL, FALSE);
- g_return_val_if_fail(PACKETLIST_IS_LIST(sortable), FALSE);
-
- packet_list = (PacketList *) sortable;
-
- if(sort_col_id)
- *sort_col_id = packet_list->sort_id;
-
- if(order)
- *order = packet_list->sort_order;
-
- return TRUE;
-}
-
-static gboolean
-packet_list_column_contains_values(PacketList *packet_list, gint sort_col_id)
-{
- if (packet_list->columnized || col_based_on_frame_data(&cfile.cinfo, sort_col_id))
- return TRUE;
- else
- return FALSE;
-}
-
-/* packet_list_dissect_and_cache_all()
- * returns:
- * TRUE if columnization completed;
- * packet_list->columnized set to TRUE;
- * FALSE: columnization did not complete (i.e., was stopped by the user);
- * packet_list->columnized unchanged (i.e., FALSE).
- */
-
-static gboolean
-packet_list_dissect_and_cache_all(PacketList *packet_list)
-{
- PacketListRecord *record;
-
- int progbar_nextstep;
- int progbar_quantum;
- gboolean progbar_stop_flag;
- GTimeVal progbar_start_time;
- float progbar_val;
- progdlg_t *progbar = NULL;
- gchar progbar_status_str[100];
- gint progbar_loop_max;
- gint progbar_loop_var;
- gint progbar_updates = 100 /* 100% */;
-
- g_assert(packet_list->columnized == FALSE);
-
- progbar_loop_max = PACKET_LIST_RECORD_COUNT(packet_list->physical_rows);
- /* Update the progress bar when it gets to this value. */
- progbar_nextstep = 0;
- /* When we reach the value that triggers a progress bar update,
- bump that value by this amount. */
- progbar_quantum = progbar_loop_max/progbar_updates;
- /* Progress so far. */
- progbar_val = 0.0f;
-
- progbar_stop_flag = FALSE;
- g_get_current_time(&progbar_start_time);
-
- main_window_update();
-
- for (progbar_loop_var = 0; progbar_loop_var < progbar_loop_max; ++progbar_loop_var) {
- record = PACKET_LIST_RECORD_GET(packet_list->physical_rows, progbar_loop_var);
- packet_list_dissect_and_cache_record(packet_list, record, FALSE);
-
- /* Create the progress bar if necessary.
- We check on every iteration of the loop, so that it takes no
- longer than the standard time to create it (otherwise, for a
- large file, we might take considerably longer than that standard
- time in order to get to the next progress bar step). */
- if (progbar == NULL)
- /* Note: The following may call gtk_main_iteration() which will */
- /* allow certain "interupts" to happen during this code. */
- /* (Note that the progress_dlg window is set to "modal" */
- /* so that clicking on other windows is disabled). */
- progbar = delayed_create_progress_dlg(gtk_widget_get_window(packet_list->view),
- "Construct", "Columns",
- TRUE, &progbar_stop_flag,
- &progbar_start_time, progbar_val);
-
- if (progbar_loop_var >= progbar_nextstep) {
- /* let's not divide by zero. We should never be started
- * with count == 0, so let's assert that */
- g_assert(progbar_loop_max > 0);
-
- progbar_val = (gfloat) progbar_loop_var / progbar_loop_max;
-
- if (progbar != NULL) {
- g_snprintf(progbar_status_str, sizeof(progbar_status_str),
- "%u of %u frames", progbar_loop_var+1, progbar_loop_max);
- /* Note: See comment above re use of gtk_main_iteration() */
- update_progress_dlg(progbar, progbar_val, progbar_status_str);
- }
-
- progbar_nextstep += progbar_quantum;
- }
-
- if (progbar_stop_flag) {
- /* Well, the user decided to abort ... */
- break;
- }
- }
-
- /* We're done; destroy the progress bar if it was created. */
- if (progbar != NULL)
- destroy_progress_dlg(progbar);
-
- if (progbar_stop_flag) {
- return FALSE; /* user aborted before columnization completed */
- }
-
- packet_list->columnized = TRUE;
- return TRUE;
-}
-
-/* packet_list_do_packet_list_dissect_and_cache_all()
- * returns:
- * TRUE: if columnization not needed or columnization completed;
- * FALSE: columnization did not complete (i.e., stopped by the user)
- */
-gboolean
-packet_list_do_packet_list_dissect_and_cache_all(PacketList *packet_list, gint sort_col_id)
-{
- if (!packet_list_column_contains_values(packet_list, sort_col_id)) {
- return packet_list_dissect_and_cache_all(packet_list);
- }
- return TRUE;
-}
-
-static void
-packet_list_sortable_set_sort_column_id(GtkTreeSortable *sortable,
- gint sort_col_id,
- GtkSortType order)
-{
- PacketList *packet_list;
-
- g_return_if_fail(sortable != NULL);
- g_return_if_fail(PACKETLIST_IS_LIST(sortable));
-
- packet_list = (PacketList *) sortable;
-
- if(packet_list->sort_id == sort_col_id &&
- packet_list->sort_order == order)
- return;
-
- packet_list->sort_id = sort_col_id;
- packet_list->sort_order = order;
-
- if(PACKET_LIST_RECORD_COUNT(packet_list->physical_rows) == 0)
- return;
-
- packet_list_resort(packet_list);
-
- /* emit "sort-column-changed" signal to tell any tree views
- * that the sort column has changed (so the little arrow
- * in the column header of the sort column is drawn
- * in the right column) */
-
- gtk_tree_sortable_sort_column_changed(sortable);
-}
-
-static void
-packet_list_sortable_set_sort_func(GtkTreeSortable *sortable _U_,
- gint sort_col_id _U_,
- GtkTreeIterCompareFunc sort_func _U_,
- gpointer user_data _U_,
- GDestroyNotify destroy_func _U_)
-{
- g_warning(G_STRLOC ": is not supported by the PacketList model.\n");
-}
-
-static void
-packet_list_sortable_set_default_sort_func(GtkTreeSortable *sortable _U_,
- GtkTreeIterCompareFunc sort_func _U_,
- gpointer user_data _U_,
- GDestroyNotify destroy_func _U_)
-{
- g_warning(G_STRLOC ": is not supported by the PacketList model.\n");
-}
-
-static gboolean
-packet_list_sortable_has_default_sort_func(GtkTreeSortable *sortable _U_)
-{
- return FALSE; /* Since packet_list_sortable_set_sort_func and
- set_default_sort_func are not implemented. */
-}
-
-static gint
-packet_list_compare_custom(gint sort_id, gint text_sort_id, PacketListRecord *a, PacketListRecord *b)
-{
- header_field_info *hfi;
-
- hfi = proto_registrar_get_byname(cfile.cinfo.columns[sort_id].col_custom_fields);
-
- if (hfi == NULL) {
- return frame_data_compare(cfile.epan, a->fdata, b->fdata, COL_NUMBER);
- } else if ((hfi->strings == NULL) &&
- (((IS_FT_INT(hfi->type) || IS_FT_UINT(hfi->type)) &&
- ((hfi->display == BASE_DEC) || (hfi->display == BASE_DEC_HEX) ||
- (hfi->display == BASE_OCT))) ||
- (hfi->type == FT_DOUBLE) || (hfi->type == FT_FLOAT) ||
- (hfi->type == FT_BOOLEAN) || (hfi->type == FT_FRAMENUM) ||
- (hfi->type == FT_RELATIVE_TIME)))
- {
- /* Attempt to convert to numbers */
- double num_a = g_ascii_strtod(a->col_text[text_sort_id], NULL);
- double num_b = g_ascii_strtod(b->col_text[text_sort_id], NULL);
-
- if (num_a < num_b)
- return -1;
- else if (num_a > num_b)
- return 1;
- else
- return 0;
- }
-
- return strcmp(a->col_text[text_sort_id], b->col_text[text_sort_id]);
-}
-
-static gint
-_packet_list_compare_records(gint sort_id, gint text_sort_id, PacketListRecord *a, PacketListRecord *b)
-{
- g_assert(a->col_text);
- g_assert(b->col_text);
- g_assert(a->col_text[text_sort_id]);
- g_assert(b->col_text[text_sort_id]);
-
- if(a->col_text[text_sort_id] == b->col_text[text_sort_id])
- return 0; /* no need to call strcmp() */
-
- if (cfile.cinfo.columns[sort_id].col_fmt == COL_CUSTOM)
- return packet_list_compare_custom(sort_id, text_sort_id, a, b);
-
- return strcmp(a->col_text[text_sort_id], b->col_text[text_sort_id]);
-}
-
-static gint
-packet_list_compare_records(gint sort_id, gint text_sort_id, PacketListRecord *a, PacketListRecord *b)
-{
- gint ret;
-
- if (text_sort_id == -1) /* based on frame_data ? */
- return frame_data_compare(cfile.epan, a->fdata, b->fdata, cfile.cinfo.columns[sort_id].col_fmt);
-
- ret = _packet_list_compare_records(sort_id, text_sort_id, a, b);
- if (ret == 0)
- ret = frame_data_compare(cfile.epan, a->fdata, b->fdata, COL_NUMBER);
- return ret;
-}
-
-static gint
-packet_list_qsort_physical_compare_func(PacketListRecord **a, PacketListRecord **b,
- PacketList *packet_list)
-{
- gint ret;
- gint sort_id = packet_list->sort_id;
-
- g_assert((a) && (b) && (packet_list));
-
- ret = packet_list_compare_records(sort_id, packet_list->col_to_text[sort_id], *a, *b);
-
- /* Swap -1 and 1 if sort order is reverse */
- if(ret != 0 && packet_list->sort_order == GTK_SORT_DESCENDING)
- ret = (ret < 0) ? 1 : -1;
-
- return ret;
-}
-
-static void
-packet_list_resort(PacketList *packet_list)
-{
- PacketListRecord *record;
- GtkTreePath *path;
- gint *neworder;
- guint phy_idx;
- guint vis_idx;
-
- g_return_if_fail(packet_list != NULL);
- g_return_if_fail(PACKETLIST_IS_LIST(packet_list));
-
- if(PACKET_LIST_RECORD_COUNT(packet_list->visible_rows) == 0)
- return;
-
- /* resort physical rows according to sorting column */
- g_ptr_array_sort_with_data(packet_list->physical_rows,
- (GCompareDataFunc) packet_list_qsort_physical_compare_func,
- packet_list);
- g_return_if_fail(packet_list->visible_rows != NULL);
-
- /* let other objects know about the new order */
- neworder = g_new0(gint, PACKET_LIST_RECORD_COUNT(packet_list->visible_rows));
- g_assert(neworder);
-
- for(phy_idx = 0, vis_idx = 0; phy_idx < PACKET_LIST_RECORD_COUNT(packet_list->physical_rows); ++phy_idx) {
- record = PACKET_LIST_RECORD_GET(packet_list->physical_rows, phy_idx);
-#ifdef PACKET_PARANOID_CHECKS
- record->physical_pos = phy_idx;
-#endif
- g_assert(record->visible_pos >= -1);
- if (record->visible_pos >= 0) {
- g_assert(record->fdata->flags.passed_dfilter || record->fdata->flags.ref_time);
- neworder[vis_idx] = record->visible_pos;
- PACKET_LIST_RECORD_SET(packet_list->visible_rows, vis_idx, record);
- record->visible_pos = vis_idx;
- ++vis_idx;
- }
- }
-
- g_assert(vis_idx == PACKET_LIST_RECORD_COUNT(packet_list->visible_rows));
-
- path = gtk_tree_path_new();
-
- gtk_tree_model_rows_reordered(GTK_TREE_MODEL(packet_list), path, NULL,
- neworder);
-
- gtk_tree_path_free(path);
- g_free(neworder);
-}
-
-guint
-packet_list_recreate_visible_rows_list(PacketList *packet_list)
-{
- guint phy_idx;
- guint vis_idx;
- PacketListRecord *record;
-
- g_return_val_if_fail(packet_list != NULL, 0);
- g_return_val_if_fail(PACKETLIST_IS_LIST(packet_list), 0);
-
- if(PACKET_LIST_RECORD_COUNT(packet_list->physical_rows) == 0)
- return 0;
-
- if(packet_list->visible_rows)
- g_ptr_array_free(packet_list->visible_rows, TRUE);
-
- packet_list->visible_rows = g_ptr_array_new();
-
- for(phy_idx = 0, vis_idx = 0; phy_idx < PACKET_LIST_RECORD_COUNT(packet_list->physical_rows); ++phy_idx) {
- record = PACKET_LIST_RECORD_GET(packet_list->physical_rows, phy_idx);
- if (record->fdata->flags.passed_dfilter || record->fdata->flags.ref_time) {
- record->visible_pos = vis_idx++;
- PACKET_LIST_RECORD_APPEND(packet_list->visible_rows, record);
- }
- else
- record->visible_pos = -1;
- }
-
- return vis_idx;
-}
-
-static void
-packet_list_dissect_and_cache_record(PacketList *packet_list, PacketListRecord *record, gboolean dissect_color)
-{
- epan_dissect_t edt;
- frame_data *fdata;
- column_info *cinfo;
- gint col;
- gboolean create_proto_tree;
- wtap_rec rec; /* Record metadata */
- Buffer buf; /* Record data */
- gboolean dissect_columns = (record->col_text == NULL);
-
- g_return_if_fail(packet_list);
- g_return_if_fail(PACKETLIST_IS_LIST(packet_list));
-
- wtap_rec_init(&rec);
-
- fdata = record->fdata;
-
- if (dissect_columns) {
- cinfo = &cfile.cinfo;
-
- record->col_text = (const gchar **)wmem_alloc0(wmem_file_scope(), sizeof(*record->col_text) * packet_list->n_text_cols);
- record->col_text_len = (gushort *)wmem_alloc0(wmem_file_scope(), sizeof(*record->col_text_len) * packet_list->n_text_cols);
- } else
- cinfo = NULL;
-
- ws_buffer_init(&buf, 1500);
- if (!cf_read_record_r(&cfile, fdata, &rec, &buf)) {
- /*
- * Error reading the record.
- *
- * Don't set the color filter for now (we might want
- * to colorize it in some fashion to warn that the
- * row couldn't be filled in or colorized), and
- * set the columns to placeholder values, except
- * for the Info column, where we'll put in an
- * error message.
- */
- if (dissect_columns) {
- col_fill_in_error(cinfo, fdata, FALSE, FALSE /* fill_fd_columns */);
-
- for(col = 0; col < cinfo->num_cols; ++col)
- packet_list_change_record(packet_list, record, col, cinfo);
- }
- if (dissect_color) {
- fdata->color_filter = NULL;
- record->colorized = TRUE;
- }
- ws_buffer_free(&buf);
- return; /* error reading the record */
- }
-
- /*
- * Determine whether we need to create a protocol tree.
- * We do if:
- *
- * we're going to apply a color filter to this packet;
- *
- * we're need to fill in the columns and we have custom columns
- * (which require field values, which currently requires that
- * we build a protocol tree).
- */
- create_proto_tree = (dissect_color && color_filters_used()) ||
- (dissect_columns && have_custom_cols(cinfo));
-
- epan_dissect_init(&edt, cfile.epan,
- create_proto_tree,
- FALSE /* proto_tree_visible */);
-
- if (dissect_color) {
- color_filters_prime_edt(&edt);
- fdata->flags.need_colorize = 1;
- }
- if (dissect_columns)
- col_custom_prime_edt(&edt, cinfo);
-
- /*
- * XXX - need to catch an OutOfMemoryError exception and
- * attempt to recover from it.
- */
- epan_dissect_run(&edt, cfile.cd_t, &rec,
- frame_tvbuff_new_buffer(&cfile.provider, fdata, &buf),
- fdata, cinfo);
-
- if (dissect_columns) {
- /* "Stringify" non frame_data vals */
- epan_dissect_fill_in_columns(&edt, FALSE, FALSE /* fill_fd_columns */);
-
- for(col = 0; col < cinfo->num_cols; ++col)
- packet_list_change_record(packet_list, record, col, cinfo);
- }
-
- if (dissect_color)
- record->colorized = TRUE;
-
- epan_dissect_cleanup(&edt);
- wtap_rec_cleanup(&rec);
- ws_buffer_free(&buf);
-}
-
-void
-packet_list_reset_colorized(PacketList *packet_list)
-{
- PacketListRecord *record;
- guint i;
-
- for(i = 0; i < PACKET_LIST_RECORD_COUNT(packet_list->physical_rows); ++i) {
- record = PACKET_LIST_RECORD_GET(packet_list->physical_rows, i);
- record->colorized = FALSE;
- }
-}
-
-const char*
-packet_list_get_widest_column_string(PacketList *packet_list, gint col)
-{
- int text_col;
-
- g_return_val_if_fail(packet_list != NULL, NULL);
- g_return_val_if_fail(PACKETLIST_IS_LIST(packet_list), NULL);
- /* We need real column here, so not packet_list->n_cols+1 */
- g_return_val_if_fail(col >= 0 && col < packet_list->n_cols, NULL);
-
- if (PACKET_LIST_RECORD_COUNT(packet_list->visible_rows) == 0)
- return "";
-
- text_col = packet_list->col_to_text[col];
-
- if (text_col == -1) { /* column based on frame data */
- PacketListRecord *record;
- guint vis_idx;
-
- guint widest_packet = 0;
- gint widest_column_len = -1;
-
- for(vis_idx = 0; vis_idx < PACKET_LIST_RECORD_COUNT(packet_list->visible_rows); ++vis_idx) {
- gint column_len;
-
- record = PACKET_LIST_RECORD_GET(packet_list->visible_rows, vis_idx);
-
- col_fill_in_frame_data(record->fdata, &cfile.cinfo, col, FALSE);
- column_len = (gint) strlen(cfile.cinfo.columns[col].col_buf);
- if (column_len > widest_column_len) {
- widest_column_len = column_len;
- widest_packet = vis_idx;
- }
- }
-
- if (widest_column_len != -1) {
- record = PACKET_LIST_RECORD_GET(packet_list->visible_rows, widest_packet);
- col_fill_in_frame_data(record->fdata, &cfile.cinfo, col, FALSE);
-
- return cfile.cinfo.columns[col].col_buf;
- } else
- return "";
- }
- else {
- PacketListRecord *record;
- guint vis_idx;
-
- const gchar *widest_column_str = NULL;
- guint widest_column_len = 0;
-
- if (!packet_list->columnized)
- packet_list_dissect_and_cache_all(packet_list); /* XXX: need to handle case of "incomplete" ? */
-
- for(vis_idx = 0; vis_idx < PACKET_LIST_RECORD_COUNT(packet_list->visible_rows); ++vis_idx) {
- record = PACKET_LIST_RECORD_GET(packet_list->visible_rows, vis_idx);
- if (record->col_text_len[text_col] > widest_column_len) {
- widest_column_str = record->col_text[text_col];
- widest_column_len = record->col_text_len[text_col];
- }
- }
-
- return widest_column_str;
- }
-}
-
-/*
- * Editor modelines - http://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/gtk/packet_list_store.h b/ui/gtk/packet_list_store.h
deleted file mode 100644
index 6b84bbfb0f..0000000000
--- a/ui/gtk/packet_list_store.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/* packet_list_store.h
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
- */
-
-/* Uncomment to track some statistics (const strings, etc.) */
-/* #define PACKET_LIST_STATISTICS */
-
-#ifndef __PACKET_LIST_STORE_H__
-#define __PACKET_LIST_STORE_H__
-
-#include <glib.h>
-
-#include "epan/column-info.h"
-#include "epan/frame_data.h"
-
-/** @file
- * The packet list store
- * @ingroup main_window_group
- */
-extern GType packet_list_get_type(void);
-#define PACKETLIST_TYPE_LIST (packet_list_get_type())
-#define PACKET_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PACKETLIST_TYPE_LIST, PacketList))
-#define PACKETLIST_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CART((klass), PACKETLIST_TYPE_LIST))
-#define PACKETLIST_IS_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PACKETLIST_TYPE_LIST))
-#define PACKETLIST_IS_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass), PACKETLIST_TYPE_LIST)
-#define PACKETLIST_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PACKETLIST_TYPE_LIST, PacketListClass))
-
-typedef struct _PacketList PacketList;
-typedef struct _PacketListClass PacketListClass;
-
-#define PACKET_LIST_RECORD_GET(rows, pos) ((PacketListRecord*) g_ptr_array_index((rows), (pos)))
-#define PACKET_LIST_RECORD_SET(rows, pos, item) g_ptr_array_index((rows), (pos)) = (item)
-#define PACKET_LIST_RECORD_APPEND(rows, item) g_ptr_array_add((rows), (item))
-#define PACKET_LIST_RECORD_COUNT(rows) ((rows) ? (rows)->len : 0)
-#define PACKET_LIST_RECORD_INDEX_VALID(rows, idx) ((rows) ? (((guint) (idx)) < (rows)->len) : FALSE)
-
-/** PacketList: Everything for our model implementation. */
-struct _PacketList
-{
- GObject parent; /** MUST be first */
-
- /** Array of pointers to the PacketListRecord structure for each visible row. */
- GPtrArray *visible_rows;
- /** Array of pointers to the PacketListRecord structure for each row. */
- GPtrArray *physical_rows;
-
- /** Has the entire file been columnized? */
- gboolean columnized;
-
- gint n_cols; /* copy of cfile.cinfo.num_cols */
- gint n_text_cols; /* number of cols not based on frame, which we need to store text */
- gint *col_to_text; /* mapping from column number to col_text index, when -1 column is based on frame_data */
- GtkWidget *view;
-
- gint sort_id;
- GtkSortType sort_order;
-
- GStringChunk *string_pool;
-
- /** Random integer to check whether an iter belongs to our model. */
- gint stamp;
-
-#ifdef PACKET_LIST_STATISTICS
- /** Statistics */
- guint const_strings;
-#endif
-};
-
-/** PacketListClass: more boilerplate GObject stuff */
-struct _PacketListClass
-{
- GObjectClass parent_class;
-};
-
-GType packet_list_list_get_type(void);
-PacketList *packet_list_new(void);
-void packet_list_store_clear(PacketList *packet_list);
-guint packet_list_recreate_visible_rows_list(PacketList *packet_list);
-gint packet_list_append_record(PacketList *packet_list, frame_data *fdata);
-gboolean packet_list_do_packet_list_dissect_and_cache_all(PacketList *packet_list, gint sort_col_id);
-void packet_list_reset_colorized(PacketList *packet_list);
-const char* packet_list_get_widest_column_string(PacketList *packet_list, gint col);
-
-#endif /* __PACKET_LIST_STORE_H__ */
diff --git a/ui/gtk/packet_panes.c b/ui/gtk/packet_panes.c
deleted file mode 100644
index 37b875a887..0000000000
--- a/ui/gtk/packet_panes.c
+++ /dev/null
@@ -1,1443 +0,0 @@
-/* packet_panes.c
- * Routines for GTK+ packet display (packet details and hex dump panes)
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * Jeff Foster, 2001/03/12, added support for displaying named
- * data sources as tabbed hex windows
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-#if GTK_CHECK_VERSION(3,0,0)
-# include <gdk/gdkkeysyms-compat.h>
-#endif
-
-#include <string.h>
-
-#include <epan/epan_dissect.h>
-
-#include <epan/packet.h>
-#include <epan/charsets.h>
-#include <epan/prefs.h>
-#include <wsutil/filesystem.h>
-
-#include "ui/alert_box.h"
-#include "ui/last_open_dir.h"
-#include "ui/progress_dlg.h"
-#include "ui/recent.h"
-#include "ui/simple_dialog.h"
-#include "ui/ws_ui_util.h"
-
-#include <wsutil/file_util.h>
-#include <wsutil/str_util.h>
-
-#include "ui/gtk/keys.h"
-#include "ui/gtk/color_utils.h"
-#include "ui/gtk/packet_win.h"
-#include "ui/gtk/file_dlg.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/font_utils.h"
-#include "ui/gtk/webbrowser.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/menus.h"
-#include "ui/gtk/packet_panes.h"
-#include "ui/gtk/proto_tree_model.h"
-#include "ui/gtk/bytes_view.h"
-
-#ifdef _WIN32
-#include <gdk/gdkwin32.h>
-#include <windows.h>
-#include "ui/win32/file_dlg_win32.h"
-#include "ui/gtk/old-gtk-compat.h"
-#endif
-
-#include "globals.h"
-
-#define E_BYTE_VIEW_TREE_PTR "byte_view_tree_ptr"
-#define E_BYTE_VIEW_TREE_VIEW_PTR "byte_view_tree_view_ptr"
-#define E_BYTE_VIEW_TVBUFF_KEY "byte_view_tvbuff"
-#define E_BYTE_VIEW_START_KEY "byte_view_start"
-#define E_BYTE_VIEW_END_KEY "byte_view_end"
-#define E_BYTE_VIEW_MASK_LO_KEY "byte_view_mask_lo"
-#define E_BYTE_VIEW_MASK_HI_KEY "byte_view_mask_hi"
-#define E_BYTE_VIEW_MASKLE_KEY "byte_view_mask_le"
-#define E_BYTE_VIEW_APP_START_KEY "byte_view_app_start"
-#define E_BYTE_VIEW_APP_END_KEY "byte_view_app_end"
-#define E_BYTE_VIEW_PROTO_START_KEY "byte_view_proto_start"
-#define E_BYTE_VIEW_PROTO_END_KEY "byte_view_proto_end"
-#define E_BYTE_VIEW_ENCODE_KEY "byte_view_encode"
-
-/* Get the current text window for the notebook. */
-GtkWidget *
-get_notebook_bv_ptr(GtkWidget *nb_ptr)
-{
- int num;
- GtkWidget *bv_page;
-
- num = gtk_notebook_get_current_page(GTK_NOTEBOOK(nb_ptr));
- bv_page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(nb_ptr), num);
- if (bv_page)
- return gtk_bin_get_child(GTK_BIN(bv_page));
- else
- return NULL;
-}
-
-/*
- * Get the data and length for a byte view, given the byte view page.
- * Return the pointer, or NULL on error, and set "*data_len" to the length.
- */
-const guint8 *
-get_byte_view_data_and_length(GtkWidget *byte_view, guint *data_len)
-{
- tvbuff_t *byte_view_tvb;
- const guint8 *data_ptr;
-
- byte_view_tvb = (tvbuff_t *)g_object_get_data(G_OBJECT(byte_view), E_BYTE_VIEW_TVBUFF_KEY);
- if (byte_view_tvb == NULL)
- return NULL;
-
- if ((*data_len = tvb_captured_length(byte_view_tvb))) {
- data_ptr = tvb_get_ptr(byte_view_tvb, 0, -1);
- return data_ptr;
- } else
- return "";
-}
-
-/*
- * Set the current text window for the notebook to the window that
- * refers to a particular tvbuff.
- */
-void
-set_notebook_page(GtkWidget *nb_ptr, tvbuff_t *tvb)
-{
- int num;
- GtkWidget *bv_page, *bv;
- tvbuff_t *bv_tvb;
-
- for (num = 0;
- (bv_page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(nb_ptr), num)) != NULL;
- num++) {
- bv = gtk_bin_get_child(GTK_BIN(bv_page));
- bv_tvb = (tvbuff_t *)g_object_get_data(G_OBJECT(bv), E_BYTE_VIEW_TVBUFF_KEY);
- if (bv_tvb == tvb) {
- /* Found it. */
- gtk_notebook_set_current_page(GTK_NOTEBOOK(nb_ptr), num);
- break;
- }
- }
-}
-
-/* Redraw a given byte view window. */
-void
-redraw_packet_bytes(GtkWidget *nb, frame_data *fd, field_info *finfo)
-{
- GtkWidget *bv;
- const guint8 *data;
- guint len;
-
- bv = get_notebook_bv_ptr(nb);
- if (bv != NULL) {
- data = get_byte_view_data_and_length(bv, &len);
- if (data != NULL)
- packet_hex_print(bv, data, fd, finfo, len);
- }
-}
-
-/* Redraw all byte view windows. */
-void
-redraw_packet_bytes_all(void)
-{
- if (cfile.current_frame != NULL)
- redraw_packet_bytes( byte_nb_ptr_gbl, cfile.current_frame, cfile.finfo_selected);
-
- redraw_packet_bytes_packet_wins();
-
- /* XXX - this is a hack, to workaround a bug in GTK2.x!
- when changing the font size, even refilling of the corresponding
- gtk_text_buffer doesn't seem to trigger an update.
- The only workaround is to freshly select the frame, which will remove any
- existing notebook tabs and "restart" the whole byte view again. */
- if (cfile.current_frame != NULL) {
- cfile.current_row = -1;
- cf_goto_frame(&cfile, cfile.current_frame->num);
- }
-}
-
-/* Expand trees (and any subtrees they may have) whose ett_ shows them as
- * expanded.
- * Callers should block calls to expand_tree() to avoid useless recursion.
- */
-static void
-check_expand_trees(GtkTreeView *tree_view, GtkTreeModel *model, GtkTreePath *path,
- GtkTreeIter *iter, gboolean scroll_it, gboolean expand_parent)
-{
- /* code inspired by gtk_tree_model_foreach_helper */
-
- field_info *fi;
-
- do {
- GtkTreeIter child;
-
- if (gtk_tree_model_iter_children(model, &child, iter)) {
- gtk_tree_model_get(model, iter, 1, &fi, -1);
-
- if (tree_expanded(fi->tree_type)) {
- if (expand_parent)
- gtk_tree_view_expand_row(tree_view, path, FALSE);
-
- if (scroll_it)
- gtk_tree_view_scroll_to_cell(tree_view, path, NULL, TRUE, (prefs.gui_auto_scroll_percentage/100.0f), 0.0f);
-
- /* try to expand children only when parent is expanded */
- gtk_tree_path_down(path);
- check_expand_trees(tree_view, model, path, &child, scroll_it, TRUE);
- gtk_tree_path_up(path);
- }
- }
-
- gtk_tree_path_next(path);
- } while (gtk_tree_model_iter_next(model, iter));
-}
-
-static void
-expand_tree(GtkTreeView *tree_view, GtkTreeIter *iter,
- GtkTreePath *path, gpointer user_data _U_)
-{
- field_info *finfo;
- GtkTreeModel *model;
-
- model = gtk_tree_view_get_model(tree_view);
- gtk_tree_model_get(model, iter, 1, &finfo, -1);
- g_assert(finfo);
-
- /* scroll the expanded item to reduce the need to do a manual scroll down
- * and provide faster navigation of deeper trees */
-
- if(prefs.gui_auto_scroll_on_expand)
- gtk_tree_view_scroll_to_cell(tree_view, path, NULL, TRUE, (prefs.gui_auto_scroll_percentage/100.0f), 0.0f);
-
- /*
- * Nodes with "finfo->tree_type" of -1 have no ett_ value, and
- * are thus presumably leaf nodes and cannot be expanded.
- */
- if (finfo->tree_type != -1)
- tree_expanded_set(finfo->tree_type, TRUE);
-
- if (finfo->tree_type != -1 && path) {
- /* Expand any subtrees that the user had left open */
- g_signal_handlers_block_by_func(tree_view, expand_tree, NULL);
- check_expand_trees(tree_view, model, path, iter, FALSE, FALSE);
- g_signal_handlers_unblock_by_func(tree_view, expand_tree, NULL);
- }
-}
-
-static void
-collapse_tree(GtkTreeView *tree_view, GtkTreeIter *iter,
- GtkTreePath *path _U_, gpointer user_data _U_)
-{
- field_info *finfo;
- GtkTreeModel *model;
-
- model = gtk_tree_view_get_model(tree_view);
- gtk_tree_model_get(model, iter, 1, &finfo, -1);
- g_assert(finfo);
-
- /*
- * Nodes with "finfo->tree_type" of -1 have no ett_ value, and
- * are thus presumably leaf nodes and cannot be collapsed.
- */
- if (finfo->tree_type != -1)
- tree_expanded_set(finfo->tree_type, FALSE);
-}
-
-struct field_lookup_info {
- field_info *fi;
- GtkTreeIter iter;
-};
-
-static gboolean
-lookup_finfo(GtkTreeModel *model, GtkTreePath *path _U_, GtkTreeIter *iter,
- gpointer data)
-{
- field_info *fi;
- struct field_lookup_info *fli = (struct field_lookup_info *)data;
-
- gtk_tree_model_get(model, iter, 1, &fi, -1);
- if (fi == fli->fi) {
- fli->iter = *iter;
- return TRUE;
- }
- return FALSE;
-}
-
-GtkTreePath
-*tree_find_by_field_info(GtkTreeView *tree_view, field_info *finfo)
-{
- GtkTreeModel *model;
- struct field_lookup_info fli;
-
- g_assert(finfo != NULL);
-
- model = gtk_tree_view_get_model(tree_view);
- fli.fi = finfo;
- gtk_tree_model_foreach(model, lookup_finfo, &fli);
-
- return gtk_tree_model_get_path(model, &fli.iter);
-}
-
-/* If the user selected a certain byte in the byte view, try to find
- * the item in the GUI proto_tree that corresponds to that byte, and:
- *
- * if we succeed, select it, and return TRUE;
- * if we fail, return FALSE. */
-gboolean
-byte_view_select(GtkWidget *widget, GdkEventButton *event)
-{
- proto_tree *tree;
- GtkTreeView *tree_view;
- int byte = -1;
- tvbuff_t *tvb;
-
- tree = (proto_tree *)g_object_get_data(G_OBJECT(widget), E_BYTE_VIEW_TREE_PTR);
- if (tree == NULL) {
- /*
- * Somebody clicked on the dummy byte view; do nothing.
- */
- return FALSE;
- }
- tree_view = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(widget),
- E_BYTE_VIEW_TREE_VIEW_PTR));
-
- byte = bytes_view_byte_from_xy(BYTES_VIEW(widget), (gint) event->x, (gint) event->y);
-
- if (byte == -1) {
- return FALSE;
- }
-
- /* Get the data source tvbuff */
- tvb = (tvbuff_t *)g_object_get_data(G_OBJECT(widget), E_BYTE_VIEW_TVBUFF_KEY);
-
- return highlight_field(tvb, byte, tree_view, tree);
-}
-
-/* This highlights the field in the proto tree that is at position byte */
-gboolean
-highlight_field(tvbuff_t *tvb, gint byte, GtkTreeView *tree_view,
- proto_tree *tree)
-{
- GtkTreeModel *model = NULL;
- GtkTreePath *first_path = NULL, *path = NULL;
- GtkTreeIter parent;
- field_info *finfo = NULL;
- match_data mdata;
- struct field_lookup_info fli;
-
- if (cfile.search_in_progress && cfile.string && cfile.decode_data) {
- /* The tree where the target string matched one of the labels was discarded in
- match_protocol_tree() so we have to search again in the latest tree. (Uugh) */
- if (cf_find_string_protocol_tree(&cfile, tree, &mdata)) {
- finfo = mdata.finfo;
- }
- } else {
- /* Find the finfo that corresponds to our byte. */
- finfo = proto_find_field_from_offset(tree, byte, tvb);
- }
-
- if (!finfo) {
- return FALSE;
- }
-
- model = gtk_tree_view_get_model(tree_view);
- fli.fi = finfo;
- gtk_tree_model_foreach(model, lookup_finfo, &fli);
-
- /* Expand our field's row */
- first_path = gtk_tree_model_get_path(model, &fli.iter);
- gtk_tree_view_expand_row(tree_view, first_path, FALSE);
- expand_tree(tree_view, &fli.iter, NULL, NULL);
-
- /* ... and its parents */
- while (gtk_tree_model_iter_parent(model, &parent, &fli.iter)) {
- path = gtk_tree_model_get_path(model, &parent);
- gtk_tree_view_expand_row(tree_view, path, FALSE);
- expand_tree(tree_view, &parent, NULL, NULL);
- fli.iter = parent;
- gtk_tree_path_free(path);
- }
-
- /* select our field's row */
- gtk_tree_selection_select_path(gtk_tree_view_get_selection(tree_view),
- first_path);
-
- /* If the last search was a string or hex search within "Packet data", the entire field might
- not be highlighted. If the user just clicked on one of the bytes comprising that field, the
- above call didn't trigger a 'gtk_tree_view_get_selection' event. Call redraw_packet_bytes()
- to make the highlighting of the entire field visible. */
- if (!cfile.search_in_progress) {
- if (cfile.hex || (cfile.string && cfile.packet_data)) {
- redraw_packet_bytes(byte_nb_ptr_gbl, cfile.current_frame, cfile.finfo_selected);
- }
- }
-
- /* And position the window so the selection is visible.
- * Position the selection in the middle of the viewable
- * pane. */
- gtk_tree_view_scroll_to_cell(tree_view, first_path, NULL, TRUE, 0.5f, 0.0f);
-
- gtk_tree_path_free(first_path);
-
- return TRUE;
-}
-
-/* Calls functions for different mouse-button presses. */
-static gboolean
-byte_view_button_press_cb(GtkWidget *widget, GdkEvent *event, gpointer data)
-{
- GdkEventButton *event_button = NULL;
-
- if(widget == NULL || event == NULL || data == NULL) {
- return FALSE;
- }
-
- if(event->type == GDK_BUTTON_PRESS) {
- event_button = (GdkEventButton *) event;
-
- /* To qoute the "Gdk Event Structures" doc:
- * "Normally button 1 is the left mouse button, 2 is the middle button, and 3 is the right button" */
- switch(event_button->button) {
-
- case 1:
- return byte_view_select(widget, event_button);
- case 3:
- return popup_menu_handler(widget, event, data);
- default:
- return FALSE;
- }
- }
-
- return FALSE;
-}
-
-GtkWidget *
-byte_view_new(void)
-{
- GtkWidget *byte_nb;
-
- byte_nb = gtk_notebook_new();
- gtk_notebook_set_tab_pos(GTK_NOTEBOOK(byte_nb), GTK_POS_BOTTOM);
-
- /* this will only have an effect, if no tabs are shown */
- gtk_notebook_set_show_border(GTK_NOTEBOOK(byte_nb), FALSE);
-
- /* set the tabs scrollable, if they don't fit into the pane */
- gtk_notebook_set_scrollable(GTK_NOTEBOOK(byte_nb), TRUE);
-
- /* enable a popup menu containing the tab labels, will be helpful if tabs don't fit into the pane */
- gtk_notebook_popup_enable(GTK_NOTEBOOK(byte_nb));
-
- /* Add a placeholder byte view so that there's at least something
- displayed in the byte view notebook. */
- add_byte_tab(byte_nb, "", NULL, NULL, NULL);
-
- return byte_nb;
-}
-
-static void
-byte_view_realize_cb(GtkWidget *bv, gpointer data _U_)
-{
- const guint8 *byte_data;
- guint byte_len;
-
- byte_data = get_byte_view_data_and_length(bv, &byte_len);
- if (byte_data == NULL) {
- /* This must be the dummy byte view if no packet is selected. */
- return;
- }
- packet_hex_print(bv, byte_data, cfile.current_frame, NULL, byte_len);
-}
-
-GtkWidget *
-add_byte_tab(GtkWidget *byte_nb, const char *name, tvbuff_t *tvb,
- proto_tree *tree, GtkWidget *tree_view)
-{
- GtkWidget *byte_view, *byte_scrollw, *label;
-
- /* Byte view. Create a scrolled window for the text. */
- byte_scrollw = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(byte_scrollw),
- GTK_SHADOW_IN);
- /* Add scrolled pane to tabbed window */
- label = gtk_label_new(name);
- gtk_notebook_append_page(GTK_NOTEBOOK(byte_nb), byte_scrollw, label);
-
- gtk_widget_show(byte_scrollw);
-
- byte_view = bytes_view_new();
- bytes_view_set_font(BYTES_VIEW(byte_view), user_font_get_regular());
-
- g_object_set_data(G_OBJECT(byte_view), E_BYTE_VIEW_TVBUFF_KEY, tvb);
- gtk_container_add(GTK_CONTAINER(byte_scrollw), byte_view);
-
- g_signal_connect(byte_view, "show", G_CALLBACK(byte_view_realize_cb), NULL);
- g_signal_connect(byte_view, "button_press_event", G_CALLBACK(byte_view_button_press_cb),
- g_object_get_data(G_OBJECT(popup_menu_object), PM_BYTES_VIEW_KEY));
-
- g_object_set_data(G_OBJECT(byte_view), E_BYTE_VIEW_TREE_PTR, tree);
- g_object_set_data(G_OBJECT(byte_view), E_BYTE_VIEW_TREE_VIEW_PTR, tree_view);
-
- gtk_widget_show(byte_view); /* triggers byte_view_realize_cb which calls packet_hex_print */
-
- /* no tabs if this is the first page */
- if (!(gtk_notebook_page_num(GTK_NOTEBOOK(byte_nb), byte_scrollw)))
- gtk_notebook_set_show_tabs(GTK_NOTEBOOK(byte_nb), FALSE);
- else
- gtk_notebook_set_show_tabs(GTK_NOTEBOOK(byte_nb), TRUE);
-
- /* set this page */
- gtk_notebook_set_current_page(GTK_NOTEBOOK(byte_nb),
- gtk_notebook_page_num(GTK_NOTEBOOK(byte_nb), byte_nb));
-
- return byte_view;
-}
-
-void
-add_byte_views(epan_dissect_t *edt, GtkWidget *tree_view,
- GtkWidget *byte_nb_ptr)
-{
- GSList *src_le;
- struct data_source *src;
- char* src_name;
-
- /*
- * Get rid of all the old notebook tabs.
- */
- while (gtk_notebook_get_nth_page(GTK_NOTEBOOK(byte_nb_ptr), 0) != NULL)
- gtk_notebook_remove_page(GTK_NOTEBOOK(byte_nb_ptr), 0);
-
- /*
- * Add to the specified byte view notebook tabs for hex dumps
- * of all the data sources for the specified frame.
- */
- for (src_le = edt->pi.data_src; src_le != NULL; src_le = src_le->next) {
- src = (struct data_source *)src_le->data;
- src_name = get_data_source_name(src);
- add_byte_tab(byte_nb_ptr, src_name, get_data_source_tvb(src), edt->tree,
- tree_view);
- wmem_free(NULL, src_name);
- }
-
- /*
- * Initially select the first byte view.
- */
- gtk_notebook_set_current_page(GTK_NOTEBOOK(byte_nb_ptr), 0);
-}
-
-static void
-copy_hex_all_info(GString* copy_buffer, const guint8* data_p, int data_len, gboolean append_text)
-{
- const int byte_line_length = 16; /* Print out data for 16 bytes on one line */
- int i, j;
- gboolean end_of_line = TRUE; /* Initial state is end of line */
- int byte_line_part_length;
-
- GString* hex_str;
- GString* char_str;
-
- /* Write hex data for a line, then ascii data, then concatenate and add to buffer */
- hex_str = g_string_new("");
- char_str= g_string_new("");
-
- i = 0;
- while (i<data_len) {
- if(end_of_line) {
- g_string_append_printf(hex_str,"%04x ",i); /* Offset - note that we _append_ here */
- }
-
- g_string_append_printf(hex_str," %02x",*data_p);
- if(append_text) {
- g_string_append_printf(char_str,"%c",g_ascii_isprint(*data_p) ? *data_p : '.');
- }
-
- ++data_p;
-
- /* Look ahead to see if this is the end of the data */
- byte_line_part_length = (++i) % byte_line_length;
- if(i == data_len){
- /* End of data - need to fill in spaces in hex string and then do "end of line".
- *
- */
- for(j = 0; append_text && (j < (byte_line_length - byte_line_part_length)); ++j) {
- g_string_append(hex_str," "); /* Three spaces for each missing byte */
- }
- end_of_line = TRUE;
- } else {
- end_of_line = (byte_line_part_length == 0 ? TRUE : FALSE);
- }
-
-
- if (end_of_line){
- /* End of line */
- g_string_append(copy_buffer, hex_str->str);
- if(append_text) {
- /* Two spaces between hex and text */
- g_string_append_c(copy_buffer, ' ');
- g_string_append_c(copy_buffer, ' ');
- g_string_append(copy_buffer, char_str->str);
- }
- /* Setup ready for next line */
- g_string_assign(char_str,"");
- g_string_assign(hex_str, "\n");
- }
- }
-
- g_string_free(hex_str, TRUE);
- g_string_free(char_str, TRUE);
-}
-
-static int
-copy_hex_bytes_text_only(GString* copy_buffer, const guint8* data_p, int data_len _U_)
-{
-
- gchar to_append;
-
- /* Copy printable characters, newlines, and (horizontal) tabs. */
- if(g_ascii_isprint(*data_p)) {
- to_append = *data_p;
- } else if(*data_p==0x0a) {
- to_append = '\n';
- } else if(*data_p==0x09) {
- to_append = '\t';
- } else {
- return 1; /* Just ignore non-printable bytes */
- }
- g_string_append_c(copy_buffer,to_append);
- return 1;
-}
-
-static
-int copy_hex_bytes_hex(GString* copy_buffer, const guint8* data_p, int data_len _U_)
-{
- g_string_append_printf(copy_buffer, "%02x", *data_p);
- return 1;
-}
-
-void
-copy_hex_cb(GtkWidget * w _U_, gpointer data _U_, copy_data_type data_type)
-{
- GtkWidget *bv;
-
- guint len = 0;
- int bytes_consumed = 0;
- int flags;
-
- const guint8* data_p;
-
- GString* copy_buffer = g_string_new(""); /* String to copy to clipboard */
-
- bv = get_notebook_bv_ptr(byte_nb_ptr_gbl);
- if (bv == NULL) {
- /* shouldn't happen */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Could not find the corresponding text window.");
- return;
- }
-
- data_p = get_byte_view_data_and_length(bv, &len);
- g_assert(data_p != NULL);
-
- flags = data_type & CD_FLAGSMASK;
- data_type = (copy_data_type)(data_type & CD_TYPEMASK);
-
- if(flags & CD_FLAGS_SELECTEDONLY) {
- int start, end;
-
- /* Get the start and end of the highlighted bytes. */
- start = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(bv), E_BYTE_VIEW_START_KEY));
- end = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(bv), E_BYTE_VIEW_END_KEY));
-
- if(start >= 0 && end > start && (end - start <= (int)len)) {
- len = end - start;
- data_p += start;
- }
- }
-
- switch(data_type) {
- case(CD_ALLINFO):
- /* This is too different from other text formats - handle separately */
- copy_hex_all_info(copy_buffer, data_p, len, TRUE);
- break;
- case(CD_HEXCOLUMNS):
- /* This could be done incrementally, but it is easier to mingle with the code for CD_ALLINFO */
- copy_hex_all_info(copy_buffer, data_p, len, FALSE);
- break;
- case(CD_BINARY):
- /* Completely different logic to text copies - leave copy buffer alone */
- copy_binary_to_clipboard(data_p,len);
- break;
- default:
- /* Incrementally write to text buffer in various formats */
- while (len > 0){
- switch(data_type) {
- case (CD_TEXTONLY):
- bytes_consumed = copy_hex_bytes_text_only(copy_buffer, data_p, len);
- break;
- case (CD_HEX):
- bytes_consumed = copy_hex_bytes_hex(copy_buffer, data_p, len);
- break;
- default:
- g_assert_not_reached();
- break;
- }
-
- g_assert(bytes_consumed>0);
- data_p += bytes_consumed;
- len -= bytes_consumed;
- }
- break;
- }
-
- if(copy_buffer->len > 0) {
- copy_to_clipboard(copy_buffer);
- }
-
- g_string_free(copy_buffer, TRUE);
-}
-
-/* save the current highlighted hex data */
-static gboolean
-savehex_save_clicked_cb(gchar *file, int start, int end, const guint8 *data_p)
-{
- int fd;
-
- fd = ws_open(file, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0666);
- if (fd == -1) {
- open_failure_alert_box(file, errno, TRUE);
- return FALSE;
- }
- if (ws_write(fd, data_p + start, end - start) < 0) {
- write_failure_alert_box(file, errno);
- ws_close(fd);
- return FALSE;
- }
- if (ws_close(fd) < 0) {
- write_failure_alert_box(file, errno);
- return FALSE;
- }
-
- return TRUE;
-}
-
-/* Launch the dialog box to put up the file selection box etc */
-#ifdef _WIN32
-void
-savehex_cb(GtkWidget * w _U_, gpointer data _U_)
-{
- win32_export_raw_file(GDK_WINDOW_HWND(gtk_widget_get_window(top_level)), &cfile);
- return;
-}
-#else
-static char *
-gtk_export_raw_file(int start, int end)
-{
- GtkWidget *savehex_dlg;
- gchar *label;
- GtkWidget *dlg_lb;
- char *pathname;
-
- /*
- * Build the dialog box we need.
- */
- savehex_dlg = file_selection_new("Wireshark: Export Selected Packet Bytes", GTK_WINDOW(top_level), FILE_SELECTION_SAVE);
-
- /* label */
- label = g_strdup_printf("Will save %u %s of raw binary data to specified file.",
- end - start, plurality(end - start, "byte", "bytes"));
- dlg_lb = gtk_label_new(label);
- g_free(label);
- file_selection_set_extra_widget(savehex_dlg, dlg_lb);
- gtk_widget_show(dlg_lb);
-
- pathname = file_selection_run(savehex_dlg);
- if (pathname == NULL) {
- /* User cancelled or closed the dialog. */
- return NULL;
- }
-
- /* We've crosed the Rubicon; get rid of the dialog box. */
- window_destroy(savehex_dlg);
-
- return pathname;
-}
-
-void
-savehex_cb(GtkWidget * w _U_, gpointer data _U_)
-{
- int start, end;
- guint len;
- const guint8 *data_p = NULL;
- GtkWidget *bv;
- char *pathname;
-
- /* don't show up the dialog, if no data has to be saved */
- bv = get_notebook_bv_ptr(byte_nb_ptr_gbl);
- if (bv == NULL) {
- /* shouldn't happen */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Could not find the corresponding text window.");
- return;
- }
- start = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(bv), E_BYTE_VIEW_START_KEY));
- end = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(bv), E_BYTE_VIEW_END_KEY));
- data_p = get_byte_view_data_and_length(bv, &len);
-
- if (data_p == NULL || start == -1 || start > end) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "No data selected to save.");
- return;
- }
-
- /*
- * Loop until the user either selects a file or gives up.
- */
- for (;;) {
- pathname = gtk_export_raw_file(start, end);
- if (pathname == NULL) {
- /* User gave up. */
- break;
- }
- if (savehex_save_clicked_cb(pathname, start, end, data_p)) {
- /* We succeeded. */
- g_free(pathname);
- break;
- }
- /* Dump failed; let the user select another file or give up. */
- g_free(pathname);
- }
-}
-#endif
-
-static void
-packet_hex_update(GtkWidget *bv, const guint8 *pd, int len, int bstart,
- int bend, guint64 bmask, int bmask_le,
- int astart, int aend,
- int pstart, int pend,
- packet_char_enc encoding)
-{
- bytes_view_set_encoding(BYTES_VIEW(bv), encoding);
- bytes_view_set_format(BYTES_VIEW(bv), recent.gui_bytes_view);
- bytes_view_set_data(BYTES_VIEW(bv), pd, len);
-
- bytes_view_set_highlight_style(BYTES_VIEW(bv), prefs.gui_hex_dump_highlight_style);
-
- bytes_view_set_highlight(BYTES_VIEW(bv), bstart, bend, bmask, bmask_le);
- bytes_view_set_highlight_extra(BYTES_VIEW(bv), BYTE_VIEW_HIGHLIGHT_APPENDIX, astart, aend);
- bytes_view_set_highlight_extra(BYTES_VIEW(bv), BYTE_VIEW_HIGHLIGHT_PROTOCOL, pstart, pend);
-
- if (bstart != -1 && bend != -1)
- bytes_view_scroll_to_byte(BYTES_VIEW(bv), bstart);
- bytes_view_refresh(BYTES_VIEW(bv));
-}
-
-static field_info *
-get_top_finfo(proto_node *node, field_info *finfo)
-{
- proto_node *child;
- field_info *top;
-
- if (node == NULL)
- return NULL;
- if (PNODE_FINFO(node) == finfo) {
- top = finfo;
-
- while (node && node->parent) {
- field_info *fi;
-
- node = node->parent;
-
- fi = PNODE_FINFO(node);
- if (fi && fi->ds_tvb == finfo->ds_tvb)
- top = fi;
- }
-
- return top;
- }
-
- for (child = node->first_child; child; child = child->next) {
- top = get_top_finfo(child, finfo);
- if (top)
- return top;
- }
-
- return NULL;
-}
-
-void
-packet_hex_print(GtkWidget *bv, const guint8 *pd, frame_data *fd,
- field_info *finfo, guint len)
-{
- /* do the initial printing and save the information needed */
- /* to redraw the display if preferences change. */
-
- int bstart = -1, bend = -1, blen = -1;
- guint64 bmask = 0x00; int bmask_le = 0;
- int astart = -1, aend = -1, alen = -1;
- int pstart = -1, pend = -1, plen = -1;
-
- if (finfo != NULL) {
- proto_tree *tree = (proto_tree *)g_object_get_data(G_OBJECT(bv), E_BYTE_VIEW_TREE_PTR);
- field_info *top_finfo;
-
- if (cfile.search_in_progress && (cfile.hex || (cfile.string && cfile.packet_data))) {
- /* In the hex view, only highlight the target bytes or string. The entire
- field can then be displayed by clicking on any of the bytes in the field. */
- if (cfile.hex) {
- char *p = cfile.sfilter;
-
- blen = 0;
- while (*p) {
- if (g_ascii_isxdigit(*p++))
- blen++;
- }
- blen = (blen + 1) / 2;
- } else {
- blen = (int)strlen(cfile.sfilter);
- }
- bstart = cfile.search_pos - (blen-1);
-
- } else {
- blen = finfo->length;
- bstart = finfo->start;
- }
-
- /* bmask = finfo->hfinfo->bitmask << hfinfo_bitshift(finfo->hfinfo); */ /* (value & mask) >> shift */
- if (finfo->hfinfo) bmask = finfo->hfinfo->bitmask;
- astart = finfo->appendix_start;
- alen = finfo->appendix_length;
-
- top_finfo = get_top_finfo(tree, finfo);
- /* it's possible to have top_finfo == finfo, no problem right now */
- if (top_finfo) {
- pstart = top_finfo->start;
- plen = top_finfo->length;
- }
-
- if (FI_GET_FLAG(finfo, FI_LITTLE_ENDIAN))
- bmask_le = 1;
- else if (FI_GET_FLAG(finfo, FI_BIG_ENDIAN))
- bmask_le = 0;
- else { /* unknown endianess - disable mask
- bmask_le = (G_BYTE_ORDER == G_LITTLE_ENDIAN);
- */
- bmask = 0x00;
- }
-
- if (bmask == 0x00) {
- int bito = FI_GET_BITS_OFFSET(finfo);
- int bitc = FI_GET_BITS_SIZE(finfo);
- int bitt = bito + bitc;
-
- /* construct mask using bito & bitc */
- /* XXX, mask has only 32 bit, later we can store bito&bitc, and use them (which should be faster) */
- if (bitt > 0 && bitt < 32) {
-
- bmask = ((G_GUINT64_CONSTANT(1) << bitc) - 1) << ((8-bitt) & 7);
- bmask_le = 0; /* ? */
- }
- }
- }
-
- if (pstart >= 0 && plen > 0 && (guint)pstart < len)
- pend = pstart + plen;
-
- if (bstart >= 0 && blen > 0 && (guint)bstart < len)
- bend = bstart + blen;
-
- if (astart >= 0 && alen > 0 && (guint)astart < len)
- aend = astart + alen;
-
- if (bend == -1 && aend != -1) {
- bstart = astart;
- bmask = 0x00;
- bend = aend;
- astart = aend = -1;
- }
-
- /* don't exceed the end of available data */
- if (aend != -1 && (guint)aend > len) aend = len;
- if (bend != -1 && (guint)bend > len) bend = len;
- if (pend != -1 && (guint)pend > len) pend = len;
-
- /* save the information needed to redraw the text */
- /* should we save the fd & finfo pointers instead ?? */
- g_object_set_data(G_OBJECT(bv), E_BYTE_VIEW_START_KEY, GINT_TO_POINTER(bstart));
- g_object_set_data(G_OBJECT(bv), E_BYTE_VIEW_END_KEY, GINT_TO_POINTER(bend));
- g_object_set_data(G_OBJECT(bv), E_BYTE_VIEW_MASK_LO_KEY, GINT_TO_POINTER((guint32) bmask));
- g_object_set_data(G_OBJECT(bv), E_BYTE_VIEW_MASK_HI_KEY, GINT_TO_POINTER((guint32)(bmask >> 32)));
- g_object_set_data(G_OBJECT(bv), E_BYTE_VIEW_MASKLE_KEY, GINT_TO_POINTER(bmask_le));
- g_object_set_data(G_OBJECT(bv), E_BYTE_VIEW_APP_START_KEY, GINT_TO_POINTER(astart));
- g_object_set_data(G_OBJECT(bv), E_BYTE_VIEW_APP_END_KEY, GINT_TO_POINTER(aend));
- g_object_set_data(G_OBJECT(bv), E_BYTE_VIEW_PROTO_START_KEY, GINT_TO_POINTER(pstart));
- g_object_set_data(G_OBJECT(bv), E_BYTE_VIEW_PROTO_END_KEY, GINT_TO_POINTER(pend));
- g_object_set_data(G_OBJECT(bv), E_BYTE_VIEW_ENCODE_KEY,
- GUINT_TO_POINTER((guint)fd->flags.encoding));
-
- /* stig: it should be done only for bitview... */
- if (recent.gui_bytes_view != BYTES_BITS)
- bmask = 0x00;
- packet_hex_update(bv, pd, len, bstart, bend, bmask, bmask_le, astart, aend, pstart, pend, (packet_char_enc)fd->flags.encoding);
-}
-
-void
-packet_hex_editor_print(GtkWidget *bv, const guint8 *pd, frame_data *fd, int offset, int bitoffset, guint len)
-{
- /* do the initial printing and save the information needed */
- /* to redraw the display if preferences change. */
-
- int bstart = offset, bend = (bstart != -1) ? offset+1 : -1;
- guint64 bmask=0; int bmask_le = 0;
- int astart = -1, aend = -1;
- int pstart = -1, pend = -1;
-
- switch (recent.gui_bytes_view) {
- case BYTES_HEX:
- bmask = (bitoffset == 0) ? 0xf0 : (bitoffset == 4) ? 0x0f : 0xff;
- break;
-
- case BYTES_BITS:
- bmask = (G_GUINT64_CONSTANT(1) << (7-bitoffset));
- break;
-
- default:
- g_assert_not_reached();
- break;
- }
-
- /* save the information needed to redraw the text */
- g_object_set_data(G_OBJECT(bv), E_BYTE_VIEW_START_KEY, GINT_TO_POINTER(bstart));
- g_object_set_data(G_OBJECT(bv), E_BYTE_VIEW_END_KEY, GINT_TO_POINTER(bend));
- g_object_set_data(G_OBJECT(bv), E_BYTE_VIEW_MASK_LO_KEY, GINT_TO_POINTER((guint32) bmask));
- g_object_set_data(G_OBJECT(bv), E_BYTE_VIEW_MASK_HI_KEY, GINT_TO_POINTER((guint32)(bmask >> 32)));
- g_object_set_data(G_OBJECT(bv), E_BYTE_VIEW_MASKLE_KEY, GINT_TO_POINTER(bmask_le));
- g_object_set_data(G_OBJECT(bv), E_BYTE_VIEW_APP_START_KEY, GINT_TO_POINTER(astart));
- g_object_set_data(G_OBJECT(bv), E_BYTE_VIEW_APP_END_KEY, GINT_TO_POINTER(aend));
- g_object_set_data(G_OBJECT(bv), E_BYTE_VIEW_ENCODE_KEY,
- GUINT_TO_POINTER((guint)fd->flags.encoding));
- g_object_set_data(G_OBJECT(bv), E_BYTE_VIEW_PROTO_START_KEY, GINT_TO_POINTER(pstart));
- g_object_set_data(G_OBJECT(bv), E_BYTE_VIEW_PROTO_END_KEY, GINT_TO_POINTER(pend));
-
- packet_hex_update(bv, pd, len, bstart, bend, bmask, bmask_le, astart, aend, pstart, pend, (packet_char_enc)fd->flags.encoding);
-}
-
-/*
- * Redraw the text using the saved information; usually called if
- * the preferences have changed.
- */
-void
-packet_hex_reprint(GtkWidget *bv)
-{
- int start, end, mask_le;
- packet_char_enc encoding;
- int astart, aend;
- int pstart, pend;
- guint64 mask;
- const guint8 *data;
- guint len = 0;
-
- start = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(bv), E_BYTE_VIEW_START_KEY));
- end = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(bv), E_BYTE_VIEW_END_KEY));
- mask = (guint64) GPOINTER_TO_INT(g_object_get_data(G_OBJECT(bv), E_BYTE_VIEW_MASK_HI_KEY)) << 32 |
- GPOINTER_TO_INT(g_object_get_data(G_OBJECT(bv), E_BYTE_VIEW_MASK_LO_KEY));
- mask_le = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(bv), E_BYTE_VIEW_MASKLE_KEY));
- astart = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(bv), E_BYTE_VIEW_APP_START_KEY));
- aend = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(bv), E_BYTE_VIEW_APP_END_KEY));
- pstart = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(bv), E_BYTE_VIEW_PROTO_START_KEY));
- pend = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(bv), E_BYTE_VIEW_PROTO_END_KEY));
- data = get_byte_view_data_and_length(bv, &len);
- g_assert(data != NULL);
- encoding = (packet_char_enc) GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(bv), E_BYTE_VIEW_ENCODE_KEY));
-
- /* stig: it should be done only for bitview... */
- if (recent.gui_bytes_view != BYTES_BITS)
- mask = 0x00;
- packet_hex_update(bv, data, len, start, end, mask, mask_le, astart, aend, pstart, pend, encoding);
-}
-
-/* List of all protocol tree widgets, so we can globally set the selection
- mode and font of all of them. */
-static GList *ptree_widgets;
-
-/* Add a protocol tree widget to the list of protocol tree widgets. */
-static void forget_ptree_widget(GtkWidget *ptreew, gpointer data);
-
-static void
-remember_ptree_widget(GtkWidget *ptreew)
-{
- ptree_widgets = g_list_append(ptree_widgets, ptreew);
-
- /* Catch the "destroy" event on the widget, so that we remove it from
- the list when it's destroyed. */
- g_signal_connect(ptreew, "destroy", G_CALLBACK(forget_ptree_widget), NULL);
-}
-
-/* Remove a protocol tree widget from the list of protocol tree widgets. */
-static void
-forget_ptree_widget(GtkWidget *ptreew, gpointer data _U_)
-{
- ptree_widgets = g_list_remove(ptree_widgets, ptreew);
-}
-
-static void
-set_ptree_font_cb(gpointer data, gpointer user_data)
-{
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_override_font((GtkWidget *)data,
- (PangoFontDescription *)user_data);
-#else
- gtk_widget_modify_font((GtkWidget *)data,
- (PangoFontDescription *)user_data);
-#endif
-}
-
-void
-set_ptree_font_all(PangoFontDescription *font)
-{
- g_list_foreach(ptree_widgets, set_ptree_font_cb, font);
-}
-
-
-/*
- * Each expert_color_* level below should match the light gradient
- * colors in image/expert_indicators.svg.
- */
-static gboolean colors_ok = FALSE;
-
-GdkColor expert_color_comment = { 0, 0xb7b7, 0xf7f7, 0x7474 }; /* Green */
-GdkColor expert_color_chat = { 0, 0x8080, 0xb7b7, 0xf7f7 }; /* light blue */
-GdkColor expert_color_note = { 0, 0xa0a0, 0xffff, 0xffff }; /* bright turquoise */
-GdkColor expert_color_warn = { 0, 0xf7f7, 0xf2f2, 0x5353 }; /* yellow */
-GdkColor expert_color_error = { 0, 0xffff, 0x5c5c, 0x5c5c }; /* pale red */
-GdkColor expert_color_foreground = { 0, 0x0000, 0x0000, 0x0000 }; /* black */
-GdkColor hidden_proto_item = { 0, 0x4444, 0x4444, 0x4444 }; /* gray */
-
-gchar *expert_color_comment_str;
-gchar *expert_color_chat_str;
-gchar *expert_color_note_str;
-gchar *expert_color_warn_str;
-gchar *expert_color_error_str;
-gchar *expert_color_foreground_str;
-
-void proto_draw_colors_init(void)
-{
- if(colors_ok) {
- return;
- }
- expert_color_comment_str = gdk_color_to_string(&expert_color_comment);
- expert_color_chat_str = gdk_color_to_string(&expert_color_chat);
- expert_color_note_str = gdk_color_to_string(&expert_color_note);
- expert_color_warn_str = gdk_color_to_string(&expert_color_warn);
- expert_color_error_str = gdk_color_to_string(&expert_color_error);
- expert_color_foreground_str = gdk_color_to_string(&expert_color_foreground);
-
- colors_ok = TRUE;
-}
-
-
-static void
-tree_cell_renderer(GtkTreeViewColumn *tree_column _U_, GtkCellRenderer *cell,
- GtkTreeModel *tree_model, GtkTreeIter *iter,
- gpointer data _U_)
-{
- field_info *fi;
-
- gtk_tree_model_get(tree_model, iter, 1, &fi, -1);
-
- if(!colors_ok) {
- proto_draw_colors_init();
- }
-
- /* for the various possible attributes, see:
- * http://developer.gnome.org/doc/API/2.0/gtk/GtkCellRendererText.html
- *
- * color definitions can be found at:
- * http://cvs.gnome.org/viewcvs/gtk+/gdk-pixbuf/io-xpm.c?rev=1.42
- * (a good color overview: http://www.computerhope.com/htmcolor.htm)
- *
- * some experiences:
- * background-gdk: doesn't seem to work (probably the GdkColor must be allocated)
- * weight/style: doesn't take any effect
- */
-
- /* for each field, we have to reset the renderer attributes */
- g_object_set (cell, "foreground-set", FALSE, NULL);
-
- g_object_set (cell, "background-set", FALSE, NULL);
-
- g_object_set (cell, "underline", PANGO_UNDERLINE_NONE, NULL);
- g_object_set (cell, "underline-set", FALSE, NULL);
-
- /*g_object_set (cell, "style", PANGO_STYLE_NORMAL, NULL);
- g_object_set (cell, "style-set", FALSE, NULL);*/
-
- /*g_object_set (cell, "weight", PANGO_WEIGHT_NORMAL, NULL);
- g_object_set (cell, "weight-set", FALSE, NULL);*/
-
- if(FI_GET_FLAG(fi, FI_GENERATED)) {
- /* we use "[...]" to mark generated items, no need to change things here */
-
- /* as some fonts don't support italic, don't use this */
- /*g_object_set (cell, "style", PANGO_STYLE_ITALIC, NULL);
- g_object_set (cell, "style-set", TRUE, NULL);
- */
- /*g_object_set (cell, "weight", PANGO_WEIGHT_BOLD, NULL);
- g_object_set (cell, "weight-set", TRUE, NULL);*/
- }
-
- if(FI_GET_FLAG(fi, FI_HIDDEN)) {
- g_object_set (cell, "foreground-gdk", &hidden_proto_item, NULL);
- g_object_set (cell, "foreground-set", TRUE, NULL);
- }
-
- if (fi && fi->hfinfo) {
- if(fi->hfinfo->type == FT_PROTOCOL) {
- g_object_set (cell, "background", "gray90", NULL);
- g_object_set (cell, "background-set", TRUE, NULL);
- g_object_set (cell, "foreground", "black", NULL);
- g_object_set (cell, "foreground-set", TRUE, NULL);
- /*g_object_set (cell, "weight", PANGO_WEIGHT_BOLD, NULL);
- g_object_set (cell, "weight-set", TRUE, NULL);*/
- }
-
- if((fi->hfinfo->type == FT_FRAMENUM) ||
- (FI_GET_FLAG(fi, FI_URL) && IS_FT_STRING(fi->hfinfo->type))) {
- render_as_url(cell);
- }
- }
-
- if(FI_GET_FLAG(fi, PI_SEVERITY_MASK)) {
- switch(FI_GET_FLAG(fi, PI_SEVERITY_MASK)) {
- case(PI_COMMENT):
- g_object_set (cell, "background-gdk", &expert_color_comment, NULL);
- g_object_set (cell, "background-set", TRUE, NULL);
- break;
- case(PI_CHAT):
- g_object_set (cell, "background-gdk", &expert_color_chat, NULL);
- g_object_set (cell, "background-set", TRUE, NULL);
- break;
- case(PI_NOTE):
- g_object_set (cell, "background-gdk", &expert_color_note, NULL);
- g_object_set (cell, "background-set", TRUE, NULL);
- break;
- case(PI_WARN):
- g_object_set (cell, "background-gdk", &expert_color_warn, NULL);
- g_object_set (cell, "background-set", TRUE, NULL);
- break;
- case(PI_ERROR):
- g_object_set (cell, "background-gdk", &expert_color_error, NULL);
- g_object_set (cell, "background-set", TRUE, NULL);
- break;
- default:
- g_assert_not_reached();
- }
- g_object_set (cell, "foreground", "black", NULL);
- g_object_set (cell, "foreground-set", TRUE, NULL);
- }
-}
-
-GtkWidget *
-proto_tree_view_new(GtkWidget **tree_view_p)
-{
- GtkWidget *tv_scrollw, *tree_view;
- ProtoTreeModel *store;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
- gint col_offset;
-
- /* Tree view */
- tv_scrollw = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(tv_scrollw),
- GTK_SHADOW_IN);
-
- store = proto_tree_model_new(NULL, prefs.display_hidden_proto_items);
- tree_view = tree_view_new(GTK_TREE_MODEL(store));
- g_object_unref(G_OBJECT(store));
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree_view), FALSE);
- renderer = gtk_cell_renderer_text_new();
- g_object_set (renderer, "ypad", 0, NULL);
- col_offset = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(tree_view),
- -1, "Name", renderer,
- "text", 0, NULL);
- column = gtk_tree_view_get_column(GTK_TREE_VIEW(tree_view),
- col_offset - 1);
- gtk_tree_view_column_set_cell_data_func(column, renderer, tree_cell_renderer,
- NULL, NULL);
-
- gtk_tree_view_column_set_sizing(GTK_TREE_VIEW_COLUMN(column),
- GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- g_signal_connect(tree_view, "row-expanded", G_CALLBACK(expand_tree), NULL);
- g_signal_connect(tree_view, "row-collapsed", G_CALLBACK(collapse_tree), NULL);
- gtk_container_add( GTK_CONTAINER(tv_scrollw), tree_view );
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_override_font(tree_view, user_font_get_regular());
-#else
- gtk_widget_modify_font(tree_view, user_font_get_regular());
-#endif
- remember_ptree_widget(tree_view);
-
- *tree_view_p = tree_view;
-
- return tv_scrollw;
-}
-
-void
-expand_all_tree(proto_tree *protocol_tree _U_, GtkWidget *tree_view)
-{
- int i;
-
- for(i=0; i < num_tree_types; i++)
- tree_expanded_set(i, TRUE);
-
- gtk_tree_view_expand_all(GTK_TREE_VIEW(tree_view));
-}
-
-void
-collapse_all_tree(proto_tree *protocol_tree _U_, GtkWidget *tree_view)
-{
- int i;
-
- for(i=0; i < num_tree_types; i++)
- tree_expanded_set(i, FALSE);
-
- gtk_tree_view_collapse_all(GTK_TREE_VIEW(tree_view));
-}
-
-static void
-tree_view_follow_link(field_info *fi)
-{
- gchar *url;
-
- if(fi->hfinfo->type == FT_FRAMENUM) {
- cf_goto_frame(&cfile, fi->value.value.uinteger);
- }
- if(FI_GET_FLAG(fi, FI_URL) && IS_FT_STRING(fi->hfinfo->type)) {
- url = fvalue_to_string_repr(NULL, &fi->value, FTREPR_DISPLAY, fi->hfinfo->display);
- if(url){
- browser_open_url(url);
- wmem_free(NULL, url);
- }
- }
-}
-
-
-/* If the user selected a position in the tree view, try to find
- * the item in the GUI proto_tree that corresponds to that byte, and
- * select it. */
-gboolean
-tree_view_select(GtkWidget *widget, GdkEventButton *event)
-{
- GtkTreeSelection *sel;
- GtkTreePath *path;
-
- if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget),
- (gint) (((GdkEventButton *)event)->x),
- (gint) (((GdkEventButton *)event)->y),
- &path, NULL, NULL, NULL))
- {
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
-
- /* if that's a doubleclick, try to follow the link */
- if(event->type == GDK_2BUTTON_PRESS) {
- GtkTreeModel *model;
- GtkTreeIter iter;
- field_info *fi;
-
- if(gtk_tree_selection_get_selected (sel, &model, &iter)) {
- if (event->state & GDK_SHIFT_MASK) {
- new_packet_window(NULL, TRUE, FALSE);
- }
- else {
- gtk_tree_model_get(model, &iter, 1, &fi, -1);
- tree_view_follow_link(fi);
- }
- }
- }
- else if (((GdkEventButton *)event)->button != 1) {
- /* if button == 1 gtk_tree_selection_select_path is already (or will be) called by the widget */
- gtk_tree_selection_select_path(sel, path);
- }
- } else {
- return FALSE;
- }
- return TRUE;
-}
-
-void
-proto_tree_draw_resolve(proto_tree *protocol_tree, GtkWidget *tree_view, const e_addr_resolve *resolv)
-{
- ProtoTreeModel *model;
- GtkTreePath *path;
- GtkTreeIter iter;
-
- model = proto_tree_model_new(protocol_tree, prefs.display_hidden_proto_items);
- if (resolv)
- proto_tree_model_force_resolv(PROTO_TREE_MODEL(model), resolv);
- gtk_tree_view_set_model(GTK_TREE_VIEW(tree_view), GTK_TREE_MODEL(model));
-
- g_signal_handlers_block_by_func(tree_view, expand_tree, NULL);
-
- /* modified version of gtk_tree_model_foreach */
- path = gtk_tree_path_new_first();
- if (gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, path))
- check_expand_trees(GTK_TREE_VIEW(tree_view), GTK_TREE_MODEL(model),
- path, &iter, prefs.gui_auto_scroll_on_expand, TRUE);
- gtk_tree_path_free(path);
-
- g_signal_handlers_unblock_by_func(tree_view, expand_tree, NULL);
-
- g_object_unref(G_OBJECT(model));
-}
-
-/* fill the whole protocol tree with the string values */
-void
-proto_tree_draw(proto_tree *protocol_tree, GtkWidget *tree_view)
-{
- proto_tree_draw_resolve(protocol_tree, tree_view, NULL);
-}
-
-void
-select_bytes_view (GtkWidget *w _U_, gpointer data _U_, bytes_view_type view)
-{
- if (recent.gui_bytes_view != view) {
- recent.gui_bytes_view = view;
- redraw_packet_bytes_all();
- }
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/packet_panes.h b/ui/gtk/packet_panes.h
deleted file mode 100644
index 0aca2c72cd..0000000000
--- a/ui/gtk/packet_panes.h
+++ /dev/null
@@ -1,240 +0,0 @@
-/* packet_panes.h
- * Definitions for GTK+ packet display structures and routines (packet
- * details and hex dump panes)
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __PACKET_PANES_H__
-#define __PACKET_PANES_H__
-
-#include "ui/recent.h"
-#include <epan/addr_resolv.h>
-
-/** @file
- * Packet tree and details panes.
- * @ingroup main_window_group
- */
-
-/** Get the current text notebook page of the packet details notebook.
- *
- * @param nb_ptr the notebook widget
- * @return the notebook page
- */
-extern GtkWidget *get_notebook_bv_ptr(GtkWidget *nb_ptr);
-
-/**
- * Get the data and length for a byte view, given the byte view page widget.
- *
- * @param byte_view the byte view to look at
- * @param data_len set "*data_len" to the length
- * @return the pointer, or NULL on error
- */
-extern const guint8 *get_byte_view_data_and_length(GtkWidget *byte_view,
- guint *data_len);
-
-/** Set the current text page of the notebook to the window that
- * refers to a particular tvbuff.
- *
- * @param nb_ptr the byte view notebook
- * @param tvb the tvbuff to look at
- */
-extern void set_notebook_page(GtkWidget *nb_ptr, tvbuff_t *tvb);
-
-/** Redraw a given byte view window.
- *
- * @param nb_ptr the byte view notebook
- * @param fd selected frame
- * @param finfo selected field_info
- */
-extern void redraw_packet_bytes(GtkWidget *nb_ptr, frame_data *fd, field_info *finfo);
-
-/** Redraw all byte view windows. */
-extern void redraw_packet_bytes_all(void);
-
-/** Create a new byte view (packet details pane).
- *
- * @return the new byte view
- */
-extern GtkWidget *byte_view_new(void);
-
-/** Add a new tab to a byte view.
- */
-extern GtkWidget *add_byte_tab(GtkWidget *byte_nb, const char *name,
- tvbuff_t *tvb, proto_tree *tree,
- GtkWidget *tree_view);
-
-/** Clear and fill all the byte view notebook tabs.
- *
- * @param edt current dissections
- * @param tree_view the corresponding packet tree
- * @param nb_ptr the byte view notebook
- */
-extern void add_byte_views(struct epan_dissect *edt, GtkWidget *tree_view,
- GtkWidget *nb_ptr);
-
-/** Gdk button click appeared, select the byte view from that position.
- *
- * @param widget the byte view
- * @param event the button event clicked
- * @return TRUE if could be selected
- */
-extern gboolean byte_view_select(GtkWidget *widget, GdkEventButton *event);
-
-/** This highlights the field in the proto tree that is at position byte
- *
- * @param tvb the current tvbuff
- * @param byte the byte offset within the packet to highlight
- * @param tree_view the current tree_view
- * @param tree the current tree
- * @return TRUE if highlighting was successful
- */
-gboolean
-highlight_field(tvbuff_t *tvb, gint byte, GtkTreeView *tree_view,
- proto_tree *tree);
-
-/** Callback for "Export Selected Packet Bytes" operation.
- *
- * @param w unused
- * @param data unused
- */
-extern void savehex_cb(GtkWidget * w, gpointer data);
-
-/** Format of packet data to copy to clipboard.
- * Lower nibble holds data type, next nibble holds flags.
- */
-typedef enum {
- CD_ALLINFO, /* All information - columated hex with text in separate column */
- CD_TEXTONLY, /* Printable characters */
- CD_HEX, /* Hex, space separated, no linebreaks */
- CD_HEXCOLUMNS, /* Like "All Information" but with no ASCII */
- CD_BINARY, /* Raw binary octets */
-
- CD_TYPEMASK = 0x0000FFFF, /* Mask for extracting type */
- CD_FLAGSMASK = -65536, /* i.e., 0xFFFF0000: Mask for extracting flags */
-
- CD_FLAGS_SELECTEDONLY = 0x00010000 /* Copy only selected bytes */
-} copy_data_type;
-
-
-/** Callback for "Copy packet bytes to clipboard" operation.
- *
- * @param w unused
- * @param data unused
- * @param data_type copy_data_type
- *
- */
-extern void copy_hex_cb(GtkWidget * w, gpointer data, copy_data_type data_type);
-
-/** Redraw a given byte view window.
- *
- * @param bv the byte view
- * @param pd the packet data
- * @param fd the current fame
- * @param finfo the current field info
- * @param len the byte view length
- */
-extern void packet_hex_print(GtkWidget *bv, const guint8 *pd, frame_data *fd,
- field_info *finfo, guint len);
-
-extern void packet_hex_editor_print(GtkWidget *bv, const guint8 *pd, frame_data *fd,
- int offset, int bitoffset, guint len);
-
-/**
- * Redraw the text using the saved information. Usually called if
- * the preferences have changed.
- *
- * @param bv the byte view
- */
-extern void packet_hex_reprint(GtkWidget *bv);
-
-/** Set a new font for all protocol trees.
- *
- * @param font the new font
- */
-extern void set_ptree_font_all(PangoFontDescription *font);
-
-/** Find field in tree view by field_info.
- *
- * @param tree_view the tree view to look at
- * @param finfo the field info the look for
- * @return the path to the field
- */
-extern GtkTreePath *tree_find_by_field_info(GtkTreeView *tree_view, field_info *finfo);
-
-/** Create a new tree view (packet details).
- *
- * @param tree_view_p fill in the new tree view
- * @return the new scrolled window (parent of the tree view)
- */
-extern GtkWidget * proto_tree_view_new(GtkWidget **tree_view_p);
-
-/** Clear and redraw the whole tree view.
- *
- * @param protocol_tree the currently dissected protocol tree
- * @param tree_view the tree view to redraw
- */
-extern void proto_tree_draw(proto_tree *protocol_tree, GtkWidget *tree_view);
-
-extern void proto_tree_draw_resolve(proto_tree *protocol_tree, GtkWidget *tree_view, const e_addr_resolve *resolv);
-
-/** Expand the whole tree view.
- *
- * @param protocol_tree the currently dissected protocol tree
- * @param tree_view the tree view to redraw
- */
-extern void expand_all_tree(proto_tree *protocol_tree, GtkWidget *tree_view);
-
-/** Collapse the whole tree view.
- *
- * @param protocol_tree the currently dissected protocol tree
- * @param tree_view the tree view to redraw
- */
-extern void collapse_all_tree(proto_tree *protocol_tree, GtkWidget *tree_view);
-
-/** Gdk button click appeared, select the byte view from that position.
- *
- * @param widget the tree view
- * @param event the button event clicked
- * @return TRUE if could be selected
- */
-extern gboolean tree_view_select(GtkWidget *widget, GdkEventButton *event);
-
-extern void select_bytes_view (GtkWidget *widget, gpointer data, bytes_view_type view);
-
-/** init the expert colors */
-extern void proto_draw_colors_init(void);
-
-/** the expert colors */
-extern GdkColor expert_color_comment;
-extern GdkColor expert_color_chat;
-extern GdkColor expert_color_note;
-extern GdkColor expert_color_warn;
-extern GdkColor expert_color_error;
-extern GdkColor expert_color_foreground;
-
-/* string representation of expert colors */
-extern gchar *expert_color_comment_str;
-extern gchar *expert_color_chat_str;
-extern gchar *expert_color_note_str;
-extern gchar *expert_color_warn_str;
-extern gchar *expert_color_error_str;
-extern gchar *expert_color_foreground_str;
-
-#endif /* __PACKET_PANES_H__ */
diff --git a/ui/gtk/packet_win.c b/ui/gtk/packet_win.c
deleted file mode 100644
index 67a8e82830..0000000000
--- a/ui/gtk/packet_win.c
+++ /dev/null
@@ -1,400 +0,0 @@
-/* packet_win.c
- * Routines for popping a window to display current packet
- *
- * Copyright 2000, Jeffrey C. Foster <jfoste@woodward.com>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * To do:
- * - Add close button to bottom.
- * - improve the window Title and allow user to config it
- * - Add print support ? ( could be a mess)
- * - Add button to have main window jump to this packet ?
- */
-
-
-#include "config.h"
-
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-#if GTK_CHECK_VERSION(3,0,0)
-# include <gdk/gdkkeysyms-compat.h>
-#endif
-
-#include <string.h>
-
-#include <epan/epan.h>
-#include <epan/timestamp.h>
-#include <epan/packet.h>
-#include <epan/prefs.h>
-#include <epan/column.h>
-#include <epan/addr_resolv.h>
-#include <epan/epan_dissect.h>
-#include <epan/strutil.h>
-#include <epan/tvbuff-int.h>
-#include <epan/print.h>
-
-#include "../../file.h"
-
-#include "ui/recent.h"
-#include "ui/simple_dialog.h"
-#include "ui/summary.h"
-#include "ui/ws_ui_util.h"
-
-#include "ui/gtk/font_utils.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/packet_win.h"
-#include "ui/gtk/packet_panes.h"
-#include "ui/gtk/keys.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/old-gtk-compat.h"
-
-#include "frame_tvbuff.h"
-
-#include "globals.h"
-
-#define BV_SIZE 75
-#define TV_SIZE 95
-
-/* Data structure holding information about a packet-detail window. */
-struct PacketWinData {
- frame_data *frame; /* The frame being displayed */
- wtap_rec rec; /* Record metadata */
- guint8 *pd; /* Record data */
- GtkWidget *main;
- GtkWidget *tv_scrollw;
- GtkWidget *tree_view;
- GtkWidget *bv_nb_ptr;
- field_info *finfo_selected;
- epan_dissect_t edt;
-
- int pd_offset;
- int pd_bitoffset;
-};
-
-/* List of all the packet-detail windows popped up. */
-static GList *detail_windows;
-
-static void new_tree_view_selection_changed_cb(GtkTreeSelection *sel,
- gpointer user_data);
-
-
-static void destroy_new_window(GObject *object, gpointer user_data);
-
-static gboolean
-button_press_handler(GtkWidget *widget, GdkEvent *event, gpointer data _U_)
-{
- if (widget == NULL || event == NULL) {
- return FALSE;
- }
-
- tree_view_select(widget, (GdkEventButton *) event);
-
- /* GDK_2BUTTON_PRESS is a doubleclick -> expand/collapse tree row */
- if (event->type == GDK_2BUTTON_PRESS) {
- GtkTreePath *path;
-
- if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget),
- (gint) (((GdkEventButton *)event)->x),
- (gint) (((GdkEventButton *)event)->y),
- &path, NULL, NULL, NULL))
- {
- if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(widget), path)) {
- gtk_tree_view_collapse_row(GTK_TREE_VIEW(widget), path);
- } else {
- gtk_tree_view_expand_row(GTK_TREE_VIEW(widget), path, FALSE);
- }
- gtk_tree_path_free(path);
- }
- }
-
- return FALSE;
-}
-
-/* Returns dynamically allocated memory, must be freed by caller after use */
-static char*
-create_packet_window_title(void)
-{
- GString *title;
- int i;
-
- title = g_string_new("");
-
- /*
- * Build title of window by getting column data constructed when the
- * frame was dissected.
- */
- for (i = 0; i < cfile.cinfo.num_cols; ++i) {
- g_string_append(title, cfile.cinfo.columns[i].col_data);
- g_string_append_c(title, ' ');
- }
-
- return g_string_free(title, FALSE);
-}
-
-static void
-redissect_packet_window(gpointer object, gpointer user_data _U_)
-{
- struct PacketWinData *DataPtr = (struct PacketWinData *)object;
- char *title;
-
- /* XXX, can be optimized? */
- proto_tree_draw(NULL, DataPtr->tree_view);
- epan_dissect_cleanup(&(DataPtr->edt));
- epan_dissect_init(&(DataPtr->edt), cfile.epan, TRUE, TRUE);
- epan_dissect_run(&(DataPtr->edt), cfile.cd_t, &DataPtr->rec,
- frame_tvbuff_new(&cfile.provider, DataPtr->frame, DataPtr->pd),
- DataPtr->frame, NULL);
- add_byte_views(&(DataPtr->edt), DataPtr->tree_view, DataPtr->bv_nb_ptr);
- proto_tree_draw(DataPtr->edt.tree, DataPtr->tree_view);
-
- /* update the window title */
- title = create_packet_window_title();
- gtk_window_set_title(GTK_WINDOW(DataPtr->main), title);
- g_free(title);
-}
-
-void new_packet_window(GtkWidget *w _U_, gboolean reference, gboolean editable _U_)
-{
- char *title;
- GtkWidget *main_w, *main_vbox, *pane,
- *tree_view, *tv_scrollw,
- *bv_nb_ptr;
- struct PacketWinData *DataPtr;
- frame_data *fd;
-
- if(reference) {
- guint32 framenum;
- header_field_info *hfinfo;
-
- if (! cfile.finfo_selected) {
- return;
- }
-
- hfinfo = cfile.finfo_selected->hfinfo;
-
- g_assert(hfinfo);
-
- if (hfinfo->type != FT_FRAMENUM) {
- return;
- }
-
- framenum = fvalue_get_uinteger(&cfile.finfo_selected->value);
-
- if (framenum == 0) {
- return;
- }
-
- fd = frame_data_sequence_find(cfile.provider.frames, framenum);
- }
- else {
- fd = cfile.current_frame;
- }
-
- if (!fd) {
- /* nothing has been captured so far */
- return;
- }
-
- /* With the new packetlists "lazy columns" it's necessary to reread the record */
- if (!cf_read_record(&cfile, fd)) {
- /* error reading the record */
- return;
- }
-
- /* Allocate data structure to represent this window. */
- DataPtr = (struct PacketWinData *) g_malloc(sizeof(struct PacketWinData));
-
- /* XXX, protect cfile.epan from closing (ref counting?) */
- DataPtr->frame = fd;
- DataPtr->rec = cfile.rec;
- DataPtr->pd = (guint8 *)g_malloc(DataPtr->frame->cap_len);
- memcpy(DataPtr->pd, ws_buffer_start_ptr(&cfile.buf), DataPtr->frame->cap_len);
-
- epan_dissect_init(&(DataPtr->edt), cfile.epan, TRUE, TRUE);
- epan_dissect_run(&(DataPtr->edt), cfile.cd_t, &DataPtr->rec,
- frame_tvbuff_new(&cfile.provider, DataPtr->frame, DataPtr->pd),
- DataPtr->frame, &cfile.cinfo);
- epan_dissect_fill_in_columns(&(DataPtr->edt), FALSE, TRUE);
-
- /* update the window title */
- title = create_packet_window_title();
- main_w = window_new(GTK_WINDOW_TOPLEVEL, title);
- g_free(title);
- gtk_window_set_default_size(GTK_WINDOW(main_w), DEF_WIDTH, -1);
-
- /* Container for paned windows */
- main_vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 1, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 1);
- gtk_container_add(GTK_CONTAINER(main_w), main_vbox);
- gtk_widget_show(main_vbox);
-
- /* Panes for the tree and byte view */
- pane = gtk_paned_new(GTK_ORIENTATION_VERTICAL);
- gtk_box_pack_start(GTK_BOX(main_vbox), pane, TRUE, TRUE, 0);
- gtk_widget_show(pane);
-
- /* Tree view */
- tv_scrollw = proto_tree_view_new(&tree_view);
- gtk_paned_pack1(GTK_PANED(pane), tv_scrollw, TRUE, TRUE);
- gtk_widget_set_size_request(tv_scrollw, -1, TV_SIZE);
- gtk_widget_show(tv_scrollw);
- gtk_widget_show(tree_view);
-
- /* Byte view */
- bv_nb_ptr = byte_view_new();
- gtk_paned_pack2(GTK_PANED(pane), bv_nb_ptr, FALSE, FALSE);
- gtk_widget_set_size_request(bv_nb_ptr, -1, BV_SIZE);
- gtk_widget_show(bv_nb_ptr);
-
- DataPtr->main = main_w;
- DataPtr->tv_scrollw = tv_scrollw;
- DataPtr->tree_view = tree_view;
- DataPtr->bv_nb_ptr = bv_nb_ptr;
- detail_windows = g_list_append(detail_windows, DataPtr);
-
- /* load callback handlers */
- g_signal_connect(gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)),
- "changed", G_CALLBACK(new_tree_view_selection_changed_cb), DataPtr);
- g_signal_connect(tree_view, "button_press_event", G_CALLBACK(button_press_handler), NULL);
- g_signal_connect(main_w, "destroy", G_CALLBACK(destroy_new_window), DataPtr);
-
- /* draw the protocol tree & print hex data */
- add_byte_views(&(DataPtr->edt), tree_view, DataPtr->bv_nb_ptr);
- proto_tree_draw(DataPtr->edt.tree, tree_view);
-
- DataPtr->finfo_selected = NULL;
- DataPtr->pd_offset = 0;
- DataPtr->pd_bitoffset = 0;
- gtk_widget_show(main_w);
-}
-
-void
-redissect_all_packet_windows(void)
-{
- g_list_foreach(detail_windows, redissect_packet_window, NULL);
-}
-
-static void
-destroy_new_window(GObject *object _U_, gpointer user_data)
-{
- struct PacketWinData *DataPtr = (struct PacketWinData *)user_data;
-
- detail_windows = g_list_remove(detail_windows, DataPtr);
- proto_tree_draw(NULL, DataPtr->tree_view);
- epan_dissect_cleanup(&(DataPtr->edt));
- g_free(DataPtr->pd);
- g_free(DataPtr);
-}
-
-/* called when a tree row is (un)selected in the popup packet window */
-static void
-new_tree_view_selection_changed_cb(GtkTreeSelection *sel, gpointer user_data)
-{
- field_info *finfo;
- GtkWidget *byte_view;
- const guint8 *data;
- guint len;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- struct PacketWinData *DataPtr = (struct PacketWinData*)user_data;
-
- /* if something is selected */
- if (gtk_tree_selection_get_selected(sel, &model, &iter))
- {
- gtk_tree_model_get(model, &iter, 1, &finfo, -1);
- if (!finfo) return;
-
- set_notebook_page(DataPtr->bv_nb_ptr, finfo->ds_tvb);
- byte_view = get_notebook_bv_ptr(DataPtr->bv_nb_ptr);
- if (!byte_view) /* exit if no hex window to write in */
- return;
-
- data = get_byte_view_data_and_length(byte_view, &len);
- if (data == NULL) {
- data = DataPtr->pd;
- len = DataPtr->frame->cap_len;
- }
-
- DataPtr->finfo_selected = finfo;
-
- packet_hex_print(byte_view, data, DataPtr->frame, finfo, len);
- }
- else
- {
- DataPtr->finfo_selected = NULL;
-
- byte_view = get_notebook_bv_ptr(DataPtr->bv_nb_ptr);
- if (!byte_view) /* exit if no hex window to write in */
- return;
-
- data = get_byte_view_data_and_length(byte_view, &len);
- g_assert(data != NULL);
- packet_hex_reprint(byte_view);
- }
-}
-
-/* Functions called from elsewhere to act on all popup packet windows. */
-
-/* Destroy all popup packet windows. */
-void
-destroy_packet_wins(void)
-{
- struct PacketWinData *DataPtr;
-
- /* Destroying a packet window causes it to be removed from
- the list of packet windows, so we can't do a "g_list_foreach()"
- to go through the list of all packet windows and destroy them
- as we find them; instead, as long as the list is non-empty,
- we destroy the first window on the list. */
- while (detail_windows != NULL) {
- DataPtr = (struct PacketWinData *)(detail_windows->data);
- window_destroy(DataPtr->main);
- }
-}
-
-static void
-redraw_packet_bytes_cb(gpointer data, gpointer user_data _U_)
-{
- struct PacketWinData *DataPtr = (struct PacketWinData *)data;
-
- redraw_packet_bytes(DataPtr->bv_nb_ptr, DataPtr->frame, DataPtr->finfo_selected);
-}
-
-/* Redraw the packet bytes part of all the popup packet windows. */
-void
-redraw_packet_bytes_packet_wins(void)
-{
- g_list_foreach(detail_windows, redraw_packet_bytes_cb, NULL);
-}
-
-/*
- * Editor modelines - http://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/gtk/packet_win.h b/ui/gtk/packet_win.h
deleted file mode 100644
index 84406c9fd8..0000000000
--- a/ui/gtk/packet_win.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/* packet_win.h
- * Declarations for popping a window to display current packet
- *
- * Copyright 2000, Jeffrey C. Foster <jfoste@woodward.com>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __PACKET_WIN_H__
-#define __PACKET_WIN_H__
-
-/** @file
- * Pop up a window to display the current packet only.
- */
-
-/** Create a new packet window.
- *
- * @param widget parent widget (unused)
- * @param reference open current packet or reference packet
- * @param editable packet window field are editable
- */
-extern void new_packet_window(GtkWidget *widget, gboolean reference, gboolean editable);
-
-/** Destroy all popup packet windows.
- */
-void destroy_packet_wins(void);
-
-/** Redraw the packet bytes panes of all packet windows. */
-void redraw_packet_bytes_packet_wins(void);
-
-/** Redissect all packet windows **/
-void redissect_all_packet_windows(void);
-
-#endif
diff --git a/ui/gtk/pixbuf-csource.c b/ui/gtk/pixbuf-csource.c
deleted file mode 100644
index 6d4b87b648..0000000000
--- a/ui/gtk/pixbuf-csource.c
+++ /dev/null
@@ -1,10489 +0,0 @@
-/* This file was automatically generated. DO NOT EDIT. */
-
-#include <glib.h>
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (expert_chat_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 expert_chat_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 expert_chat_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (784) */
- "\0\0\3("
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (56) */
- "\0\0\0""8"
- /* width (14) */
- "\0\0\0\16"
- /* height (14) */
- "\0\0\0\16"
- /* pixel_data: */
- "\377\377\377\0\377\377\377\0\377\377\377\0KVb\23CWj\223EXk\320F[p\366"
- "F[p\366EXk\320CWj\223KVb\23\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0DWiRG[p\360m\210\250\374\207\245\312\377"
- "\224\266\334\377\221\264\333\377\177\240\307\377g\204\245\374G[p\360"
- "DWiR\377\377\377\0\377\377\377\0\377\377\377\0DWiRRj\204\370\211\252"
- "\316\377\240\300\346\377\242\302\346\377\240\300\346\377\234\275\345"
- "\377\227\272\343\377\221\266\342\377}\241\310\377Ph\202\370DWiR\377\377"
- "\377\0KVb\23G[p\360\206\247\314\377\235\276\345\377\243\302\346\377\250"
- "\305\350\377\243\302\346\377\235\276\345\377\230\273\344\377\223\267"
- "\342\377\215\264\341\377y\236\307\377G[p\360KVb\23CWj\223h\205\246\374"
- "\227\272\343\377\234\276\345\377\241\301\346\377\243\302\347\377\241"
- "\301\346\377\234\276\345\377\227\272\343\377\222\267\342\377\215\263"
- "\341\377\207\260\337\377a~\241\374CWj\223EXk\320}\236\306\377\225\271"
- "\343\377\231\274\344\377\235\276\345\377\236\277\345\377\235\276\345"
- "\377\231\274\344\377\225\271\343\377\220\266\342\377\213\262\340\377"
- "\206\257\337\377q\225\300\377EXk\320F[p\366\206\255\330\377\221\266\342"
- "\377\225\271\343\377\227\272\343\377\231\273\344\377\227\272\343\377"
- "\225\271\343\377\221\266\342\377\216\264\341\377\211\261\340\377\204"
- "\255\336\377y\244\323\377F[p\366F[p\366\203\253\327\377\216\264\341\377"
- "\220\266\342\377\223\267\342\377\223\270\342\377\223\267\342\377\220"
- "\266\342\377\216\264\341\377\212\261\340\377\205\257\337\377\201\254"
- "\335\377w\242\323\377F[p\366EXk\320t\230\302\377\211\261\340\377\213"
- "\263\340\377\215\264\341\377\216\264\341\377\215\264\341\377\213\263"
- "\340\377\211\261\340\377\205\257\337\377\202\254\336\377~\251\335\377"
- "k\221\276\377EXk\320CWj\223a~\241\374\204\255\336\377\206\257\337\377"
- "\210\260\337\377\210\260\337\377\210\260\337\377\206\257\337\377\204"
- "\255\336\377\201\254\335\377~\251\335\377{\247\334\377[z\236\374CWj\223"
- "KVb\23G[p\360r\230\304\377\201\254\335\377\202\254\336\377\202\254\336"
- "\377\202\254\336\377\201\254\335\377\177\252\335\377}\251\334\377y\247"
- "\333\377k\223\301\377G[p\360KVb\23\377\377\377\0DWiRNg\201\370o\226\302"
- "\377}\251\334\377}\251\334\377}\251\334\377|\250\334\377z\247\334\377"
- "x\246\333\377j\222\300\377Mf\200\370DWiR\377\377\377\0\377\377\377\0"
- "\377\377\377\0DWiRG[p\360[z\236\374i\220\275\377r\237\321\377q\237\321"
- "\377h\216\274\377Zy\235\374G[p\360DWiR\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0KVb\23CWj\223EXk\320F[p\366F[p"
- "\366EXk\320CWj\223KVb\23\377\377\377\0\377\377\377\0\377\377\377\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (expert_error_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 expert_error_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 expert_error_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (784) */
- "\0\0\3("
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (56) */
- "\0\0\0""8"
- /* width (14) */
- "\0\0\0\16"
- /* height (14) */
- "\0\0\0\16"
- /* pixel_data: */
- "\377\377\377\0\377\377\377\0\377\377\377\0m\77\77\23g\77@\223g\77@\320"
- "l@A\366l@A\366g\77@\320g\77@\223m\77\77\23\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0f<\77Rm\77A\360\251^_\374"
- "\314tu\377\340\200\200\377\337||\377\310lm\377\246WX\374m\77A\360f<\77"
- "R\377\377\377\0\377\377\377\0\377\377\377\0f<\77R\202HI\370\321ww\377"
- "\352\214\214\377\352\216\216\377\352\214\214\377\351\206\206\377\350"
- "\200\200\377\347zz\377\314hi\377\200FG\370f<\77R\377\377\377\0m\77\77"
- "\23m\77A\360\317rs\377\351\210\210\377\352\217\217\377\354\225\225\377"
- "\352\217\217\377\351\210\210\377\350\202\202\377\347{{\377\346tt\377"
- "\312cd\377m\77A\360m\77\77\23g\77@\223\246YZ\374\350\201\201\377\351"
- "\207\207\377\352\215\215\377\353\220\220\377\352\215\215\377\351\207"
- "\207\377\350\201\201\377\347zz\377\345tt\377\344mm\377\242PQ\374g\77"
- "@\223g\77@\320\307ij\377\347~~\377\350\203\203\377\351\210\210\377\351"
- "\211\211\377\351\210\210\377\350\203\203\377\347~~\377\346xx\377\345"
- "rr\377\344ll\377\302[\\\377g\77@\320l@A\366\334oo\377\347zz\377\347~"
- "~\377\350\201\201\377\350\202\202\377\350\201\201\377\347~~\377\347z"
- "z\377\346uu\377\345oo\377\344ii\377\330``\377l@A\366l@A\366\333ll\377"
- "\346uu\377\346xx\377\347{{\377\347||\377\347{{\377\346xx\377\346uu\377"
- "\345qq\377\344kk\377\343ff\377\327]]\377l@A\366g\77@\320\304_`\377\345"
- "oo\377\345rr\377\346tt\377\346uu\377\346tt\377\345rr\377\345oo\377\344"
- "kk\377\343gg\377\342bb\377\300UV\377g\77@\320g\77@\223\242PQ\374\344"
- "ii\377\344ll\377\344nn\377\344oo\377\344nn\377\344ll\377\344ii\377\343"
- "ff\377\342bb\377\341^^\377\237JK\374g\77@\223m\77\77\23m\77A\360\307"
- "[\\\377\343ff\377\343gg\377\343gg\377\343gg\377\343ff\377\342cc\377\342"
- "aa\377\341]]\377\305ST\377m\77A\360m\77\77\23\377\377\377\0f<\77R\177"
- "DE\370\306XY\377\342aa\377\342aa\377\342aa\377\342__\377\341]]\377\341"
- "[[\377\304RS\377~CD\370f<\77R\377\377\377\0\377\377\377\0\377\377\377"
- "\0f<\77Rm\77A\360\237JK\374\277ST\377\326WW\377\326WW\377\276QR\377\236"
- "IJ\374m\77A\360f<\77R\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0m\77\77\23g\77@\223g\77@\320l@A\366l@A\366g\77@\320"
- "g\77@\223m\77\77\23\377\377\377\0\377\377\377\0\377\377\377\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (expert_none_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 expert_none_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 expert_none_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (784) */
- "\0\0\3("
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (56) */
- "\0\0\0""8"
- /* width (14) */
- "\0\0\0\16"
- /* height (14) */
- "\0\0\0\16"
- /* pixel_data: */
- "\377\377\377\0\377\377\377\0\377\377\377\0VVV\23TYX\223TZY\320X]]\366"
- "X]]\366TZY\320TYX\223VVV\23\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0TWZRX]]\360\210\214\211\374\246\251\246\377"
- "\267\271\265\377\265\267\263\377\241\244\241\377\204\207\205\374X]]\360"
- "TWZR\377\377\377\0\377\377\377\0\377\377\377\0TWZRglk\370\252\255\251"
- "\377\302\304\300\377\303\306\302\377\302\304\300\377\277\302\275\377"
- "\274\277\272\377\270\273\266\377\241\245\240\377fji\370TWZR\377\377\377"
- "\0VVV\23X]]\360\250\253\246\377\300\303\276\377\303\306\302\377\307\311"
- "\305\377\303\306\302\377\300\303\276\377\274\277\273\377\271\274\267"
- "\377\265\271\264\377\236\242\235\377X]]\360VVV\23TYX\223\205\210\206"
- "\374\274\277\272\377\277\302\276\377\302\305\301\377\304\306\302\377"
- "\302\305\301\377\277\302\276\377\274\277\272\377\270\274\267\377\265"
- "\270\263\377\261\265\260\377~\202\177\374TYX\223TZY\320\237\243\237\377"
- "\272\275\271\377\275\300\274\377\277\302\276\377\300\303\277\377\277"
- "\302\276\377\275\300\274\377\273\276\271\377\267\273\266\377\264\267"
- "\262\377\261\264\257\377\226\232\226\377TZY\320X]]\366\256\260\254\377"
- "\270\273\266\377\273\276\271\377\274\277\272\377\275\300\273\377\274"
- "\277\272\377\273\276\271\377\270\273\266\377\266\271\264\377\262\266"
- "\261\377\257\263\255\377\245\250\243\377X]]\366X]]\366\254\256\252\377"
- "\266\271\264\377\267\273\266\377\271\274\267\377\271\274\270\377\271"
- "\274\267\377\267\273\266\377\266\271\264\377\263\266\261\377\260\264"
- "\257\377\255\261\254\377\243\246\241\377X]]\366TZY\320\231\234\231\377"
- "\262\266\261\377\264\270\263\377\265\271\264\377\266\271\264\377\265"
- "\271\264\377\264\270\263\377\262\266\261\377\260\264\257\377\256\262"
- "\254\377\253\257\251\377\222\226\222\377TZY\320TYX\223~\202\177\374\257"
- "\263\255\377\261\264\257\377\262\265\260\377\262\265\260\377\262\265"
- "\260\377\261\264\257\377\257\263\255\377\255\261\254\377\253\257\251"
- "\377\251\255\247\377z~{\374TYX\223VVV\23X]]\360\231\235\227\377\255\261"
- "\254\377\256\262\254\377\256\262\254\377\256\262\254\377\255\261\254"
- "\377\254\260\252\377\253\256\251\377\251\254\247\377\224\230\222\377"
- "X]]\360VVV\23\377\377\377\0TWZRdih\370\227\233\225\377\253\256\251\377"
- "\253\256\251\377\253\256\251\377\252\256\250\377\251\255\247\377\247"
- "\253\246\377\223\227\221\377chg\370TWZR\377\377\377\0\377\377\377\0\377"
- "\377\377\0TWZRX]]\360z~{\374\221\225\221\377\240\243\236\377\240\242"
- "\236\377\217\223\217\377y}z\374X]]\360TWZR\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0VVV\23TYX\223TZY\320X]]\366"
- "X]]\366TZY\320TYX\223VVV\23\377\377\377\0\377\377\377\0\377\377\377\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (expert_note_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 expert_note_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 expert_note_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (784) */
- "\0\0\3("
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (56) */
- "\0\0\0""8"
- /* width (14) */
- "\0\0\0\16"
- /* height (14) */
- "\0\0\0\16"
- /* pixel_data: */
- "\377\377\377\0\377\377\377\0\377\377\377\0Vmm\23Lkm\223Mlm\320Ppr\366"
- "Ppr\366Mlm\320Lkm\223Vmm\23\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0LilRPqs\360|\253\254\374\230\315\316\377"
- "\247\340\340\377\245\340\340\377\222\312\313\377w\250\250\374Pqs\360"
- "LilR\377\377\377\0\377\377\377\0\377\377\377\0LilR_\205\206\370\233\322"
- "\322\377\263\353\353\377\264\353\353\377\263\353\353\377\257\352\352"
- "\377\253\351\351\377\247\347\347\377\221\316\316\377]\203\205\370Lil"
- "R\377\377\377\0Vmm\23Pqs\360\230\321\321\377\260\352\352\377\265\353"
- "\353\377\271\354\354\377\265\353\353\377\260\352\352\377\254\351\351"
- "\377\250\350\350\377\243\346\346\377\215\314\314\377Pqs\360Vmm\23Lkm"
- "\223x\250\251\374\254\351\351\377\260\352\352\377\263\353\353\377\265"
- "\353\353\377\263\353\353\377\260\352\352\377\254\351\351\377\247\347"
- "\347\377\243\346\346\377\236\345\345\377q\244\245\374Lkm\223Mlm\320\220"
- "\311\312\377\251\350\350\377\255\351\351\377\260\352\352\377\261\352"
- "\352\377\260\352\352\377\255\351\351\377\252\350\350\377\246\347\347"
- "\377\241\346\346\377\235\345\345\377\205\304\305\377Mlm\320Ppr\366\234"
- "\335\335\377\247\347\347\377\252\350\350\377\254\351\351\377\254\351"
- "\351\377\254\351\351\377\252\350\350\377\247\347\347\377\244\347\347"
- "\377\240\345\345\377\234\344\344\377\221\331\331\377Ppr\366Ppr\366\232"
- "\334\334\377\244\347\347\377\246\347\347\377\250\350\350\377\250\350"
- "\350\377\250\350\350\377\246\347\347\377\244\347\347\377\241\346\346"
- "\377\235\345\345\377\232\344\344\377\217\330\330\377Ppr\366Mlm\320\210"
- "\305\306\377\240\345\345\377\242\346\346\377\243\346\346\377\244\347"
- "\347\377\243\346\346\377\242\346\346\377\240\345\345\377\235\345\345"
- "\377\232\344\344\377\227\343\343\377\201\302\303\377Mlm\320Lkm\223q\244"
- "\245\374\234\344\344\377\235\345\345\377\237\345\345\377\237\345\345"
- "\377\237\345\345\377\235\345\345\377\234\344\344\377\232\344\344\377"
- "\227\343\343\377\224\342\342\377l\241\242\374Lkm\223Vmm\23Pqs\360\207"
- "\311\311\377\232\344\344\377\232\344\344\377\232\344\344\377\232\344"
- "\344\377\232\344\344\377\230\343\343\377\226\343\343\377\223\342\342"
- "\377\201\307\307\377Pqs\360Vmm\23\377\377\377\0LilR[\202\203\370\205"
- "\310\310\377\226\343\343\377\226\343\343\377\226\343\343\377\225\343"
- "\343\377\224\342\342\377\222\342\342\377\200\306\306\377Z\201\203\370"
- "LilR\377\377\377\0\377\377\377\0\377\377\377\0LilRPqs\360l\241\242\374"
- "\177\301\302\377\213\327\327\377\213\327\327\377~\300\301\377k\240\241"
- "\374Pqs\360LilR\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0Vmm\23Lkm\223Mlm\320Ppr\366Ppr\366Mlm\320Lkm\223Vmm\23"
- "\377\377\377\0\377\377\377\0\377\377\377\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (expert_warn_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 expert_warn_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 expert_warn_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (784) */
- "\0\0\3("
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (56) */
- "\0\0\0""8"
- /* width (14) */
- "\0\0\0\16"
- /* height (14) */
- "\0\0\0\16"
- /* pixel_data: */
- "\377\377\377\0\377\377\377\0\377\377\377\0bb\77\23dg=\223eh>\320jm\77"
- "\366jm\77\366eh>\320dg=\223bb\77\23\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0cf=Rjn>\360\246\245[\374\310\307p\377"
- "\333\331z\377\332\330w\377\304\303g\377\242\241U\374jn>\360cf=R\377\377"
- "\377\0\377\377\377\0\377\377\377\0cf=R\177\201F\370\314\312r\377\345"
- "\343\207\377\346\344\212\377\345\343\207\377\344\342\201\377\343\340"
- "{\377\341\337t\377\307\305c\377}\177D\370cf=R\377\377\377\0bb\77\23j"
- "n>\360\312\311n\377\344\342\203\377\346\344\212\377\347\345\221\377\346"
- "\344\212\377\344\342\203\377\343\341}\377\341\337v\377\340\335o\377\305"
- "\303^\377jn>\360bb\77\23dg=\223\243\242V\374\343\340|\377\344\342\202"
- "\377\345\343\210\377\346\344\213\377\345\343\210\377\344\342\202\377"
- "\343\340|\377\341\337u\377\340\335n\377\336\334g\377\236\235M\374dg="
- "\223eh>\320\303\302d\377\342\340x\377\343\341~\377\344\342\203\377\344"
- "\342\204\377\344\342\203\377\343\341~\377\342\340y\377\341\336s\377\337"
- "\335l\377\336\333f\377\275\274U\377eh>\320jm\77\366\327\324j\377\341"
- "\337t\377\342\340y\377\343\340|\377\343\341}\377\343\340|\377\342\340"
- "y\377\341\337t\377\340\336o\377\337\334i\377\335\333c\377\322\320Z\377"
- "jm\77\366jm\77\366\326\323f\377\340\336o\377\341\336s\377\341\337v\377"
- "\341\337v\377\341\337v\377\341\336s\377\340\336o\377\337\334k\377\336"
- "\333e\377\335\332`\377\322\317W\377jm\77\366eh>\320\277\276Z\377\337"
- "\334i\377\337\335m\377\340\335o\377\340\336o\377\340\335o\377\337\335"
- "m\377\337\334i\377\336\333e\377\335\332a\377\334\331[\377\273\272O\377"
- "eh>\320dg=\223\236\235M\374\335\333c\377\336\333f\377\336\334h\377\337"
- "\334i\377\336\334h\377\336\333f\377\335\333c\377\335\332`\377\334\331"
- "[\377\333\330W\377\233\232G\374dg=\223bb\77\23jn>\360\302\300V\377\335"
- "\332`\377\335\332a\377\335\332a\377\335\332a\377\335\332`\377\334\331"
- "]\377\333\331Z\377\332\330V\377\277\275M\377jn>\360bb\77\23\377\377\377"
- "\0cf=R|~B\370\301\277R\377\333\331Z\377\333\331Z\377\333\331Z\377\333"
- "\330Y\377\333\330W\377\332\327T\377\276\274L\377{}A\370cf=R\377\377\377"
- "\0\377\377\377\0\377\377\377\0cf=Rjn>\360\233\232G\374\272\271M\377\320"
- "\315P\377\320\315P\377\271\270K\377\232\231F\374jn>\360cf=R\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0bb\77\23dg"
- "=\223eh>\320jm\77\366jm\77\366eh>\320dg=\223bb\77\23\377\377\377\0\377"
- "\377\377\0\377\377\377\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (expert_ok_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 expert_ok_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 expert_ok_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (784) */
- "\0\0\3("
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (56) */
- "\0\0\0""8"
- /* width (14) */
- "\0\0\0\16"
- /* height (14) */
- "\0\0\0\16"
- /* pixel_data: */
- "\377\377\377\0\377\377\377\0\377\377\377\0\0\0\0\15\1\16\20\206\1\22"
- "\25\314\1\23\26\345\2\24\27\345\1\22\25\314\1\16\20\206\0\0\0\15\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\1"
- "\5\6G\11\30\33\344[\243\221\377\201\324\277\377\241\343\322\377\241\343"
- "\322\377\201\324\277\377[\243\221\377\12\31\33\344\1\5\6G\377\377\377"
- "\0\377\377\377\0\377\377\377\0\1\5\6G\27""39\357\201\324\277\377\241"
- "\343\322\377\241\343\322\377\241\343\322\377\241\343\322\377\241\343"
- "\322\377\241\343\322\377\201\324\277\377\27""39\357\1\5\6G\377\377\377"
- "\0\0\0\0\15\5\24\27\343\201\324\277\377\205\336\310\377\205\336\310\377"
- "\205\336\310\377\205\336\310\377\205\336\310\377\205\336\310\377\205"
- "\336\310\377\205\336\310\377\201\324\277\377\5\24\27\343\0\0\0\15\5\21"
- "\22\206[\243\221\377l\331\276\377l\331\276\377l\331\276\377l\331\276"
- "\377l\331\276\377l\331\276\377l\331\276\377l\331\276\377l\331\276\377"
- "l\331\276\377[\243\221\377\5\21\22\206\10\26\30\314\201\324\277\377F"
- "\324\260\377F\324\260\377F\324\260\377F\324\260\377F\324\260\377F\324"
- "\260\377F\324\260\377F\324\260\377F\324\260\377F\324\260\377\201\324"
- "\277\377\10\26\30\314\12\31\33\345P\331\267\377P\331\267\377P\331\267"
- "\377P\331\267\377P\331\267\377P\331\267\377P\331\267\377P\331\267\377"
- "P\331\267\377P\331\267\377P\331\267\377P\331\267\377\12\31\33\345\13"
- "\32\33\345]\336\276\377]\336\276\377]\336\276\377]\336\276\377]\336\276"
- "\377]\336\276\377]\336\276\377]\336\276\377]\336\276\377]\336\276\377"
- "]\336\276\377]\336\276\377\13\32\33\345\14\31\32\314\201\324\277\377"
- "h\343\304\377h\343\304\377h\343\304\377h\343\304\377h\343\304\377h\343"
- "\304\377h\343\304\377h\343\304\377h\343\304\377h\343\304\377\201\324"
- "\277\377\14\31\32\314\12\24\25\206[\243\221\377u\353\315\377u\353\315"
- "\377u\353\315\377u\353\315\377u\353\315\377u\353\315\377u\353\315\377"
- "u\353\315\377u\353\315\377u\353\315\377[\243\221\377\12\24\25\206\0\0"
- "\0\15\17\32\33\343\201\324\277\377\201\360\324\377\201\360\324\377\201"
- "\360\324\377\201\360\324\377\201\360\324\377\201\360\324\377\201\360"
- "\324\377\201\360\324\377\201\324\277\377\17\32\33\343\0\0\0\15\377\377"
- "\377\0\4\7\10G\40""77\356\201\324\277\377\216\365\333\377\216\365\333"
- "\377\216\365\333\377\216\365\333\377\216\365\333\377\216\365\333\377"
- "\201\324\277\377\40""77\356\4\7\10G[\243\221\0\377\377\377\0\377\377"
- "\377\0\5\10\10G\21\34\34\343[\243\221\377\216\350\321\377\230\372\342"
- "\377\230\372\342\377\216\350\321\377[\243\221\377\21\34\34\343\5\10\10"
- "G\201\324\277\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\0\0\0\15\16\27\27\206\22\35\35\314\24\37\37\345\24\37\37\345\22\35"
- "\35\314\16\27\27\206\0\0\0\15\201\324\277\0\377\377\377\0\377\377\377"
- "\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (capture_comment_add_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 capture_comment_add_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 capture_comment_add_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (1024) */
- "\0\0\4\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (64) */
- "\0\0\0@"
- /* width (16) */
- "\0\0\0\20"
- /* height (16) */
- "\0\0\0\20"
- /* pixel_data: */
- "\262\266\257I\263\267\260\342\261\264\256\377\261\264\255\377\260\263"
- "\254\377\257\262\254\377\257\262\253\377\257\262\253\365\257\262\254"
- "\257\253\257\247@\377\377\377\0\377\377\377\0\356,,i\356//\352\35600"
- "\334\356'';\260\263\254\344\356\357\354\377\376\376\376\377S\235\15\377"
- "N\232\6\377N\232\6\377\370\373\366\377\370\371\370\377\347\350\346\377"
- "\262\264\257\366\252\254\246r\256he\246\272[Y\376\325wv\377\356ss\377"
- "\356..\342\251\254\245\377\376\376\376\377\362\363\362\377S\235\15\377"
- "N\232\6\377N\232\6\377\337\344\332\377\343\346\340\377\331\332\330\377"
- "\375\375\375\377\250\215w\375\230\223\215\377\266\265\262\377\221\210"
- "\203\376\315vu\377\355--\355\244\247\241\377S\235\15\377N\232\6\377N"
- "\232\6\377N\232\6\377N\232\6\377N\232\6\377N\232\6\377\275\275\275\377"
- "\306\246\212\377\212\211\203\377\227\226\216\377\271\272\271\377\200"
- "~|\377\264ca\374\355++p\237\242\234\377S\235\15\377N\232\6\377N\232\6"
- "\377N\232\6\377N\232\6\377N\232\6\377N\232\6\377\306\222c\377\325s\40"
- "\377\371\276l\377\312\240g\377\210\207\177\377\222\216\210\377\251kh"
- "\270\377\377\377\0\232\235\227\377S\235\15\377N\232\6\377N\232\6\377"
- "N\232\6\377N\232\6\377N\232\6\377\217}\4\377\327v\"\377\372\277l\377"
- "\366\257Q\377\346\241Y\377\212\211\203\377\231\201k\310\377\377\377\1"
- "\377\377\377\0\226\230\222\377\375\376\375\377\347\351\345\377R\234\14"
- "\377N\232\6\377N\232\6\377\325\235g\377\330y$\377\372\277l\377\366\256"
- "Q\377\352\242V\377\324o\34\377\236\177d\377\377\377\377\1\377\377\377"
- "\0\377\377\377\0\221\223\216\377\375\376\375\377\326\327\326\377R\234"
- "\14\377N\232\6\377\225z\4\377\330y&\377\372\277l\377\365\256O\377\352"
- "\241V\377\323m\31\377\353\277\234\377\211\213\206\377\377\377\377\0\377"
- "\377\377\0\377\377\377\0\214\216\211\377\375\376\375\377\347\351\344"
- "\377\345\346\342\377\341\304\236\377\337\226Q\377\373\311\203\377\365"
- "\256O\377\352\241V\377\323m\32\377\333\262\215\377\365\365\365\377\201"
- "\203~\377\377\377\377\0\377\377\377\0\377\377\377\0\207\212\204\377\375"
- "\376\375\377\347\351\345\377\345\347\342\377\347\266r\377\363\324\255"
- "\377\377\375\374\377\354\255l\377\321j\30\377\312\244\200\377\314\316"
- "\312\377\352\352\351\377{}x\377\377\377\377\0\377\377\377\0\377\377\377"
- "\0\202\205\177\377\376\376\375\377\327\327\327\377\276\266\251\377\274"
- "\224Y\377\361\322\256\377\351\270}\377\331\2059\377\265\216o\377\261"
- "\261\261\377\276\276\275\377\353\353\353\377wzu\377\377\377\377\0\377"
- "\377\377\0\377\377\377\0}\200z\377\376\376\376\377\355\357\353\377g["
- "E\377\27\22\13\377\327\254o\377\313\253}\377\274\261\242\377\312\313"
- "\311\377\334\336\333\377\351\353\350\377\376\376\376\377uxs\377\377\377"
- "\377\0\377\377\377\0\377\377\377\0x{v\377\376\376\376\377\331\332\331"
- "\377\234\222\203\377\270\266\261\377\307\307\307\377\324\324\324\377"
- "\363\365\362\377\364\365\363\377\364\365\363\377\365\366\363\377\376"
- "\376\376\377qsn\377\377\377\377\0\377\377\377\0\377\377\377\0tvq\377"
- "\376\376\376\377\363\364\362\377\364\365\363\377\365\366\364\377\366"
- "\367\365\377\367\370\366\377\370\370\367\377\370\371\370\377\370\371"
- "\370\377\371\371\370\377\377\377\376\377lni\377\377\377\377\0\377\377"
- "\377\0\377\377\377\0vxs\343\351\352\351\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\351\352\351\377orm\336"
- "\377\377\377\0\377\377\377\0\377\377\377\0jnjHqso\337ikf\377hjf\377g"
- "ie\377gid\377fhd\377egc\377egb\377dfb\377cea\377lni\335dd`E\377\377\377"
- "\0\377\377\377\0\377\377\377\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (capture_comment_update_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 capture_comment_update_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 capture_comment_update_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (784) */
- "\0\0\3("
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (56) */
- "\0\0\0""8"
- /* width (14) */
- "\0\0\0\16"
- /* height (14) */
- "\0\0\0\16"
- /* pixel_data: */
- ">w\224>K\235\304\331C\232\303\331:\226\302\3311\223\302\331)\221\302"
- "\331\"\216\301\331\32\211\277\3303\201\246\214\0\0\0\1\0\0\0\0RUR]UX"
- "S\320UWSoL\206\242J^\262\331\377T\257\331\377d\267\335\377\326\352\362"
- "\377[\264\336\377/\240\327\377&\236\326\377>\227\277\377\307\310\305"
- "\232TWRmXXT@UVT\303UWS\320S\212\242Jj\271\333\377_\265\333\377\350\362"
- "\364\377\371\371\366\377E\253\333\3779\246\332\3770\243\332\377:\227"
- "\300\377\201\222\224\377UWS\377UWS\356TWTFRUR]\212\245\260J\270\335\354"
- "\377\270\335\355\377\370\370\365\377\370\370\364\377\263\334\356\377"
- "\237\324\354\377\232\322\354\377x\232\247\377UWS\377UWS\377UWS\377TW"
- "Rm\0\0\0\0\267\267\263J\370\370\364\377\370\370\365\377\370\370\365\377"
- "\370\370\365\377\370\370\364\377\370\370\364\377\260\261\255\377UWS\377"
- "UWS\377UWS\377VWT\233\0\0\0\0\0\0\0\0\267\267\263J\366\367\363\377\322"
- "\322\317\377\336\336\334\377\345\344\342\377\322\322\320\377\236\237"
- "\233\377UWS\377UWS\377UWS\377\252\253\250\377XXX@\0\0\0\0\0\0\0\0\263"
- "\267\263J\363\365\360\377\325\325\323\377\334\334\332\377\336\336\333"
- "\377\260\260\255\377UWS\377UWS\377UWS\377\242\243\237\377\370\370\364"
- "\377XXX@\0\0\0\0\0\0\0\0\263\263\263J\362\363\356\377\363\364\357\377"
- "\365\366\362\377\314\315\311\377\217\217\215\377\226\227\223\377UWS\377"
- "\251\252\246\377\367\367\363\377\367\367\364\377XXX@\0\0\0\0\0\0\0\0"
- "\263\263\260J\360\361\353\377\312\312\307\377\324\325\322\377ttr\377"
- "\1\1\1\377oon\377\256\257\254\377\324\325\322\377\324\325\322\377\365"
- "\366\362\377XXX@\0\0\0\0\0\0\0\0\263\263\260J\357\356\347\377\331\331"
- "\324\377\336\337\332\377KKI\377kki\377\257\257\252\377\332\333\326\377"
- "\336\337\332\377\337\340\334\377\362\364\356\377XXX@\0\0\0\0\0\0\0\0"
- "\263\263\260J\356\355\344\377\342\341\332\377\351\350\341\377\354\352"
- "\343\377\344\344\334\377\341\341\330\377\344\343\333\377\351\350\341"
- "\377\350\351\343\377\361\362\354\377XXX@\0\0\0\0\0\0\0\0\263\263\260"
- "J\353\353\342\377\316\316\310\377\324\324\316\377\343\343\333\377\322"
- "\322\314\377\321\321\313\377\317\317\311\377\270\270\266\377\322\321"
- "\314\377\357\356\347\377XXX@\0\0\0\0\0\0\0\0\263\263\254J\352\352\341"
- "\377\342\342\332\377\344\344\334\377\342\342\333\377\337\337\327\377"
- "\335\335\323\377\343\343\333\377\347\347\336\377\345\345\335\377\355"
- "\354\343\377XXX@\0\0\0\0\0\0\0\0\231\231\225<\301\301\270\331\302\301"
- "\272\331\301\301\272\331\301\301\267\331\300\300\266\331\300\300\266"
- "\331\301\301\267\331\301\301\272\331\302\302\273\331\302\302\273\331"
- "HHH5\0\0\0\0\0\0\0\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (capture_comment_disabled_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 capture_comment_disabled_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 capture_comment_disabled_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (1024) */
- "\0\0\4\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (64) */
- "\0\0\0@"
- /* width (16) */
- "\0\0\0\20"
- /* height (16) */
- "\0\0\0\20"
- /* pixel_data: */
- "\263\267\260J\263\267\260\342\261\264\256\377\261\264\255\377\260\263"
- "\254\377\257\262\254\377\257\262\253\377\257\262\253\366\257\263\254"
- "\262\255\260\251D\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\260\263\254\344\355\356\354\377\376\376"
- "\376\377\376\376\376\377\376\376\376\377\376\376\376\377\376\376\376"
- "\377\371\371\370\377\347\350\346\377\264\266\261\366\251\253\245z\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\251"
- "\254\245\377\376\376\376\377\362\363\362\377\357\360\355\377\353\355"
- "\351\377\350\352\345\377\344\346\341\377\343\345\340\377\330\331\327"
- "\377\375\375\375\377\276\300\273\367\244\246\240v\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\244\247\241\377\376\376\376\377\331"
- "\331\331\377\323\323\323\377\323\323\323\377\323\323\323\377\323\323"
- "\323\377\323\323\323\377\274\274\274\377\377\377\377\377\375\375\374"
- "\377\252\255\247\365\233\237\233=\377\377\377\0\377\377\377\0\377\377"
- "\377\0\237\242\234\377\376\376\376\377\353\355\351\377\350\352\346\377"
- "\345\347\343\377\342\345\340\377\337\342\334\377\334\337\331\377\277"
- "\302\274\377\251\254\246\377\260\260\257\377\330\331\326\376\233\236"
- "\230\262\377\377\377\0\377\377\377\0\377\377\377\0\232\235\227\377\376"
- "\376\375\377\330\330\327\377\323\323\323\377\323\323\323\377\323\323"
- "\323\377\323\323\323\377\323\323\323\377\323\323\323\377\316\317\316"
- "\377\314\320\312\377\331\333\330\377\224\227\220\371\200\200\200\4\377"
- "\377\377\0\377\377\377\0\226\230\222\377\375\376\375\377\347\351\345"
- "\377\344\346\341\377\342\345\340\377\341\343\336\377\336\341\333\377"
- "\334\337\330\377\331\334\326\377\331\334\326\377\332\335\326\377\376"
- "\376\376\377\217\221\214\374\200\237\200\10\377\377\377\0\377\377\377"
- "\0\221\223\216\377\375\376\375\377\326\327\326\377\323\323\323\377\323"
- "\323\323\377\323\323\323\377\323\323\323\377\323\323\323\377\323\323"
- "\323\377\323\323\323\377\324\325\324\377\376\376\376\377\212\214\210"
- "\374\200\200\200\10\377\377\377\0\377\377\377\0\214\216\211\377\375\376"
- "\375\377\347\351\344\377\345\346\342\377\343\346\341\377\342\345\340"
- "\377\342\344\337\377\342\344\337\377\342\345\337\377\342\345\337\377"
- "\343\345\340\377\376\376\376\377\206\210\203\374\200\200\200\10\377\377"
- "\377\0\377\377\377\0\207\212\204\377\375\376\375\377\347\351\345\377"
- "\345\347\342\377\344\347\342\377\345\347\342\377\345\347\343\377\345"
- "\350\343\377\345\350\343\377\345\350\343\377\347\352\345\377\376\376"
- "\376\377\201\204}\374\200\200\200\10\377\377\377\0\377\377\377\0\202"
- "\205\177\377\376\376\375\377\327\327\327\377\324\324\324\377\324\324"
- "\324\377\324\324\324\377\324\324\324\377\324\324\324\377\324\324\324"
- "\377\324\324\324\377\327\327\327\377\376\376\376\377{~y\374\200\200\200"
- "\10\377\377\377\0\377\377\377\0}\200z\377\376\376\376\377\355\357\353"
- "\377\354\355\352\377\355\356\353\377\355\357\354\377\356\357\354\377"
- "\357\361\356\377\357\361\356\377\357\361\356\377\360\361\357\377\377"
- "\377\377\377vyt\374\200\200\200\10\377\377\377\0\377\377\377\0x{v\377"
- "\376\376\376\377\331\332\331\377\324\324\324\377\324\324\324\377\324"
- "\324\324\377\330\330\330\377\363\365\362\377\364\365\363\377\364\365"
- "\363\377\364\365\362\377\377\377\377\377rtp\374\200\200`\10\377\377\377"
- "\0\377\377\377\0tvq\377\376\376\376\377\363\364\362\377\364\365\363\377"
- "\365\366\364\377\366\367\365\377\367\370\366\377\370\370\367\377\370"
- "\371\370\377\370\371\370\377\371\371\370\377\377\377\377\377npk\374`"
- "``\10\377\377\377\0\377\377\377\0vxs\343\351\352\351\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\356"
- "\356\355\377nql\347\0\0\0\1\377\377\377\0\377\377\377\0jnjHqso\337ik"
- "f\377hjf\377gie\377gid\377fhd\377egc\377egb\377dfb\377cea\377lni\341"
- "ffcK\377\377\377\0\377\377\377\0\377\377\377\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (network_bluetooth_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 network_bluetooth_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 network_bluetooth_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (1024) */
- "\0\0\4\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (64) */
- "\0\0\0@"
- /* width (16) */
- "\0\0\0\20"
- /* height (16) */
- "\0\0\0\20"
- /* pixel_data: */
- "\0\0\0\0\0\0\0\0\0\0\0\0\11\13\16\13\40!\"v\"$'\265\36\40\"\344\35\36"
- "\37\372\35\36\37\344\36\40\"\251\40\"$b\16\21\24\16\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\33\35\37\241035\350ehl\363\202"
- "\213\223\363t}\207\362r|\207\361Zcj\362&+/\350\27\33\37\214\10\14\20"
- "\17\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\23\24\26RCDF\363\220\227"
- "\236\367j}\221\373y\214\237\377\375\376\376\377r\206\232\377B[t\376H"
- "Xh\367#'+\356\23\27\34q\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\25\27\30,\34"
- "\36!\314\215\221\226\373m\201\225\3774Pn\377f|\222\377\375\376\376\377"
- "\375\376\376\377q\205\231\377>Yt\377;IW\372\26\32\35\333\40!\":\0\0\0"
- "\0\0\0\0\0\0\0\0\0\36\40!|KOQ\346\227\243\257\374Ib}\377@[w\377g}\222"
- "\377\375\376\376\377\357\362\364\377\375\376\376\377m\203\227\377;Ri"
- "\377\32#-\360\40!\"\215\0\0\0\0\0\0\0\0\0\0\0\0\37!\"\254\202\207\213"
- "\352\\r\211\375\375\376\376\377\307\317\327\377|\217\242\377\375\376"
- "\376\377g|\222\377\343\350\353\377\375\376\376\377C^x\377\"6L\362\36"
- "\37\40\266\0\0\0\0\0\0\0\0\0\0\0\0\37\40\"\302\221\227\232\357G`{\376"
- "`v\216\377\375\376\376\377\341\346\352\377\375\376\376\377\217\236\256"
- "\377\375\376\376\377\254\270\304\3779Uq\377!5J\362\35\36\37\347\0\0\0"
- "\0\0\0\0\0\0\0\0\0\36\37!\353\212\215\221\3655Qn\3762Om\377Sk\204\377"
- "\375\376\376\377\375\376\376\377\375\376\376\377\263\276\311\3773Pn\377"
- "1Nl\377\"6K\366\31\33\35\347\0\0\0\0\0\0\0\0\0\0\0\0\36\37\40\360\210"
- "\214\217\3643Ol\3761Nl\3779Tq\377\251\265\301\377\375\376\376\377\375"
- "\376\376\377aw\215\3771Nl\3771Nl\377#6J\367\27\30\32\3361Nl\1\0\0\0\0"
- "\0\0\0\0\36\40!\301y|\201\3624Pl\376=Yu\377\214\234\255\377\375\376\376"
- "\377\375\376\376\377\370\372\373\377\375\376\376\377Xo\207\3772Om\377"
- "%8M\363\34\37\40\307\0\0\0\0\0\0\0\0\0\0\0\0\37!\"\244\202\205\212\361"
- "A[v\375\216\236\256\377\375\376\376\377\312\322\331\377\375\376\376\377"
- "g|\222\377\363\365\367\377\375\376\376\377@Zv\377#3E\363\37\40#\261\0"
- "\0\0\0\0\0\0\0\0\0\0\0\35\37\"m]ac\361dw\213\376\230\247\266\377\253"
- "\267\303\377q\205\232\377\375\376\376\377\254\267\303\377\375\376\376"
- "\377\261\273\306\3774Ni\377\35$+\370\"'(\233\0\0\0\0\0\0\0\0\0\0\0\0"
- "\22\31\40\25""048\336ku\177\373Jc}\377;Wt\377f|\221\377\375\376\376\377"
- "\375\376\376\377\240\256\274\3776Ro\377!1B\376\35\37(\304!%(6\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\1\30\35#V<=B\364jw\205\3728Tp\377g}\223\377\375"
- "\376\376\377\235\253\270\3778Tq\377(>U\374\35%*\365\30\"+|\20\32$\3\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\32$\3\26\35$\225>BG\360Yaj\371n}\214"
- "\372\202\216\233\3740Ha\372$0=\372\35'-\364\24\40-\234\23\37+\31\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\23\32\32\31\37%e\36\40"
- "&\235\35\37$\310\33\35\37\372\35\36\"\337\36#(\264\32\36#\220\16\26\36"
- "&\20\32$\3\0\0\0\0\0\0\0\0\0\0\0\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (network_usb_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 network_usb_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 network_usb_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (512) */
- "\0\0\2\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (32) */
- "\0\0\0\40"
- /* width (8) */
- "\0\0\0\10"
- /* height (16) */
- "\0\0\0\20"
- /* pixel_data: */
- "\223\223\223\0]_[\344mok\340qso\340uwr\340xzv\340cea\344\223\223\223"
- "\0\223\223\223\0suq\340\243\245\241\377\254\255\251\377\265\266\262\377"
- "\275\276\273\377\205\207\203\340\223\223\223\0\223\223\223\0|~z\340U"
- "WS\377\246\247\244\377\254\256\253\377UWS\377\217\220\214\340\223\223"
- "\223\0\223\223\223\0\205\207\203\340\317\317\314\377\246\250\244\377"
- "\254\255\251\377\351\351\347\377\226\227\224\340\223\223\223\0\223\223"
- "\223\0\217\220\214\340\344\344\342\377\355\355\353\377\355\355\353\377"
- "\355\355\353\377\226\227\224\340\223\223\223\0)S\2175Fb\206\364Tp\225"
- "\363Tp\225\363Tp\225\363Tp\225\363Fb\206\364)S\2175=h\240\325q\236\316"
- "\377r\237\317\377r\237\317\377r\237\317\377r\237\317\377q\236\316\377"
- "=h\240\325Co\246\337r\237\317\377r\237\317\377r\237\317\377r\237\317"
- "\377r\237\317\377r\237\317\377Co\246\337Co\246\337r\237\317\377r\237"
- "\317\377r\237\317\377r\237\317\377r\237\317\377r\237\317\377Co\246\337"
- "Co\246\337r\237\317\377r\237\317\377r\237\317\377r\237\317\377r\237\317"
- "\377r\237\317\377Co\246\337Co\246\337r\237\317\377r\237\317\377r\237"
- "\317\377r\237\317\377r\237\317\377r\237\317\377Co\246\337Co\246\337r"
- "\237\317\377r\237\317\377r\237\317\377r\237\317\377r\237\317\377r\237"
- "\317\377Co\246\337Co\246\337r\237\317\377r\237\317\377r\237\317\377r"
- "\237\317\377r\237\317\377r\237\317\377Co\246\337Co\246\337r\237\317\377"
- "r\237\317\377r\237\317\377r\237\317\377r\237\317\377r\237\317\377Co\246"
- "\337Cn\246\335r\237\317\377r\237\317\377r\237\317\377r\237\317\377r\237"
- "\317\377r\237\317\377Cn\246\3354_\231\243Cn\246\335Co\246\337Co\246\337"
- "Co\246\337Co\246\337Cn\246\3354_\231\243"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (network_wired_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 network_wired_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 network_wired_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (1024) */
- "\0\0\4\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (64) */
- "\0\0\0@"
- /* width (16) */
- "\0\0\0\20"
- /* height (16) */
- "\0\0\0\20"
- /* pixel_data: */
- "\0\0\0\0\216\221\213a\213\214\210\366\211\213\206\376\211\213\206\376"
- "\211\213\206\376\211\213\206\376\211\213\206\376\211\213\206\376\211"
- "\213\206\376\211\213\206\376\211\213\206\376\211\213\206\376\211\213"
- "\206\376\213\214\210\366\216\221\213a\0\0\0\0\214\216\211\363\361\361"
- "\360\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\360\360\357\377\213"
- "\215\211\364\0\0\0\0\211\213\206\376\376\376\376\377\357\357\355\377"
- "\356\356\354\377\356\356\354\377\355\355\353\377\355\355\353\377\354"
- "\355\352\377\354\354\352\377\354\354\351\377\353\354\351\377\353\353"
- "\351\377\354\354\351\377\376\376\376\377\211\213\206\376\0\0\0\0\211"
- "\213\206\376\377\377\377\377\355\355\353\377\354\355\352\377\354\354"
- "\352\377\360\360\356\377\363\364\362\377\364\364\362\377\364\364\362"
- "\377\357\357\355\377\352\352\350\377\351\352\347\377\351\352\347\377"
- "\377\377\377\377\211\213\206\376\0\0\0\0\211\213\206\376\377\377\377"
- "\377\353\354\351\377\357\357\356\377\364\364\362\377\350\351\346\377"
- "\215\217\212\377\210\212\205\377\213\215\210\377\351\352\347\377\364"
- "\364\363\377\356\357\354\377\350\351\345\377\377\377\377\377\211\213"
- "\206\376\0\0\0\0\211\213\206\376\377\377\377\377\352\353\350\377\364"
- "\364\362\377\214\216\211\377\210\212\205\377JON\377.46\377JOO\377\233"
- "\236\230\377\254\257\250\377\364\365\363\377\346\347\344\377\377\377"
- "\377\377\211\213\206\376\0\0\0\0\211\213\206\376\377\377\377\377\351"
- "\351\346\377\364\364\363\377\210\212\205\377.46\377.46\377.46\377.46"
- "\377.46\377\272\275\266\377\365\365\364\377\345\346\342\377\377\377\377"
- "\377\211\213\206\376]^[\326VXS\377VXT\377VXT\377VXT\377VXS\377UWS\377"
- "Y[X\377CGE\377CGE\377CGE\377\272\275\266\377\365\366\364\377\343\345"
- "\341\377\377\377\377\377\211\213\206\376\\_Z\350\327\327\326\377\377"
- "\377\377\377\314\316\311\377\323\325\321\377\366\366\365\377\366\367"
- "\366\377VXS\377UWS\377\260\247Q\377UWS\377\272\275\266\377\366\367\365"
- "\377\342\344\337\377\377\377\377\377\211\213\206\376UWS\373\260\261\257"
- "\377\210\212\205\377\242\243\237\377\352\352\350\377\366\367\366\377"
- "\324\326\322\377VXT\377\272\275\266\377\272\275\266\377\272\275\266\377"
- "\275\300\271\377\367\370\366\377\341\342\336\377\377\377\377\377\211"
- "\213\206\376UWS\376\355\355\354\377\262\302\324\377\254\275\323\377\355"
- "\355\354\377\311\314\307\377\337\340\335\377VXT\377\367\370\366\377\367"
- "\370\367\377\367\370\367\377\370\370\367\377\354\355\352\377\337\341"
- "\334\377\377\377\377\377\211\213\206\376UWT\376y\230\277\377O{\261\377"
- "<l\250\377\254\275\323\377\323\325\321\377\261\262\260\377qtp\377\340"
- "\342\335\377\337\341\334\377\337\341\334\377\337\341\333\377\336\340"
- "\333\377\337\341\335\377\376\376\376\377\211\213\206\376Cc\211\377Q}"
- "\263\377\226\266\332\377Oz\261\377\262\301\325\377\263\265\261\377oq"
- "n\377\355\355\355\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\376\376\376\377\351\353\350\377\212"
- "\215\210\364Kw\255\375\226\266\332\377Kv\254\377Cc\212\377VXU\377efb"
- "\377\204\205\201\376\211\213\206\376\211\213\206\376\211\213\206\376"
- "\211\213\206\376\211\213\206\376\211\213\206\376\211\213\206\376\213"
- "\214\210\366\216\221\213a\226\266\332\377Jx\261\3649i\247\245\0\0\377"
- "\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0Gu\256\3559i\247\245\0\0\377\1\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (network_wireless_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 network_wireless_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 network_wireless_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (1024) */
- "\0\0\4\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (64) */
- "\0\0\0@"
- /* width (16) */
- "\0\0\0\20"
- /* height (16) */
- "\0\0\0\20"
- /* pixel_data: */
- "\0\0\0\0""9c\252\22""5j\252\30\0\0\0\0\0\0\0\0q\252\306\11q\234\325\22"
- "t\242\321\26t\242\321\26q\234\325\22q\252\306\11\0\0\0\0\0\0\0\0""5j"
- "\252\30""9c\252\22\0\0\0\0+U\252\6""2d\241.\0\200\200\2\200\237\277\10"
- "f\231\304\36b\215\311/q\242\3164o\242\3217o\242\3217q\242\3164b\215\311"
- "/f\231\304\36\200\237\277\10\0\200\200\2""2d\241.+U\252\6""2c\252$0h"
- "\247\40t\242\321\13d\225\307)V\206\274Ps\232\315Gs\237\317Pq\240\320"
- "Vq\240\320Vs\237\317Ps\232\315GV\206\274Pd\225\307)t\242\321\13""0h\247"
- "\40""2c\252$5g\246HKx\264\21s\234\316\37Q\201\267_e\222\304[q\236\320"
- "af\202\231\245\206\207\206\375^b_\373f\203\235\242q\236\320ae\222\304"
- "[Q\201\267_s\234\316\37Kx\264\21""5g\246H5e\244eh\242\321\26r\241\320"
- "1Jx\264\216q\240\320fq\236\316\214fhh\375\373\373\372\377\320\320\316"
- "\377`dc\374q\236\316\214q\240\320fJx\264\216r\241\3201h\242\321\26""5"
- "e\244e3e\245wm\240\314#q\236\316\77Fv\260\253q\235\315zq\236\314\256"
- "^a`\377\322\323\320\377\317\317\314\377`cb\377q\236\314\256q\235\315"
- "zFv\260\253q\236\316\77m\240\314#3e\245w6f\246va\215\275:s\241\316II"
- "y\263\253a\217\304\233y\230\266\324{\216\233\377\\`^\377]`^\377}\217"
- "\237\377y\230\266\324a\217\304\233Iy\263\253s\241\316Ia\215\275:6f\246"
- "v4e\246SGv\263hr\240\316N_\215\300\206Bs\254\330\201\213\222\371\270"
- "\310\332\377\221\252\301\377\221\252\301\377\270\310\332\377\177\215"
- "\226\365Bs\254\330_\215\300\206r\240\316NGv\263h4e\246S3f\246\24""8h"
- "\246\247m\230\312Rq\236\320lW{\250\323Lr\243\377\255\302\333\377\252"
- "\270\307\377\204\223\241\377\247\274\324\377Lr\243\377W{\250\323q\236"
- "\320lm\230\312R8h\246\2473f\246\24\0\0\0\0""4d\244k>n\255\244r\237\315"
- "e\206\214\215\345\254\271\312\377c\204\255\377Is\252\377Oy\260\377n\217"
- "\270\377\256\273\315\377\210\212\207\371r\237\315e>n\255\2444d\244k\0"
- "\0\0\0\0\0\0\0""3f\231\5""3e\245\244Uy\235\313\234\235\231\377\364\364"
- "\364\377\215\216\212\376\215\220\214\377\271\273\270\377\360\360\357"
- "\377\377\377\377\377\234\235\231\377Uy\235\3133e\245\2443f\231\5\0\0"
- "\0\0\0\0\0\0\0\0\0\0+U\252\6\205\211\206\367\326\326\325\377\327\330"
- "\326\377\333\333\332\377\370\371\370\377\333\333\332\377\263\264\261"
- "\377\303\305\303\377\324\324\323\377z\204\212\340+U\252\6\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\211\211\2046\226\230\224\377\377\377\377\377\373"
- "\373\372\377\353\353\353\377\323\324\322\377\300\301\276\377\260\261"
- "\256\377\246\250\244\377\366\366\366\377\226\230\224\377\211\211\206"
- "N\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\210\212\205\257\315\316\314\377\310"
- "\310\306\377\230\232\226\377\250\252\246\377\270\271\266\377\310\311"
- "\307\377\330\330\327\377\350\350\347\377\374\374\373\377\336\337\335"
- "\377\210\212\205\360\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\210\212\205\355"
- "\352\352\351\377\223\225\220\375\210\214\205I\210\210\205G\210\212\206"
- "i\210\212\204\213\210\213\205\255\207\213\205\327\223\225\220\377\347"
- "\350\347\377\210\212\205\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\211\213"
- "\205{\210\212\205\356\211\213\205\177\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\207\212\205q\210\212\205\356\211\213\205{\0\0\0\0\0"
- "\0\0\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (remote_arrow_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 remote_arrow_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 remote_arrow_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (1024) */
- "\0\0\4\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (64) */
- "\0\0\0@"
- /* width (16) */
- "\0\0\0\20"
- /* height (16) */
- "\0\0\0\20"
- /* pixel_data: */
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\253\254\251\377\202\204\177\377\202\204\177\377\202"
- "\204\177\377\202\204\177\377\202\204\177\377\202\204\177\377\202\204"
- "\177\377\202\204\177\377\265\266\263\377\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\202\204\177"
- "\377\310\310\307\377\353\361\367\377\353\361\367\377\353\361\367\377"
- "\353\361\367\377\353\361\367\377\353\361\367\377\326\326\326\377\202"
- "\204\177\377\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\202\204\177\377\353\361\367\377<]\244\377"
- "Bc\250\377Bc\250\377Bc\250\377Bc\250\377<]\244\377\356\364\370\377\202"
- "\204\177\377\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\202\204\177\377\354\362\370\377Bc\250\377"
- "r\230\314\377r\230\313\377r\230\314\377r\230\314\377Bc\250\377\354\362"
- "\370\377\202\204\177\377\253\254\251\377\202\204\177\377\202\204\177"
- "\377\202\204\177\377\202\204\177\377\202\204\177\377\202\204\177\377"
- "\202\204\177\377\202\204\177\377|\205\217\377]\206\302\377S}\274\377"
- "Fq\264\377Bc\250\377\354\362\370\377\202\204\177\377\202\204\177\377"
- "\310\310\307\377\353\361\367\377\353\361\367\377\353\361\367\377\353"
- "\361\367\377\353\361\367\377\353\361\367\377\326\326\326\377\202\204"
- "\177\377Dq\267\377Dq\267\377Dq\267\377Bc\250\377\353\361\367\377\202"
- "\204\177\377\202\204\177\377\353\361\367\377<]\244\377Bc\250\377Bc\250"
- "\377Bc\250\377Bc\250\377<]\244\377\356\364\370\377\202\204\177\377Bc"
- "\250\377Bc\250\377Bc\250\377<]\244\377\353\361\367\377\202\204\177\377"
- "\202\204\177\377\354\362\370\377Bc\250\377r\230\314\377r\230\313\377"
- "r\230\314\377r\230\314\377Bc\250\377\354\362\370\377\202\204\177\377"
- "\353\361\367\377\353\361\367\377\353\361\367\377\353\361\367\377\326"
- "\326\326\377\202\204\177\377\202\204\177\377\354\362\370\377Bc\250\377"
- "u\233\316\377]\206\302\377S}\274\377Fq\264\377Bc\250\377\354\362\370"
- "\377\202\204\177\377\202\204\177\377\202\204\177\377\202\204\177\377"
- "\202\204\177\377\202\204\177\377\302\303\300\377\202\204\177\377\354"
- "\362\370\377Bc\250\377Dr\266\377Dq\267\377Dq\267\377Dq\267\377Bc\250"
- "\377\353\361\367\377\202\204\177\377\353\353\353\377\353\353\353\377"
- "\353\353\353\377\206\251\306\377\5T\225\377j{\204\377\202\204\177\377"
- "\353\361\367\377<]\244\377Bc\250\377Bc\250\377Bc\250\377Bc\250\377<]"
- "\244\377\353\361\367\377k~\207\377\261\302\317\377\331\331\331\377\177"
- "\244\301\377\31y\265\377;\310\365\377\14_\240\377\202\204\177\377\326"
- "\326\326\377\353\361\367\377\353\361\367\377\353\361\367\377\353\361"
- "\367\377\353\361\367\377\353\361\367\377\326\326\326\377\27m\256\377"
- "\37\203\277\377Ky\231\377\37\203\277\377F\313\365\377'\207\300\377Sy"
- "\223\377\265\266\263\377\202\204\177\377\202\204\177\377\202\204\177"
- "\377\202\204\177\377\202\204\177\377\202\204\177\377\202\204\177\377"
- "\202\204\177\377\"|\273\377q\327\365\377@\220\300\377S\317\365\377-\220"
- "\313\377\235\304\340\377\377\377\377\0\202\204\177\377\363\363\363\377"
- "\353\353\353\377\353\353\353\377\353\353\353\377\353\353\353\377\353"
- "\353\353\377\353\353\353\377\355\355\355\377,\212\312\377e\304\351\377"
- "u\330\365\377D\221\300\377\220\301\342\377\377\377\377\0\377\377\377"
- "\0\202\204\177\377\331\331\331\377\331\331\331\377\331\331\331\377\331"
- "\331\331\377\331\331\331\377\331\331\331\377\331\331\331\377\331\331"
- "\331\3776\226\326\377\222\341\365\377y\316\355\377\223\341\365\377M\250"
- "\336\377\327\353\367\377\377\377\377\0\202\204\177\377\202\204\177\377"
- "\202\204\177\377\202\204\177\377\202\204\177\377\202\204\177\377\202"
- "\204\177\377\202\204\177\377\202\204\177\377X\224\270\377=\237\337\377"
- "=\237\337\377=\237\337\377=\237\337\377\330\353\370\377\377\377\377\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (remote_globe_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 remote_globe_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 remote_globe_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (1024) */
- "\0\0\4\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (64) */
- "\0\0\0@"
- /* width (16) */
- "\0\0\0\20"
- /* height (16) */
- "\0\0\0\20"
- /* pixel_data: */
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\364\371\376"
- "\377\245\324\365\377Y\252\354\377<\227\347\3770\217\346\377<\227\347"
- "\377Y\252\354\377\245\324\365\377\364\371\376\377\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\323\351"
- "\370\377K\234\341\377B\224\336\377k\263\330\377\202\301\330\377\212\305"
- "\324\377\220\336\260\377v\310\277\377F\234\323\377K\234\341\377\323\351"
- "\370\377\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\323"
- "\347\365\377>\213\316\377Y\237\316\377w\275\270\377\202\333\232\377y"
- "\274\320\377v\260\341\377\204\324\246\377\207\343\222\377\212\343\227"
- "\377d\267\270\377>\213\316\377\323\347\365\377\377\377\377\0\377\377"
- "\377\0\363\370\373\377F\207\304\377R\233\266\377T\245\247\377m\317\213"
- "\377\200\337\220\377x\274\307\377|\303\277\377\202\326\237\377\177\334"
- "\220\377t\336\201\377k\334x\377Y\256\244\377F\207\304\377\363\370\373"
- "\377\220\221\216\377ce`\377ce`\377ce`\377ce`\377ce`\377ce`\377ce`\377"
- "ce`\377g\211h\377P\225\242\377V\303v\377Q\327`\377V\322i\3772l\253\377"
- "\240\301\334\377ce`\377\264\264\263\377\343\354\364\377\343\354\364\377"
- "\343\354\364\377\343\354\364\377\343\354\364\377\343\354\364\377\307"
- "\307\307\377ce`\3770n\240\377@\311T\3774\262Y\377+\226m\377>\205\234"
- "\377Q}\256\377ce`\377\343\354\364\377)B\210\377-G\214\377-G\214\377-"
- "G\214\377-G\214\377)B\210\377\347\360\365\377ce`\377.\316=\377)\275A"
- "\377\34tw\377\33i\233\3774v\267\3771\\\217\377ce`\377\345\355\365\377"
- "-G\214\377Tz\272\377Tz\270\377Tz\272\377Tz\272\377-G\214\377\345\355"
- "\365\377ce`\377\27\204S\377\32\2672\377\21N\227\377\25yl\377(j\244\377"
- "$L\177\377ce`\377\345\355\365\377-G\214\377W}\274\377Bg\255\377:_\245"
- "\3770S\233\377-G\214\377\345\355\365\377ce`\377\23\210N\377\22\262)\377"
- "\16Sz\377\21\301\35\377#\246A\3770V\207\377ce`\377\345\355\365\377-G"
- "\214\377/T\235\377/S\237\377/S\237\377/S\237\377-G\214\377\343\354\364"
- "\377ce`\377\31\200q\377\25nk\377\17\2223\377\15\270\30\377\40\224B\377"
- "Nt\240\377ce`\377\343\354\364\377)B\210\377-G\214\377-G\214\377-G\214"
- "\377-G\214\377)B\210\377\343\354\364\377ce`\377+u\313\377\"b\256\377"
- "\21\253\33\377\23\253\34\377\40bk\377\235\270\322\377ce`\377\307\307"
- "\307\377\343\354\364\377\343\354\364\377\343\354\364\377\343\354\364"
- "\377\343\354\364\377\343\354\364\377\307\307\307\377ce`\377>\210\337"
- "\3771o\310\377\33\237\"\377\35}K\377Ao\246\377\363\367\371\377\234\235"
- "\232\377ce`\377ce`\377ce`\377ce`\377ce`\377ce`\377ce`\377ce`\377\\\177"
- "\242\377M\224\352\377>{\326\377${U\3771k\241\377\320\341\356\377\377"
- "\377\377\0ce`\377\356\356\356\377\343\343\343\377\343\343\343\377\343"
- "\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377\346\346"
- "\346\377ce`\377\77\203\334\377*h\270\377A{\273\377\320\342\360\377\377"
- "\377\377\0\377\377\377\0ce`\377\313\313\313\377\313\313\313\377\313\313"
- "\313\377\313\313\313\377\313\313\313\377\313\313\313\377\313\313\313"
- "\377\313\313\313\377ce`\377N\213\310\377\235\303\343\377\363\370\373"
- "\377\377\377\377\0\377\377\377\0\377\377\377\0ce`\377ce`\377ce`\377c"
- "e`\377ce`\377ce`\377ce`\377ce`\377ce`\377ce`\377\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (remote_sat_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 remote_sat_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 remote_sat_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (1024) */
- "\0\0\4\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (64) */
- "\0\0\0@"
- /* width (16) */
- "\0\0\0\20"
- /* height (16) */
- "\0\0\0\20"
- /* pixel_data: */
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\277\277\277\377\256\256\256\377\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\370\370\370\377z\177\214\377do\207\377`j\177\377inz\377\242\244"
- "\251\377\377\377\377\0\311\317\337\377{\202\222\377\244\244\246\377\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0u{\212\377\240\303\355\377\246\311\363\377\251\313\363\377"
- "\251\311\361\377\203\233\304\377V`\202\377js\217\377x\202\247\377\363"
- "\364\367\377\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\330\330\332\377\177\217\256\377\252\313\363\377\257\317"
- "\363\377\260\317\363\377\202\232\310\377\207\240\314\377\230\262\336"
- "\377s\207\262\377QYu\377\363\363\364\377\377\377\377\0\377\377\377\0"
- "\220\221\216\377ce`\377ce`\377ce`\377ce`\377ce`\377ce`\377ce`\377ce`"
- "\377}\204\210\377\221\247\320\377\232\262\334\377}\224\301\377TZi\377"
- "\352\352\352\377\377\377\377\0ce`\377\264\264\263\377\343\354\364\377"
- "\343\354\364\377\343\354\364\377\343\354\364\377\343\354\364\377\343"
- "\354\364\377\307\307\307\377ce`\377\311\336\367\377\241\270\336\377\214"
- "\244\317\377\244\277\345\377QUc\377\371\371\371\377ce`\377\343\354\364"
- "\377)B\210\377-G\214\377-G\214\377-G\214\377-G\214\377)B\210\377\347"
- "\360\365\377ce`\377\322\343\367\377\311\336\364\377\224\252\322\377\267"
- "\323\364\377\214\246\314\377orx\377ce`\377\345\355\365\377-G\214\377"
- "Tz\272\377Tz\270\377Tz\272\377Tz\272\377-G\214\377\345\355\365\377ce"
- "`\377\337\355\371\377\326\346\370\377\232\257\326\377\274\327\364\377"
- "\260\317\363\377NWk\377ce`\377\345\355\365\377-G\214\377W}\274\377Bg"
- "\255\377:_\245\3770S\233\377-G\214\377\345\355\365\377ce`\377\345\360"
- "\371\377\313\334\360\377\252\277\341\377\275\330\367\377\262\320\364"
- "\377l\201\244\377ce`\377\345\355\365\377-G\214\377/T\235\377/S\237\377"
- "/S\237\377/S\237\377-G\214\377\343\354\364\377ce`\377\222\240\274\377"
- "\273\313\343\377\303\330\363\377\275\330\364\377\260\320\364\377\\i\202"
- "\377ce`\377\343\354\364\377)B\210\377-G\214\377-G\214\377-G\214\377-"
- "G\214\377)B\210\377\343\354\364\377ce`\377ALv\377AMu\377Wd\214\377`r"
- "\233\377LXu\377rsu\377ce`\377\307\307\307\377\343\354\364\377\343\354"
- "\364\377\343\354\364\377\343\354\364\377\343\354\364\377\343\354\364"
- "\377\307\307\307\377ce`\377=Fg\3777@]\37749L\377BFO\377\235\235\235\377"
- "\377\377\377\0\234\235\232\377ce`\377ce`\377ce`\377ce`\377ce`\377ce`"
- "\377ce`\377ce`\377iq\201\377R^\207\377ISu\377\257\257\260\377\377\377"
- "\377\0\377\377\377\0\377\377\377\0ce`\377\356\356\356\377\343\343\343"
- "\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377"
- "\343\343\343\377\346\346\346\377ce`\377R^\207\377R^\207\377Z]e\377\377"
- "\377\377\0\377\377\377\0\377\377\377\0ce`\377\313\313\313\377\313\313"
- "\313\377\313\313\313\377\313\313\313\377\313\313\313\377\313\313\313"
- "\377\313\313\313\377\313\313\313\377ce`\377KUy\377;AQ\377\233\234\234"
- "\377\377\377\377\0\377\377\377\0\377\377\377\0ce`\377ce`\377ce`\377c"
- "e`\377ce`\377ce`\377ce`\377ce`\377ce`\377ce`\377\230\230\232\377\352"
- "\352\352\377\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (pipe_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 pipe_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 pipe_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (1024) */
- "\0\0\4\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (64) */
- "\0\0\0@"
- /* width (16) */
- "\0\0\0\20"
- /* height (16) */
- "\0\0\0\20"
- /* pixel_data: */
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0HKK\377egl\377HKK\377\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0OPP\377ty\202\377OPP\377\220\221"
- "\216\377ce`\377ce`\377ce`\377ce`\377ce`\377ce`\377ce`\377ce`\377ce`\377"
- "ce`\377aee\377\377\377\377\0PQQ\377ty\202\377PQQ\377ce`\377\264\264\263"
- "\377\343\354\364\377\343\354\364\377\343\354\364\377\343\354\364\377"
- "\343\354\364\377\343\354\364\377\343\354\364\377\343\354\364\377\307"
- "\307\307\377ce`\377\377\377\377\0PQQ\377ty\202\377PQQ\377ce`\377\343"
- "\354\364\377)B\210\377-G\214\377-G\214\377-G\214\377-G\214\377-G\214"
- "\377-G\214\377)B\210\377\347\360\365\377ce`\377\377\377\377\0PQQ\377"
- "ty\202\377PQQ\377ce`\377\343\354\364\377)B\210\377-G\214\377-G\214\377"
- "-G\214\377-G\214\377-G\214\377-G\214\377)B\210\377\347\360\365\377ce"
- "`\377\377\377\377\0KLM\377)B\210\377)B\210\377ce`\377\345\355\365\377"
- "-G\214\377\374\374\376\377Tz\272\377Tz\270\377Tz\272\377Tz\272\377Tz"
- "\272\377-G\214\377\345\355\365\377ce`\377\355\355\355\377JKL\377Tz\272"
- "\377/S\237\377ce`\377\345\355\365\377-G\214\377W}\274\377\374\374\376"
- "\377\373\374\375\377:_\245\3770S\233\3770S\233\377-G\214\377\345\355"
- "\365\377ce`\377UUY\377)B\210\377Tz\272\377/S\237\377ce`\377\345\355\365"
- "\377-G\214\377/T\235\377\373\374\375\377\373\374\375\377/S\237\377/S"
- "\237\377/S\237\377-G\214\377\343\354\364\377ce`\377gjr\377)B\210\377"
- "Tz\272\377/S\237\377ce`\377\343\354\364\377)B\210\377\373\373\375\377"
- "-G\214\377-G\214\377\373\373\375\377\373\373\375\377\373\373\375\377"
- ")B\210\377\343\354\364\377ce`\377\345\345\345\377JKL\377Tz\272\377/S"
- "\237\377ce`\377\343\354\364\377)B\210\377-G\214\377-G\214\377-G\214\377"
- "-G\214\377-G\214\377-G\214\377)B\210\377\343\354\364\377ce`\377\377\377"
- "\377\0KLM\377)B\210\377)B\210\377ce`\377\343\354\364\377)B\210\377-G"
- "\214\377-G\214\377-G\214\377-G\214\377-G\214\377-G\214\377)B\210\377"
- "\343\354\364\377ce`\377\377\377\377\0PQQ\377ty\202\377PQQ\377ce`\377"
- "\307\307\307\377\343\354\364\377\343\354\364\377\343\354\364\377\343"
- "\354\364\377\343\354\364\377\343\354\364\377\343\354\364\377\343\354"
- "\364\377\307\307\307\377ce`\377\377\377\377\0PQQ\377ty\202\377PQQ\377"
- "\234\235\232\377ce`\377ce`\377ce`\377ce`\377ce`\377ce`\377ce`\377ce`"
- "\377ce`\377ce`\377\255\256\252\377\377\377\377\0PQQ\377ty\202\377PQQ"
- "\377\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0OPP\377ty\202\377OPP"
- "\377\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0JIL\377fkp\377JIL\377"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (capture_interfaces_16_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 capture_interfaces_16_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 capture_interfaces_16_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (1024) */
- "\0\0\4\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (64) */
- "\0\0\0@"
- /* width (16) */
- "\0\0\0\20"
- /* height (16) */
- "\0\0\0\20"
- /* pixel_data: */
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\231\231`\231\231\231\277\263\263"
- "\263\377\263\263\263\377\263\263\263\377\263\263\263\377\231\231\231"
- "\277\231\231\231`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231"
- "\231\231\40\241\241\241\317\314\314\314\377\371\371\371\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\371\371\371\377"
- "\314\314\314\377\241\241\241\317\231\231\231\40\0\0\0\0\0\0\0\0\0\0\0"
- "\0\231\231\231\40\240\240\240\357\354\354\354\377\377\377\377\377\323"
- "\323\323\377\220\220\220\377zzz\377zzz\377\220\220\220\377\323\323\323"
- "\377\377\377\377\377\354\354\354\377\240\240\240\357\231\231\231\40\0"
- "\0\0\0\0\0\0\0\241\241\241\317\354\354\354\377\377\377\377\377\233\233"
- "\233\377MMM\377MMM\377MMM\377MMM\377MMM\377MMM\377\233\233\233\377\377"
- "\377\377\377\354\354\354\377\241\241\241\317\0\0\0\0\231\231\231`\314"
- "\314\314\377\377\377\377\377\233\233\233\377MMM\377MMM\377MMM\377MMM"
- "\377MMM\377MMM\377MMM\377MMM\377\233\233\233\377\377\377\377\377\314"
- "\314\314\377\231\231\231`\231\231\231\277\371\371\371\377\323\323\323"
- "\377MMM\377\323\323\323\377zzz\377\323\323\323\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377zzz\377MMM\377\323\323\323"
- "\377\371\371\371\377\231\231\231\277\263\263\263\377\377\377\377\377"
- "\220\220\220\377MMM\377nnn\377XXX\377nnn\377zzz\377zzz\377zzz\377zzz"
- "\377XXX\377MMM\377\220\220\220\377\377\377\377\377\263\263\263\377\263"
- "\263\263\377\377\377\377\377zzz\377MMM\377\323\323\323\377zzz\377\323"
- "\323\323\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377zzz\377MMM\377zzz\377\377\377\377\377\263\263\263\377\263\263"
- "\263\377\377\377\377\377zzz\377MMM\377nnn\377XXX\377nnn\377zzz\377zz"
- "z\377zzz\377zzz\377XXX\377MMM\377zzz\377\377\377\377\377\263\263\263"
- "\377\263\263\263\377\377\377\377\377\220\220\220\377MMM\377\323\323\323"
- "\377zzz\377\323\323\323\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377zzz\377MMM\377\220\220\220\377\377\377\377\377\263"
- "\263\263\377\231\231\231\277\371\371\371\377\323\323\323\377MMM\377n"
- "nn\377XXX\377nnn\377zzz\377zzz\377zzz\377zzz\377XXX\377MMM\377\323\323"
- "\323\377\371\371\371\377\231\231\231\277\231\231\231`\314\314\314\377"
- "\377\377\377\377\233\233\233\377MMM\377MMM\377MMM\377MMM\377MMM\377M"
- "MM\377MMM\377MMM\377\233\233\233\377\377\377\377\377\314\314\314\377"
- "\231\231\231`\0\0\0\0\241\241\241\317\354\354\354\377\377\377\377\377"
- "\233\233\233\377MMM\377MMM\377MMM\377MMM\377MMM\377MMM\377\233\233\233"
- "\377\377\377\377\377\354\354\354\377\241\241\241\317\0\0\0\0\0\0\0\0"
- "\231\231\231\40\240\240\240\357\354\354\354\377\377\377\377\377\323\323"
- "\323\377\220\220\220\377zzz\377zzz\377\220\220\220\377\323\323\323\377"
- "\377\377\377\377\354\354\354\377\240\240\240\357\231\231\231\40\0\0\0"
- "\0\0\0\0\0\0\0\0\0\231\231\231\40\241\241\241\317\314\314\314\377\371"
- "\371\371\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\371\371\371\377\314\314\314\377\241\241\241\317\231\231\231"
- "\40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\231\231`\231"
- "\231\231\277\263\263\263\377\263\263\263\377\263\263\263\377\263\263"
- "\263\377\231\231\231\277\231\231\231`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (capture_interfaces_24_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 capture_interfaces_24_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 capture_interfaces_24_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (2304) */
- "\0\0\11\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (96) */
- "\0\0\0`"
- /* width (24) */
- "\0\0\0\30"
- /* height (24) */
- "\0\0\0\30"
- /* pixel_data: */
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\231\231"
- "P\231\231\231\237\231\231\231\337\231\231\231\377\231\231\231\377\231"
- "\231\231\377\231\231\231\377\231\231\231\337\231\231\231\237\231\231"
- "\231P\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\231\231@\231\231\231\337\237\237"
- "\237\377\306\306\306\377\346\346\346\377\371\371\371\377\377\377\377"
- "\377\377\377\377\377\371\371\371\377\346\346\346\377\306\306\306\377"
- "\237\237\237\377\231\231\231\337\231\231\231@\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\231\231\217\237"
- "\237\237\377\322\322\322\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\322\322\322\377"
- "\237\237\237\377\231\231\231\217\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\231\231\231\237\254\254\254\377\354\354\354\377"
- "\377\377\377\377\377\377\377\377\364\364\364\377\261\261\261\377\205"
- "\205\205\377zzz\377zzz\377\205\205\205\377\261\261\261\377\364\364\364"
- "\377\377\377\377\377\377\377\377\377\354\354\354\377\254\254\254\377"
- "\231\231\231\237\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\231\231"
- "\217\254\254\254\377\371\371\371\377\377\377\377\377\377\377\377\377"
- "\246\246\246\377XXX\377MMM\377MMM\377MMM\377MMM\377MMM\377MMM\377XXX"
- "\377\246\246\246\377\377\377\377\377\377\377\377\377\371\371\371\377"
- "\254\254\254\377\231\231\231\217\0\0\0\0\0\0\0\0\0\0\0\0\231\231\231"
- "@\237\237\237\377\354\354\354\377\377\377\377\377\364\364\364\377nnn"
- "\377MMM\377MMM\377MMM\377MMM\377MMM\377MMM\377MMM\377MMM\377MMM\377M"
- "MM\377nnn\377\364\364\364\377\377\377\377\377\354\354\354\377\237\237"
- "\237\377\231\231\231@\0\0\0\0\0\0\0\0\231\231\231\337\322\322\322\377"
- "\377\377\377\377\377\377\377\377nnn\377MMM\377MMM\377MMM\377MMM\377M"
- "MM\377MMM\377MMM\377MMM\377MMM\377MMM\377MMM\377MMM\377nnn\377\377\377"
- "\377\377\377\377\377\377\322\322\322\377\231\231\231\337\0\0\0\0\231"
- "\231\231P\237\237\237\377\377\377\377\377\377\377\377\377\246\246\246"
- "\377MMM\377\220\220\220\377\246\246\246\377MMM\377MMM\377\220\220\220"
- "\377\246\246\246\377\246\246\246\377\246\246\246\377\246\246\246\377"
- "\246\246\246\377\246\246\246\377\246\246\246\377MMM\377\246\246\246\377"
- "\377\377\377\377\377\377\377\377\237\237\237\377\231\231\231P\231\231"
- "\231\237\306\306\306\377\377\377\377\377\364\364\364\377XXX\377MMM\377"
- "\323\323\323\377\377\377\377\377MMM\377MMM\377\323\323\323\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377MMM\377XXX\377\364\364\364\377\377"
- "\377\377\377\306\306\306\377\231\231\231\237\231\231\231\337\346\346"
- "\346\377\377\377\377\377\261\261\261\377MMM\377MMM\377nnn\377zzz\377"
- "MMM\377MMM\377nnn\377zzz\377zzz\377zzz\377zzz\377zzz\377zzz\377zzz\377"
- "MMM\377MMM\377\261\261\261\377\377\377\377\377\346\346\346\377\231\231"
- "\231\337\231\231\231\377\371\371\371\377\377\377\377\377\205\205\205"
- "\377MMM\377MMM\377\220\220\220\377\246\246\246\377MMM\377MMM\377\220"
- "\220\220\377\246\246\246\377\246\246\246\377\246\246\246\377\246\246"
- "\246\377\246\246\246\377\246\246\246\377\246\246\246\377MMM\377MMM\377"
- "\205\205\205\377\377\377\377\377\371\371\371\377\231\231\231\377\231"
- "\231\231\377\377\377\377\377\377\377\377\377zzz\377MMM\377MMM\377\323"
- "\323\323\377\377\377\377\377MMM\377MMM\377\323\323\323\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377MMM\377MMM\377zzz\377\377\377\377\377"
- "\377\377\377\377\231\231\231\377\231\231\231\377\377\377\377\377\377"
- "\377\377\377zzz\377MMM\377MMM\377nnn\377zzz\377MMM\377MMM\377nnn\377"
- "zzz\377zzz\377zzz\377zzz\377zzz\377zzz\377zzz\377MMM\377MMM\377zzz\377"
- "\377\377\377\377\377\377\377\377\231\231\231\377\231\231\231\377\371"
- "\371\371\377\377\377\377\377\205\205\205\377MMM\377MMM\377zzz\377\246"
- "\246\246\377MMM\377MMM\377zzz\377\246\246\246\377\246\246\246\377\246"
- "\246\246\377\246\246\246\377\246\246\246\377\246\246\246\377\246\246"
- "\246\377MMM\377MMM\377\205\205\205\377\377\377\377\377\371\371\371\377"
- "\231\231\231\377\231\231\231\337\346\346\346\377\377\377\377\377\261"
- "\261\261\377MMM\377MMM\377\246\246\246\377\377\377\377\377MMM\377MMM"
- "\377\246\246\246\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377MMM\377"
- "MMM\377\261\261\261\377\377\377\377\377\346\346\346\377\231\231\231\337"
- "\231\231\231\237\306\306\306\377\377\377\377\377\364\364\364\377XXX\377"
- "MMM\377ccc\377zzz\377MMM\377MMM\377ccc\377zzz\377zzz\377zzz\377zzz\377"
- "zzz\377zzz\377zzz\377MMM\377XXX\377\364\364\364\377\377\377\377\377\306"
- "\306\306\377\231\231\231\237\231\231\231P\237\237\237\377\377\377\377"
- "\377\377\377\377\377\246\246\246\377MMM\377MMM\377MMM\377MMM\377MMM\377"
- "MMM\377MMM\377MMM\377MMM\377MMM\377MMM\377MMM\377MMM\377MMM\377\246\246"
- "\246\377\377\377\377\377\377\377\377\377\237\237\237\377\231\231\231"
- "P\0\0\0\0\231\231\231\337\314\314\314\377\377\377\377\377\377\377\377"
- "\377nnn\377MMM\377MMM\377MMM\377MMM\377MMM\377MMM\377MMM\377MMM\377M"
- "MM\377MMM\377MMM\377MMM\377nnn\377\377\377\377\377\377\377\377\377\314"
- "\314\314\377\231\231\231\337\0\0\0\0\0\0\0\0\231\231\231@\237\237\237"
- "\377\354\354\354\377\377\377\377\377\364\364\364\377nnn\377MMM\377MM"
- "M\377MMM\377MMM\377MMM\377MMM\377MMM\377MMM\377MMM\377MMM\377nnn\377"
- "\364\364\364\377\377\377\377\377\354\354\354\377\237\237\237\377\231"
- "\231\231@\0\0\0\0\0\0\0\0\0\0\0\0\231\231\231\217\254\254\254\377\371"
- "\371\371\377\377\377\377\377\377\377\377\377\246\246\246\377XXX\377M"
- "MM\377MMM\377MMM\377MMM\377MMM\377MMM\377XXX\377\246\246\246\377\377"
- "\377\377\377\377\377\377\377\371\371\371\377\254\254\254\377\231\231"
- "\231\217\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\231\231\237\254"
- "\254\254\377\354\354\354\377\377\377\377\377\377\377\377\377\364\364"
- "\364\377\261\261\261\377\205\205\205\377zzz\377zzz\377\205\205\205\377"
- "\261\261\261\377\364\364\364\377\377\377\377\377\377\377\377\377\354"
- "\354\354\377\254\254\254\377\231\231\231\237\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\231\231\217\237\237\237\377\322"
- "\322\322\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\322\322\322\377\237\237\237\377"
- "\231\231\231\217\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\231\231\231@\231\231\231\337\237\237\237\377\306"
- "\306\306\377\346\346\346\377\371\371\371\377\377\377\377\377\377\377"
- "\377\377\371\371\371\377\346\346\346\377\306\306\306\377\237\237\237"
- "\377\231\231\231\337\231\231\231@\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\231"
- "\231P\231\231\231\237\231\231\231\337\231\231\231\377\231\231\231\377"
- "\231\231\231\377\231\231\231\377\231\231\231\337\231\231\231\237\231"
- "\231\231P\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (gnome_emblem_web_16_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 gnome_emblem_web_16_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 gnome_emblem_web_16_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (1024) */
- "\0\0\4\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (64) */
- "\0\0\0@"
- /* width (16) */
- "\0\0\0\20"
- /* height (16) */
- "\0\0\0\20"
- /* pixel_data: */
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\40P\200\20\40"
- "K\206_\"K\212\230%N\212\324%O\213\321\"M\210\226!I\210^'N\211\15\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\37K\210K*T\211\355e\205\216\367\213\244q\376"
- "\235\262Y\377\241\271\224\377w\226\277\376Vy\251\365&P\214\353\36H\205"
- "C\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0#N\211\223\\{u\371\223\253\212\377\222\254\222\377\220\253}\377\230"
- "\260b\377\215\255\253\377\207\251\324\377\243\273\220\377\237\267x\377"
- "Hk\207\367$M\213\210\377\377\377\0\377\377\377\0\377\377\377\0\40J\207"
- "HUv{\367\235\262d\377\221\255w\377\223\260{\377|\240\275\377\201\245"
- "\323\377\210\251\314\377\215\254\250\377\234\267\200\377\261\305=\377"
- "\250\274>\377Ej\207\367\37K\205A\377\377\377\0\40P\200\20(R\212\354\232"
- "\2576\377\245\270.\377\247\273A\377\203\245\235\377z\237\317\377\204"
- "\250\325\377\215\257\331\377\256\307t\377\274\320@\377\264\3079\377\253"
- "\2763\377\235\262D\377(P\212\351+@\200\14\40K\206_i\207\200\367\235\260"
- ")\377\237\2649\377n\223\255\377m\225\307\377w\235\315\377\177\243\322"
- "\377\221\261\267\377\243\277\210\377\210\251\251\377\227\262s\377\246"
- "\273<\377\242\265-\377d\204\203\367\40I\207W!K\211\231\211\241^\377\201"
- "\235l\377i\217\227\377_\211\276\377h\220\304\377p\227\311\377v\234\314"
- "\377\230\266\225\377\302\325B\377\261\307Q\377\237\267^\377\237\265F"
- "\377\234\261;\377\205\237f\376\40K\207\216\"K\210\325\222\251V\377b\207"
- "\223\377Q}\266\377Y\204\273\377a\213\300\377h\220\304\377m\224\305\377"
- "\271\315H\377\275\320\77\377\267\312;\377\260\3036\377\222\254W\377\234"
- "\2604\377\203\237\224\377\"M\211\313!L\211\323y\230\257\377q\222q\377"
- "k\217\177\377s\226\202\377Y\204\273\377^\210\276\377e\216\272\377\261"
- "\306F\377\267\312;\377\263\3068\377\255\3004\377\243\2663\377\202\236"
- "^\377u\224\276\377!L\211\311\40L\207\227`\204\262\376R|\263\377\211\241"
- "H\377\243\266-\377\205\243g\377W\202\264\377X\203\272\377l\221\236\377"
- "r\226\223\377\234\264O\377\251\2741\377\242\265,\377z\231s\377_\201\260"
- "\375!I\207\214!I\210^Mr\244\364b\207\267\377\227\2540\377\237\262*\377"
- "\245\270.\377\237\265\77\377N{\262\377N{\264\377Mz\263\377|\234n\377"
- "\244\267.\377\234\260,\377k\217\271\377Hm\240\364!J\210V$I\200\16%O\214"
- "\353p\221\274\377i\213z\377\235\260)\377\237\262+\377\207\242R\377Cq"
- "\255\377Dr\255\377Cq\255\377l\216u\377\237\262*\377\227\2545\377m\216"
- "\271\377$M\212\347\32M\200\12\377\377\377\0!I\207F7^\225\364u\225\300"
- "\377\223\2518\377\234\257+\377Py\206\3778i\247\3779i\247\3778i\247\377"
- "\\\201y\377\235\260)\377\204\240\207\3774Z\223\366\40I\206\77\377\377"
- "\377\0\377\377\377\0\377\377\377\0!L\210\2157]\224\364\225\253C\377\211"
- "\243Z\377Mx\257\377\77m\251\377\77m\251\377Mx\257\377i\215\254\377\213"
- "\243b\3779_\220\364!M\211\202\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\36H\205C4[~\354Nr\240\363_\202\261\376"
- "p\220\273\377p\220\273\377^\201\257\375In\241\363%P\213\346\"H\210<\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0+@\200\14\40I\207W\40J\210\220\"L\211\315!K\211"
- "\313!J\210\215!J\210V\32M\200\12\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (gnome_emblem_web_24_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 gnome_emblem_web_24_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 gnome_emblem_web_24_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (2304) */
- "\0\0\11\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (96) */
- "\0\0\0`"
- /* width (24) */
- "\0\0\0\30"
- /* height (24) */
- "\0\0\0\30"
- /* pixel_data: */
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\1!I\207F\"L\207"
- "\200%N\213\300\"M\211\360\"L\210\365%P\213\312!L\211\212\37K\206R+U\200"
- "\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\"M\210\36\"M\212\310Ch\213\365"
- "y\225{\376\216\247r\377\243\270`\377\256\304|\377\204\241\310\377i\212"
- "\267\375Ej\236\364#M\212\335\37I\2071\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0!I\206e5[\200"
- "\364\202\234{\376\231\260\205\377\217\253\222\377\227\255I\377\247\273"
- "4\377\236\272\205\377\205\247\322\377\213\253\323\377\241\272\250\377"
- "\214\246\223\3760W\210\366!L\210\203\0U\252\3\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\37J\207S@d\204\366\232\260l"
- "\377\212\250\254\377\210\247\205\377r\231\312\377\216\251i\377\203\244"
- "\303\377\206\247\270\377\177\243\313\377\223\261\231\377\242\273j\377"
- "\256\302G\377\245\272^\377Nr\217\366\"L\207\200\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0$I\206\25)Q\201\362\234\260F\377\234"
- "\263P\377\224\256f\377\264\3079\377\202\244\260\377}\242\321\377\204"
- "\250\325\377\212\254\314\377\217\253\220\377\225\263\236\377\236\272"
- "v\377\264\3079\377\256\3015\377\243\270K\377/W\206\365!H\205.\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\"L\211\266\201\232`\375\242"
- "\265,\377\250\2730\377\253\2779\377\210\250\217\377x\234\277\377}\242"
- "\321\377\205\251\326\377\213\256\331\377\225\265\260\377\277\323D\377"
- "\273\316>\377\265\3109\377\257\3025\377\250\2731\377\220\250^\377\"L"
- "\211\33333\231\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\36K\207\"6\\\202\370"
- "\234\257-\377\242\265,\377\245\2713\377v\232\234\377k\223\306\377s\231"
- "\312\377z\237\317\377\200\244\323\377\203\247\324\377\277\323V\377\211"
- "\252\263\377\221\257\217\377\243\274Y\377\256\3015\377\250\2730\377\241"
- "\264/\377Di\220\364\37H\206J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0!K\207Uh"
- "\206m\370\235\260)\377\235\2613\377w\230\205\377`\212\277\377h\220\304"
- "\377n\226\310\377t\233\313\377y\236\316\377|\240\314\377\252\304r\377"
- "\265\313S\377\221\257\211\377\204\244\222\377\220\254h\377\247\2720\377"
- "\241\264,\377t\220v\375\40J\207\177\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0!"
- "K\211\214\204\234W\377w\226\215\377R~\254\377W\202\263\377\\\207\275"
- "\377c\214\301\377i\221\304\377n\225\307\377q\230\311\377\234\270\202"
- "\377\300\323A\377\275\320\77\377\270\313;\377\262\3058\377\233\263O\377"
- "\242\2664\377\211\244]\377\204\235q\377\"M\211\276\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0!L\211\311\210\241a\377\202\234]\377U\177\237\377Q}\266"
- "\377W\202\272\377]\207\275\377b\214\300\377g\217\303\377i\221\305\377"
- "\261\307O\377\274\317>\377\271\314<\377\265\310:\377\260\3036\377\251"
- "\2755\377\207\243^\377\235\260-\377\200\235\254\377!K\210\355\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0!L\211\274c\205\264\377g\213\216\377q\221k\377"
- "n\221|\377q\224\204\377\\\205\257\377[\206\274\377_\211\276\377a\213"
- "\277\377\253\302N\377\270\313;\377\266\311:\377\262\3057\377\255\300"
- "4\377\250\2731\377\220\250H\377p\220z\377v\226\300\377!K\211\343\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0!J\210|Ot\246\374_\206\267\377Dr\244\377"
- "\230\2566\377\244\267.\377\216\250W\377V\201\263\377W\202\272\377Y\204"
- "\273\377k\221\242\377\224\257e\377\210\247s\377\255\3007\377\252\275"
- "2\377\246\271/\377\241\264+\377l\216\213\377`\203\261\377\"K\210\256"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\40J\207H<c\231\363j\215\273\377Py\212"
- "\377\235\260)\377\242\265,\377\246\271/\377\227\256K\377i\216\220\377"
- "Q}\266\377R~\266\377Q}\266\377P|\265\377\237\265A\377\247\2720\377\243"
- "\266-\377\202\235P\377`\207\270\377Lp\244\371\40K\206p\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0$I\206\25%N\211\370t\225\277\377Ox\226\377\233\256"
- "*\377\236\261*\377\242\265-\377\246\271/\377\216\250R\377Iv\261\377I"
- "w\261\377Iw\261\377Hu\260\377\203\240^\377\244\267.\377\240\263+\377"
- "k\215m\377u\226\301\377/W\220\365\40I\2118\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\40J\207\206Ag\233\366p\222\277\377_\204r\377\235\260)"
- "\377\237\262*\377\242\265,\377j\216t\377Ap\254\377Ap\254\377Ap\254\377"
- "@o\253\377~\234Y\377\240\263+\377\234\257)\377{\231\203\377Rv\250\372"
- "!L\207\263\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""33\231\5"
- "!K\210\333_\202\261\376_\206\267\377\217\2469\377\235\260)\377\211\242"
- "B\377Fr\224\3779i\247\3779i\247\3779i\247\3778h\246\377p\220`\377\235"
- "\260)\377\212\242L\377l\216\272\377!L\210\357&M\214\24\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\36Ax3%N\211\365\\\200\257"
- "\376\221\250O\377\235\260)\377\\\201t\3774e\244\3774e\244\3774e\244\377"
- "4e\244\3774e\244\377S|\207\377\235\260)\377w\225\210\377*S\215\365\35"
- "BxY\0\0\0\7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\13"
- "\0\0\0\22\26""4\\E\40I\205\337r\216[\373\214\244d\377k\217\271\377\\"
- "\203\266\377Nx\257\377Lw\257\377[\202\265\377i\215\273\377v\227\272\377"
- "Ps\226\371\40J\206\356\30""6c_\0\0\0\33\0\0\0\24\0\0\0\14\0\0\0\4\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\0\0\0\20\0\0\0\30\0\0\0\40\6\6\13-\34@"
- "r\234#M\207\3727^\224\365Lq\243\373_\202\261\377b\204\263\377Os\245\375"
- ":`\226\365&O\212\372\35Cy\270\10\21\35=\0\0\0*\0\0\0\"\0\0\0\32\0\0\0"
- "\21\0\0\0\11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\0\0\0\16\0\0\0\26\0\0\0"
- "\36\0\0\0%\0\0\0-\4\15\31=\21)Mj\30""8f\226\35Dz\310\36D|\317\30""9i"
- "\241\23+Pv\7\21\37K\0\0\0""6\0\0\0.\0\0\0'\0\0\0\37\0\0\0\27\0\0\0\17"
- "\0\0\0\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\13\0\0\0\23\0"
- "\0\0\31\0\0\0\37\0\0\0$\0\0\0)\0\0\0-\0\0\0/\0\0\0""0\0\0\0/\0\0\0-\0"
- "\0\0*\0\0\0%\0\0\0\40\0\0\0\32\0\0\0\23\0\0\0\10\0\0\0\1\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\7"
- "\0\0\0\14\0\0\0\20\0\0\0\23\0\0\0\26\0\0\0\27\0\0\0\25\0\0\0\22\0\0\0"
- "\17\0\0\0\13\0\0\0\6\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (toolbar_wireshark_file_16_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 toolbar_wireshark_file_16_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 toolbar_wireshark_file_16_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (1024) */
- "\0\0\4\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (64) */
- "\0\0\0@"
- /* width (16) */
- "\0\0\0\20"
- /* height (16) */
- "\0\0\0\20"
- /* pixel_data: */
- "\377\377\377\0\210\212\205\377\210\212\205\377\210\212\205\377\210\212"
- "\205\377\210\212\205\377\210\212\205\377\210\212\205\377\210\212\205"
- "\377\210\212\205\377\213\215\207\373\223\222\215I\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\210\212\205\377F\257"
- "\343\377\77\254\343\3778\252\343\3772\247\343\377+\245\343\377%\243\343"
- "\377\37\240\343\377\31\236\342\3770\227\300\377\217\221\212\372\222\222"
- "\214J\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\210\212"
- "\205\377O\262\343\377G\257\343\377@\254\343\377:\252\342\3774\250\342"
- "\377-\246\343\377&\243\343\377!\241\343\377\33\237\334\377\343\343\327"
- "\377\220\222\214\372\221\221\213J\377\377\377\0\377\377\377\0\377\377"
- "\377\0\210\212\205\377W\265\343\377O\262\343\377I\260\342\377_\272\344"
- "\377\226\322\356\377Y\270\346\377.\246\342\377(\244\343\377#\242\341"
- "\377\355\354\331\377\325\324\305\377\216\220\212\371\207\207\203=\377"
- "\377\377\0\377\377\377\0\210\212\205\377`\270\344\377X\265\342\377h\275"
- "\346\377\266\337\363\377\377\377\376\377N\263\344\3776\251\337\3770\247"
- "\342\377)\244\343\377$\242\343\377\36\240\342\377>\235\302\376\207\212"
- "\205\365\377\377\377\0\377\377\377\1\210\212\205\377q\277\344\377k\275"
- "\342\377\222\317\354\377\377\377\375\377\377\377\374\377k\277\346\377"
- "J\261\341\377D\256\341\377>\255\343\3778\253\344\3773\251\345\3779\253"
- "\336\376\210\212\205\377\377\377\377\1\377\377\377\6\210\212\205\377"
- "\233\321\351\377\231\322\351\377\305\345\362\377\377\377\373\377\377"
- "\377\372\377\215\315\352\377\201\311\350\377}\307\351\377y\305\351\377"
- "u\304\351\377p\302\353\377m\301\346\376\210\212\205\377\377\377\377\3"
- "\377\377\377\0\210\212\205\377\377\377\370\376\377\377\365\377\377\377"
- "\370\377\377\377\371\377\377\377\370\377\377\377\367\377\377\377\365"
- "\377\377\377\370\377\377\377\371\377\377\377\372\377\377\377\372\377"
- "\377\377\362\356\210\212\205\377\377\377\377\0\377\377\377\0\210\212"
- "\205\377\377\377\365\376\371\371\354\377\347\347\336\377\346\346\337"
- "\377\360\360\347\377\354\354\341\377\351\351\335\377\364\364\352\377"
- "\362\362\352\377\343\343\335\377\344\344\337\377\362\362\344\357\210"
- "\212\205\377\377\377\377\0\377\377\377\0\210\212\205\377\377\377\365"
- "\376\275\275\266\377\221\221\216\377\307\307\277\377\320\320\307\377"
- "\220\220\215\377\316\316\302\377\355\355\342\377\246\246\242\377\223"
- "\223\220\377\312\312\304\377\343\342\324\360\210\212\205\377\377\377"
- "\377\0\377\377\377\0\210\212\205\377\370\370\356\376\207\207\207\377"
- "\257\257\251\377\215\215\211\377\350\350\332\377\220\220\215\377\315"
- "\315\300\377\316\316\304\377\237\237\233\377\221\221\216\377\236\236"
- "\231\377\330\327\311\360\210\212\205\377\377\377\377\0\377\377\377\0"
- "\210\212\205\377\353\353\340\376\235\235\232\377\334\334\317\377\205"
- "\205\203\377\377\377\355\377\236\236\231\377\325\325\305\377\301\301"
- "\270\377\273\273\264\377\260\260\250\377\217\217\212\377\333\332\312"
- "\360\210\212\205\377\377\377\377\0\377\377\377\0\210\212\205\377\377"
- "\377\360\376\231\231\230\377\233\233\230\377\257\257\247\377\332\332"
- "\313\377\216\216\214\377\237\237\231\377\351\351\330\377\223\223\221"
- "\377\205\205\203\377\310\310\275\377\346\345\325\357\210\212\205\377"
- "\377\377\377\0\377\377\377\0\210\212\205\377\377\377\357\376\370\370"
- "\345\377\351\351\330\377\377\377\351\377\361\361\337\377\342\341\322"
- "\377\340\337\317\377\377\377\352\377\361\361\337\377\360\360\335\377"
- "\366\366\342\377\362\361\336\356\210\212\205\377\377\377\377\0\377\377"
- "\377\0\210\212\205\377\377\377\355\376\377\376\350\377\377\376\350\377"
- "\377\376\350\377\377\376\350\377\377\375\345\377\376\373\344\377\377"
- "\376\347\377\377\376\350\377\377\377\350\377\375\375\346\377\367\366"
- "\341\356\210\212\205\377\377\377\377\0\377\377\377\0\210\212\205\377"
- "\210\212\205\377\210\212\205\377\210\212\205\377\210\212\205\377\210"
- "\212\205\377\210\212\205\377\210\212\205\377\210\212\205\377\210\212"
- "\205\377\210\212\205\377\210\212\205\377\210\212\205\377\210\212\205"
- "\377\377\377\377\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (toolbar_wireshark_file_24_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 toolbar_wireshark_file_24_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 toolbar_wireshark_file_24_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (2304) */
- "\0\0\11\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (96) */
- "\0\0\0`"
- /* width (24) */
- "\0\0\0\30"
- /* height (24) */
- "\0\0\0\30"
- /* pixel_data: */
- "\377\377\377\0\377\377\377\0\207\211\204\342\210\212\205\377\210\212"
- "\205\377\210\212\205\377\210\212\205\377\210\212\205\377\210\212\205"
- "\377\210\212\205\377\210\212\205\377\210\212\205\377\210\212\205\377"
- "\210\212\205\377\210\212\205\377\210\212\205\377\210\211\205\363\210"
- "\214\204>\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\210\212\205\377"
- "S\257\334\377M\262\344\377G\257\343\377@\255\343\377:\252\343\377/\246"
- "\342\377J\262\346\377Y\271\352\377,\245\344\377\33\237\342\377\30\236"
- "\342\377\21\234\340\377$\241\325\377\224\264\272\344\210\212\205\357"
- "\211\211\2046\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\210\212\205\377b\265\335\367"
- "_\271\346\377X\265\343\377P\262\343\377K\260\343\377\202\310\354\377"
- "\303\345\366\377\331\356\372\377S\266\350\377*\244\342\377+\245\343\377"
- "%\243\343\377<\255\341\377\230\311\321\377\316\317\301\345\210\212\205"
- "\355\212\212\2050\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\210\212\205\377i\267\335\367e\273\346"
- "\377^\270\344\377W\265\343\377\215\315\354\377\315\350\366\377\377\377"
- "\377\377\300\344\366\377A\255\344\3774\250\343\3772\247\343\377+\245"
- "\343\377C\260\344\377\246\324\333\377\377\377\372\377\321\321\306\345"
- "\210\212\204\353\211\211\203)\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\210\212\205\377o\271\334\367l\275\345"
- "\377`\270\343\377n\300\346\377\307\346\364\377\372\375\373\377\377\377"
- "\376\377\251\333\360\3779\251\340\377:\252\343\3776\250\343\3770\247"
- "\343\377B\261\346\377\206\300\314\377\316\326\316\377\337\342\327\377"
- "\267\271\255\346\210\211\205\351\212\212\203#\377\377\377\0\377\377\377"
- "\0\377\377\377\1\377\377\377\0\210\212\205\377\200\300\336\367\177\305"
- "\346\377v\301\345\377\220\316\353\377\350\365\370\377\377\377\374\377"
- "\377\377\374\377\304\345\363\377[\270\344\377O\263\343\377L\262\345\377"
- "G\260\345\377H\261\346\377S\261\335\377_\260\324\377j\267\325\377v\277"
- "\327\377\226\251\252\334\210\212\204\336\377\377\377\0\377\377\377\0"
- "\377\377\377\4\377\377\377\0\210\212\205\377\363\365\365\366\373\375"
- "\376\377\372\375\375\377\375\376\376\377\377\377\376\377\377\377\377"
- "\377\377\377\376\377\377\377\377\377\373\375\375\377\371\375\374\377"
- "\372\375\376\377\371\375\377\377\370\374\376\377\367\375\377\377\365"
- "\375\377\377\364\374\377\377\364\374\375\377\350\354\346\350\210\212"
- "\205\377\377\377\377\0\377\377\377\3\377\377\377\0\377\377\377\0\210"
- "\212\205\377\370\367\366\366\377\377\376\377\377\377\376\377\377\376"
- "\375\377\373\373\373\377\374\374\373\377\376\376\374\377\373\373\370"
- "\377\376\375\371\377\377\377\372\377\374\374\370\377\375\374\372\377"
- "\377\376\375\377\375\374\373\377\376\376\375\377\377\377\377\377\377"
- "\377\377\377\355\354\342\336\210\212\205\377\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\210\212\205\377\367\367\365\366\377\377"
- "\373\377\377\377\374\377\363\363\360\377\332\332\330\377\352\352\347"
- "\377\355\355\352\377\334\334\331\377\362\362\356\377\365\365\361\377"
- "\333\333\330\377\350\350\345\377\357\357\354\377\340\340\337\377\355"
- "\355\354\377\375\375\374\377\377\377\377\377\361\357\347\336\210\212"
- "\205\377\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\210"
- "\212\205\377\367\367\364\366\377\377\372\377\375\375\370\377\302\302"
- "\300\377\241\241\241\377\327\327\324\377\311\311\307\377\255\255\253"
- "\377\360\360\352\377\315\315\313\377\242\242\241\377\322\322\317\377"
- "\321\321\317\377\260\260\256\377\335\335\333\377\374\374\371\377\377"
- "\377\377\377\357\357\346\336\210\212\205\377\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\210\212\205\377\367\367\362\366\377\377"
- "\367\377\363\363\355\377\317\317\315\377\310\310\306\377\317\317\314"
- "\377\357\357\353\377\262\262\260\377\355\355\346\377\320\320\315\377"
- "\315\315\311\377\310\310\304\377\366\366\361\377\273\273\272\377\323"
- "\323\317\377\370\370\364\377\377\377\377\377\357\357\346\336\210\212"
- "\205\377\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\210"
- "\212\205\377\367\367\360\366\377\377\366\377\372\372\361\377\312\312"
- "\310\377\273\273\272\377\350\350\342\377\326\326\324\377\256\256\254"
- "\377\353\353\344\377\316\316\314\377\273\273\271\377\346\346\341\377"
- "\334\334\330\377\254\254\254\377\321\321\315\377\371\371\364\377\377"
- "\377\376\377\357\357\344\336\210\212\205\377\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\210\212\205\377\367\367\360\366\377\377"
- "\364\377\377\377\365\377\374\374\363\377\357\357\351\377\376\376\366"
- "\377\366\366\357\377\346\346\336\377\370\370\355\377\375\375\362\377"
- "\356\356\343\377\376\376\366\377\367\367\361\377\346\346\337\377\342"
- "\342\334\377\371\371\363\377\377\377\375\377\357\357\344\336\210\212"
- "\205\377\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\210"
- "\212\205\377\367\367\357\366\377\377\362\377\377\377\364\377\334\334"
- "\325\377\274\274\271\377\350\350\337\377\333\333\325\377\311\311\301"
- "\377\364\364\346\377\335\335\326\377\310\310\300\377\367\367\353\377"
- "\347\347\341\377\276\276\271\377\317\317\312\377\363\363\354\377\377"
- "\377\373\377\357\355\343\336\210\212\205\377\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\210\212\205\377\367\367\356\366\377\377"
- "\362\377\367\367\354\377\303\303\300\377\262\262\256\377\321\321\311"
- "\377\336\336\327\377\246\246\242\377\356\356\337\377\344\344\333\377"
- "\272\272\264\377\360\360\343\377\312\312\306\377\264\264\260\377\256"
- "\256\252\377\353\353\343\377\377\377\373\377\355\355\341\336\210\212"
- "\205\377\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\210"
- "\212\205\377\367\367\355\366\377\377\360\377\364\364\350\377\312\312"
- "\307\377\301\301\275\377\326\326\314\377\345\345\335\377\244\244\242"
- "\377\345\345\326\377\352\352\336\377\271\271\265\377\355\355\341\377"
- "\315\315\311\377\300\300\274\377\265\265\256\377\356\356\343\377\377"
- "\377\367\377\355\354\340\336\210\212\205\377\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\210\212\205\377\367\367\353\366\377\377"
- "\356\377\377\377\360\377\337\337\327\377\320\320\311\377\370\370\352"
- "\377\336\336\327\377\303\303\274\377\355\355\335\377\341\341\326\377"
- "\306\306\277\377\361\361\344\377\345\345\335\377\312\312\304\377\343"
- "\343\326\377\370\370\352\377\377\377\364\377\354\354\337\336\210\212"
- "\205\377\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\210"
- "\212\205\377\367\367\352\366\377\377\355\377\377\377\356\377\374\374"
- "\354\377\346\346\330\377\365\365\345\377\370\370\350\377\350\350\327"
- "\377\372\372\345\377\371\371\346\377\347\347\325\377\367\367\344\377"
- "\375\375\356\377\353\353\334\377\353\353\335\377\374\374\354\377\377"
- "\377\363\377\353\352\334\336\210\212\205\377\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\210\212\205\377\367\367\351\366\377\377"
- "\353\377\375\375\353\377\302\302\275\377\244\244\241\377\332\332\313"
- "\377\317\317\307\377\256\256\247\377\361\361\333\377\322\322\311\377"
- "\264\264\255\377\361\361\334\377\324\324\315\377\262\262\253\377\335"
- "\335\316\377\374\374\353\377\377\377\362\377\353\352\334\336\210\212"
- "\205\377\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\210"
- "\212\205\377\367\367\350\366\377\377\353\377\363\363\343\377\316\316"
- "\310\377\307\307\276\377\316\316\301\377\360\360\340\377\251\251\244"
- "\377\352\352\324\377\366\365\345\377\274\274\263\377\355\355\327\377"
- "\366\366\346\377\273\273\263\377\323\323\302\377\370\370\345\377\377"
- "\377\360\377\352\352\332\336\210\212\205\377\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\210\212\205\377\367\366\347\366\377\377"
- "\351\377\372\372\350\377\312\312\305\377\272\272\265\377\347\347\325"
- "\377\327\327\316\377\247\247\245\377\345\344\321\377\334\333\321\377"
- "\255\255\252\377\347\347\323\377\333\333\321\377\254\254\251\377\320"
- "\320\300\377\370\370\344\377\377\377\355\377\352\351\330\336\210\212"
- "\205\377\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\210"
- "\212\205\377\367\366\346\366\377\377\350\377\377\377\352\377\370\367"
- "\345\377\363\363\337\377\377\377\352\377\362\361\341\377\352\351\331"
- "\377\371\367\342\377\361\357\336\377\352\350\327\377\371\371\344\377"
- "\362\362\341\377\351\351\330\377\357\357\331\377\373\373\345\377\377"
- "\377\353\377\352\351\327\336\210\212\205\377\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\210\212\205\377\373\372\351\377\377\377"
- "\352\377\377\377\353\377\377\377\354\377\377\377\354\377\377\377\352"
- "\377\377\377\352\377\377\377\352\377\377\377\347\377\377\377\347\377"
- "\377\377\350\377\377\377\352\377\377\377\353\377\377\377\355\377\377"
- "\377\352\377\377\377\353\377\377\377\356\377\356\353\332\346\210\212"
- "\205\377\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\207"
- "\211\204\342\210\212\205\377\210\212\205\377\210\212\205\377\210\212"
- "\205\377\210\212\205\377\210\212\205\377\210\212\205\377\210\212\205"
- "\377\210\212\205\377\210\212\205\377\210\212\205\377\210\212\205\377"
- "\210\212\205\377\210\212\205\377\210\212\205\377\210\212\205\377\210"
- "\212\205\377\210\212\205\377\207\211\205\341\377\377\377\0\377\377\377"
- "\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (capture_options_alt1_16_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 capture_options_alt1_16_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 capture_options_alt1_16_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (1024) */
- "\0\0\4\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (64) */
- "\0\0\0@"
- /* width (16) */
- "\0\0\0\20"
- /* height (16) */
- "\0\0\0\20"
- /* pixel_data: */
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\232\232\232"
- "&\231\231\231\200\230\230\230\263\251\251\251\352\251\251\251\352\230"
- "\230\230\263\231\231\231\200\232\232\232&\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\1\231\231\231p\257\257\257\370\331\331\331\377\365\365\365\377\377\377"
- "\377\377\377\377\377\377\365\365\365\377\331\331\331\377\256\256\256"
- "\370\231\231\231p\377\377\377\1\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\1\234\234\234\267\312\312\312\377\375\375\375\377\301"
- "\301\301\377\210\210\210\377ddd\377ddd\377\210\210\210\377\301\301\301"
- "\377\375\375\375\377\310\310\310\377\234\234\234\267\377\377\377\1\377"
- "\377\377\0\377\377\377\0\231\231\231p\311\311\311\377\361\361\361\377"
- "\202\202\202\377MMM\377mmm\377\242\242\242\377\77\77\77\377III\377SS"
- "S\377\202\202\202\377\361\361\361\377\307\307\307\377\231\231\231p\377"
- "\377\377\0\232\232\232&\257\257\257\370\375\375\375\377\202\202\202\377"
- "MMM\377333\377\245\245\245\377\377\377\377\377\270\270\270\377\300\300"
- "\300\377\342\342\342\377NNN\377\200\200\200\377\374\374\374\377\255\255"
- "\255\370\232\232\232&\231\231\231\200\331\331\331\377\301\301\301\377"
- "OOO\377\321\321\321\377\340\340\340\377\372\372\372\377\232\232\232\377"
- "\250\250\250\377\341\341\341\377\355\355\355\377000\377GGG\377\276\276"
- "\276\377\327\327\327\377\231\231\231\177\230\230\230\263\365\365\365"
- "\377\210\210\210\377JJJ\377\271\271\271\377\355\355\355\377BBB\377\32"
- "\32\32\377\32\32\32\377222\377\361\361\361\377\271\271\271\377ttt\377"
- "\204\204\204\377\364\364\364\377\230\230\230\263\251\251\251\352\377"
- "\377\377\377ddd\377>>>\377\243\243\243\377\272\272\272\377\32\32\32\377"
- "\32\32\32\377\32\32\32\377\32\32\32\377\210\210\210\377\377\377\377\377"
- "\246\246\246\377[[[\377\373\373\373\377\251\251\251\352\251\251\251\352"
- "\377\377\377\377ddd\377\221\221\221\377\377\377\377\377\243\243\243\377"
- "\32\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377\234\234\234\377"
- "\277\277\277\377666\377ZZZ\377\373\373\373\377\251\251\251\352\230\230"
- "\230\263\365\365\365\377\210\210\210\377lll\377\261\261\261\377\372\372"
- "\372\377CCC\377\32\32\32\377\32\32\32\377444\377\335\335\335\377\321"
- "\321\321\377AAA\377{{{\377\360\360\360\377\230\230\230\263\231\231\231"
- "\200\330\330\330\377\301\301\301\377LLL\377000\377\324\324\324\377\351"
- "\351\351\377\256\256\256\377\222\222\222\377\362\362\362\377\343\343"
- "\343\377\345\345\345\377LLL\377\266\266\266\377\325\325\325\377\231\231"
- "\231\177\232\232\232&\255\255\255\370\375\375\375\377\202\202\202\377"
- "III\377\314\314\314\377\316\316\316\377\253\253\253\377\377\377\377\377"
- "\304\304\304\377...\377CCC\377uuu\377\367\367\367\377\253\253\253\371"
- "\232\232\232&\377\377\377\0\231\231\231p\307\307\307\377\361\361\361"
- "\377\200\200\200\377III\377FFF\377666\377\222\222\222\377ooo\377BBB\377"
- "uuu\377\345\345\345\377\303\303\303\377\231\231\231p\377\377\377\0\377"
- "\377\377\0\377\377\377\1\234\234\234\267\306\306\306\377\374\374\374"
- "\377\276\276\276\377\204\204\204\377[[[\377ZZZ\377{{{\377\266\266\266"
- "\377\367\367\367\377\303\303\303\377\234\234\234\267\377\377\377\1\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\1\231\231\231p\254"
- "\254\254\371\327\327\327\377\363\363\363\377\373\373\373\377\373\373"
- "\373\377\360\360\360\377\324\324\324\377\252\252\252\371\231\231\231"
- "p\377\377\377\1\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\232\232\232&\231\231\231\200\230\230\230"
- "\263\251\251\251\352\251\251\251\352\230\230\230\263\231\231\231\200"
- "\232\232\232&\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (capture_options_alt1_24_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 capture_options_alt1_24_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 capture_options_alt1_24_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (2304) */
- "\0\0\11\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (96) */
- "\0\0\0`"
- /* width (24) */
- "\0\0\0\30"
- /* height (24) */
- "\0\0\0\30"
- /* pixel_data: */
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\227\227\227\26\231\231\231K\231\231\231"
- "\177\231\231\231\262\231\231\231\346\231\231\231\346\231\231\231\262"
- "\231\231\231\177\231\231\231K\227\227\227\26\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\231\231\231\5\231\231\231\200\231\231\231\372\247\247\247\377\274"
- "\274\274\377\316\316\316\377\340\340\340\377\337\337\337\377\315\315"
- "\315\377\274\274\274\377\247\247\247\377\231\231\231\372\231\231\231"
- "\177\231\231\231\5\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\232\232\2320\231\231\231\320\253\253\253\377\346\346\346\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\346\346\346"
- "\377\253\253\253\377\231\231\231\320\232\232\2320\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\232\232\232j\233\233\233\372\310\310\310\377\374\374\374\377\377"
- "\377\377\377\342\342\342\377\264\264\264\377\217\217\217\377jjj\377j"
- "jj\377\217\217\217\377\264\264\264\377\342\342\342\377\377\377\377\377"
- "\373\373\373\377\307\307\307\377\233\233\233\372\232\232\232j\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\232\232"
- "\2320\233\233\233\372\343\343\343\377\377\377\377\377\372\372\372\377"
- "\241\241\241\377OOO\377LLL\377LLL\377LLL\377LLL\377LLL\377LLL\377NNN"
- "\377\240\240\240\377\372\372\372\377\377\377\377\377\342\342\342\377"
- "\233\233\233\372\232\232\2320\377\377\377\0\377\377\377\0\377\377\377"
- "\0\231\231\231\5\231\231\231\320\310\310\310\377\377\377\377\377\342"
- "\342\342\377kkk\377LLL\377KKK\377III\377ttt\377\204\204\204\377\77\77"
- "\77\377CCC\377GGG\377III\377JJJ\377jjj\377\342\342\342\377\377\377\377"
- "\377\306\306\306\377\231\231\231\320\231\231\231\5\377\377\377\0\377"
- "\377\377\0\231\231\231\200\253\253\253\377\374\374\374\377\372\372\372"
- "\377kkk\377LLL\377III\377\77\77\77\377FFF\377\377\377\377\377\377\377"
- "\377\377mmm\377555\377\230\230\230\377\234\234\234\377III\377JJJ\377"
- "jjj\377\372\372\372\377\373\373\373\377\253\253\253\377\231\231\231\177"
- "\377\377\377\0\227\227\227\26\231\231\231\372\347\347\347\377\377\377"
- "\377\377\241\241\241\377LLL\377III\377[[[\377555\377\222\222\222\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\371\371\371\377\377"
- "\377\377\377\377\377\377\377ooo\377EEE\377JJJ\377\240\240\240\377\377"
- "\377\377\377\345\345\345\377\231\231\231\372\227\227\227\26\231\231\231"
- "K\247\247\247\377\377\377\377\377\342\342\342\377OOO\377KKK\377zzz\377"
- "\377\377\377\377\364\364\364\377\377\377\377\377\321\321\321\377\214"
- "\214\214\377\210\210\210\377\300\300\300\377\375\375\375\377\377\377"
- "\377\377EEE\377<<<\377GGG\377NNN\377\342\342\342\377\377\377\377\377"
- "\247\247\247\377\231\231\231K\231\231\231\177\274\274\274\377\377\377"
- "\377\377\264\264\264\377LLL\377HHH\377\220\220\220\377\377\377\377\377"
- "\377\377\377\377\237\237\237\377333\377333\377333\377333\377vvv\377\374"
- "\374\374\377\267\267\267\377]]]\377LLL\377KKK\377\264\264\264\377\377"
- "\377\377\377\272\272\272\377\231\231\231\177\231\231\231\262\315\315"
- "\315\377\377\377\377\377\217\217\217\377LLL\377CCC\377333\377\352\352"
- "\352\377\336\336\336\377333\377333\377333\377333\377333\377333\377\263"
- "\263\263\377\377\377\377\377\377\377\377\377\207\207\207\377III\377\216"
- "\216\216\377\377\377\377\377\311\311\311\377\231\231\231\262\231\231"
- "\231\346\337\337\337\377\377\377\377\377jjj\377LLL\377\77\77\77\377L"
- "LL\377\376\376\376\377\235\235\235\377333\377333\377333\377333\37733"
- "3\377333\377vvv\377\377\377\377\377\375\375\375\377\214\214\214\377G"
- "GG\377iii\377\377\377\377\377\335\335\335\377\231\231\231\346\231\231"
- "\231\346\337\337\337\377\377\377\377\377jjj\377LLL\377nnn\377\370\370"
- "\370\377\377\377\377\377\235\235\235\377333\377333\377333\377333\377"
- "333\377333\377vvv\377\377\377\377\377qqq\377:::\377FFF\377iii\377\377"
- "\377\377\377\334\334\334\377\231\231\231\346\231\231\231\262\314\314"
- "\314\377\377\377\377\377\217\217\217\377LLL\377fff\377\377\377\377\377"
- "\377\377\377\377\331\331\331\377333\377333\377333\377333\377333\3773"
- "33\377\265\265\265\377\377\377\377\377DDD\377>>>\377HHH\377\216\216\216"
- "\377\377\377\377\377\310\310\310\377\231\231\231\262\231\231\231\177"
- "\274\274\274\377\377\377\377\377\264\264\264\377LLL\377JJJ\377[[[\377"
- "\225\225\225\377\377\377\377\377\231\231\231\377333\377333\377333\377"
- "333\377vvv\377\374\374\374\377\377\377\377\377\271\271\271\377DDD\377"
- "KKK\377\264\264\264\377\377\377\377\377\271\271\271\377\231\231\231\177"
- "\231\231\231K\247\247\247\377\377\377\377\377\342\342\342\377OOO\377"
- "JJJ\377>>>\377333\377\345\345\345\377\377\377\377\377\320\320\320\377"
- "\215\215\215\377\207\207\207\377\277\277\277\377\375\375\375\377\364"
- "\364\364\377\377\377\377\377\241\241\241\377FFF\377MMM\377\342\342\342"
- "\377\377\377\377\377\247\247\247\377\231\231\231K\227\227\227\26\231"
- "\231\231\372\344\344\344\377\377\377\377\377\241\241\241\377LLL\377H"
- "HH\377JJJ\377\375\375\375\377\377\377\377\377\372\372\372\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\263\263\263\377:::\377VVV\377"
- "GGG\377HHH\377\237\237\237\377\377\377\377\377\342\342\342\377\231\231"
- "\231\372\227\227\227\26\377\377\377\0\231\231\231\200\253\253\253\377"
- "\373\373\373\377\372\372\372\377jjj\377JJJ\377FFF\377\201\201\201\377"
- "\263\263\263\377;;;\377RRR\377\365\365\365\377\377\377\377\377ooo\377"
- ";;;\377CCC\377HHH\377iii\377\371\371\371\377\373\373\373\377\252\252"
- "\252\377\231\231\231\177\377\377\377\0\377\377\377\0\231\231\231\5\231"
- "\231\231\320\306\306\306\377\377\377\377\377\342\342\342\377jjj\377J"
- "JJ\377GGG\377DDD\377\77\77\77\377;;;\377sss\377xxx\377LLL\377FFF\377"
- "HHH\377iii\377\341\341\341\377\377\377\377\377\303\303\303\377\231\231"
- "\231\320\231\231\231\5\377\377\377\0\377\377\377\0\377\377\377\0\232"
- "\232\2320\233\233\233\372\341\341\341\377\377\377\377\377\372\372\372"
- "\377\240\240\240\377NNN\377KKK\377III\377GGG\377FFF\377HHH\377KKK\377"
- "MMM\377\237\237\237\377\371\371\371\377\377\377\377\377\337\337\337\377"
- "\233\233\233\372\232\232\2320\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\232\232\232j\233\233\233\372\305\305\305"
- "\377\373\373\373\377\377\377\377\377\342\342\342\377\264\264\264\377"
- "\216\216\216\377iii\377iii\377\216\216\216\377\264\264\264\377\342\342"
- "\342\377\377\377\377\377\373\373\373\377\303\303\303\377\233\233\233"
- "\372\232\232\232j\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\232\232\2320\231\231\231"
- "\320\253\253\253\377\343\343\343\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\342\342\342\377\252\252\252\377\231\231"
- "\231\320\232\232\2320\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\231\231\231\5\231\231\231\200\231\231\231\372\247\247\247\377"
- "\271\271\271\377\310\310\310\377\334\334\334\377\334\334\334\377\307"
- "\307\307\377\270\270\270\377\247\247\247\377\231\231\231\372\231\231"
- "\231\177\231\231\231\5\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\227\227\227\26\231"
- "\231\231K\231\231\231\177\231\231\231\262\231\231\231\346\231\231\231"
- "\346\231\231\231\262\231\231\231\177\231\231\231K\227\227\227\26\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (capture_restart_16_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 capture_restart_16_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 capture_restart_16_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (1024) */
- "\0\0\4\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (64) */
- "\0\0\0@"
- /* width (16) */
- "\0\0\0\20"
- /* height (16) */
- "\0\0\0\20"
- /* pixel_data: */
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\234\234\234$\232\232\232e\232\232\232\215\237\237\237\245"
- "\240\240\240\277\231\231\231{\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\231\231\231#\233\233\233\234\262\262\262\277"
- "\336\336\336\316\332\364\325\357\343\373\340\377\264\264\264\274\235"
- "\235\235\32\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\222\222\222"
- "\7\232\232\232\223\264\264\264\276\336\361\334\352\204\355v\377C\343"
- ".\377!\336\10\377\325\370\320\375\243\243\243\212\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\231\231\12\235\235\235\256\340\340\340"
- "\321\253\363\242\3770\340\30\377!\336\10\377!\336\10\3775\341\36\377"
- "\336\337\336\320\231\231\231A\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\222\222\222\16\236\236\236\260\351\353\351\333n\352^\377!\336\10\377"
- "!\336\10\377!\336\10\377!\336\10\377q\352a\377\261\261\261\276\216\216"
- "\216\11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\232\232\232\246\351\352"
- "\351\331u\352e\377!\336\10\377!\336\10\377!\336\10\377!\336\10\377!\336"
- "\10\377\257\363\246\377\243\243\243\264\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\231\231\231P\305\305\305\301\265\364\255\377\203\354t\377"
- "\234\360\221\377\266\364\256\377\227\360\214\377!\336\10\377!\336\10"
- "\377\332\371\325\377\242\242\242\263\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\231\231\231\17\245\245\245\275\334\372\330\377\202\355t\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\237\361\224\377!\336\10\377"
- "!\336\10\377\326\371\321\377\241\241\241\265\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\232\232\232o\325\325\325\310\\\347J\377!\336\10\377\323\370"
- "\316\377\377\377\377\377\377\377\377\377\201\354s\377\221\357\205\377"
- "F\3442\377\321\370\314\377\240\240\240\267\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\237\237\237\271\335\372\331\374!\336\10\377a\347O\377\377\377"
- "\377\377\315\370\310\377\377\377\377\377t\352d\377\371\376\370\377\275"
- "\365\265\377\315\367\307\377\240\240\240\266\0\0\0\0\0\0\0\0\0\0\0\0"
- "\232\232\2320\277\277\277\300\211\355{\377!\336\10\377\214\356\177\377"
- "\377\377\377\377\77\343*\377z\353k\377B\343-\377\276\365\266\377\355"
- "\374\353\377\275\365\265\377\252\252\252\272\0\0\0\0\0\0\0\0\0\0\0\0"
- "\234\234\234\213\365\367\364\3557\341\40\377!\336\10\377n\351]\377\377"
- "\377\377\377\202\354t\377!\336\10\3770\340\30\377\357\375\356\377\324"
- "\371\320\377\211\355{\377\274\274\274\277\230\230\230%\0\0\0\0\231\231"
- "\231\5\252\252\252\272\300\366\271\377!\336\10\377!\336\10\377&\337\16"
- "\377\330\371\323\377\377\377\377\377\326\371\321\377\365\376\364\377"
- "\376\377\376\377e\350T\377P\345<\377\330\330\330\311\230\230\230^\0\0"
- "\0\0\230\230\230>\277\277\277\300\207\355y\377!\336\10\377!\336\10\377"
- "!\336\10\377'\337\17\377r\352b\377\310\367\302\377\233\360\220\377\77"
- "\342)\377!\336\10\377$\337\14\377\354\366\353\357\233\233\233\226\0\0"
- "\0\0\231\231\231l\337\337\337\320\273\365\263\377\235\361\223\377\235"
- "\360\222\377\234\360\221\377\233\360\220\377\233\360\220\377\232\360"
- "\217\377\231\360\216\377\231\360\216\377\230\360\215\377\227\360\214"
- "\377\350\374\346\377\246\246\246\275\252\252\252\6\231\231\231\212\247"
- "\247\247\304\252\252\252\301\252\252\252\301\252\252\252\302\252\252"
- "\252\302\252\252\252\303\252\252\252\303\252\252\252\303\252\252\252"
- "\303\251\251\251\304\250\250\250\305\250\250\250\305\252\252\252\305"
- "\234\234\234\333\232\232\232\77"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (capture_restart_24_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 capture_restart_24_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 capture_restart_24_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (2304) */
- "\0\0\11\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (96) */
- "\0\0\0`"
- /* width (24) */
- "\0\0\0\30"
- /* height (24) */
- "\0\0\0\30"
- /* pixel_data: */
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\200\200"
- "\200\2\233\233\2333\230\230\230r\230\230\230\251\231\231\231\301\231"
- "\231\231\327\231\231\231\355\232\232\232D\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\224\224\224\23\230\230\230\206\231\231\231\355\234\234"
- "\234\337\247\247\247\306\277\277\277\277\332\332\332\312\335\335\335"
- "\315\231\231\231\354\225\225\225\14\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\226\226"
- "\226\21\232\232\232\203\231\231\231\344\273\273\273\300\370\370\370\357"
- "\377\377\377\377\345\373\342\377\246\362\234\377\371\376\370\377\257"
- "\257\257\302\231\231\231}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\231\231\12\231\231\231"
- "\200\231\231\231\342\273\273\273\300\371\371\371\361\313\367\305\377"
- "\207\355y\377G\3443\377!\336\10\377Y\346F\377\370\370\370\356\231\231"
- "\231\350\237\237\237\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\231\231\17\231\231\231\303\253"
- "\253\253\303\371\371\371\361\350\374\346\377g\350U\377!\336\10\377!\336"
- "\10\377!\336\10\377!\336\10\377\253\363\242\377\305\305\305\300\232\232"
- "\232\222\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\231\231\231\24\231\231\231\315\272\272\272\277\376"
- "\377\376\377\246\362\234\377.\340\27\377!\336\10\377!\336\10\377!\336"
- "\10\377!\336\10\377*\337\22\377\365\375\363\377\246\246\246\310\232\232"
- "\232Q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\235\235\235\32\231\231\231\324\311\311\311\301\370\376\367\377"
- "a\347O\377!\336\10\377!\336\10\377!\336\10\377!\336\10\377!\336\10\377"
- "!\336\10\377Z\347H\377\377\377\377\376\231\231\231\354\231\231\231\24"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231"
- "\231\231\24\231\231\231\335\323\323\323\306\373\376\372\377c\350R\377"
- "!\336\10\377!\336\10\377!\336\10\377!\336\10\377!\336\10\377!\336\10"
- "\377!\336\10\377\203\354t\377\355\355\355\335\231\231\231\326\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231"
- "\231\231\247\263\263\263\300\375\377\375\377m\351\\\377!\336\10\377!"
- "\336\10\377!\336\10\377!\336\10\377!\336\10\377!\336\10\377!\336\10\377"
- "!\336\10\377\253\363\242\377\343\343\343\322\231\231\231\257\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\230\230\230"
- "O\234\234\234\331\374\374\374\370\204\355v\3779\342#\377T\346A\377n\352"
- "^\377\211\356|\377\244\361\231\377s\352c\377!\336\10\377!\336\10\377"
- "!\336\10\377\313\367\305\377\340\340\340\320\231\231\231\235\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\237\237\237\20\232\232"
- "\232\334\355\355\355\335\335\372\332\377\373\376\372\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\200\354r\377!\336\10\377!\336\10\377!\336\10\377\312\367\304\377\337"
- "\337\337\316\230\230\230\213\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\232\232\232\234\276\276\276\277\373\376\372\377G\344"
- "3\377|\354n\377\376\377\376\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377b\350Q\377!\336\10\377!\336\10\377!\336\10\377"
- "\305\366\276\377\334\334\334\315\230\230\230|\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\227\227\227\40\231\231\231\354\371\371\371\362"
- "\227\357\213\377!\336\10\377!\336\10\377\251\362\237\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377D\343/\377D\343/"
- "\377\205\355w\377!\336\10\377\300\366\271\377\333\333\333\313\231\231"
- "\231\211\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\232\232\232"
- "\215\274\274\274\277\373\376\372\3774\341\35\377!\336\10\3777\341\40"
- "\377\362\375\360\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\376\377\376\377E\3430\377\352\374\350\377\375\377\375\377Q\345=\377"
- "\274\365\264\377\330\330\330\311\232\232\232\234\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\235\235\235\15\232\232\232\343\371\371\371\361\270"
- "\365\261\377!\336\10\377!\336\10\377\221\357\205\377\377\377\377\377"
- "\375\377\375\377\220\357\204\377\375\377\375\377\347\373\344\377*\337"
- "\22\377\360\375\357\377\377\377\377\377\265\364\255\377\270\364\260\377"
- "\337\337\337\316\231\231\231\257\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\232\232\232o\256\256\256\302\377\377\377\377b\350Q\377!\336\10\377"
- "!\336\10\377\274\365\264\377\377\377\377\377\277\365\267\377!\336\10"
- "\377r\352b\377\305\366\276\377!\336\10\377\235\360\222\377\377\377\377"
- "\377\337\372\333\377\256\363\245\377\367\367\367\355\231\231\231\325"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\231\231\315\337\337\337"
- "\317\350\374\346\377$\336\13\377!\336\10\377!\336\10\377\270\364\260"
- "\377\377\377\377\377\314\367\306\377!\336\10\377!\336\10\3779\342#\377"
- "!\336\10\377\251\362\237\377\377\377\377\377\332\371\325\377\203\354"
- "t\377\377\377\377\377\232\232\232\344\237\237\237\20\0\0\0\0\0\0\0\0"
- "\0\0\0\0\235\235\235\32\232\232\232\346\376\376\376\375\225\357\211\377"
- "!\336\10\377!\336\10\377!\336\10\377\213\356~\377\377\377\377\377\377"
- "\377\377\377]\347K\377!\336\10\377!\336\10\377C\343.\377\367\376\366"
- "\377\377\377\377\377\254\363\243\377P\345<\377\377\377\377\377\245\245"
- "\245\311\232\232\232G\0\0\0\0\0\0\0\0\0\0\0\0\231\231\231d\260\260\260"
- "\301\377\377\377\377@\343+\377!\336\10\377!\336\10\377!\336\10\377/\340"
- "\27\377\350\374\346\377\377\377\377\377\377\377\377\377\321\370\314\377"
- "\305\366\276\377\376\377\376\377\377\377\377\377\367\376\366\377@\343"
- "+\377%\337\15\377\370\376\367\377\273\273\273\277\231\231\231\200\0\0"
- "\0\0\0\0\0\0\0\0\0\0\230\230\230\256\320\320\320\304\337\372\333\377"
- "!\336\10\377!\336\10\377!\336\10\377!\336\10\377!\336\10\377U\346B\377"
- "\350\374\346\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\363\375\361\377l\351[\377!\336\10\377!\336\10\377\313\367"
- "\305\377\330\330\330\311\231\231\231\271\0\0\0\0\0\0\0\0\0\0\0\0\231"
- "\231\231\343\357\357\357\341\261\363\250\377!\336\10\377!\336\10\377"
- "!\336\10\377!\336\10\377!\336\10\377!\336\10\377/\340\27\377\213\356"
- "~\377\270\364\260\377\275\365\265\377\224\357\210\377;\342%\377!\336"
- "\10\377!\336\10\377!\336\10\377\211\356|\377\373\373\373\365\231\231"
- "\231\347\252\252\252\6\0\0\0\0\237\237\237\20\231\231\231\354\377\377"
- "\377\377\262\364\252\377m\351\\\377m\351\\\377m\351\\\377m\351\\\377"
- "m\351\\\377m\351\\\377m\351\\\377m\351\\\377m\351\\\377m\351\\\377m\351"
- "\\\377m\351\\\377m\351\\\377m\351\\\377m\351\\\377\207\355y\377\377\377"
- "\377\377\247\247\247\306\232\232\232Q\0\0\0\0\233\233\233=\244\244\244"
- "\312\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\323\323\323\306\231\231\231\257"
- "\0\0\0\0\232\232\232L\231\231\231\357\231\231\231\360\231\231\231\360"
- "\231\231\231\360\231\231\231\360\231\231\231\360\231\231\231\360\231"
- "\231\231\360\231\231\231\360\232\232\232\357\232\232\232\357\232\232"
- "\232\357\232\232\232\357\232\232\232\357\232\232\232\357\232\232\232"
- "\357\232\232\232\357\232\232\232\357\232\232\232\357\232\232\232\357"
- "\231\231\231\361\231\231\231\333\377\377\377\1"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (capture_start_16_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 capture_start_16_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 capture_start_16_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (1024) */
- "\0\0\4\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (64) */
- "\0\0\0@"
- /* width (16) */
- "\0\0\0\20"
- /* height (16) */
- "\0\0\0\20"
- /* pixel_data: */
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\234\234\234$\232\232\232e\232\232\232\215\237\237\237\245\240\240"
- "\240\277\231\231\231{\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\231\231"
- "\231#\233\233\233\234\262\262\262\277\336\336\336\316\334\340\361\357"
- "\345\350\370\377\264\264\264\274\235\235\235\32\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\222\222"
- "\222\7\232\232\232\223\264\264\264\276\340\344\357\352\223\242\340\377"
- "_w\322\377E`\313\377\330\336\363\375\243\243\243\212\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\231"
- "\231\231\12\235\235\235\256\340\340\340\321\264\276\352\377Pi\316\377"
- "C_\312\377B]\312\377Pj\316\377\336\337\337\320\231\231\231A\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\222\222\222"
- "\16\236\236\236\260\351\352\353\333\200\222\334\377B]\312\377@\\\312"
- "\377>[\311\377=Z\311\377~\221\333\377\261\261\261\276\216\216\216\11"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\232\232\232\246\351\352\352\331\203\226\334\377>[\311\377=Y\311\377"
- ";X\310\377:W\310\3778V\307\377\264\277\352\377\243\243\243\264\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\231\231"
- "\231P\305\305\305\300\234\252\343\377;X\310\3779V\310\3778V\307\3777"
- "T\307\3775S\307\3773Q\306\377\333\341\365\377\242\242\242\263\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\231\231\231\17\245\245"
- "\245\275\336\343\366\377<X\310\3776S\307\3775S\307\3773Q\306\3772P\306"
- "\3770O\304\377.M\303\377\327\335\363\377\241\241\241\265\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\232\232\232o\325\325\325"
- "\310h\177\325\3773Q\306\3772P\306\3770O\305\377.L\303\377-K\301\377+"
- "I\277\377*H\275\377\321\330\361\377\240\240\240\267\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\237\237\237\271\336\343\366\374"
- "0O\305\377.M\305\377,K\302\377+J\300\377+I\277\377*H\274\377*G\273\377"
- "*G\271\377\314\323\356\377\240\240\240\266\377\377\377\0\377\377\377"
- "\0\377\377\377\0\232\232\2320\277\277\277\300\216\237\340\377+J\301\377"
- "+I\277\377+I\276\377*H\274\377*G\272\377)G\270\377)F\266\377)E\265\377"
- "\273\304\347\377\252\252\252\272\377\377\377\0\377\377\377\0\377\377"
- "\377\0\234\234\234\213\365\365\367\355\77[\305\377*H\275\377*G\273\377"
- "*G\271\377)F\270\377)E\265\377(E\264\377(D\262\377(C\260\377\206\226"
- "\323\377\274\274\274\277\230\230\230%\377\377\377\0\231\231\231\5\252"
- "\252\252\272\301\312\353\377*G\272\377)G\270\377)F\267\377)E\265\377"
- "(E\263\377(D\262\377'C\257\377'B\256\377&B\253\377Pe\272\377\330\330"
- "\330\311\230\230\230^\377\377\377\0\230\230\230>\277\277\277\300\210"
- "\231\327\377)F\266\377(E\264\377(D\262\377(D\261\377'C\256\377'B\255"
- "\377&A\253\377&A\251\377&@\250\377(B\247\377\352\354\362\357\233\233"
- "\233\226\377\377\377\0\231\231\231l\337\337\337\320\271\303\347\377\233"
- "\251\334\377\232\247\333\377\231\246\331\377\227\244\327\377\226\244"
- "\326\377\225\242\325\377\223\240\324\377\223\240\324\377\222\240\323"
- "\377\222\236\322\377\345\351\365\377\246\246\246\275\252\252\252\6\231"
- "\231\231\212\247\247\247\304\252\252\252\301\252\252\252\301\252\252"
- "\252\302\252\252\252\302\252\252\252\303\252\252\252\303\252\252\252"
- "\303\252\252\252\303\251\251\251\304\250\250\250\305\250\250\250\305"
- "\252\252\252\305\234\234\234\333\232\232\232\77"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (capture_start_24_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 capture_start_24_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 capture_start_24_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (2304) */
- "\0\0\11\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (96) */
- "\0\0\0`"
- /* width (24) */
- "\0\0\0\30"
- /* height (24) */
- "\0\0\0\30"
- /* pixel_data: */
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\231"
- "\231\5\231\231\2317\232\232\232t\230\230\230\251\231\231\231\301\231"
- "\231\231\327\231\231\231\355\232\232\232D\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\227\227\227\26\232\232\232\215\231\231\231\362\234\234"
- "\234\337\247\247\247\306\277\277\277\277\332\332\332\312\335\335\335"
- "\315\231\231\231\353\225\225\225\14\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\234\234"
- "\234\22\231\231\231\207\231\231\231\346\273\273\273\300\370\370\370\357"
- "\377\377\377\377\346\352\370\377\260\273\351\377\371\372\375\377\257"
- "\257\257\302\231\231\231{\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\231\231\12\230\230\230"
- "\201\232\232\232\343\273\273\273\300\371\371\371\361\317\326\362\377"
- "\227\246\342\377g}\324\377Mg\315\377s\207\330\377\370\370\370\356\231"
- "\231\231\346\222\222\222\16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\231\231\17\231\231\231\303"
- "\253\253\253\303\371\371\371\361\351\355\371\377~\220\333\377Mg\315\377"
- "Lf\315\377Kf\315\377Jd\314\377\264\276\352\377\305\305\305\300\231\231"
- "\231\217\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\231\231\231\24\231\231\231\315\272\272\272\277\376"
- "\376\377\377\260\273\351\377Un\317\377Kf\315\377Jd\314\377Ic\314\377"
- "Gb\314\377Lf\315\377\365\367\374\377\246\246\246\310\230\230\230O\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\235\235\235\32\231\231\231\324\311\311\311\301\370\371\375\377x\214"
- "\331\377Jd\314\377Ic\314\377Gb\314\377Fa\313\377E`\313\377C_\312\377"
- "o\204\326\377\377\377\377\376\231\231\231\354\231\231\231\24\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\231\231"
- "\24\231\231\231\335\323\323\323\306\373\373\376\377y\215\332\377Gb\314"
- "\377Fa\313\377E`\313\377C_\312\377B^\312\377A]\312\377\77[\311\377\217"
- "\237\340\377\355\355\355\335\231\231\231\326\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\231\231\247\263"
- "\263\263\300\375\376\377\377\177\221\333\377E`\313\377C_\312\377B^\312"
- "\377A]\312\377\77[\311\377>Z\311\377=Y\311\377;X\310\377\262\275\352"
- "\377\343\343\343\322\231\231\231\257\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\230\230\230O\234\234\234\331\374\374"
- "\374\370\221\241\340\377B^\312\377A]\312\377\77[\311\377>Z\311\377=Y"
- "\311\377;X\310\377:W\310\3778V\307\3778U\307\377\316\325\361\377\340"
- "\340\340\320\231\231\231\235\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\237\237\237\20\232\232\232\334\355\355\355\335\322\330"
- "\362\377A\\\311\377>Z\311\377=Y\311\377;X\310\377:W\310\3778V\307\377"
- "8U\307\3776S\307\3774R\306\3773Q\305\377\315\324\361\377\337\337\337"
- "\316\230\230\230\213\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\232\232\232\234\276\276\276\277\373\373\376\377[t\321\377;X"
- "\310\377:W\310\3778V\307\3778U\307\3776S\307\3774R\305\3773P\304\377"
- "1O\304\3770N\302\377.M\301\377\307\317\356\377\334\334\334\315\230\230"
- "\230|\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\227\227\227\40"
- "\231\231\231\354\371\371\371\362\237\255\344\3778V\307\3778U\307\377"
- "6S\306\3774Q\304\3772P\304\3771O\303\3770N\301\377.L\300\377-J\300\377"
- ",J\276\377*H\275\377\301\312\354\377\333\333\333\313\231\231\231\211"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\232\232\232\215\274"
- "\274\274\277\373\373\376\377Fa\312\3773Q\304\3772P\303\3771O\302\377"
- "0M\301\377.L\300\377-J\277\377+I\275\377*H\275\377*H\274\377*H\274\377"
- "*G\273\377\274\306\351\377\330\330\330\311\232\232\232\234\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\235\235\235\15\232\232\232\343\371\371"
- "\371\361\274\306\353\3771N\301\3770M\301\377.L\277\377,I\276\377+I\275"
- "\377*H\274\377*H\274\377*G\273\377*G\272\377*G\271\377)G\270\377)F\270"
- "\377\267\301\347\377\337\337\337\316\231\231\231\257\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\232\232\232o\256\256\256\302\377\377\377\377"
- "i~\321\377,I\276\377+I\274\377*H\274\377*G\273\377*G\272\377*G\271\377"
- ")G\270\377)F\270\377)F\267\377)F\266\377)E\265\377)E\265\377\255\267"
- "\342\377\367\367\367\355\231\231\231\325\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\231\231\231\315\337\337\337\317\350\354\370\377,I\274\377"
- "*G\272\377*G\271\377)G\270\377)F\270\377)F\267\377)F\266\377)E\265\377"
- ")E\265\377(E\264\377(E\263\377(D\262\377(D\262\377\201\222\322\377\377"
- "\377\377\377\232\232\232\344\237\237\237\20\0\0\0\0\0\0\0\0\0\0\0\0\235"
- "\235\235\32\232\232\232\346\376\376\376\375\226\244\335\377)F\270\377"
- ")F\267\377)F\266\377)E\265\377)E\265\377(E\264\377(E\263\377(D\262\377"
- "(D\262\377(D\261\377(C\260\377(C\260\377'C\257\377Qg\276\377\377\377"
- "\377\377\245\245\245\311\232\232\232G\0\0\0\0\0\0\0\0\0\0\0\0\231\231"
- "\231d\260\260\260\301\377\377\377\377E^\277\377)E\265\377(E\264\377("
- "E\263\377(D\262\377(D\262\377(D\261\377(C\260\377(C\260\377'C\257\377"
- "'C\256\377'B\256\377'B\255\377'B\254\377*E\255\377\367\370\374\377\273"
- "\273\273\277\231\231\231\200\0\0\0\0\0\0\0\0\0\0\0\0\230\230\230\256"
- "\320\320\320\304\334\340\363\377(D\262\377(D\262\377(D\261\377(C\260"
- "\377(C\260\377'C\257\377'C\256\377'B\256\377'B\255\377'B\254\377&B\253"
- "\377&A\253\377&A\252\377&A\251\377&@\250\377\306\316\351\377\330\330"
- "\330\311\231\231\231\271\0\0\0\0\0\0\0\0\0\0\0\0\231\231\231\343\357"
- "\357\357\341\251\265\340\377(C\260\377'C\257\377'C\256\377'B\256\377"
- "'B\255\377'B\254\377&B\253\377&A\253\377&A\252\377&A\251\377&@\250\377"
- "&@\250\377%@\247\377%@\246\377%\77\245\377\203\223\315\377\373\373\373"
- "\365\231\231\231\347\252\252\252\6\0\0\0\0\237\237\237\20\231\231\231"
- "\354\377\377\377\377\254\266\340\377k}\307\377k}\307\377j}\306\377j|"
- "\306\377j|\305\377j|\304\377i{\304\377i{\303\377i{\303\377hz\302\377"
- "hz\302\377hz\302\377hz\302\377hz\302\377hz\302\377\201\221\314\377\377"
- "\377\377\377\247\247\247\306\232\232\232Q\0\0\0\0\233\233\233=\244\244"
- "\244\312\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\323\323\323\306\231\231\231"
- "\257\0\0\0\0\232\232\232L\231\231\231\357\231\231\231\360\231\231\231"
- "\360\231\231\231\360\231\231\231\360\231\231\231\360\231\231\231\360"
- "\231\231\231\360\231\231\231\360\232\232\232\357\232\232\232\357\232"
- "\232\232\357\232\232\232\357\232\232\232\357\232\232\232\357\232\232"
- "\232\357\232\232\232\357\232\232\232\357\232\232\232\357\232\232\232"
- "\357\231\231\231\361\231\231\231\333\377\377\377\1"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (capture_stop_16_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 capture_stop_16_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 capture_stop_16_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (1024) */
- "\0\0\4\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (64) */
- "\0\0\0@"
- /* width (16) */
- "\0\0\0\20"
- /* height (16) */
- "\0\0\0\20"
- /* pixel_data: */
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\241\241\241\377\265\265\265\377\265\265"
- "\265\377\265\265\265\377\265\265\265\377\265\265\265\377\265\265\265"
- "\377\265\265\265\377\265\265\265\377\265\265\265\377\265\265\265\377"
- "\265\265\265\377\265\265\265\377\241\241\241\377\377\377\377\0\377\377"
- "\377\0\265\265\265\377\375\357\357\377\366\277\277\377\366\277\277\377"
- "\366\277\277\377\366\277\277\377\366\277\277\377\366\277\277\377\366"
- "\277\277\377\366\277\277\377\366\277\277\377\366\277\277\377\375\357"
- "\357\377\265\265\265\377\377\377\377\0\377\377\377\0\265\265\265\377"
- "\366\277\277\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334"
- "\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377"
- "\366\277\277\377\265\265\265\377\377\377\377\0\377\377\377\0\265\265"
- "\265\377\366\277\277\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0"
- "\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334"
- "\0\0\377\366\277\277\377\265\265\265\377\377\377\377\0\377\377\377\0"
- "\265\265\265\377\366\277\277\377\334\0\0\377\334\0\0\377\334\0\0\377"
- "\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0"
- "\377\334\0\0\377\366\277\277\377\265\265\265\377\377\377\377\0\377\377"
- "\377\0\265\265\265\377\366\277\277\377\334\0\0\377\334\0\0\377\334\0"
- "\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334"
- "\0\0\377\334\0\0\377\366\277\277\377\265\265\265\377\377\377\377\0\377"
- "\377\377\0\265\265\265\377\366\277\277\377\334\0\0\377\334\0\0\377\334"
- "\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377"
- "\334\0\0\377\334\0\0\377\366\277\277\377\265\265\265\377\377\377\377"
- "\0\377\377\377\0\265\265\265\377\366\277\277\377\334\0\0\377\334\0\0"
- "\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334"
- "\0\0\377\334\0\0\377\334\0\0\377\366\277\277\377\265\265\265\377\377"
- "\377\377\0\377\377\377\0\265\265\265\377\366\277\277\377\334\0\0\377"
- "\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0"
- "\377\334\0\0\377\334\0\0\377\334\0\0\377\366\277\277\377\265\265\265"
- "\377\377\377\377\0\377\377\377\0\265\265\265\377\366\277\277\377\334"
- "\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377"
- "\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\366\277\277\377\265"
- "\265\265\377\377\377\377\0\377\377\377\0\265\265\265\377\366\277\277"
- "\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334"
- "\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\366\277\277"
- "\377\265\265\265\377\377\377\377\0\377\377\377\0\265\265\265\377\366"
- "\277\277\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0"
- "\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\366"
- "\277\277\377\265\265\265\377\377\377\377\0\377\377\377\0\265\265\265"
- "\377\375\357\357\377\366\277\277\377\366\277\277\377\366\277\277\377"
- "\366\277\277\377\366\277\277\377\366\277\277\377\366\277\277\377\366"
- "\277\277\377\366\277\277\377\366\277\277\377\375\357\357\377\265\265"
- "\265\377\377\377\377\0\377\377\377\0\241\241\241\377\265\265\265\377"
- "\265\265\265\377\265\265\265\377\265\265\265\377\265\265\265\377\265"
- "\265\265\377\265\265\265\377\265\265\265\377\265\265\265\377\265\265"
- "\265\377\265\265\265\377\265\265\265\377\241\241\241\377\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (capture_stop_24_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 capture_stop_24_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 capture_stop_24_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (2304) */
- "\0\0\11\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (96) */
- "\0\0\0`"
- /* width (24) */
- "\0\0\0\30"
- /* height (24) */
- "\0\0\0\30"
- /* pixel_data: */
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\231\231\231\377\231\231\231\377\231\231\231\377\231\231\231\377\231"
- "\231\231\377\231\231\231\377\231\231\231\377\231\231\231\377\231\231"
- "\231\377\231\231\231\377\231\231\231\377\231\231\231\377\231\231\231"
- "\377\231\231\231\377\231\231\231\377\231\231\231\377\231\231\231\377"
- "\231\231\231\377\231\231\231\377\231\231\231\377\231\231\231\377\231"
- "\231\231\377\377\377\377\0\377\377\377\0\231\231\231\377\342\342\342"
- "\377\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377"
- "\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377\357"
- "\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377\357\357"
- "\357\377\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357"
- "\377\357\357\357\377\342\342\342\377\231\231\231\377\377\377\377\0\377"
- "\377\377\0\231\231\231\377\357\357\357\377\375\357\357\377\366\277\277"
- "\377\366\277\277\377\366\277\277\377\366\277\277\377\366\277\277\377"
- "\366\277\277\377\366\277\277\377\366\277\277\377\366\277\277\377\366"
- "\277\277\377\366\277\277\377\366\277\277\377\366\277\277\377\366\277"
- "\277\377\366\277\277\377\366\277\277\377\375\357\357\377\357\357\357"
- "\377\231\231\231\377\377\377\377\0\377\377\377\0\231\231\231\377\357"
- "\357\357\377\366\277\277\377\334\0\0\377\334\0\0\377\334\0\0\377\334"
- "\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377"
- "\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0"
- "\377\334\0\0\377\366\277\277\377\357\357\357\377\231\231\231\377\377"
- "\377\377\0\377\377\377\0\231\231\231\377\357\357\357\377\366\277\277"
- "\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334"
- "\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377"
- "\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\366\277"
- "\277\377\357\357\357\377\231\231\231\377\377\377\377\0\377\377\377\0"
- "\231\231\231\377\357\357\357\377\366\277\277\377\334\0\0\377\334\0\0"
- "\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334"
- "\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377"
- "\334\0\0\377\334\0\0\377\334\0\0\377\366\277\277\377\357\357\357\377"
- "\231\231\231\377\377\377\377\0\377\377\377\0\231\231\231\377\357\357"
- "\357\377\366\277\277\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0"
- "\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334"
- "\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377"
- "\334\0\0\377\366\277\277\377\357\357\357\377\231\231\231\377\377\377"
- "\377\0\377\377\377\0\231\231\231\377\357\357\357\377\366\277\277\377"
- "\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0"
- "\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334"
- "\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\366\277\277"
- "\377\357\357\357\377\231\231\231\377\377\377\377\0\377\377\377\0\231"
- "\231\231\377\357\357\357\377\366\277\277\377\334\0\0\377\334\0\0\377"
- "\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0"
- "\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334"
- "\0\0\377\334\0\0\377\334\0\0\377\366\277\277\377\357\357\357\377\231"
- "\231\231\377\377\377\377\0\377\377\377\0\231\231\231\377\357\357\357"
- "\377\366\277\277\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377"
- "\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0"
- "\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334"
- "\0\0\377\366\277\277\377\357\357\357\377\231\231\231\377\377\377\377"
- "\0\377\377\377\0\231\231\231\377\357\357\357\377\366\277\277\377\334"
- "\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377"
- "\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0"
- "\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\366\277\277\377"
- "\357\357\357\377\231\231\231\377\377\377\377\0\377\377\377\0\231\231"
- "\231\377\357\357\357\377\366\277\277\377\334\0\0\377\334\0\0\377\334"
- "\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377"
- "\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0"
- "\377\334\0\0\377\334\0\0\377\366\277\277\377\357\357\357\377\231\231"
- "\231\377\377\377\377\0\377\377\377\0\231\231\231\377\357\357\357\377"
- "\366\277\277\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334"
- "\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377"
- "\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0"
- "\377\366\277\277\377\357\357\357\377\231\231\231\377\377\377\377\0\377"
- "\377\377\0\231\231\231\377\357\357\357\377\366\277\277\377\334\0\0\377"
- "\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0"
- "\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334"
- "\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\366\277\277\377\357\357"
- "\357\377\231\231\231\377\377\377\377\0\377\377\377\0\231\231\231\377"
- "\357\357\357\377\366\277\277\377\334\0\0\377\334\0\0\377\334\0\0\377"
- "\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0"
- "\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334"
- "\0\0\377\334\0\0\377\366\277\277\377\357\357\357\377\231\231\231\377"
- "\377\377\377\0\377\377\377\0\231\231\231\377\357\357\357\377\366\277"
- "\277\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377"
- "\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0"
- "\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\366"
- "\277\277\377\357\357\357\377\231\231\231\377\377\377\377\0\377\377\377"
- "\0\231\231\231\377\357\357\357\377\366\277\277\377\334\0\0\377\334\0"
- "\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334"
- "\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377"
- "\334\0\0\377\334\0\0\377\334\0\0\377\366\277\277\377\357\357\357\377"
- "\231\231\231\377\377\377\377\0\377\377\377\0\231\231\231\377\357\357"
- "\357\377\366\277\277\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0"
- "\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334"
- "\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377"
- "\334\0\0\377\366\277\277\377\357\357\357\377\231\231\231\377\377\377"
- "\377\0\377\377\377\0\231\231\231\377\357\357\357\377\366\277\277\377"
- "\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0"
- "\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334"
- "\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\334\0\0\377\366\277\277"
- "\377\357\357\357\377\231\231\231\377\377\377\377\0\377\377\377\0\231"
- "\231\231\377\357\357\357\377\375\357\357\377\366\277\277\377\366\277"
- "\277\377\366\277\277\377\366\277\277\377\366\277\277\377\366\277\277"
- "\377\366\277\277\377\366\277\277\377\366\277\277\377\366\277\277\377"
- "\366\277\277\377\366\277\277\377\366\277\277\377\366\277\277\377\366"
- "\277\277\377\366\277\277\377\375\357\357\377\357\357\357\377\231\231"
- "\231\377\377\377\377\0\377\377\377\0\231\231\231\377\342\342\342\377"
- "\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377\357"
- "\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377\357\357"
- "\357\377\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357"
- "\377\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377"
- "\357\357\357\377\342\342\342\377\231\231\231\377\377\377\377\0\377\377"
- "\377\0\231\231\231\377\231\231\231\377\231\231\231\377\231\231\231\377"
- "\231\231\231\377\231\231\231\377\231\231\231\377\231\231\231\377\231"
- "\231\231\377\231\231\231\377\231\231\231\377\231\231\231\377\231\231"
- "\231\377\231\231\231\377\231\231\231\377\231\231\231\377\231\231\231"
- "\377\231\231\231\377\231\231\231\377\231\231\231\377\231\231\231\377"
- "\231\231\231\377\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (layout_1_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 layout_1_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 layout_1_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (9216) */
- "\0\0$\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (192) */
- "\0\0\0\300"
- /* width (48) */
- "\0\0\0""0"
- /* height (48) */
- "\0\0\0""0"
- /* pixel_data: */
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362.56\314.56\314NSU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362."
- "56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314"
- ".56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314"
- "NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\353\354"
- "\354\301\243\245\246\325\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\376\376\376\274\262\264\264\320"
- "\217\223\224\333\264\265\267\320\376\376\376\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\360\360\360\300pst\346Z^`\355\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274lpq\347W\\]\356\221\223"
- "\225\332PVX\361lpq\347\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\226\231\232\331\77EG\3708>@\373Z^`\355"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\334"
- "\335\335\305:\77A\372\370\370\370\276\377\377\377\274\354\354\356\300"
- "/57\376\356\356\356\300\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362"
- ".56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\264\265\267\320Z^`\355\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\340\341"
- "\341\304\234\240\240\327\377\377\377\274\377\377\377\274\357\357\357"
- "\300/57\376\362\362\363\277\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\264\265\267\320"
- "Z^`\355\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\366\367\367\276chi\352"
- "rvx\344\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362"
- ".56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\264\265\267\320Z^`\355\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\305\306\310\313INP\364}\201\202\341\374\374"
- "\374\275\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\264\265\267\320"
- "Z^`\355\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\234\240\240\327JOQ\363\306\310\311\312\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\264\265"
- "\267\320Z^`\355\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\340\341\341\304@EH\367\352\353\353\301\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\264\265\267\320Z^`\355\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\234\240\240\32739;\375<BD\371<BD\371<BD\371<BD\371\362"
- "\362\363\277\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314"
- ".56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314"
- "NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362"
- "OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362OTU\362O"
- "TU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362NSU\362.56\314.56\314NSU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314"
- ".56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314"
- ".56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\321\322\322\310\222\226"
- "\227\332\231\234\235\330\346\347\347\302\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\276\301\301\315\77EG\370\211\215\216\335lpq\347:@B\372\346"
- "\347\347\302\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU"
- "\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274bgh\352\245\247\247\324\377\377\377"
- "\274\377\377\377\274OUW\361\252\255\255\323\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\313"
- "\314\316\311\360\360\360\300\377\377\377\274\352\352\352\301CIK\366\322"
- "\323\323\307\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU"
- "\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "rvx\34438:\375wz|\343\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\347\347\351\302W[^\356\222\225"
- "\226\332\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274vy|\343\347\347\351\302\377\377\377\274"
- "\377\377\377\274\243\245\246\325^bd\354\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274TXZ\360\203"
- "\207\210\337\374\374\374\275\374\374\374\275gln\350\177\202\203\340\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\320\321\322\310KQR\363@EH\367@EH\367cgj\352\362"
- "\362\363\277\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU"
- "\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362"
- ".56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU"
- "\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274NSU\362.56\314.56\314NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (layout_2_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 layout_2_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 layout_2_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (9216) */
- "\0\0$\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (192) */
- "\0\0\0\300"
- /* width (48) */
- "\0\0\0""0"
- /* height (48) */
- "\0\0\0""0"
- /* pixel_data: */
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362.56\314.56\314NSU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362"
- ".56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU"
- "\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362"
- ".56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\353\354\354\301\243\245\246\325\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU"
- "\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\360\360\360\300pst\346Z^`\355\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\226\231\232\331\77EG\3708>@\373Z^`\355\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\264\265\267\320Z^`\355\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\264\265\267\320Z^`\355\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU"
- "\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\264\265\267\320Z^`\355\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\264\265\267"
- "\320Z^`\355\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314"
- ".56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\264\265\267\320Z^`\355\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\264"
- "\265\267\320Z^`\355\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362"
- ".56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU"
- "\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362"
- ".56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU"
- "\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362NSU\362.56\314.56\314NSU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362"
- ".56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314"
- ".56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314"
- "NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\376"
- "\376\376\274\262\264\264\320\217\223\224\333\264\265\267\320\376\376"
- "\376\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\321\322\322\310\222\226\227\332\231\234\235\330"
- "\346\347\347\302\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274lpq\347W\\]\356\221\223\225\332PVX\361lp"
- "q\347\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362"
- "OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\276"
- "\301\301\315\77EG\370\211\215\216\335lpq\347:@B\372\346\347\347\302\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\334\335\335\305:\77A\372"
- "\370\370\370\276\377\377\377\274\354\354\356\300/57\376\356\356\356\300"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274bgh\352\245\247\247\324"
- "\377\377\377\274\377\377\377\274OUW\361\252\255\255\323\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\340\341\341\304\234\240\240\327\377"
- "\377\377\274\377\377\377\274\357\357\357\300/57\376\362\362\363\277\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\313\314\316\311\360\360"
- "\360\300\377\377\377\274\352\352\352\301CIK\366\322\323\323\307\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\366\367\367\276chi\352rvx\344\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274rvx\34438:\375wz|\343\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\305\306\310"
- "\313INP\364}\201\202\341\374\374\374\275\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\347\347\351\302W[^\356\222\225\226\332\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\234\240\240\327JOQ\363"
- "\306\310\311\312\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274vy|\343\347\347\351\302\377"
- "\377\377\274\377\377\377\274\243\245\246\325^bd\354\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\340\341\341\304@EH\367\352\353\353\301\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274TXZ\360\203\207\210\337\374\374"
- "\374\275\374\374\374\275gln\350\177\202\203\340\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\234\240\240\32739;\375<BD\371<BD\371<BD\371"
- "<BD\371\362\362\363\277\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362"
- "OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\320"
- "\321\322\310KQR\363@EH\367@EH\367cgj\352\362\362\363\277\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362"
- ".56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314"
- ".56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314"
- "NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274NSU\362.56\314.56\314NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (layout_3_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 layout_3_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 layout_3_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (9216) */
- "\0\0$\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (192) */
- "\0\0\0\300"
- /* width (48) */
- "\0\0\0""0"
- /* height (48) */
- "\0\0\0""0"
- /* pixel_data: */
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314KPQ\354"
- "KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354"
- "KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354"
- "KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354"
- "KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354"
- "KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354.56\314.56\314KPQ\354\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354KPQ\354\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354."
- "56\314.56\314KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240KPQ\354KPQ\354\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240KPQ\354.56\314.56\314KPQ\354\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354KPQ\354\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354.56\314"
- ".56\314KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240KPQ\354KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240KPQ\354.56\314.56\314KPQ\354\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240KPQ\354KPQ\354\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354.56\314.56\314"
- "KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "KPQ\354KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240KPQ\354.56\314.56\314KPQ\354\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\350\352"
- "\352\247\232\235\236\303\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240KPQ\354KPQ\354\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240KPQ\354.56\314.56\314KPQ\354"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\356\356\356\245ilm\333TY[\346\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240KPQ\354KPQ\354\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354.56\314.5"
- "6\314KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\216\220\222\311=BD\3656<\77\371TY[\346\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354KPQ\354\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354.56\314"
- ".56\314KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\254\256\257\274TY[\346\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354"
- "KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "KPQ\354.56\314.56\314KPQ\354\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\254\256\257\274"
- "TY[\346\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240KPQ\354KPQ\354\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240KPQ\354.56\314.56\314KPQ\354\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\254\256\257\274TY[\346\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240KPQ\354KPQ\354\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240KPQ\354.56\314.56\314KPQ\354"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\254\256\257\274TY[\346\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354KPQ\354\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354."
- "56\314.56\314KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\254\256\257\274TY[\346\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240KPQ\354KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240KPQ\354.56\314.56\314KPQ\354\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\254"
- "\256\257\274TY[\346\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240KPQ\354KPQ\354\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240KPQ\354.56\314.56\314KPQ\354\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354KPQ\354"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354"
- ".56\314.56\314KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240KPQ\354KPQ\354\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240KPQ\354.56\314.56\314KPQ\354\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354KPQ\354\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\313\314\314\260\212\215\217\312\221\223\225\307\342\344\344\251\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354.56\314"
- ".56\314KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240KPQ\354KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\267\272\272\267=BD\365\201\205\206\316ejk\3348>@\370\342"
- "\344\344\251\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354.56\314"
- ".56\314KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240KPQ\354KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\\ab\342\235\237\237\302\377\377\377\240\377\377\377\240"
- "KPS\353\242\245\245\300\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354"
- ".56\314.56\314KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240KPQ\354KPQ\354\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\304\306\307\263\356\356\356\245\377\377\377\240"
- "\347\347\347\247AFH\362\314\316\316\260\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240KPQ\354.56\314.56\314KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354"
- "KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354"
- "KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240koq\33138:\374pst\327\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240KPQ\354.56\314.56\314KPQ\354KPQ\354KPQ\354"
- "KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354"
- "KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354"
- "KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\344\344\345\250RVY\350\212"
- "\214\216\312\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354.56\314"
- ".56\314KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240KPQ\354KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240oru\330\344\344\345\250\377\377\377\240\377\377\377\240\232"
- "\235\236\303X]_\344\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354."
- "56\314.56\314KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240KPQ\354KPQ\354\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240OSV\351{\177\200\321\374\374\374\241\374\374\374"
- "\241aeh\337wz|\323\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354."
- "56\314.56\314KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240KPQ\354KPQ\354\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\312\313\315\261HMN\356>CE\364>CE\364]ad\341\357"
- "\357\361\244\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354.56\314"
- ".56\314KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240KPQ\354KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240KPQ\354.56\314.56\314KPQ\354\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240KPQ\354KPQ\354\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354.56\314.56\314"
- "KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "KPQ\354KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240KPQ\354.56\314.56\314KPQ\354\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\375\375\375\240\252\255\255\275\207\213"
- "\214\314\254\256\257\274\375\375\375\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240KPQ\354KPQ\354\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240KPQ\354.56\314.56\314KPQ\354"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240ejk\334R"
- "WX\347\211\213\215\313LQS\353ejk\334\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240KPQ\354KPQ\354\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240KPQ\354.56\314.56\314KPQ\354\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\327\331\331\2548>@\370\367\367"
- "\367\242\377\377\377\240\352\352\353\246/57\376\353\353\353\246\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240KPQ\354KPQ\354\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240KPQ\354.56\314.56\314KPQ"
- "\354\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\333\335\335\253\224"
- "\230\230\306\377\377\377\240\377\377\377\240\355\355\355\246/57\376\357"
- "\357\361\244\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354KPQ\354"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354"
- ".56\314.56\314KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\364\366\366\243]bc\341k"
- "oq\331\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354"
- "KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "KPQ\354.56\314.56\314KPQ\354\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\276\300\301\265EKM\357uz{\324\374"
- "\374\374\241\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240KPQ\354KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240KPQ\354.56\314.56\314KPQ\354\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\224\230\230\306FKN\357\277\301\302\264"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240KPQ\354KPQ\354\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240KPQ\354.56\314.56\314KPQ\354\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\333\335\335\253>CE\364\347\350\350"
- "\247\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240KPQ\354KPQ\354\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354.56\314.5"
- "6\314KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\224\230\230"
- "\30628:\374:@B\366:@B\366:@B\366:@B\366\357\357\361\244\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240KPQ\354KPQ\354\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240KPQ\354.56\314.56\314KPQ\354\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354K"
- "PQ\354\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "KPQ\354.56\314.56\314KPQ\354\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240KPQ\354KPQ\354\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240KPQ\354.56\314.56\314KPQ\354\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354KPQ\354"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354"
- ".56\314.56\314KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240KPQ\354KPQ\354\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240KPQ\354.56\314.56\314KPQ\354\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354KPQ\354\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240KPQ\354.56\314"
- ".56\314KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240KPQ\354KPQ\354\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377"
- "\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377"
- "\377\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377"
- "\240\377\377\377\240\377\377\377\240\377\377\377\240\377\377\377\240"
- "\377\377\377\240KPQ\354.56\314.56\314KPQ\354KPQ\354KPQ\354KPQ\354KPQ"
- "\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354K"
- "PQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354"
- "KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354"
- "KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354KPQ\354"
- "KPQ\354KPQ\354.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (layout_4_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 layout_4_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 layout_4_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (9216) */
- "\0\0$\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (192) */
- "\0\0\0\300"
- /* width (48) */
- "\0\0\0""0"
- /* height (48) */
- "\0\0\0""0"
- /* pixel_data: */
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362.56\314.56\314NSU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362."
- "56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314"
- ".56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314"
- "NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\376\376\376\274\262\264\264\320"
- "\217\223\224\333\264\265\267\320\376\376\376\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362"
- "OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274lpq\347"
- "W\\]\356\221\223\225\332PVX\361lpq\347\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\334\335\335\305:\77A\372\370"
- "\370\370\276\377\377\377\274\354\354\356\300/57\376\356\356\356\300\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362"
- "OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\340\341\341\304\234"
- "\240\240\327\377\377\377\274\377\377\377\274\357\357\357\300/57\376\362"
- "\362\363\277\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314"
- ".56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\366\367\367\276chi\352r"
- "vx\344\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362"
- ".56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\305\306\310\313INP\364}\201\202"
- "\341\374\374\374\275\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\234\240\240\327JOQ\363\306\310"
- "\311\312\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\340\341\341\304@EH\367\352"
- "\353\353\301\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.5"
- "6\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\234"
- "\240\240\32739;\375<BD\371<BD\371<BD\371<BD\371\362\362\363\277\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362O"
- "TU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\353\354\354\301\243\245\246\325\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362"
- ".56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\360\360\360\300pst\346Z^`\355\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362"
- "OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\226\231\232\331\77EG\3708>@\373Z^`\355\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362"
- "OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\264\265\267\320"
- "Z^`\355\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\264\265\267\320Z^`\355\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274OTU\362OTU\362OTU\362OTU\362OTU\362O"
- "TU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362NSU\362.56\314"
- ".56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\264\265\267\320Z^`\355\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\264"
- "\265\267\320Z^`\355\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\264\265\267\320Z^`\355\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.5"
- "6\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\264\265\267\320Z^`\355\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362"
- "OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362"
- ".56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\321\322\322\310\222\226\227\332\231\234\235\330\346\347\347\302\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314"
- ".56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\276\301\301\315\77EG\370\211\215\216\335lpq\347:@B\372\346"
- "\347\347\302\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314"
- ".56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274bgh\352\245\247\247\324\377\377\377\274\377\377\377\274O"
- "UW\361\252\255\255\323\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362"
- ".56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\313\314\316\311\360\360\360\300\377\377\377\274"
- "\352\352\352\301CIK\366\322\323\323\307\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274rvx\34438:\375wz|\343\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\347\347\351\302W[^\356\222\225\226\332\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362O"
- "TU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274vy|\343"
- "\347\347\351\302\377\377\377\274\377\377\377\274\243\245\246\325^bd\354"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU"
- "\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274TXZ\360\203\207\210\337\374\374\374\275\374\374\374\275gln\350\177"
- "\202\203\340\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314"
- ".56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\320\321\322\310KQR\363@EH\367@EH\367cgj\352\362\362\363"
- "\277\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314"
- "NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362"
- "OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362"
- ".56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362NSU\362NSU\362NS"
- "U\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (layout_5_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 layout_5_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 layout_5_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (9216) */
- "\0\0$\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (192) */
- "\0\0\0\300"
- /* width (48) */
- "\0\0\0""0"
- /* height (48) */
- "\0\0\0""0"
- /* pixel_data: */
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362.56\314.56\314NSU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362"
- ".56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\274\275\276\315Z^`\355\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\306\310\311\312\177\202\203\3409\77@\373Z^`"
- "\355\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\311\312"
- "\312\312\232\235\236\327wz|\343Z^`\355\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\264\265\267"
- "\320Z^`\355\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\264\265\267\320Z^`\355\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU"
- "\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\264\265\267\320Z^`\355\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\264\265\267\320Z^`\355\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314"
- ".56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\264\265\267\320Z^`\355\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\330\332\332\306\243"
- "\245\246\325\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362."
- "56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU"
- "\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362O"
- "TU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362NSU\362.56\314.56\314NSU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362NSU\362.56\314.56\314NSU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314"
- ".56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\376\376\376\274\262\264"
- "\264\320\217\223\224\333\264\265\267\320\376\376\376\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274lpq\347W\\]\356\221\223\225\332PVX\361lp"
- "q\347\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.5"
- "6\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\334\335\335\305:\77A\372\370\370\370\276"
- "\377\377\377\274\354\354\356\300/57\376\356\356\356\300\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\340\341"
- "\341\304\234\240\240\327\377\377\377\274\377\377\377\274\357\357\357"
- "\300/57\376\362\362\363\277\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314"
- ".56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\366\367\367\276chi\352rvx\344\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\305\306\310\313INP\364}\201\202\341\374\374"
- "\374\275\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314"
- ".56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\234\240\240\327JOQ\363\306"
- "\310\311\312\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\340\341\341\304@EH\367\352\353\353\301\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362"
- ".56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\234\240\240\32739;\375<BD\371<B"
- "D\371<BD\371<BD\371\362\362\363\277\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362"
- ".56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU"
- "\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274NSU\362.56\314.56\314NSU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "NSU\362.56\314.56\314NSU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362"
- "OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362OTU\362NSU\362.56\314"
- ".56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\321\322\322\310\222\226\227\332\231\234"
- "\235\330\346\347\347\302\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\276"
- "\301\301\315\77EG\370\211\215\216\335lpq\347:@B\372\346\347\347\302\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274bgh\352\245\247\247\324\377\377\377\274\377\377\377"
- "\274OUW\361\252\255\255\323\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314"
- ".56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\313\314\316\311\360\360"
- "\360\300\377\377\377\274\352\352\352\301CIK\366\322\323\323\307\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274rvx\34438:\375wz|\343"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314"
- "NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\347\347\351\302W[^\356\222\225\226\332\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274vy|\343\347\347\351\302\377\377\377\274\377\377\377\274\243\245"
- "\246\325^bd\354\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU"
- "\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274TXZ\360\203\207\210\337\374\374\374"
- "\275\374\374\374\275gln\350\177\202\203\340\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\320"
- "\321\322\310KQR\363@EH\367@EH\367cgj\352\362\362\363\277\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314"
- ".56\314NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (layout_6_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 layout_6_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 layout_6_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (9216) */
- "\0\0$\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (192) */
- "\0\0\0\300"
- /* width (48) */
- "\0\0\0""0"
- /* height (48) */
- "\0\0\0""0"
- /* pixel_data: */
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362.56\314.56\314NSU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362O"
- "TU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.5"
- "6\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362"
- ".56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362O"
- "TU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.5"
- "6\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362"
- ".56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362O"
- "TU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.5"
- "6\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362"
- ".56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\353\354\354\301\243\245\246\325\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\376\376\376\274\262\264\264\320\217\223\224\333\264\265\267\320"
- "\376\376\376\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\321\322\322\310\222\226\227\332"
- "\231\234\235\330\346\347\347\302\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\360\360\360\300pst\346Z^`\355\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274lpq\347"
- "W\\]\356\221\223\225\332PVX\361lpq\347\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\276\301\301\315\77EG\370\211"
- "\215\216\335lpq\347:@B\372\346\347\347\302\377\377\377\274\377\377\377"
- "\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\226\231\232\331\77EG\370"
- "8>@\373Z^`\355\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\334\335\335\305:\77A\372\370\370\370"
- "\276\377\377\377\274\354\354\356\300/57\376\356\356\356\300\377\377\377"
- "\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274bgh\352\245\247\247\324\377"
- "\377\377\274\377\377\377\274OUW\361\252\255\255\323\377\377\377\274\377"
- "\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\264\265\267\320Z^`\355\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\340\341\341"
- "\304\234\240\240\327\377\377\377\274\377\377\377\274\357\357\357\300"
- "/57\376\362\362\363\277\377\377\377\274\377\377\377\274\377\377\377\274"
- "OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\313\314\316\311\360\360\360\300\377\377\377\274\352\352\352"
- "\301CIK\366\322\323\323\307\377\377\377\274\377\377\377\274\377\377\377"
- "\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\264\265"
- "\267\320Z^`\355\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\366\367\367\276chi\352rvx\344\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274rvx\34438:\375wz|\343\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\264\265\267\320Z^`\355\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\305\306\310\313INP\364}\201\202\341\374\374\374\275"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362"
- "OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\347\347\351\302W[^\356"
- "\222\225\226\332\377\377\377\274\377\377\377\274\377\377\377\274NSU\362"
- ".56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\264\265\267\320Z^`\355"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\234\240\240\327JOQ\363\306\310\311"
- "\312\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274vy|\343\347\347\351\302\377\377"
- "\377\274\377\377\377\274\243\245\246\325^bd\354\377\377\377\274\377\377"
- "\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\264\265\267\320Z^`\355\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\340\341\341\304"
- "@EH\367\352\353\353\301\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362"
- "OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "TXZ\360\203\207\210\337\374\374\374\275\374\374\374\275gln\350\177\202"
- "\203\340\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314"
- ".56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\264\265\267\320Z^`\355\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\234\240\240\32739;\375<BD\371<BD\371<BD\371<BD\371\362\362"
- "\363\277\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\320"
- "\321\322\310KQR\363@EH\367@EH\367cgj\352\362\362\363\277\377\377\377"
- "\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314"
- "NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314"
- ".56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362"
- ".56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362O"
- "TU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.5"
- "6\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362"
- ".56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362O"
- "TU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362.56\314.5"
- "6\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274NSU\362"
- ".56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377\377\274\377"
- "\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274NSU\362.56\314.56\314NSU\362\377\377\377\274\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274OTU\362OTU\362\377\377"
- "\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274OTU\362OTU\362\377\377\377\274\377\377\377\274\377\377\377"
- "\274\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274"
- "\377\377\377\274\377\377\377\274\377\377\377\274\377\377\377\274\377"
- "\377\377\274\377\377\377\274NSU\362.56\314.56\314NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362NSU\362"
- "NSU\362NSU\362NSU\362.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314.56\314"
- ".56\314.56\314"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (wsicon_16_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 wsicon_16_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 wsicon_16_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (1024) */
- "\0\0\4\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (64) */
- "\0\0\0@"
- /* width (16) */
- "\0\0\0\20"
- /* height (16) */
- "\0\0\0\20"
- /* pixel_data: */
- "\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\363\362\361\0\371\365\361"
- "\0\372\366\361\0\345\353\361\37\302\331\360I\243\310\357k\215\274\355"
- "~\301\333\365O\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\362\361\361\0\371\365\361\0\361\361\361"
- "\16\302\331\361gr\256\356\277.\211\351\363\17x\347\377\4q\346\377\0f"
- "\344\377j\251\354\255\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\364\362\361\0\371\365\361\0\302\331\360Zo\255\357"
- "\332%\204\351\377\3n\343\377\4l\341\377\7m\340\377\4j\337\377\23s\340"
- "\367\323\340\357.\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\365\363\361\0\362\362\361\6\222\277\356\230D\225\354\377\26x\344\377"
- "\5k\337\377\10j\335\377\11i\333\377\11g\332\377\0^\330\377b\234\342\257"
- "\377\371\362\0\361\361\361\0\361\361\361\0\361\361\361\0\364\363\361"
- "\0\362\361\361\7}\264\355\256:\216\352\377\22s\341\377\6h\334\377\11"
- "g\332\377\11d\327\377\11b\325\377\10`\323\377\2Z\321\377\256\307\350"
- "Y\375\371\363\0\361\361\361\0\361\361\361\0\362\361\361\0\372\366\361"
- "\0\203\266\355\235F\225\353\377\30u\341\377\5e\332\377\11d\327\377\11"
- "a\324\377\10^\321\377\10\\\316\377\4W\314\377\24a\316\371\332\342\355"
- "$\367\365\362\0\361\361\361\0\361\361\361\0\375\370\362\0\250\312\355"
- "dD\224\353\377,\200\343\377\5d\331\377\11b\325\377\10^\321\377\10[\315"
- "\377\10X\312\377\10U\307\377\1N\304\377-k\313\343\355\356\360\14\363"
- "\363\362\0\361\361\361\0\366\364\361\0\340\350\360\34J\226\352\354;\212"
- "\346\377\10g\332\377\10a\325\377\10]\320\377\10X\314\377\10U\307\377"
- "\10Q\304\377\10O\301\377\0F\274\377<p\311\322\365\364\362\3\362\362\361"
- "\0\361\361\361\0\376\370\362\0\204\266\353\224;\214\350\377\27q\335\377"
- "\6a\325\377\10]\320\377\10X\313\377\10S\306\377\10O\301\377\10L\275\377"
- "\7I\271\377\0>\263\377>m\302\317\366\365\362\1\362\362\361\0\366\364"
- "\361\0\335\346\360\35E\223\351\3632\204\343\377\6c\327\377\10_\322\377"
- "\10Y\314\377\10S\306\377\10O\301\377\7J\273\377\7F\265\377\7C\260\377"
- "\0""9\251\3776c\270\330\362\362\361\6\363\362\362\0\376\370\362\0\227"
- "\300\355z9\213\350\377\30q\335\377\6`\324\377\10[\316\377\10U\307\377"
- "\10P\302\377\7J\273\377\7E\264\377\7A\255\377\6>\250\377\0""6\241\377"
- "\"O\252\353\350\352\356\22\364\363\362\0\364\363\361\3\\\240\352\317"
- "2\205\345\377\11e\330\377\7^\321\377\7W\313\377\7Q\304\377\10L\275\377"
- "\7F\266\377\6A\256\377\5=\246\377\4""8\237\377\0""2\231\377\17<\233\374"
- "\323\331\346.\367\366\364\0\322\340\360+=\217\351\373\35v\340\377\0^"
- "\325\377\11]\317\377\11W\311\377\11P\302\377\5H\271\377\3A\260\377\3"
- "<\247\377\5""9\240\377\14;\234\377\27A\234\377\32A\231\377\263\276\327"
- "^\377\375\372\0\251\314\362g'\201\345\377'{\340\377F\211\337\377[\222"
- "\337\377`\221\333\377Z\211\325\377Kz\313\377An\301\377>g\271\377Dh\265"
- "\377=`\254\377Ed\253\377Pl\255\377\246\263\323\240\350\346\343\0h\236"
- "\327\252W\245\373\377}\265\371\377w\255\365\377t\250\360\377{\250\355"
- "\377\200\250\352\377|\241\343\377u\231\333\377~\234\331\377u\223\320"
- "\377n\212\310\377n\210\304\377i\202\277\377\203\227\307\363789\25""8"
- "J]cf\177\233\215\77Yy\2209Tu\222\77Uu\225\77Sr\2268Mn\226ETo\226JWo\226"
- "ERk\226HSj\225GQh\223>Ib\221GPe\216GPd\214\12\14\20\""};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (wsicon_24_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 wsicon_24_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 wsicon_24_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (2304) */
- "\0\0\11\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (96) */
- "\0\0\0`"
- /* width (24) */
- "\0\0\0\30"
- /* height (24) */
- "\0\0\0\30"
- /* pixel_data: */
- "\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\364\362\361\0\372\366\361\0\375\367\361\0\367\364\361\3\351\355\361"
- "\27\333\346\360/\315\336\360>\313\335\360A\370\372\373\15\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\367\364\361\0\372\366\361\0\353\356\361"
- "\40\300\330\360c\204\270\356\245U\237\354\3223\215\352\356\40\203\351"
- "\375\30~\351\377\11u\350\377\222\301\362\216\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\367\364\361"
- "\0\370\364\361\0\326\343\361G\234\306\361\256T\237\355\362\35\200\351"
- "\377\10t\347\377\7s\346\377\10r\345\377\10r\345\377\7q\344\377\0l\343"
- "\377\245\310\357n\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\362\362\361\0\374\367\361\0\331\344\3605\216\276\360\266W\241\357"
- "\377'\205\351\377\13t\345\377\10q\343\377\11p\342\377\11o\341\377\10"
- "n\341\377\11n\341\377\0g\337\377I\223\345\317\371\365\361\6\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\365\363\361\0\370\365\361\1\246\311\356"
- "{[\243\356\370A\223\354\377\33|\346\377\10o\342\377\10n\340\377\11m\337"
- "\377\11l\336\377\11k\335\377\11j\335\377\10i\334\377\3e\333\377\265\316"
- "\353Z\375\370\362\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\367\364\361\0\360\361"
- "\361\16}\263\355\255K\231\355\377>\220\352\377\24v\343\377\10m\337\377"
- "\11l\336\377\11j\334\377\11h\333\377\11g\332\377\11f\331\377\11e\330"
- "\377\2`\327\3775\177\335\343\362\362\361\15\363\362\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\366\364\361\0\357\360\361\21g\247\354\301I\230\354\3778\213\350\377"
- "\16q\341\377\10k\335\377\11i\334\377\11g\332\377\11e\331\377\11d\327"
- "\377\11c\325\377\11b\325\377\11a\324\377\0X\321\377|\250\342\231\377"
- "\372\363\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\364\363\361\0\365\363\361\11e\246\352\275L\231"
- "\354\377B\220\350\377\11m\337\377\10i\334\377\11g\332\377\11e\330\377"
- "\11d\326\377\11a\324\377\11`\323\377\10^\321\377\10]\320\377\7\\\317"
- "\377\3X\316\377\266\314\350V\374\370\363\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\375\370\361"
- "\0z\261\353\237@\222\353\377X\235\353\377\21q\337\377\7h\333\377\11f"
- "\331\377\11d\327\377\11b\324\377\10_\322\377\10]\320\377\10[\316\377"
- "\10Z\315\377\10Y\314\377\3U\312\377\27b\315\372\335\344\356'\366\364"
- "\362\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\376\370\362\0\251\312\355f0\211\351\377`\242\354\377\40z\341\377"
- "\6g\333\377\11e\330\377\11b\325\377\11`\323\377\10^\320\377\10[\316\377"
- "\10Y\314\377\10W\311\377\10U\310\377\10T\307\377\0N\304\3770n\315\344"
- "\357\360\361\14\363\362\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\366\364\361\0\340\350\360\"6\214\350\361X\236\354\377"
- "5\206\344\377\10h\333\377\10e\330\377\11b\325\377\10_\322\377\10\\\317"
- "\377\10Z\314\377\10W\311\377\10U\307\377\10S\305\377\10Q\304\377\10P"
- "\302\377\0H\277\377Cx\315\317\370\366\362\1\362\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\375\370\362\0n\252\352\254"
- ":\216\351\377J\223\347\377\20m\335\377\7d\330\377\11b\325\377\10_\322"
- "\377\10\\\317\377\10Y\313\377\10U\310\377\10S\306\377\10Q\303\377\10"
- "O\301\377\10N\277\377\10M\275\377\0C\271\377P~\314\305\373\370\363\0"
- "\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\371\366\361"
- "\0\310\332\357@*\204\347\377S\232\352\377\40x\337\377\7e\331\377\11b"
- "\325\377\10_\322\377\10[\316\377\10X\313\377\10U\310\377\10R\305\377"
- "\10O\302\377\10M\277\377\7K\274\377\7I\272\377\7G\267\377\0=\263\377"
- "S}\310\302\373\370\364\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\374\367\362\0b\243\351\271>\217\351\377\77\214\345\377\14"
- "i\332\377\10c\326\377\10`\323\377\10\\\317\377\10Y\313\377\10U\307\377"
- "\10R\304\377\10O\300\377\10L\276\377\7J\272\377\7G\267\377\7D\264\377"
- "\7C\261\377\0""9\254\377Mw\302\306\373\370\364\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\370\365\361\0\316\336\3575+\205\347\376R\231\351"
- "\377\37v\336\377\7d\330\377\10a\324\377\10]\320\377\10Y\314\377\10U\310"
- "\377\10R\304\377\10O\301\377\10L\275\377\7I\271\377\7E\265\377\7C\261"
- "\377\7A\256\377\6@\253\377\0""7\246\377@j\272\322\370\366\363\2\362\362"
- "\361\0\361\361\361\0\361\361\361\0\377\370\362\0|\261\352\2345\212\350"
- "\377C\216\345\377\13h\332\377\10b\325\377\10^\322\377\10[\316\377\10"
- "W\311\377\10S\305\377\10O\302\377\10L\275\377\7I\271\377\7E\264\377\7"
- "B\260\377\6@\254\377\6>\250\377\6=\245\377\0""4\240\377.Y\257\345\356"
- "\357\360\15\363\363\362\0\361\361\361\0\364\362\361\0\353\356\361\21"
- "<\216\347\352K\226\351\377'|\340\377\7d\330\377\10a\324\377\10]\320\377"
- "\10Y\313\377\10T\307\377\10P\303\377\10M\276\377\7I\272\377\7E\264\377"
- "\7B\257\377\6@\253\377\6=\246\377\6;\243\377\6""9\240\377\1""4\234\377"
- "\25C\241\371\336\342\352%\366\365\363\0\361\361\361\0\373\366\362\0\270"
- "\322\356R+\205\347\377G\222\347\377\22n\334\377\7c\326\377\10_\322\377"
- "\10[\316\377\10W\311\377\10S\305\377\10O\300\377\7K\274\377\7F\267\377"
- "\7C\261\377\6@\253\377\6=\246\377\6:\242\377\6""8\236\377\3""5\232\377"
- "\1""1\227\377\11""7\230\377\302\314\337K\372\370\364\0\361\361\361\0"
- "\376\370\362\0x\257\353\2413\211\350\3771\203\343\377\11g\332\377\7a"
- "\325\377\4[\320\377\5X\314\377\5S\307\377\4N\302\377\4K\275\377\4F\271"
- "\377\5B\263\377\5\77\255\377\4<\247\377\3""8\241\377\2""4\234\377\2""3"
- "\230\377\15:\232\377\31B\234\377\27>\230\377\240\257\320~\375\373\366"
- "\0\361\361\361\0\362\362\361\7J\227\351\334=\216\350\377\33u\337\377"
- "\0`\327\377\16d\325\377\"n\325\377&l\321\377%h\315\377&e\312\377\33Z"
- "\302\377\24Q\273\377\23L\265\377\21H\256\377\20D\251\377\30G\247\377"
- "\37K\245\377)P\245\3770T\244\377*N\237\377)L\235\377}\221\300\272\372"
- "\370\365\0\370\370\370\0\331\346\363./\207\347\3743\207\346\377!x\337"
- "\377F\213\342\377k\240\345\377r\242\343\377r\237\341\377t\236\337\377"
- "r\233\334\377h\221\326\377]\206\317\377U~\310\377Ow\302\377Ot\275\377"
- "Sv\273\377Hj\263\377>`\253\377\77_\250\377]w\263\377m\204\272\377\222"
- "\243\311\360\355\356\363\27\324\324\323\0\226\267\331`#\203\352\377Z"
- "\236\352\377x\255\354\377v\251\351\377i\237\345\377m\237\343\377n\235"
- "\340\377m\231\335\377p\231\333\377s\231\331\377l\221\323\377h\214\316"
- "\377q\221\315\377x\224\314\377p\214\306\377i\204\300\377n\207\277\377"
- "r\211\276\377i\201\270\377Qk\251\377Nj\254\377\227\235\253W\26\25\23"
- "\0Dg\214\222v\271\377\377}\264\362\377y\261\364\377q\251\360\377l\243"
- "\354\377q\244\352\377l\236\346\377\177\250\350\377{\243\344\377\200\244"
- "\342\377\177\241\336\377}\235\332\377t\224\323\377x\225\321\377u\222"
- "\315\377p\214\307\377l\206\302\377d\177\273\377h\201\273\377}\221\303"
- "\377\230\251\325\377Zf\204\274\0\0\0\3\36#)/V`kSPZfX'4CZ#0A]$0@`'2@b"
- "*3@d!,=e\27$9e\36):f,2=f6:@f26>f05=e15=d8:@b8:\77a04;^-09\\/2:X&*6T#"
- "'0G\2\2\2\4"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (wsicon_32_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 wsicon_32_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 wsicon_32_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (4096) */
- "\0\0\20\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (128) */
- "\0\0\0\200"
- /* width (32) */
- "\0\0\0\40"
- /* height (32) */
- "\0\0\0\40"
- /* pixel_data: */
- "\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\363\362\361\0\367\364\361\0\374\367\361"
- "\0\376\370\361\0\374\367\361\0\370\365\361\6\361\361\361\16\354\356\361"
- "\23\366\364\363\12\377\377\376\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\363\362\361\0\370\365\361\0\373\366\361\0\361\361"
- "\361\25\324\342\361D\256\316\357w\205\271\356\242d\247\355\303N\234\354"
- "\330B\225\354\3477\220\354\355L\232\353\333\337\354\3709\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\364\363\361\0\372\366\361\0\360\360\361\30\315\337\361"
- "b\223\301\360\262T\237\355\352'\207\353\377\24|\351\377\12v\350\377\10"
- "t\347\377\11u\347\377\11u\347\377\10t\347\377\0j\345\377\243\311\363"
- "\201\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\364\362\361\0\373\366\361\0\344\352\361+\260\320\361\225w\263"
- "\360\352A\225\355\377\33\177\351\377\17w\347\377\15v\346\377\16v\345"
- "\377\15u\345\377\13s\344\377\12r\344\377\11r\344\377\3n\344\377\"\200"
- "\345\364\340\351\362-\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\373\366\361\0\354\356\361\32\243\311\360\222l\254\360\365O\234"
- "\356\377+\207\351\377\21w\346\377\13s\344\377\12r\344\377\12q\343\377"
- "\11p\342\377\11o\342\377\11o\341\377\11o\341\377\11o\341\377\0h\340\377"
- "\230\277\353\207\377\371\362\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\363\362\361"
- "\0\375\367\361\0\277\327\357^e\250\356\344T\237\357\377D\225\354\377"
- "\36~\347\377\13r\343\377\11p\342\377\11p\341\377\11n\340\377\11m\340"
- "\377\11m\337\377\11l\336\377\11l\336\377\11k\336\377\2g\335\377.\201"
- "\341\354\357\360\361\26\364\363\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\366\364\361\0\366"
- "\364\361\13\215\274\355\233H\230\355\377W\240\356\3778\215\351\377\24"
- "w\345\377\12p\342\377\11n\340\377\11m\337\377\11l\336\377\11k\335\377"
- "\11j\334\377\11i\334\377\11h\333\377\11h\333\377\11h\333\377\0_\332\377"
- "\215\265\347\224\377\372\362\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\360\361\361\0\370\365\361\0\354\356\361"
- "\34g\247\354\304C\226\355\377Z\241\356\377/\207\350\377\21t\343\377\11"
- "n\340\377\11m\336\377\11k\335\377\11i\334\377\11h\333\377\11g\332\377"
- "\11f\332\377\11f\331\377\11e\330\377\11e\330\377\5b\327\377\25l\330\375"
- "\331\343\3564\367\365\362\0\361\361\361\0\361\361\361\0\361\361\361\0"
- "\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\360\361\361\0\370\365\361\0\350\354\360!R\234\352\325"
- "D\225\355\377X\237\355\377&\201\346\377\16q\341\377\11m\336\377\11k\335"
- "\377\11i\333\377\11g\333\377\11f\331\377\11e\330\377\11d\327\377\11c"
- "\326\377\11c\325\377\11b\325\377\11b\324\377\0Z\322\377N\214\334\321"
- "\373\367\362\2\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\367\364\361\0\354\356\361\35M\231\352\330C\224\354\377"
- "`\243\355\377!}\344\377\11n\337\377\11l\335\377\11i\334\377\11g\333\377"
- "\11f\331\377\11e\327\377\11c\326\377\11b\325\377\11a\323\377\11`\323"
- "\377\10_\322\377\10_\322\377\10^\321\377\0U\317\377\216\262\343\215\377"
- "\372\363\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\364"
- "\363\361\0\366\364\361\15X\237\352\3118\216\353\377m\252\356\3771\206"
- "\346\377\12m\336\377\11j\334\377\11h\333\377\11f\332\377\11e\330\377"
- "\11c\325\377\11b\324\377\11`\323\377\10_\322\377\10^\321\377\10]\320"
- "\377\10\\\317\377\10[\316\377\6Z\315\377\6Y\315\377\301\322\352Q\372"
- "\367\363\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\376"
- "\370\362\0y\260\353\250&\204\351\377n\253\356\377E\222\350\377\20p\337"
- "\377\10i\334\377\11g\332\377\11e\331\377\11d\326\377\11b\324\377\11`"
- "\322\377\10_\321\377\10]\320\377\10\\\317\377\10Z\315\377\10Z\314\377"
- "\10Y\313\377\10X\312\377\3T\311\377\34d\315\372\341\346\356'\365\364"
- "\362\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\376\370\362\0\253\314"
- "\355n\33}\347\377d\245\356\377U\232\352\377\32v\340\377\10i\333\377\11"
- "g\332\377\11e\330\377\11c\325\377\11a\323\377\10_\322\377\10]\320\377"
- "\10[\316\377\10Z\314\377\10X\313\377\10W\312\377\10V\311\377\10U\310"
- "\377\10T\307\377\0N\304\3776r\316\345\362\362\361\15\363\362\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\367\364\361\0\340\350\360+)\205\346\365L\230"
- "\354\377a\242\354\377)\177\342\377\11i\334\377\11g\332\377\11d\327\377"
- "\11b\325\377\11`\323\377\10^\321\377\10\\\317\377\10Z\315\377\10X\313"
- "\377\10W\311\377\10U\310\377\10T\306\377\10S\305\377\10R\304\377\10Q"
- "\303\377\0H\301\377M\200\320\315\373\370\363\1\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\375\370\362\1d\244\351\275)\204\350\377f\245\355"
- "\377:\211\345\377\17m\335\377\10f\332\377\11e\327\377\11b\325\377\10"
- "_\322\377\10]\321\377\10[\316\377\10Y\314\377\10W\312\377\10U\310\377"
- "\10T\306\377\10R\305\377\10Q\303\377\10O\302\377\10O\301\377\10N\300"
- "\377\0D\274\377`\213\321\275\375\371\364\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\374\367\362\0\272\323\356\\\27z\346\377Y\236\354\377J\223\347\377"
- "\32t\337\377\10f\332\377\11d\330\377\11b\325\377\10_\323\377\10]\320"
- "\377\10[\315\377\10X\313\377\10W\311\377\10T\307\377\10R\305\377\10Q"
- "\303\377\10O\301\377\10N\300\377\10M\276\377\10L\275\377\7K\274\377\0"
- "A\270\377k\221\322\262\376\372\364\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\362\362\361\0\366"
- "\364\361\13E\223\350\3366\213\351\377X\234\352\377)~\342\377\13i\333"
- "\377\11e\330\377\11c\325\377\11`\323\377\10]\320\377\10[\316\377\10X"
- "\313\377\10V\311\377\10T\306\377\10Q\304\377\10P\302\377\10N\300\377"
- "\10M\276\377\7K\274\377\7J\272\377\7I\271\377\7G\270\377\0<\263\377n"
- "\222\320\255\376\373\364\0\361\361\361\0\361\361\361\0\361\361\361\0"
- "\361\361\361\0\361\361\361\0\361\361\361\0\375\370\362\0\254\314\355"
- "k\26z\346\377Z\236\353\377@\215\345\377\23o\335\377\10e\331\377\11c\326"
- "\377\11a\323\377\10]\321\377\10[\316\377\10X\313\377\10V\310\377\10S"
- "\306\377\10Q\303\377\10O\301\377\10M\277\377\7L\274\377\7J\272\377\7"
- "H\270\377\7F\266\377\7E\264\377\7D\262\377\0""9\256\377k\216\315\262"
- "\376\373\365\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\362\362\361\0\367\365\361\11E\223\350\3326\213\351\377"
- "X\234\352\377(}\341\377\12g\332\377\11d\327\377\11a\324\377\10^\321\377"
- "\10\\\316\377\10Y\313\377\10V\310\377\10S\306\377\10Q\303\377\10O\301"
- "\377\10M\276\377\7K\273\377\7H\271\377\7F\266\377\7D\263\377\7C\262\377"
- "\7B\260\377\7B\256\377\0""7\251\377a\205\306\274\375\372\365\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\373\367"
- "\362\0\273\324\356X\27z\346\377X\234\353\377A\215\346\377\23n\334\377"
- "\10e\330\377\11b\325\377\10_\322\377\10]\320\377\10Y\314\377\10W\311"
- "\377\10T\306\377\10Q\303\377\10O\301\377\10M\276\377\7K\273\377\7H\270"
- "\377\7E\264\377\7C\262\377\7B\260\377\7A\255\377\6@\253\377\6\77\251"
- "\377\0""5\244\377Pv\276\312\373\371\364\0\361\361\361\0\361\361\361\0"
- "\361\361\361\0\361\361\361\0\361\361\361\0\376\370\362\0a\242\351\301"
- "+\204\350\377Y\235\352\377(}\341\377\11g\332\377\11d\326\377\11a\323"
- "\377\10^\321\377\10[\315\377\10X\312\377\10U\310\377\10R\304\377\10O"
- "\301\377\10M\276\377\7K\273\377\7H\270\377\7E\264\377\7C\261\377\7B\256"
- "\377\6@\253\377\6>\250\377\6=\246\377\6<\245\377\0""3\240\377;c\264\336"
- "\365\364\363\11\363\362\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\366\364\361\0\335\346\360-#\201\346\374L\227\352\377J\223\347\377"
- "\27q\335\377\10e\330\377\11c\325\377\10_\322\377\10\\\317\377\10Y\314"
- "\377\10V\311\377\10S\305\377\10P\302\377\10N\277\377\7K\274\377\7H\270"
- "\377\7E\264\377\7C\261\377\7A\256\377\6@\252\377\6=\247\377\6<\244\377"
- "\6:\242\377\6""9\241\377\0""3\235\377#O\250\364\350\352\356\34\364\363"
- "\362\0\361\361\361\0\361\361\361\0\361\361\361\0\376\370\362\0\232\302"
- "\355~\33|\346\377W\234\352\3774\205\343\377\14i\332\377\10d\327\377\11"
- "a\323\377\10^\321\377\10[\315\377\10W\312\377\10T\307\377\10Q\304\377"
- "\10O\301\377\10L\275\377\7I\272\377\7F\265\377\7C\261\377\7A\255\377"
- "\6\77\252\377\6=\246\377\6;\243\377\6""9\240\377\6""8\237\377\6""7\234"
- "\377\2""4\231\377\13:\234\377\321\327\345;\370\367\364\0\361\361\361"
- "\0\361\361\361\0\362\361\361\0\373\366\362\2R\233\351\3153\211\350\377"
- "L\225\350\377\37w\337\377\10f\331\377\11c\326\377\10`\323\377\10]\320"
- "\377\10Y\314\377\10V\311\377\10S\305\377\10P\302\377\10M\277\377\7J\273"
- "\377\7G\267\377\7D\263\377\7B\256\377\6@\252\377\6=\247\377\6;\243\377"
- "\6""9\240\377\6""8\235\377\5""6\232\377\3""2\227\377\3""2\226\377\12"
- "6\230\377\267\302\333f\373\371\365\0\361\361\361\0\361\361\361\0\366"
- "\364\361\0\335\346\360*'\203\347\373G\224\352\3779\211\345\377\21m\335"
- "\377\10e\330\377\11b\325\377\10^\322\377\6[\316\377\6W\312\377\6T\307"
- "\377\7Q\304\377\10O\301\377\10L\275\377\7I\271\377\7E\264\377\7C\260"
- "\377\6@\254\377\6>\250\377\6;\244\377\6""9\240\377\5""7\234\377\2""3"
- "\230\377\3""2\226\377\22=\232\377\32B\234\377\25;\227\377\214\237\310"
- "\234\376\374\367\0\361\361\361\0\361\361\361\0\375\367\362\0\253\313"
- "\355l\36~\347\377L\226\351\377*\177\342\377\13i\333\377\7d\327\377\3"
- "]\323\377\4[\320\377\14]\316\377\16[\313\377\15W\310\377\11Q\303\377"
- "\4K\276\377\1F\272\377\0B\265\377\1\77\261\377\3>\255\377\3=\250\377"
- "\3:\244\377\2""7\240\377\3""5\234\377\7""7\233\377\30C\237\377+Q\244"
- "\377-R\243\377/R\242\377*L\236\377f~\267\322\370\366\364\3\362\361\361"
- "\0\361\361\361\0\377\370\362\0r\255\352\255)\204\350\377D\221\350\377"
- "\32u\337\377\1c\331\377\15f\330\377.y\332\377G\207\334\377I\205\332\377"
- "E\200\326\377G\177\324\377L\200\323\377H{\317\3778m\310\3773g\303\377"
- "2c\276\377,]\271\377(X\263\377*X\261\3775^\261\377>d\262\377>b\257\377"
- "8\\\251\3770U\244\377.Q\240\377&I\233\377A`\246\377c|\265\371\346\347"
- "\354(\365\364\363\0\373\373\373\0\366\365\362\11E\224\350\3374\212\351"
- "\377/\204\345\377\33u\337\377D\213\343\377n\243\347\377{\252\347\377"
- "v\245\345\377s\241\342\377\177\247\343\377\177\245\341\377v\235\335\377"
- "o\230\331\377k\222\325\377b\211\320\377[\202\312\377U|\305\377Pv\301"
- "\377Ot\275\377Su\274\377Gj\264\3776Z\252\377<^\251\3776W\245\377d~\270"
- "\377l\203\271\377\203\226\304\377\230\247\315\377\306\315\337i\375\374"
- "\371\0\275\275\275\0\335\346\357+\37\200\347\3742\210\350\377X\234\352"
- "\377|\260\354\377\206\264\354\377p\244\347\377i\236\344\377o\240\343"
- "\377n\235\341\377p\235\337\377i\226\333\377m\227\332\377t\232\332\377"
- "r\227\327\377s\226\325\377j\216\317\377v\226\320\377z\227\317\377\177"
- "\232\317\377}\227\314\377v\217\306\377|\224\307\377\201\226\307\377\210"
- "\234\311\377z\217\300\377u\212\274\377Qk\251\377(H\224\377\215\236\307"
- "\267\222\220\213\0\0\0\0\0H`xWC\233\371\377p\256\363\377y\261\361\377"
- "q\252\357\377k\245\354\377c\236\350\377_\231\346\377l\240\346\377c\227"
- "\342\377e\227\340\377z\243\343\377\177\245\342\377}\242\337\377x\234"
- "\333\377f\215\323\377`\206\316\377c\207\314\377e\207\312\377k\212\311"
- "\377d\204\304\377Pq\271\377Qq\267\377Kk\261\377Jh\256\377@^\246\377G"
- "d\250\377Un\254\377\212\233\307\377\226\245\311\367\26\30\34#\0\0\0\0"
- "CTgr\205\270\355\363w\246\332\364w\245\332\365w\246\336\366q\241\333"
- "\366m\234\331\367g\227\326\367m\231\325\370k\226\323\370x\235\324\370"
- "s\230\321\370_\210\312\370m\220\313\370x\227\314\370\211\242\317\370"
- "\216\245\317\370\203\233\311\370}\225\305\370\202\230\305\370\202\227"
- "\303\370\207\233\303\370\215\236\304\367\202\225\276\367|\216\271\367"
- "\201\223\272\366\204\224\272\366\225\242\301\365\204\223\270\364l\200"
- "\261\365<BOp\0\0\0\0\12\13\13\15/01!VVU(<>@+\15\22\26.\14\20\25""0\16"
- "\21\25""3\20\22\25""5\23\24\26""7\26\26\26""9\22\23\25:\12\15\23;\10"
- "\14\22;\11\14\22<\13\16\23=\20\21\24<\24\24\25<\26\26\26<\25\25\26<\26"
- "\26\26;\26\26\26:\27\26\26""9\31\30\27""7\30\30\27""5\22\23\24""3\17"
- "\20\22""1\17\20\22.\21\21\23+\16\17\22'\26\26\27#\13\13\14\24\0\0\0\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (wsicon_48_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 wsicon_48_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 wsicon_48_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (9216) */
- "\0\0$\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (192) */
- "\0\0\0\300"
- /* width (48) */
- "\0\0\0""0"
- /* height (48) */
- "\0\0\0""0"
- /* pixel_data: */
- "\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\362\362\361\0\364\363\361"
- "\0\366\364\361\0\370\365\361\0\372\366\361\0\374\367\361\0\374\367\361"
- "\0\372\366\360\0\375\374\373\0\377\377\377\7\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\362\361\361\0\365\363\361\0\371\365\361\0\375\367\361"
- "\0\374\367\361\0\365\363\361\20\352\355\361)\335\346\360B\314\336\360"
- "[\276\327\360n\263\321\357|\252\314\357\202\264\321\357x\362\363\364"
- "\34\377\377\377\1\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\362\361\361\0\366\364\361\0\373\366\361\0\370\365\361"
- "\13\345\353\3614\306\333\360j\234\305\357\242p\256\355\313K\232\354\347"
- "3\215\353\372#\205\353\377\31\200\352\377\22|\352\377\17{\352\377\15"
- "y\352\377\10w\352\377c\246\354\330\372\373\373\27\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\364\363\361\0\372\365\361\0\365\363\361\20\333\346"
- "\361R\256\317\361\234v\261\357\335B\226\355\377$\206\353\377\26~\352"
- "\377\22{\351\377\16y\350\377\17y\350\377\21z\350\377\23z\350\377\23z"
- "\350\377\22z\350\377\20y\350\377\13v\350\377\15w\347\377\335\352\370"
- "D\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\366\364\361\0\372\366\361\0\346\353\3619\267\324\361"
- "\225\205\272\361\342U\240\357\3771\215\354\377\35\201\352\377\26|\350"
- "\377\25{\350\377\25{\347\377\25z\347\377\22x\346\377\17w\346\377\16v"
- "\346\377\14u\345\377\13t\345\377\12t\345\377\12t\345\377\2o\345\377,"
- "\205\346\370\356\362\366'\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\366\364\361\0\373\366\361\0\332\345\361J\234\305\360\273o"
- "\257\361\376V\241\360\377=\222\355\377&\204\351\377\27|\347\377\22x\346"
- "\377\20w\346\377\16u\345\377\15u\345\377\14t\344\377\13s\344\377\11r"
- "\344\377\11r\344\377\11q\344\377\11q\344\377\11q\344\377\10q\344\377"
- "\1l\343\377\246\310\354\207\375\371\363\0\361\361\361\0\361\361\361\0"
- "\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\363\362\361\0\375\367\361\0\336\347\360>\217\276\357\272_\246\360"
- "\377]\245\360\377Q\235\356\3771\212\351\377\31|\347\377\20v\345\377\15"
- "t\345\377\14s\344\377\13r\344\377\12r\343\377\12q\343\377\11p\342\377"
- "\11p\342\377\11p\342\377\11o\342\377\11o\342\377\11o\342\377\11o\342"
- "\377\0h\341\377J\223\346\341\371\366\361\20\362\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\371\366\361\0\363\362\361\34\235\305\357\233S\237\356\376X\242\357"
- "\377`\245\357\377C\224\353\377#\202\347\377\22w\345\377\14s\344\377\12"
- "r\343\377\12q\343\377\12q\342\377\11p\342\377\11o\341\377\11n\341\377"
- "\11n\340\377\11n\340\377\11m\340\377\11m\340\377\11m\337\377\11m\337"
- "\377\7l\337\377\7k\337\377\275\323\355k\374\367\362\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\362\362\361\0\376"
- "\370\361\0\316\337\360X[\243\354\345D\227\356\377c\247\357\377V\237\355"
- "\3773\212\351\377\32{\346\377\16t\344\377\13q\343\377\12q\342\377\12"
- "o\341\377\11n\341\377\11n\340\377\11m\337\377\11m\337\377\11l\336\377"
- "\11l\336\377\11l\336\377\11k\335\377\11k\335\377\11k\335\377\11k\335"
- "\377\0d\334\377L\222\343\336\372\367\362\12\362\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\365\363\361\0\373\366\361"
- "\12\235\304\355\2255\216\353\377P\235\356\377f\250\357\377H\227\353\377"
- "(\204\350\377\25w\344\377\14r\343\377\12p\341\377\12o\341\377\11n\340"
- "\377\11m\337\377\11l\336\377\11l\336\377\11k\335\377\11j\334\377\11j"
- "\334\377\11j\334\377\11i\334\377\11i\334\377\11h\333\377\11h\333\377"
- "\10h\333\377\2c\332\377\261\313\353~\375\370\362\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\360\361\361\0\370\365\361\0\361\361\361\"o\254"
- "\353\303)\207\352\377^\244\357\377c\246\356\377@\221\352\377#\200\346"
- "\377\23v\343\377\14p\341\377\12n\340\377\11m\337\377\11l\337\377\11k"
- "\335\377\11k\335\377\11j\334\377\11i\334\377\11h\333\377\11h\333\377"
- "\11g\333\377\11g\332\377\11f\332\377\11f\332\377\11f\331\377\11f\331"
- "\377\2a\330\377.}\335\367\357\360\361!\363\362\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\360\361\361\0\372\366\361\0\345\353\3607O\232\352\341)\206"
- "\352\377e\250\357\377^\243\356\377:\215\351\377\40~\345\377\22t\342\377"
- "\13o\340\377\11n\337\377\11m\336\377\11k\335\377\11j\334\377\11i\334"
- "\377\11h\333\377\11g\333\377\11g\332\377\11f\331\377\11f\331\377\11f"
- "\330\377\11e\330\377\11e\327\377\11e\327\377\11d\327\377\11d\327\377"
- "\0[\325\377\177\254\344\262\377\372\363\0\361\361\361\0\361\361\361\0"
- "\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\360\361\361\0\373\366\361\0\335\347\360@<\220\351\355+\207\352\377"
- "g\250\356\377Z\240\355\3774\211\350\377\34z\344\377\20r\342\377\13n\337"
- "\377\12m\336\377\11k\335\377\11j\334\377\11i\334\377\11h\333\377\11g"
- "\332\377\11f\331\377\11f\330\377\11e\330\377\11e\327\377\11d\326\377"
- "\11c\326\377\11c\325\377\11b\325\377\11b\325\377\11b\324\377\7a\324\377"
- "\10`\324\377\304\325\353^\372\366\362\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\360\361\361\0\372"
- "\366\361\0\335\346\360C4\214\350\361*\206\351\377i\251\357\377[\240\355"
- "\377/\206\346\377\25v\342\377\14o\340\377\12m\337\377\11l\335\377\11"
- "j\334\377\11i\334\377\11g\333\377\11f\332\377\11f\331\377\11e\330\377"
- "\11d\327\377\11c\326\377\11c\325\377\11b\324\377\11a\324\377\11a\323"
- "\377\11`\323\377\11`\323\377\10`\323\377\10`\322\377\1Z\321\3771y\327"
- "\364\360\360\361\36\363\362\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\371\365\361\0\343\352"
- "\36196\214\350\360$\203\350\377i\251\356\377d\245\356\3774\211\347\377"
- "\23t\341\377\12n\337\377\12m\336\377\11k\335\377\11i\334\377\11h\333"
- "\377\11f\332\377\11f\331\377\11e\330\377\11d\327\377\11c\326\377\11b"
- "\324\377\11a\324\377\11`\323\377\10`\323\377\10_\322\377\10_\322\377"
- "\10^\321\377\10^\321\377\10]\321\377\10]\320\377\0T\316\377g\231\335"
- "\302\377\371\363\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\366\363\361\0\357\360\361$D\224\351"
- "\345\32}\347\377d\246\356\377m\253\357\377C\221\350\377\31v\342\377\12"
- "m\337\377\12l\335\377\11j\334\377\11h\333\377\11g\332\377\11f\331\377"
- "\11e\330\377\11d\326\377\11c\325\377\11b\324\377\11a\323\377\11`\323"
- "\377\10_\322\377\10^\321\377\10]\321\377\10]\320\377\10]\317\377\10\\"
- "\317\377\10\\\317\377\10[\316\377\10[\316\377\0S\314\377\235\273\344"
- "\214\376\371\363\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\363\362\361\0\372\366\361\17`\243\352\317\17w\346"
- "\377[\241\355\377r\255\357\377S\232\352\377$}\343\377\14n\337\377\11"
- "k\335\377\11i\334\377\11g\333\377\11f\332\377\11e\330\377\11d\327\377"
- "\11c\325\377\11b\324\377\11a\323\377\10`\323\377\10^\322\377\10^\321"
- "\377\10]\320\377\10\\\317\377\10\\\316\377\10[\315\377\10Z\315\377\10"
- "Z\314\377\10Y\314\377\10Y\313\377\6W\313\377\12Z\313\377\313\330\353"
- "W\371\366\362\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\377\371\362\0\212\271\354\252\7s\346\377L\230\354\377"
- "q\255\357\377]\240\354\3771\205\345\377\20p\337\377\11k\334\377\11i\334"
- "\377\11g\332\377\11f\331\377\11e\330\377\11d\326\377\11b\324\377\11a"
- "\323\377\10`\322\377\10^\322\377\10]\321\377\10\\\320\377\10\\\317\377"
- "\10[\315\377\10Z\315\377\10Y\314\377\10X\313\377\10X\312\377\10W\312"
- "\377\10W\312\377\10W\311\377\2S\310\377\"g\315\374\346\352\357+\365\363"
- "\362\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\375\367"
- "\362\0\273\324\356p\15u\345\3778\215\351\377m\252\356\377c\243\354\377"
- "<\214\346\377\26t\337\377\11j\334\377\11i\333\377\11g\332\377\11f\331"
- "\377\11d\327\377\11c\325\377\11b\324\377\11`\323\377\10_\322\377\10^"
- "\321\377\10]\320\377\10\\\316\377\10[\315\377\10Z\314\377\10X\313\377"
- "\10X\312\377\10W\312\377\10W\311\377\10V\310\377\10U\310\377\10U\307"
- "\377\10T\307\377\0N\305\377:v\317\350\364\363\361\17\362\362\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\366\364\361\0\350\354\3602+\206"
- "\347\366\36\177\347\377c\245\355\377h\247\355\377H\222\350\377\37y\341"
- "\377\13k\334\377\11h\333\377\11f\332\377\11e\330\377\11d\326\377\11b"
- "\325\377\11a\324\377\10`\323\377\10^\321\377\10]\320\377\10\\\317\377"
- "\10[\315\377\10Y\314\377\10X\313\377\10W\312\377\10W\311\377\10V\310"
- "\377\10U\310\377\10T\306\377\10S\306\377\10S\305\377\10R\305\377\10R"
- "\304\377\0I\301\377T\206\322\322\374\370\363\2\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\376\370\362\6h\247\352\312\10r\345"
- "\377R\233\353\377k\250\355\377Q\230\351\377,\201\342\377\17n\335\377"
- "\11h\333\377\11f\332\377\11e\330\377\11d\326\377\11b\325\377\11a\323"
- "\377\10_\322\377\10]\321\377\10\\\320\377\10[\316\377\10Z\314\377\10"
- "X\313\377\10W\312\377\10V\311\377\10V\310\377\10T\307\377\10S\306\377"
- "\10R\305\377\10R\304\377\10Q\303\377\10Q\303\377\10Q\303\377\10P\302"
- "\377\0F\277\377n\227\326\276\376\372\364\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\375\367\362\0\265\321\356u\7r\345\3778\215\351\377h"
- "\246\355\377Y\235\352\3777\210\344\377\27r\336\377\12i\333\377\11g\332"
- "\377\11e\330\377\11d\326\377\11b\324\377\11a\323\377\10_\322\377\10]"
- "\321\377\10\\\317\377\10[\315\377\10Y\314\377\10X\312\377\10W\311\377"
- "\10V\310\377\10T\307\377\10S\306\377\10R\305\377\10Q\304\377\10P\303"
- "\377\10P\302\377\10O\302\377\10O\301\377\10O\300\377\10N\300\377\0D\274"
- "\377\203\244\331\252\377\373\364\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\364\362"
- "\361\0\360\360\361\40""4\212\347\361\30z\346\377\\\240\354\377`\241\353"
- "\377B\216\346\377\40y\340\377\14j\334\377\11g\332\377\11e\330\377\11"
- "d\326\377\11b\324\377\11`\323\377\10_\322\377\10]\320\377\10\\\317\377"
- "\10Z\314\377\10X\313\377\10W\312\377\10V\311\377\10U\307\377\10S\306"
- "\377\10R\304\377\10Q\303\377\10P\303\377\10P\302\377\10O\301\377\10N"
- "\300\377\10M\277\377\10M\276\377\10M\275\377\10L\275\377\0C\271\377\221"
- "\255\334\233\377\373\364\0\361\361\361\0\361\361\361\0\361\361\361\0"
- "\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\377\371\362"
- "\0\214\272\353\250\3o\344\377E\224\352\377b\243\354\377K\224\350\377"
- ",\200\342\377\20n\335\377\11g\332\377\11e\330\377\11d\326\377\11b\324"
- "\377\11`\323\377\10^\322\377\10]\320\377\10\\\316\377\10Z\314\377\10"
- "X\313\377\10W\311\377\10V\310\377\10T\307\377\10R\305\377\10Q\304\377"
- "\10P\303\377\10P\302\377\10O\301\377\10N\277\377\10M\276\377\10L\275"
- "\377\7L\274\377\7K\274\377\7J\273\377\7J\273\377\0A\267\377\232\263\335"
- "\222\376\372\364\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\366\364\361\0\341\350\360<\35~\345"
- "\375#\201\347\377]\240\354\377S\231\351\3776\206\343\377\31s\336\377"
- "\12h\333\377\11f\331\377\11d\327\377\11b\325\377\11a\323\377\10^\322"
- "\377\10]\320\377\10\\\316\377\10Z\314\377\10X\313\377\10W\311\377\10"
- "V\310\377\10S\306\377\10R\304\377\10Q\303\377\10P\302\377\10O\301\377"
- "\10N\277\377\10M\276\377\10L\275\377\7K\274\377\7J\273\377\7I\272\377"
- "\7H\271\377\7G\270\377\7G\267\377\0\77\263\377\236\264\334\213\376\372"
- "\364\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\377\371\362\0y\260\352\270\4o\344\377J\226\352\377"
- "^\240\353\377B\217\346\377${\340\377\15j\334\377\11f\331\377\11e\327"
- "\377\11c\325\377\11a\323\377\10_\322\377\10]\321\377\10\\\317\377\10"
- "Z\314\377\10X\313\377\10W\311\377\10U\310\377\10S\306\377\10Q\304\377"
- "\10Q\303\377\10O\301\377\10N\300\377\10M\276\377\10L\275\377\7K\274\377"
- "\7J\273\377\7I\271\377\7G\270\377\7F\266\377\7E\265\377\7E\264\377\7"
- "D\264\377\0<\260\377\236\263\333\214\376\372\364\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\367\364\361\0\334"
- "\345\360>\31{\345\376'\202\347\377^\241\353\377R\230\351\3774\205\343"
- "\377\25p\335\377\11g\332\377\11e\330\377\11c\326\377\11a\324\377\10_"
- "\322\377\10]\321\377\10\\\317\377\10Z\315\377\10X\313\377\10W\311\377"
- "\10U\310\377\10S\305\377\10Q\304\377\10P\302\377\10O\301\377\10N\277"
- "\377\10L\275\377\7K\274\377\7J\273\377\7I\271\377\7G\270\377\7F\266\377"
- "\7E\264\377\7D\263\377\7D\262\377\7C\262\377\7C\261\377\0:\255\377\230"
- "\256\330\225\376\373\365\0\361\361\361\0\361\361\361\0\361\361\361\0"
- "\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\377\370\362\0~\262\352\262\4o\344\377"
- "J\226\352\377^\240\353\377D\220\346\377$z\340\377\14j\333\377\11f\330"
- "\377\11d\327\377\11b\324\377\11`\323\377\10^\321\377\10\\\317\377\10"
- "[\315\377\10X\313\377\10W\311\377\10U\310\377\10S\306\377\10Q\304\377"
- "\10P\302\377\10O\301\377\10N\277\377\10L\275\377\7K\274\377\7J\272\377"
- "\7H\270\377\7F\266\377\7E\264\377\7D\263\377\7C\262\377\7C\261\377\7"
- "B\257\377\7B\256\377\7A\255\377\0""7\251\377\215\246\323\236\377\373"
- "\365\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\365\363"
- "\361\0\345\352\360/\40\177\345\374#\200\346\377\\\237\353\377S\231\351"
- "\3775\205\343\377\25p\335\377\11g\331\377\11e\327\377\11c\325\377\11"
- "a\323\377\10_\322\377\10]\320\377\10[\316\377\10Y\313\377\10W\312\377"
- "\10V\310\377\10S\306\377\10Q\304\377\10P\303\377\10O\301\377\10N\277"
- "\377\10L\275\377\7K\273\377\7I\271\377\7G\267\377\7E\265\377\7D\263\377"
- "\7C\262\377\7B\260\377\7B\257\377\7A\255\377\6A\254\377\6@\253\377\6"
- "@\252\377\0""4\245\377}\231\315\260\377\374\365\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\377\370\362\0\226\277\354\232\3o\344"
- "\377E\223\351\377]\240\352\377E\220\346\377\"y\340\377\14i\333\377\11"
- "f\330\377\11d\326\377\11a\324\377\10`\323\377\10]\321\377\10\\\317\377"
- "\10Z\314\377\10X\312\377\10V\311\377\10T\306\377\10R\304\377\10P\303"
- "\377\10O\301\377\10M\277\377\10L\275\377\7K\273\377\7I\271\377\7F\266"
- "\377\7E\264\377\7D\263\377\7C\261\377\7B\257\377\7A\255\377\6A\254\377"
- "\6@\252\377\6\77\251\377\6>\250\377\6>\247\377\0""2\242\377i\210\305"
- "\303\376\373\365\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\362\362"
- "\361\0\364\363\361\26""9\215\347\356\30z\346\377X\235\353\377U\232\351"
- "\3776\206\343\377\23o\335\377\11f\331\377\11e\327\377\11c\325\377\11"
- "a\323\377\10^\322\377\10\\\320\377\10[\315\377\10X\313\377\10W\311\377"
- "\10U\307\377\10R\305\377\10Q\303\377\10O\301\377\10N\277\377\10L\275"
- "\377\7K\273\377\7I\271\377\7F\266\377\7E\264\377\7C\262\377\7B\260\377"
- "\7B\256\377\6A\254\377\6\77\252\377\6>\250\377\6>\247\377\6=\246\377"
- "\6<\245\377\6<\244\377\0""2\237\377Ot\273\324\373\371\364\3\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\372\366\362\0\276\325\356m\11r\344\377"
- "9\214\350\377\\\237\353\377K\224\347\377(|\340\377\14i\333\377\11f\330"
- "\377\11d\326\377\11a\324\377\10_\322\377\10]\321\377\10\\\316\377\10"
- "Y\314\377\10W\312\377\10V\310\377\10S\306\377\10Q\303\377\10P\302\377"
- "\10N\277\377\10L\275\377\7K\274\377\7I\271\377\7F\266\377\7E\264\377"
- "\7C\262\377\7B\260\377\7B\255\377\6@\253\377\6\77\251\377\6>\250\377"
- "\6=\246\377\6<\244\377\6;\243\377\6:\242\377\6""9\241\377\0""2\235\377"
- "8`\261\351\364\363\362\20\363\362\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\376"
- "\370\362\0j\247\351\305\12r\345\377O\230\352\377W\234\352\377\77\214"
- "\345\377\31s\336\377\11g\332\377\11e\327\377\11b\325\377\11`\323\377"
- "\10^\322\377\10\\\317\377\10Z\315\377\10X\312\377\10W\311\377\10T\306"
- "\377\10R\304\377\10P\303\377\10O\301\377\10M\276\377\7K\274\377\7I\272"
- "\377\7G\267\377\7E\264\377\7C\262\377\7B\257\377\7A\255\377\6@\253\377"
- "\6\77\251\377\6=\247\377\6<\245\377\6;\243\377\6:\242\377\6""9\240\377"
- "\6""8\237\377\6""8\236\377\0""3\233\377\"N\247\372\347\351\356)\364\363"
- "\362\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\364\363\361\0\347\354\360+%\201\346\372&\202\347"
- "\377X\235\352\377N\226\350\3770\202\342\377\17l\334\377\11f\331\377\11"
- "d\327\377\11b\324\377\10`\322\377\10]\321\377\10\\\316\377\10Y\314\377"
- "\10W\312\377\10U\310\377\10S\305\377\10Q\303\377\10P\302\377\10M\277"
- "\377\7L\275\377\7J\273\377\7H\270\377\7E\265\377\7D\263\377\7B\260\377"
- "\7B\255\377\6@\253\377\6>\250\377\6=\246\377\6<\244\377\6;\242\377\6"
- "9\241\377\6""8\237\377\6""8\236\377\6""7\234\377\5""7\233\377\2""4\231"
- "\377\14;\234\377\321\330\345M\367\366\364\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\375\367\362"
- "\0\255\314\355w\6p\344\377@\220\351\377V\233\352\377B\216\346\377!x\337"
- "\377\12h\332\377\11e\330\377\11c\326\377\11a\323\377\10^\322\377\10\\"
- "\320\377\10[\315\377\10X\313\377\10W\311\377\10T\307\377\10R\304\377"
- "\10P\303\377\10N\300\377\10M\275\377\7K\273\377\7H\271\377\7F\266\377"
- "\7D\263\377\7C\260\377\7B\256\377\6@\253\377\6\77\250\377\6=\246\377"
- "\6;\244\377\6:\242\377\6""9\240\377\6""8\236\377\6""7\234\377\5""7\233"
- "\377\5""5\231\377\5""5\230\377\4""4\230\377\0*\223\377\253\271\326z\374"
- "\372\365\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\376\370\362\1f\245\351\307\16u\345\377N\230"
- "\352\377M\226\350\3773\205\343\377\24p\335\377\11f\332\377\11e\327\377"
- "\11b\325\377\11`\323\377\10^\321\377\10\\\317\377\10Y\314\377\10W\312"
- "\377\10V\310\377\10S\305\377\10Q\303\377\10O\302\377\10M\277\377\7K\274"
- "\377\7J\273\377\7G\267\377\7E\264\377\7C\261\377\7B\257\377\6A\254\377"
- "\6\77\251\377\6=\246\377\6;\244\377\6:\242\377\6""8\240\377\6""8\236"
- "\377\5""7\234\377\5""6\232\377\5""5\231\377\4""3\227\377\2""1\225\377"
- "\3""2\225\377\20""8\230\377\224\246\315\247\375\373\366\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\364\363\361"
- "\0\351\355\361%'\203\346\372'\202\347\377R\232\352\377B\216\346\377&"
- "|\341\377\15k\333\377\11f\331\377\11d\327\377\11b\324\377\10`\322\377"
- "\10]\320\377\10[\316\377\10Y\314\377\10W\312\377\10U\307\377\10R\305"
- "\377\10P\303\377\10O\301\377\10M\276\377\7K\274\377\7H\271\377\7F\265"
- "\377\7D\263\377\7B\260\377\7A\255\377\6\77\252\377\6>\247\377\6<\245"
- "\377\6:\242\377\6""9\240\377\6""8\236\377\5""7\233\377\5""6\231\377\4"
- "3\230\377\1""0\225\377\10""5\226\377\27A\234\377(O\242\377\40E\235\377"
- "Xt\263\325\373\370\365\4\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\372\366\362\0\276\326\356d\14t\345\377=\216"
- "\351\377N\227\351\3778\210\345\377\34u\337\377\12h\333\377\11f\330\377"
- "\11d\326\377\11a\323\377\10_\322\377\7\\\320\377\6Y\315\377\5V\312\377"
- "\5U\310\377\6R\306\377\7P\303\377\10O\302\377\10N\277\377\7L\274\377"
- "\7J\273\377\7G\267\377\7E\264\377\7C\261\377\7B\257\377\6@\253\377\6"
- ">\250\377\6=\245\377\6;\243\377\6""9\240\377\6""8\236\377\5""7\234\377"
- "\3""4\231\377\1""0\226\377\11""6\227\377\34F\236\377-S\244\377\34D\233"
- "\377\21:\225\377\23""9\225\377Ur\262\371\357\360\360&\363\362\362\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\377\371\362\0\202"
- "\265\353\256\14t\345\377I\225\352\377G\222\350\377/\203\343\377\24p\335"
- "\377\11g\332\377\11e\330\377\11c\325\377\7_\323\377\3[\321\377\12^\320"
- "\377\23a\317\377\25`\315\377\24^\313\377\22Z\307\377\14T\304\377\7N\301"
- "\377\3J\275\377\2H\273\377\3F\270\377\4D\265\377\4A\262\377\4@\257\377"
- "\3>\254\377\3=\250\377\3;\246\377\3""9\243\377\3""7\240\377\1""4\235"
- "\377\0""2\232\377\0""2\230\377\15:\233\377%M\243\377:]\252\377.S\243"
- "\377(L\237\3773U\243\377Ji\255\377Ed\252\377+M\235\377\310\317\337[\371"
- "\367\364\0\361\361\361\0\361\361\361\0\361\361\361\0\362\361\361\0\370"
- "\365\361\12F\224\350\342\35~\347\377M\227\352\377>\215\347\377'}\342"
- "\377\16l\334\377\10f\332\377\4b\326\377\0\\\323\377\20e\324\377/w\330"
- "\377:}\330\3776x\325\3774u\323\3776t\322\377;v\321\377>w\320\377\77v"
- "\316\3772k\311\377(c\304\377\40[\300\377\32T\273\377\32Q\270\377\26N"
- "\264\377\34R\263\377\32M\257\377\32L\255\377\31J\252\377\35K\251\377"
- "-W\255\3776^\256\377\77d\260\377Dg\260\377:^\253\3770T\244\3778Z\246"
- "\3777Y\244\377/Q\237\377!E\230\377+M\234\377(I\232\377\226\246\311\234"
- "\375\373\366\0\361\361\361\0\361\361\361\0\361\361\361\0\365\363\361"
- "\0\342\351\3605!\200\346\3750\210\351\377K\226\352\3776\210\345\377\34"
- "v\340\377\4e\333\377\10f\331\377)y\334\377Y\225\342\377y\250\347\377"
- "q\242\344\377p\240\342\377q\237\341\377l\233\337\377h\226\335\377o\232"
- "\335\377m\227\333\377s\233\333\377c\216\325\377^\211\322\377\\\206\320"
- "\377^\206\316\377h\214\317\377Y\201\311\377V}\305\377Nu\301\377Ou\277"
- "\377Vy\300\377]}\300\377b\201\301\377St\271\377=a\256\3777\\\252\377"
- "*O\242\377,P\241\377-Q\240\3774U\242\377\"E\227\3773T\237\377\205\230"
- "\305\377\254\272\330\377\242\260\320\336\370\367\364\11\360\360\360\0"
- "\366\366\366\0\376\376\376\0\372\366\361\0\273\324\357n\15u\346\377<"
- "\216\351\377A\220\350\377$}\343\377\27s\337\3774\202\342\377i\242\350"
- "\377\177\257\352\377o\243\345\377m\240\344\377w\246\345\377d\230\340"
- "\377v\242\342\377{\245\342\377\206\254\343\377\201\246\341\377m\230\333"
- "\377x\236\334\377i\222\327\377{\237\332\377\\\206\317\377e\213\320\377"
- "Ht\304\377R{\306\377Fq\277\377Ak\273\377Fn\273\377;c\265\377Bg\265\377"
- "6^\256\3774[\254\3772X\251\377'N\241\377Dd\255\377.P\240\3779Y\244\377"
- "\220\242\313\377\224\245\314\377s\211\274\377\215\237\310\377\237\255"
- "\320\377t\211\272\377\340\343\3517\373\373\372\0\335\335\335\0\236\236"
- "\236\0\377\377\374\0\212\272\354\241\7r\345\3774\212\350\3771\206\346"
- "\377C\217\347\377l\246\352\377\221\273\357\377\215\270\355\377\177\257"
- "\352\377s\245\346\377|\253\347\377{\250\346\377y\246\344\377y\245\342"
- "\377~\247\343\377s\235\336\377n\231\334\377r\232\334\377}\242\335\377"
- "t\231\331\377r\230\330\377c\212\320\377p\223\323\377d\211\315\377d\211"
- "\314\377\202\237\323\377\201\235\322\377\231\257\331\377\213\242\323"
- "\377\222\250\324\377\211\240\317\377\204\233\314\377\231\253\324\377"
- "j\205\276\377\240\260\325\377\257\274\332\377}\221\302\377\210\233\307"
- "\377\222\243\313\377w\214\275\377`x\261\377Hd\245\377)I\225\377\246\263"
- "\321\205\353\352\347\0""000\0\0\0\0\0\303\275\267\1]\242\353\314\2p\345"
- "\377A\221\352\377l\251\355\377\224\277\361\377\207\266\356\377u\252\353"
- "\377e\237\347\377X\226\343\377S\221\341\377[\225\341\377b\230\341\377"
- "`\225\337\377U\214\333\377V\213\332\377_\220\332\377Q\204\325\377X\210"
- "\325\377a\215\325\377n\226\330\377t\230\330\377x\232\327\377\201\240"
- "\330\377z\232\324\377}\233\323\377z\230\320\377e\206\307\377f\206\306"
- "\377j\210\305\377k\211\304\377f\204\301\377Op\266\377t\215\303\377i\203"
- "\275\377b}\271\377d~\270\377f~\267\377Nj\253\377;Y\240\377<Y\237\377"
- "'E\222\377$A\217\377Ld\245\377\270\301\332\320MLH\2\0\0\0\0\0\0\0\0\25"
- "\24\24\24B\216\337\355Y\242\361\377\210\272\361\377s\255\356\377_\240"
- "\352\377Z\233\347\377k\244\351\377o\245\351\377e\236\345\377^\227\342"
- "\377b\231\342\377v\244\344\377r\240\342\377t\241\341\377m\233\336\377"
- "{\242\340\377\215\256\344\377\222\261\344\377\212\253\340\377\201\244"
- "\335\377}\237\332\377`\210\320\377Jv\307\377Fr\303\377Ku\302\377V{\304"
- "\377c\205\307\377k\211\310\377m\212\307\377g\205\302\377Rs\270\377Jl"
- "\263\377Hi\260\377Aa\253\377Hg\254\3779Y\244\377:Y\242\377#F\226\377"
- "Jd\246\377Wp\254\377m\201\266\377\255\270\325\377\307\317\343\377\207"
- "\230\301\374!#)9\0\0\0\0\0\0\0\0.38;\224\312\377\377\177\275\377\377"
- "t\265\374\377{\270\374\377\213\300\374\377\216\301\374\377\201\270\372"
- "\377y\261\367\377x\257\365\377v\255\363\377o\247\361\377r\247\360\377"
- "j\240\355\377a\231\352\377t\245\354\377\214\264\360\377\201\253\355\377"
- "j\232\345\377r\236\345\377\202\250\351\377\205\251\347\377\215\256\350"
- "\377\247\301\357\377\252\301\356\377\215\253\343\377\207\245\337\377"
- "v\227\327\377y\230\326\377w\225\324\377\210\242\331\377\207\242\327\377"
- "\215\245\330\377\216\245\327\377\207\237\323\377\200\230\316\377\203"
- "\232\316\377\213\240\320\377\233\255\327\377\235\256\327\377\227\250"
- "\323\377\246\265\331\377\221\243\316\377j\201\271\377[v\271\377`i\200"
- "\253\0\0\0\2\0\0\0\0\37\40\"#[q\207\217Zm\202\227bp\200\233]l~\236Jb"
- "}\240B^\177\242\77[~\244@[}\245C\\|\247B[|\251J`}\252Qc}\253Wg~\254Z"
- "i~\255Vf}\255DXx\256.Hq\255)Do\255,Fn\2552Io\256<Pq\256IXt\256Uaw\256"
- "\\fx\256lr}\256fm{\256dlz\256gnz\255flz\255fly\254_fv\254joz\253pt|\252"
- "pt}\251ejw\250Zbr\247T\\o\246JSi\244EOf\243MUj\241Y`p\237IRg\234KTh\231"
- "^eu\225IMWq\1\1\0\6\0\0\0\0\0\0\0\0\0\0\0\0)&#\0GEB\0EB@\2+($\3\0\0\0"
- "\4\0\0\0\6\0\0\0\10\0\0\0\11\0\0\0\13\0\0\0\15\0\0\0\16\0\0\0\17\0\0"
- "\0\20\0\0\0\21\0\0\0\22\0\0\0\23\0\0\0\23\0\0\0\24\0\0\0\24\0\0\0\25"
- "\0\0\0\25\0\0\0\25\0\0\0\25\0\0\0\25\0\0\0\24\0\0\0\24\0\0\0\23\0\0\0"
- "\23\0\0\0\22\0\0\0\21\0\0\0\21\0\0\0\17\0\0\0\16\0\0\0\15\0\0\0\13\0"
- "\0\0\12\0\0\0\10\0\0\0\6\0\0\0\4\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\1\0\0\0\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (wsicon_64_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 wsicon_64_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 wsicon_64_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (16384) */
- "\0\0@\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (256) */
- "\0\0\1\0"
- /* width (64) */
- "\0\0\0@"
- /* height (64) */
- "\0\0\0@"
- /* pixel_data: */
- "\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\362\361\361\0\362\361\361"
- "\0\361\360\360\0\367\367\367\0\377\377\377\0\377\377\377\12\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\362\361\361\0\364\363\361"
- "\0\367\364\361\0\373\366\361\0\375\367\361\0\377\370\361\0\376\370\361"
- "\0\374\367\361\10\372\366\361\16\371\365\361\22\367\364\361\25\371\365"
- "\361\23\374\367\362\0\376\375\375\0\377\377\377\12\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\363\362\361\0\367"
- "\364\361\0\374\367\361\0\374\367\361\0\367\364\361\30\350\354\3619\324"
- "\342\360^\273\325\360\200\242\310\357\240\213\274\356\272w\262\356\315"
- "g\252\355\333[\243\355\346Q\236\355\355J\232\355\357N\234\355\354\236"
- "\305\356\252\373\371\366\25\377\377\377\4\361\361\361\0\361\361\361\0"
- "\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\364\363\361\0\372\365\361\0\373\366\361\4\357\360\361-\324\342\360"
- "d\254\315\357\235\202\267\356\315Y\242\355\3578\221\354\377\40\204\353"
- "\377\21|\352\377\13y\352\377\11x\352\377\11x\352\377\13x\352\377\15y"
- "\352\377\16z\352\377\15z\352\377\13x\352\377\7v\351\377\240\307\357\251"
- "\377\377\376\2\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\363\362\361\0\371\365\361\0\370\365\361\15\345\353\361H\276\327\361"
- "\222\214\275\360\323Z\243\356\3744\217\355\377\40\204\354\377\30\200"
- "\353\377\27\177\352\377\26~\352\377\24|\351\377\25|\351\377\25|\351\377"
- "\26|\350\377\26|\350\377\25|\350\377\25{\350\377\23z\350\377\22z\350"
- "\377\21y\350\377\3r\347\377J\230\352\357\377\377\374\22\361\361\361\0"
- "\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\367\364\361\0\372\366\361\2\351\355\361<\301\331\361"
- "\223\217\277\361\336a\250\360\377@\226\356\377+\212\354\377!\204\352"
- "\377\34\200\351\377\31\177\351\377\31~\350\377\31~\350\377\30|\350\377"
- "\25z\347\377\23y\347\377\22x\347\377\21x\346\377\17w\346\377\16v\346"
- "\377\15v\346\377\14u\346\377\13u\346\377\13u\346\377\0m\345\377S\234"
- "\351\347\377\377\373\14\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\362\361\361\0\371\365\361\0\370\365\361\21\326\343\361j\236"
- "\307\360\312r\260\361\377X\243\361\377G\231\357\3775\217\354\377&\205"
- "\352\377\34\177\350\377\27|\350\377\24z\347\377\22y\347\377\22x\346\377"
- "\22x\346\377\21w\346\377\17v\345\377\15u\345\377\14t\345\377\13t\345"
- "\377\12s\344\377\12s\344\377\12s\344\377\12s\344\377\12s\344\377\10r"
- "\344\377\7q\345\377\267\321\355\206\375\374\367\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\371\365\361\0\370\364\361\25\310\334\360{\205\272"
- "\360\340a\250\360\377]\245\361\377V\240\357\377\77\224\355\377(\206\352"
- "\377\33~\350\377\24z\347\377\22x\346\377\21w\346\377\17v\345\377\15u"
- "\345\377\14t\344\377\14s\344\377\13s\344\377\12s\344\377\12r\344\377"
- "\11r\344\377\11q\344\377\11q\344\377\11q\344\377\11q\344\377\11q\344"
- "\377\11q\344\377\0i\343\377e\244\351\332\376\370\362\14\362\362\362\0"
- "\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\367\364\361\0\373\366\361\12\313\335\360qw\262\357\343"
- "T\241\357\377`\247\361\377c\250\360\377M\233\355\3771\212\352\377\36"
- "\177\347\377\24z\346\377\20w\345\377\16u\345\377\15t\345\377\14s\344"
- "\377\13s\344\377\12r\344\377\12r\343\377\11q\343\377\11q\343\377\11p"
- "\343\377\11p\342\377\11p\342\377\11p\342\377\11p\342\377\11p\342\377"
- "\11p\342\377\11p\342\377\5m\342\377\27x\343\377\332\344\360U\370\365"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\363\362\361\0\376\370\361\0\335\347\360Q}\264\356\322G\231\356"
- "\377Z\243\360\377j\254\361\377Z\242\356\377>\222\353\377&\204\350\377"
- "\27z\346\377\20v\345\377\16t\344\377\13s\344\377\12r\344\377\12r\343"
- "\377\12q\343\377\12q\342\377\11p\342\377\11o\342\377\11o\341\377\11n"
- "\341\377\11n\341\377\11n\341\377\11n\340\377\11n\340\377\11n\340\377"
- "\11m\340\377\11m\340\377\11n\340\377\0e\337\377~\260\351\305\377\372"
- "\362\1\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\371\365\361\0\366\364\361$\236\305\356\254A\225\355\377H\231\356"
- "\377i\253\361\377d\250\357\377L\231\355\3772\212\351\377\36\177\347\377"
- "\23x\345\377\16t\345\377\13r\344\377\12r\343\377\12q\342\377\12q\342"
- "\377\12p\342\377\11o\341\377\11n\341\377\11n\340\377\11m\340\377\11m"
- "\340\377\11m\337\377\11m\337\377\11m\337\377\11m\337\377\11m\337\377"
- "\11m\337\377\11m\337\377\11m\336\377\4i\336\377\35x\340\377\341\350\360"
- "G\366\364\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\362\361\361"
- "\0\376\370\361\0\327\343\360_[\242\354\3520\214\354\377[\242\357\377"
- "k\253\360\377Z\242\356\377@\222\352\377)\205\350\377\31{\346\377\20u"
- "\345\377\14r\343\377\12q\342\377\12q\342\377\12p\341\377\12o\341\377"
- "\11n\340\377\11m\340\377\11m\337\377\11m\337\377\11m\337\377\11m\336"
- "\377\11l\336\377\11l\336\377\11k\335\377\11k\335\377\11k\335\377\11k"
- "\335\377\11k\335\377\11j\334\377\11k\335\377\0b\333\377z\254\347\305"
- "\377\372\362\1\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\364\363\361"
- "\0\375\370\361\16\247\312\356\234/\213\352\377:\221\355\377f\251\357"
- "\377g\251\357\377P\233\355\3776\214\351\377\"\200\347\377\26x\345\377"
- "\17t\344\377\13q\342\377\12p\342\377\12o\341\377\12n\340\377\11n\340"
- "\377\11m\337\377\11m\337\377\11l\336\377\11l\336\377\11k\335\377\11k"
- "\335\377\11j\335\377\11j\334\377\11j\334\377\11i\334\377\11i\334\377"
- "\11i\334\377\11i\334\377\11i\334\377\11i\334\377\5g\333\377\22n\334\377"
- "\325\341\357]\370\365\362\0\361\361\361\0\361\361\361\0\361\361\361\0"
- "\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\360\361\361\0\370\365\361"
- "\0\363\363\361*v\260\354\314\34\200\352\377H\230\355\377j\253\357\377"
- "c\247\356\377I\227\354\3770\211\351\377\37~\346\377\24w\344\377\16r\343"
- "\377\13p\341\377\12o\340\377\12n\340\377\12m\337\377\11l\337\377\11l"
- "\336\377\11l\335\377\11k\335\377\11j\334\377\11j\334\377\11i\334\377"
- "\11i\334\377\11i\334\377\11h\333\377\11h\333\377\11g\333\377\11g\333"
- "\377\11g\332\377\11g\332\377\11g\332\377\11g\332\377\0_\331\377Z\227"
- "\342\345\375\371\362\16\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\360\361\361\0\373\366\361\0\344"
- "\352\360LP\233\353\352\32\177\351\377S\236\355\377l\254\357\377_\244"
- "\356\377D\224\353\377-\206\350\377\35|\346\377\24v\343\377\15q\342\377"
- "\12o\340\377\12n\340\377\12m\337\377\11l\336\377\11l\336\377\11k\335"
- "\377\11j\334\377\11j\334\377\11i\334\377\11i\334\377\11h\333\377\11g"
- "\333\377\11g\332\377\11f\332\377\11f\332\377\11f\331\377\11f\331\377"
- "\11f\331\377\11f\330\377\11f\330\377\11f\330\377\10e\330\377\2`\330\377"
- "\260\312\352\217\375\370\362\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\360\361\361\0\376\370\361\0\324\342\360"
- "d5\215\351\373\35\200\352\377W\240\355\377l\253\357\377\\\242\355\377"
- "@\221\352\377*\204\347\377\34{\344\377\23t\342\377\14p\341\377\12n\340"
- "\377\12n\337\377\12m\336\377\11k\335\377\11k\335\377\11j\334\377\11i"
- "\334\377\11h\334\377\11h\333\377\11g\333\377\11g\332\377\11f\331\377"
- "\11f\331\377\11f\331\377\11e\330\377\11e\330\377\11e\327\377\11e\327"
- "\377\11e\327\377\11d\327\377\11d\326\377\11d\326\377\2`\326\377(w\332"
- "\375\353\355\3614\364\363\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\376\370\361\0\310\333\360s&\204\351\377"
- "\40\201\351\377Z\241\356\377k\253\357\377Y\240\355\377<\217\351\377&"
- "\201\346\377\31x\343\377\21r\342\377\14o\340\377\12n\337\377\12m\336"
- "\377\11k\335\377\11j\334\377\11i\334\377\11i\334\377\11h\333\377\11g"
- "\333\377\11f\332\377\11f\331\377\11f\331\377\11f\330\377\11e\330\377"
- "\11e\327\377\11d\327\377\11d\326\377\11c\326\377\11c\326\377\11c\325"
- "\377\11b\325\377\11b\325\377\11b\324\377\11b\324\377\0Y\322\377l\237"
- "\341\322\377\372\363\3\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\377\370\361\0\304\331\357w\36\200\350\377!\201"
- "\351\377Z\241\356\377l\253\357\377X\237\355\3778\214\351\377!~\345\377"
- "\24u\343\377\16p\341\377\13n\337\377\12m\336\377\11l\335\377\11j\334"
- "\377\11i\334\377\11i\334\377\11h\333\377\11g\332\377\11f\332\377\11f"
- "\331\377\11e\330\377\11e\327\377\11e\327\377\11d\326\377\11c\326\377"
- "\11c\325\377\11b\325\377\11b\324\377\11a\324\377\11a\324\377\11a\323"
- "\377\11a\323\377\11a\323\377\11a\323\377\10`\323\377\2\\\322\377\261"
- "\311\351\211\374\370\363\0\361\361\361\0\361\361\361\0\361\361\361\0"
- "\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\376\370\361\0\306\332\357x\35\177\350\377\36\200\350"
- "\377W\240\355\377o\254\357\377\\\241\355\3778\214\351\377\35{\344\377"
- "\21r\342\377\13n\340\377\12m\337\377\12m\336\377\11k\335\377\11j\334"
- "\377\11i\334\377\11h\333\377\11g\332\377\11f\331\377\11f\331\377\11e"
- "\330\377\11e\327\377\11d\327\377\11c\326\377\11c\325\377\11b\325\377"
- "\11a\324\377\11a\324\377\11a\323\377\11a\323\377\10`\323\377\10`\323"
- "\377\10_\322\377\10_\322\377\10_\322\377\10^\322\377\3[\321\377\34k\324"
- "\377\342\347\357B\366\364\362\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\360\361\361"
- "\0\375\367\361\0\320\337\360j\40\201\350\377\31}\347\377S\235\355\377"
- "q\255\357\377d\245\356\377@\220\351\377\40|\344\377\17q\341\377\12n\337"
- "\377\12m\336\377\12l\335\377\11j\334\377\11i\334\377\11h\333\377\11g"
- "\332\377\11f\332\377\11f\331\377\11e\330\377\11e\327\377\11d\326\377"
- "\11c\325\377\11b\325\377\11a\324\377\11a\323\377\11a\323\377\10`\323"
- "\377\10`\323\377\10_\322\377\10^\322\377\10^\322\377\10]\321\377\10]"
- "\321\377\10]\320\377\10]\320\377\10]\320\377\0V\316\377L\210\332\351"
- "\372\367\362\17\362\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\371\366\361"
- "\0\337\350\360P+\207\350\375\22y\346\377L\231\354\377o\255\357\377l\252"
- "\356\377L\227\352\377(\201\345\377\22r\341\377\12n\337\377\12m\336\377"
- "\12l\335\377\12j\334\377\11h\334\377\11g\333\377\11f\332\377\11f\331"
- "\377\11e\330\377\11e\327\377\11d\326\377\11c\325\377\11b\325\377\11a"
- "\324\377\11a\323\377\10`\323\377\10_\322\377\10_\322\377\10^\322\377"
- "\10]\321\377\10]\320\377\10]\320\377\10]\320\377\10\\\317\377\10\\\317"
- "\377\10\\\316\377\10\\\316\377\10[\316\377\0R\314\377\202\251\340\271"
- "\377\372\363\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\366\364\361\0\357\360\361"
- "3@\222\351\361\11t\346\377C\224\353\377l\253\357\377p\254\357\377X\236"
- "\353\3774\207\346\377\27v\342\377\13n\337\377\12l\335\377\12k\334\377"
- "\11i\334\377\11h\333\377\11g\332\377\11f\331\377\11e\330\377\11e\327"
- "\377\11d\326\377\11c\325\377\11b\324\377\11a\324\377\11a\323\377\10`"
- "\323\377\10_\322\377\10^\322\377\10]\321\377\10]\320\377\10]\320\377"
- "\10\\\317\377\10\\\317\377\10\\\316\377\10[\315\377\10[\315\377\10Z\315"
- "\377\10Z\314\377\10Y\314\377\7Y\314\377\1T\313\377\262\310\347\205\374"
- "\370\363\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\363\362\361\0\373\367\362\30b\244\353\333\2"
- "p\345\3778\215\351\377f\247\356\377r\255\357\377`\242\354\377\77\216"
- "\350\377\36z\342\377\15o\337\377\12l\335\377\12k\334\377\11i\334\377"
- "\11g\333\377\11f\332\377\11e\331\377\11e\330\377\11d\327\377\11c\326"
- "\377\11b\325\377\11a\324\377\11a\323\377\10`\323\377\10_\322\377\10^"
- "\321\377\10]\320\377\10]\320\377\10\\\317\377\10\\\316\377\10[\316\377"
- "\10[\315\377\10Z\315\377\10Y\314\377\10Y\314\377\10X\313\377\10X\313"
- "\377\10X\312\377\10X\312\377\5V\312\377\22^\314\377\326\337\354S\367"
- "\365\362\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\377\371\362\3\217\274\355\270\1o\345\377*\206"
- "\350\377]\242\355\377q\255\357\377e\245\355\377I\224\351\377'\177\343"
- "\377\20p\337\377\12k\335\377\12j\334\377\11i\334\377\11g\332\377\11f"
- "\331\377\11e\330\377\11e\327\377\11d\326\377\11b\325\377\11b\324\377"
- "\11a\323\377\10`\323\377\10_\322\377\10^\321\377\10]\320\377\10]\320"
- "\377\10\\\317\377\10[\316\377\10[\315\377\10Z\314\377\10Y\314\377\10"
- "Y\313\377\10X\313\377\10X\312\377\10X\312\377\10W\312\377\10W\311\377"
- "\10W\311\377\10V\311\377\1Q\310\377,n\317\374\355\356\360,\364\363\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\360\361\361"
- "\0\375\370\362\0\300\327\357\177\14u\345\377\34}\347\377Q\233\354\377"
- "o\254\357\377h\247\355\377P\230\351\3770\204\344\377\25s\340\377\12k"
- "\335\377\12j\334\377\11i\333\377\11g\332\377\11f\331\377\11e\330\377"
- "\11d\327\377\11c\326\377\11b\324\377\11a\323\377\11`\323\377\10_\322"
- "\377\10^\321\377\10]\320\377\10]\320\377\10\\\317\377\10[\316\377\10"
- "Z\315\377\10Y\314\377\10Y\313\377\10X\313\377\10X\312\377\10W\312\377"
- "\10W\311\377\10V\311\377\10V\311\377\10V\310\377\10U\310\377\10U\307"
- "\377\10U\307\377\0M\305\377I\200\323\351\372\367\363\21\362\361\361\0"
- "\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\366\364\361"
- "\0\351\355\361\77.\210\347\374\14u\346\377B\222\352\377i\250\356\377"
- "k\250\355\377W\233\352\3778\211\346\377\33w\341\377\14l\335\377\12j\334"
- "\377\11h\333\377\11f\332\377\11e\331\377\11e\330\377\11d\326\377\11c"
- "\325\377\11a\324\377\11a\323\377\10`\322\377\10^\322\377\10]\321\377"
- "\10]\320\377\10\\\317\377\10[\316\377\10Z\315\377\10Y\314\377\10X\313"
- "\377\10X\312\377\10W\312\377\10W\311\377\10V\311\377\10V\310\377\10U"
- "\310\377\10U\307\377\10T\306\377\10S\306\377\10S\306\377\10S\305\377"
- "\10R\305\377\0I\302\377h\224\327\320\376\372\363\2\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\376\370\362\20h"
- "\247\352\332\0n\345\3771\211\351\377`\244\355\377l\252\356\377\\\236"
- "\353\377A\217\347\377#|\342\377\17n\336\377\12j\334\377\12h\333\377\11"
- "f\332\377\11e\331\377\11e\327\377\11d\326\377\11b\325\377\11a\324\377"
- "\11`\323\377\10_\322\377\10^\321\377\10]\320\377\10]\317\377\10\\\316"
- "\377\10[\315\377\10Y\314\377\10X\313\377\10X\312\377\10W\312\377\10W"
- "\311\377\10V\311\377\10U\310\377\10T\307\377\10T\306\377\10S\306\377"
- "\10R\305\377\10R\305\377\10R\304\377\10Q\304\377\10Q\304\377\10Q\303"
- "\377\0G\300\377\203\245\334\267\377\373\364\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\376\370\362\0\260\316\356\221\4p\344\377"
- "\37\177\347\377R\233\354\377l\251\355\377`\242\353\377I\223\350\377-"
- "\202\343\377\25r\336\377\13j\334\377\11i\333\377\11g\332\377\11e\331"
- "\377\11e\327\377\11d\326\377\11b\325\377\11a\323\377\10`\323\377\10_"
- "\322\377\10]\321\377\10]\320\377\10\\\317\377\10[\315\377\10Z\314\377"
- "\10Y\313\377\10X\312\377\10W\312\377\10W\311\377\10V\310\377\10U\307"
- "\377\10T\307\377\10S\306\377\10R\305\377\10R\305\377\10Q\304\377\10Q"
- "\303\377\10Q\303\377\10Q\303\377\10P\303\377\10P\302\377\10P\302\377"
- "\0H\300\377\232\265\337\236\376\372\364\0\361\361\361\0\361\361\361\0"
- "\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\366\364\361\0\351\355\361;+\206\347\374\14t\345\377"
- "@\221\352\377g\246\355\377d\244\354\377O\227\351\3776\207\344\377\34"
- "v\340\377\15k\334\377\12i\333\377\11g\332\377\11f\331\377\11e\327\377"
- "\11d\326\377\11b\325\377\11a\323\377\10`\323\377\10^\322\377\10]\321"
- "\377\10]\317\377\10\\\316\377\10[\315\377\10Y\314\377\10X\313\377\10"
- "W\312\377\10W\311\377\10V\310\377\10U\310\377\10T\306\377\10S\306\377"
- "\10R\305\377\10R\304\377\10Q\303\377\10Q\303\377\10P\302\377\10P\302"
- "\377\10O\302\377\10O\301\377\10O\301\377\10N\300\377\10N\300\377\0G\276"
- "\377\255\301\342\212\374\371\363\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\377\371\362\5w\257\353\313\0m\344\377,\205\350\377\\\240\354\377"
- "f\246\355\377U\232\352\377>\214\346\377${\341\377\21n\335\377\12i\333"
- "\377\11g\332\377\11e\331\377\11e\327\377\11c\326\377\11b\324\377\11a"
- "\323\377\10`\323\377\10^\322\377\10]\320\377\10]\317\377\10[\316\377"
- "\10Z\315\377\10Y\313\377\10X\312\377\10W\312\377\10V\311\377\10U\310"
- "\377\10T\307\377\10S\306\377\10R\305\377\10Q\304\377\10Q\303\377\10P"
- "\303\377\10P\302\377\10O\302\377\10O\301\377\10N\300\377\10N\277\377"
- "\10M\277\377\10M\276\377\10M\276\377\7L\276\377\2H\274\377\272\312\345"
- "x\373\370\363\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\372\366\362\0\313\334\357"
- "l\16v\345\377\27z\346\377J\226\353\377f\245\355\377Z\236\353\377E\220"
- "\347\377-\201\342\377\26r\336\377\13j\333\377\12g\332\377\11e\331\377"
- "\11e\327\377\11d\326\377\11b\324\377\11a\323\377\10`\323\377\10^\321"
- "\377\10]\320\377\10\\\317\377\10[\316\377\10Z\314\377\10X\313\377\10"
- "X\312\377\10W\311\377\10V\310\377\10U\307\377\10S\306\377\10R\305\377"
- "\10R\304\377\10Q\303\377\10P\303\377\10P\302\377\10O\301\377\10N\300"
- "\377\10N\277\377\10M\277\377\10M\276\377\10M\275\377\10L\275\377\7L\274"
- "\377\7K\274\377\5J\274\377\6K\273\377\302\320\346p\372\367\363\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\362\362\361\0\372\366\362\30Q\232\351\353\2o\344\3774\212"
- "\351\377^\241\354\377^\240\353\377J\224\350\3775\206\344\377\36v\337"
- "\377\15k\334\377\11h\332\377\11f\331\377\11e\330\377\11d\326\377\11b"
- "\325\377\11a\323\377\10`\323\377\10^\322\377\10]\320\377\10\\\317\377"
- "\10[\315\377\10Y\314\377\10X\313\377\10W\312\377\10W\311\377\10U\310"
- "\377\10T\306\377\10S\305\377\10R\304\377\10Q\303\377\10Q\303\377\10P"
- "\302\377\10O\301\377\10N\300\377\10N\277\377\10M\276\377\10L\275\377"
- "\7L\275\377\7K\274\377\7K\274\377\7K\274\377\7J\273\377\7J\273\377\5"
- "H\272\377\12K\272\377\310\324\347g\371\367\363\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\375\370"
- "\362\0\263\320\356\221\4o\344\377\35}\346\377O\231\352\377a\242\354\377"
- "P\230\351\377<\213\345\377&|\341\377\22n\335\377\12h\333\377\11f\331"
- "\377\11e\330\377\11d\326\377\11b\325\377\11a\324\377\10`\323\377\10^"
- "\322\377\10]\320\377\10\\\317\377\10[\315\377\10Y\314\377\10X\313\377"
- "\10W\312\377\10V\311\377\10U\310\377\10S\306\377\10R\305\377\10Q\304"
- "\377\10Q\303\377\10P\302\377\10O\301\377\10N\300\377\10N\277\377\10M"
- "\276\377\10L\275\377\7L\274\377\7K\274\377\7J\273\377\7J\273\377\7I\272"
- "\377\7I\271\377\7H\270\377\7H\270\377\4E\266\377\13J\270\377\312\325"
- "\347`\371\367\363\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\363\362\361\0\365\364\361#\77\220\350\366\6p\344"
- "\3779\214\351\377_\241\354\377Y\235\352\377C\220\347\377.\202\342\377"
- "\30s\336\377\13i\333\377\12g\332\377\11e\330\377\11e\327\377\11b\325"
- "\377\11a\324\377\10`\323\377\10^\322\377\10]\320\377\10\\\317\377\10"
- "[\316\377\10Y\314\377\10X\313\377\10W\312\377\10V\310\377\10U\307\377"
- "\10S\306\377\10R\305\377\10Q\304\377\10P\303\377\10O\302\377\10O\301"
- "\377\10N\300\377\10M\276\377\10L\275\377\7L\274\377\7K\274\377\7J\273"
- "\377\7I\272\377\7I\271\377\7H\270\377\7G\267\377\7F\266\377\7F\265\377"
- "\7F\265\377\4C\264\377\13H\265\377\312\325\347a\371\367\363\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\376\370"
- "\362\0\251\312\355\225\1n\344\377\40\177\346\377Q\232\353\377`\241\353"
- "\377N\226\351\3779\211\344\377\"y\340\377\17l\334\377\12g\332\377\11"
- "f\331\377\11e\327\377\11c\326\377\11a\324\377\11a\323\377\10_\322\377"
- "\10]\321\377\10\\\317\377\10[\315\377\10Y\314\377\10X\313\377\10W\312"
- "\377\10V\311\377\10U\307\377\10S\306\377\10R\304\377\10Q\303\377\10P"
- "\302\377\10O\301\377\10O\300\377\10N\277\377\10M\275\377\7L\274\377\7"
- "K\274\377\7J\273\377\7I\272\377\7H\271\377\7G\267\377\7F\266\377\7F\265"
- "\377\7E\265\377\7E\264\377\7D\264\377\7D\263\377\5B\262\377\12F\263\377"
- "\311\323\346e\371\367\363\0\361\361\361\0\361\361\361\0\361\361\361\0"
- "\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\363\362\361\0\365\363\361!<\217\350\365\7q\344\377:"
- "\215\351\377_\241\354\377Y\235\352\377D\220\346\377.\201\342\377\27q"
- "\336\377\13h\333\377\11g\331\377\11e\330\377\11d\326\377\11b\324\377"
- "\11a\323\377\10_\322\377\10]\321\377\10]\317\377\10\\\316\377\10Z\314"
- "\377\10X\313\377\10W\312\377\10V\311\377\10U\307\377\10S\306\377\10R"
- "\304\377\10Q\303\377\10P\302\377\10O\301\377\10N\277\377\10M\276\377"
- "\10L\275\377\7K\274\377\7K\273\377\7J\272\377\7H\271\377\7G\267\377\7"
- "F\266\377\7E\265\377\7E\264\377\7D\263\377\7D\263\377\7C\262\377\7C\261"
- "\377\7C\260\377\5A\257\377\7B\260\377\304\317\344o\371\367\363\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\375\370\362\0\256"
- "\315\356\217\1n\344\377\40~\346\377Q\232\352\377`\241\353\377P\227\350"
- "\377:\212\344\377\"y\340\377\16k\334\377\12g\332\377\11f\330\377\11d"
- "\327\377\11c\325\377\11a\323\377\10`\323\377\10^\321\377\10]\320\377"
- "\10\\\316\377\10Z\315\377\10X\313\377\10X\312\377\10V\311\377\10U\307"
- "\377\10S\306\377\10R\304\377\10Q\303\377\10P\302\377\10O\301\377\10N"
- "\300\377\10M\276\377\10L\275\377\7K\274\377\7J\273\377\7I\272\377\7H"
- "\270\377\7G\266\377\7F\265\377\7E\264\377\7D\263\377\7C\262\377\7C\261"
- "\377\7B\260\377\7B\260\377\7B\257\377\7B\256\377\5A\256\377\2>\254\377"
- "\274\311\342v\373\371\364\0\361\361\361\0\361\361\361\0\361\361\361\0"
- "\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\362\362\361\0\371\365\362\30G\225\350\356\4o\344\3777\214\350\377"
- "]\241\354\377Y\235\352\377F\221\346\377/\201\342\377\27q\336\377\13h"
- "\332\377\11f\331\377\11e\327\377\11c\326\377\11a\324\377\10`\323\377"
- "\10^\322\377\10]\320\377\10\\\317\377\10[\315\377\10X\313\377\10W\312"
- "\377\10W\311\377\10U\310\377\10S\306\377\10R\304\377\10Q\303\377\10P"
- "\302\377\10O\301\377\10N\277\377\10M\276\377\7L\274\377\7K\274\377\7"
- "J\272\377\7I\271\377\7G\267\377\7F\265\377\7E\264\377\7D\263\377\7C\262"
- "\377\7C\261\377\7B\260\377\7B\257\377\7B\256\377\7A\255\377\6A\254\377"
- "\6@\254\377\5@\253\377\0""9\247\377\260\300\335\205\374\371\365\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\373\366\362\0\300\327\357w\7q"
- "\344\377\33|\346\377N\230\352\377_\241\353\377P\230\350\377;\211\344"
- "\377!x\337\377\17k\334\377\12g\331\377\11f\330\377\11d\326\377\11b\325"
- "\377\11a\323\377\10_\322\377\10]\321\377\10\\\317\377\10[\316\377\10"
- "Y\314\377\10X\312\377\10W\311\377\10U\310\377\10S\306\377\10R\305\377"
- "\10Q\303\377\10P\302\377\10O\301\377\10N\277\377\10M\276\377\7L\274\377"
- "\7K\274\377\7J\272\377\7H\270\377\7G\266\377\7E\265\377\7D\264\377\7"
- "D\263\377\7C\261\377\7B\260\377\7B\257\377\7B\256\377\6A\254\377\6@\253"
- "\377\6@\252\377\6\77\252\377\6\77\251\377\6\77\250\377\0""6\245\377\237"
- "\262\330\227\376\373\365\0\361\361\361\0\361\361\361\0\361\361\361\0"
- "\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\376\370\362\12b\243\352\335\0m\344\3772\211\350\377[\237\353\377Y"
- "\235\352\377G\221\346\377-\200\342\377\25p\335\377\13h\332\377\11f\330"
- "\377\11d\327\377\11c\325\377\11a\324\377\10`\322\377\10^\322\377\10]"
- "\320\377\10\\\316\377\10Z\314\377\10X\313\377\10W\311\377\10V\310\377"
- "\10T\307\377\10R\305\377\10Q\304\377\10P\303\377\10O\301\377\10N\277"
- "\377\10M\276\377\7L\274\377\7K\274\377\7I\272\377\7H\270\377\7F\266\377"
- "\7E\265\377\7D\263\377\7C\262\377\7B\260\377\7B\257\377\7B\256\377\6"
- "A\254\377\6@\253\377\6@\252\377\6\77\251\377\6>\250\377\6>\250\377\6"
- ">\247\377\6=\246\377\0""2\242\377\213\242\320\255\377\374\366\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\367\364\361\0\332\345\360U\26z\345\377\24x\345\377"
- "H\224\352\377^\240\353\377S\231\351\377=\213\345\377\37x\337\377\15j"
- "\334\377\12g\331\377\11e\330\377\11d\326\377\11b\325\377\11a\323\377"
- "\10_\322\377\10]\321\377\10\\\317\377\10[\315\377\10X\314\377\10X\312"
- "\377\10V\311\377\10U\307\377\10S\305\377\10R\304\377\10Q\303\377\10O"
- "\302\377\10N\300\377\10M\276\377\7L\275\377\7K\274\377\7I\272\377\7G"
- "\270\377\7F\266\377\7E\264\377\7D\263\377\7C\261\377\7B\260\377\7B\256"
- "\377\7A\255\377\6@\253\377\6@\252\377\6\77\251\377\6>\250\377\6=\247"
- "\377\6=\246\377\6<\245\377\6<\244\377\6<\244\377\0""0\237\377s\220\310"
- "\305\377\374\366\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\377\371\362\0\214\272"
- "\354\270\0l\344\377*\204\347\377V\234\353\377[\236\352\377K\224\347\377"
- "2\203\343\377\25q\335\377\12h\332\377\11f\331\377\11e\327\377\11c\325"
- "\377\11a\323\377\10`\323\377\10]\321\377\10\\\317\377\10\\\316\377\10"
- "Y\314\377\10X\312\377\10W\311\377\10V\310\377\10S\306\377\10R\304\377"
- "\10Q\303\377\10O\302\377\10N\300\377\10M\276\377\10L\274\377\7K\274\377"
- "\7J\272\377\7H\270\377\7F\265\377\7E\264\377\7D\263\377\7C\261\377\7"
- "B\257\377\7B\256\377\6A\254\377\6@\252\377\6\77\251\377\6>\250\377\6"
- "=\247\377\6=\246\377\6<\245\377\6<\244\377\6;\243\377\6:\243\377\6:\242"
- "\377\0""0\235\377Yz\275\333\375\372\365\7\361\361\361\0\361\361\361\0"
- "\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\363\362\361"
- "\0\363\362\361'8\214\347\371\12r\345\377>\217\351\377\\\237\353\377U"
- "\232\351\377D\217\346\377&|\340\377\17l\334\377\11g\331\377\11e\330\377"
- "\11d\326\377\11b\325\377\11a\323\377\10_\322\377\10]\320\377\10\\\317"
- "\377\10Z\315\377\10X\313\377\10W\312\377\10V\311\377\10T\306\377\10R"
- "\305\377\10Q\304\377\10P\302\377\10O\301\377\10N\277\377\10L\275\377"
- "\7K\274\377\7J\272\377\7H\270\377\7F\266\377\7E\264\377\7D\263\377\7"
- "B\261\377\7B\257\377\7B\256\377\6A\253\377\6@\252\377\6\77\251\377\6"
- ">\247\377\6=\246\377\6<\245\377\6;\244\377\6;\243\377\6:\242\377\6""9"
- "\241\377\6""9\240\377\6""8\240\377\0""1\234\377=d\262\362\366\365\363"
- "\31\362\362\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\373\366\362\0\300\326\357z\7q\344\377\36}\346\377O\230"
- "\352\377Z\236\352\377N\226\350\3779\210\344\377\33t\336\377\13i\333\377"
- "\11f\331\377\11e\327\377\11c\326\377\11a\324\377\10`\323\377\10^\321"
- "\377\10]\317\377\10\\\316\377\10Y\314\377\10X\312\377\10W\311\377\10"
- "U\310\377\10S\306\377\10R\304\377\10Q\303\377\10O\302\377\10N\277\377"
- "\10M\276\377\7L\274\377\7J\273\377\7H\270\377\7F\266\377\7E\265\377\7"
- "D\263\377\7B\261\377\7B\257\377\7B\256\377\6@\253\377\6\77\252\377\6"
- ">\250\377\6=\247\377\6<\245\377\6<\244\377\6;\243\377\6:\242\377\6""9"
- "\241\377\6""8\240\377\6""8\237\377\6""8\236\377\6""8\236\377\0""3\233"
- "\377\"O\247\376\350\352\3565\364\363\362\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\361\361\361\0\377\371\362\2q\254\352\313"
- "\0m\344\3772\211\350\377W\235\353\377U\233\352\377F\221\346\377.\200"
- "\341\377\23n\335\377\12g\332\377\11e\330\377\11d\326\377\11b\325\377"
- "\11a\323\377\10_\322\377\10]\321\377\10\\\317\377\10Z\315\377\10X\313"
- "\377\10W\312\377\10V\311\377\10T\307\377\10R\305\377\10Q\303\377\10P"
- "\302\377\10N\300\377\10M\276\377\7L\274\377\7J\274\377\7I\272\377\7G"
- "\267\377\7E\265\377\7D\263\377\7C\261\377\7B\257\377\7B\256\377\6@\253"
- "\377\6\77\251\377\6>\250\377\6=\247\377\6<\245\377\6;\244\377\6:\242"
- "\377\6""9\241\377\6""8\240\377\6""8\237\377\6""8\236\377\6""8\235\377"
- "\5""7\234\377\5""7\233\377\2""4\231\377\14<\235\377\322\330\345Y\370"
- "\366\364\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\364"
- "\363\361\0\354\356\361/+\205\346\374\17u\345\377C\222\351\377X\235\353"
- "\377N\226\350\377=\213\345\377!x\337\377\15j\333\377\11g\331\377\11e"
- "\330\377\11d\326\377\11a\324\377\10`\323\377\10^\322\377\10]\320\377"
- "\10\\\316\377\10Y\314\377\10X\313\377\10W\311\377\10U\310\377\10S\305"
- "\377\10Q\304\377\10Q\303\377\10O\301\377\10N\277\377\10M\275\377\7K\274"
- "\377\7J\272\377\7H\267\377\7F\265\377\7E\264\377\7C\262\377\7B\257\377"
- "\7B\256\377\6A\253\377\6\77\252\377\6>\250\377\6=\246\377\6<\245\377"
- "\6;\243\377\6:\242\377\6""9\240\377\6""8\237\377\6""8\236\377\6""8\235"
- "\377\5""7\233\377\5""6\233\377\5""6\232\377\5""5\231\377\4""4\231\377"
- "\0/\225\377\262\276\331\203\374\372\365\0\361\361\361\0\361\361\361\0"
- "\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361"
- "\0\361\361\361\0\361\361\361\0\373\367\362\0\271\323\356}\5p\344\377"
- "#\200\347\377O\231\352\377T\232\352\377F\221\347\3772\203\342\377\27"
- "r\336\377\12h\333\377\11f\331\377\11d\327\377\11b\325\377\11a\323\377"
- "\10`\322\377\10]\321\377\10\\\317\377\10[\315\377\10X\313\377\10W\312"
- "\377\10V\311\377\10T\306\377\10R\305\377\10Q\303\377\10P\302\377\10N"
- "\300\377\10M\276\377\7L\274\377\7J\273\377\7I\271\377\7F\266\377\7E\264"
- "\377\7D\263\377\7B\260\377\7B\256\377\6A\254\377\6@\252\377\6>\250\377"
- "\6=\247\377\6<\244\377\6;\243\377\6:\242\377\6""9\240\377\6""8\236\377"
- "\6""8\235\377\5""7\234\377\5""6\232\377\5""6\231\377\5""5\231\377\5""4"
- "\230\377\5""4\227\377\4""3\227\377\0%\220\377\206\233\310\261\377\375"
- "\367\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\377\371"
- "\362\2r\254\352\312\0n\344\3775\212\350\377T\233\352\377M\225\350\377"
- "<\213\345\377%|\341\377\20m\334\377\11g\332\377\11e\330\377\11d\326\377"
- "\11b\324\377\11a\323\377\10^\322\377\10]\320\377\10\\\317\377\10Z\315"
- "\377\10X\312\377\10W\311\377\10V\310\377\10S\306\377\10Q\304\377\10Q"
- "\303\377\10O\301\377\10N\277\377\10L\275\377\7K\274\377\7J\272\377\7"
- "G\267\377\7F\265\377\7D\263\377\7C\261\377\7B\257\377\7A\255\377\6@\252"
- "\377\6>\251\377\6=\247\377\6<\245\377\6;\243\377\6:\242\377\6""8\240"
- "\377\6""8\237\377\6""8\235\377\5""7\233\377\5""6\232\377\5""5\231\377"
- "\5""4\230\377\5""3\227\377\5""3\226\377\0/\223\377\6""4\226\377\31A\234"
- "\377\177\225\305\333\373\371\365\6\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\363\362\361\0\360\361\361(2\211\347\372\17u\345\377C\222\352\377"
- "S\232\352\377F\221\347\3773\205\343\377\34u\337\377\14j\333\377\11g\331"
- "\377\11e\330\377\11d\326\377\11a\324\377\10`\323\377\10^\322\377\10]"
- "\320\377\10[\316\377\10Y\314\377\10X\312\377\10V\311\377\10U\307\377"
- "\10R\305\377\10Q\303\377\10P\302\377\10O\300\377\10M\276\377\7L\274\377"
- "\7J\273\377\7I\271\377\7F\266\377\7E\264\377\7C\262\377\7B\260\377\7"
- "B\256\377\6@\253\377\6\77\251\377\6>\250\377\6<\245\377\6;\244\377\6"
- ":\242\377\6""9\240\377\6""8\237\377\6""8\235\377\5""7\233\377\5""6\232"
- "\377\5""5\230\377\5""4\227\377\3""1\225\377\1""0\224\377\6""4\224\377"
- "$K\240\3777[\251\3772V\246\377;]\250\372\357\357\360'\363\363\362\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\372\366\361\0\307\333\357k\13t\345\377\"\200"
- "\347\377L\230\352\377N\227\351\377>\214\346\377+\177\342\377\24p\335"
- "\377\12h\333\377\11f\331\377\11e\327\377\11c\325\377\11a\323\377\10`"
- "\322\377\10]\321\377\10\\\317\377\10[\315\377\10X\313\377\10W\312\377"
- "\10V\311\377\10T\306\377\10R\304\377\10Q\303\377\10O\302\377\10N\300"
- "\377\10M\275\377\7K\274\377\7J\272\377\7H\267\377\7E\265\377\7D\263\377"
- "\7C\261\377\7B\257\377\6A\254\377\6\77\252\377\6>\250\377\6=\246\377"
- "\6<\244\377\6:\242\377\6""9\240\377\6""8\237\377\6""8\235\377\5""7\233"
- "\377\5""6\232\377\5""4\230\377\2""1\226\377\0/\224\377\22=\232\377.T"
- "\245\3774X\247\377\"I\236\377\11""3\222\377\0%\213\377\22;\226\377\324"
- "\331\345X\370\367\363\0\361\361\361\0\361\361\361\0\361\361\361\0\361"
- "\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\377\371\362\0\214"
- "\272\354\262\0n\344\3772\211\350\377P\231\352\377H\223\350\3777\211\345"
- "\377$z\341\377\17m\334\377\11g\332\377\11f\330\377\11d\327\377\11b\325"
- "\377\11a\323\377\10_\322\377\10]\320\377\6[\316\377\5X\314\377\4V\312"
- "\377\4U\310\377\5S\307\377\5Q\305\377\7Q\303\377\7P\302\377\10O\301\377"
- "\10M\276\377\7L\274\377\7J\273\377\7I\271\377\7F\266\377\7E\264\377\7"
- "C\262\377\7B\260\377\7B\256\377\6@\253\377\6\77\251\377\6=\247\377\6"
- "<\244\377\6;\243\377\6""9\241\377\6""8\237\377\6""8\235\377\5""7\233"
- "\377\4""5\231\377\2""2\227\377\1""0\225\377\27B\235\377.T\245\3777Z\250"
- "\377!G\235\377\10""2\222\377\20""9\225\3770S\242\377=^\250\377[w\266"
- "\377\307\317\341\223\371\367\364\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\362\361\361\0\372\366"
- "\362\20O\231\351\351\11s\345\377\77\220\352\377O\230\352\377B\217\347"
- "\3772\205\344\377\35v\337\377\15k\334\377\11g\332\377\11e\330\377\11"
- "d\326\377\11b\324\377\10`\323\377\4[\321\377\7\\\320\377\23c\320\377"
- "\34g\320\377\40h\317\377\40g\316\377\35d\314\377\30^\311\377\20W\305"
- "\377\12Q\302\377\4L\277\377\4J\275\377\5J\273\377\6I\273\377\6H\270\377"
- "\6E\265\377\6D\263\377\6B\261\377\5A\256\377\4\77\254\377\3>\251\377"
- "\3<\247\377\3:\244\377\3""9\242\377\3""8\241\377\2""5\236\377\1""4\234"
- "\377\0""2\231\377\0""0\227\377\3""3\230\377\26B\236\3775Z\252\377Ef\257"
- "\377+P\242\377)N\241\377-Q\242\377;\\\247\377\\x\265\377Ol\257\377Ec"
- "\252\377\13/\215\377s\211\273\317\376\374\367\2\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\361\361\361\0\361\361\361\0\365\363"
- "\361\0\344\352\360A!\200\346\377\32|\347\377H\225\352\377K\225\352\377"
- "<\213\346\377,\201\343\377\27r\336\377\12i\333\377\11f\332\377\11e\330"
- "\377\7c\326\377\2\\\323\377\3]\322\377\37m\326\3770w\327\377/u\325\377"
- "&n\322\377$j\320\377%j\317\377'i\316\377-l\315\377-k\314\3775o\315\377"
- "/j\312\377\37]\303\377\20Q\276\377\11K\273\377\3D\266\377\4C\264\377"
- "\7D\263\377\10C\260\377\16G\260\377\25L\261\377\27L\257\377\26J\255\377"
- "\33M\254\377\25G\251\377\25E\247\377\36K\250\377'S\252\3770Y\254\377"
- "Ch\262\377Op\266\377Oo\265\377=`\254\377,Q\243\3778Z\247\377<]\250\377"
- "Fd\254\377/R\240\377*L\235\377\12""1\215\377\25:\221\377'G\231\377Pl"
- "\254\370\360\360\360$\363\363\362\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\373\366\362\0\273\324\357}\7r\345"
- "\377)\204\350\377L\227\353\377F\222\351\3776\210\345\377%}\341\377\22"
- "o\335\377\11h\333\377\4c\330\377\2`\326\377\12d\326\3772{\333\377j\237"
- "\344\377q\243\345\377f\232\342\377k\234\341\377e\227\337\377h\231\336"
- "\377f\226\335\377a\221\332\377g\225\333\377k\227\333\377l\226\332\377"
- "t\233\333\377n\226\330\377s\231\331\377t\230\330\377r\226\326\377l\220"
- "\323\377k\217\321\377U~\310\377It\303\377Ep\300\3776c\271\3773`\266\377"
- "7b\266\3776`\264\377@f\266\377Vw\275\377Z{\275\377Vw\272\377=a\256\377"
- "0V\251\377-S\245\377'N\242\3774W\246\377(M\237\377/R\241\377\25;\224"
- "\377(K\234\377)L\234\377Da\247\377\227\247\316\377\221\243\313\377A_"
- "\245\377\330\335\346a\367\365\363\0\361\361\361\0\361\361\361\0\361\361"
- "\361\0\361\361\361\0\361\361\361\0\377\371\362\0\210\271\354\271\2o\345"
- "\3775\213\351\377L\227\352\377\77\217\350\3770\204\344\377\34w\340\377"
- "\7h\334\377\6f\332\377%w\335\377X\226\344\377\210\263\353\377\223\272"
- "\354\377{\251\347\377k\236\344\377c\230\341\377k\234\341\377g\230\337"
- "\377e\226\336\377p\235\337\377d\223\333\377w\237\337\377c\220\331\377"
- "r\232\334\377h\223\330\377S\203\321\377M~\316\3777k\306\377@q\307\377"
- "\77n\305\377Pz\310\377S|\307\377Ox\304\377X~\306\377Y\177\305\377Z~\304"
- "\377b\204\305\377p\215\311\377o\214\310\377g\206\303\377Z{\275\377Fi"
- "\263\377<`\256\377Hj\262\3777[\251\377-R\243\377)M\237\3776V\244\377"
- "6W\243\377c|\267\3779Y\242\377\25;\221\377c|\265\377w\214\276\377\344"
- "\350\362\377\254\272\330\377\327\334\350\252\365\365\363\0\361\361\361"
- "\0\361\361\361\0\375\375\375\0\377\377\377\0\361\361\361\0\374\367\362"
- "\15U\235\351\345\10s\346\377;\216\351\377G\224\352\3777\211\346\377\40"
- "z\342\377\25r\337\377-\177\341\377c\237\350\377\207\264\354\377~\256"
- "\352\377f\236\345\377G\210\336\377u\245\346\377j\235\343\377u\243\344"
- "\377W\217\335\377\203\253\345\377y\244\342\377\221\263\347\377\212\255"
- "\344\377\206\252\342\377\200\245\340\377d\221\330\377\213\253\340\377"
- "m\226\330\377\231\265\343\377\205\244\334\377m\222\324\377\207\245\333"
- "\377Lw\306\377Qz\307\377Z\201\310\3777e\272\377+[\265\3776b\266\377%"
- "S\256\377\32I\250\377)T\254\377'R\251\377\37J\244\377(P\246\377.U\247"
- "\377\31B\234\377&L\240\377Sq\263\3775W\244\377\21""6\222\377[u\263\377"
- "\236\255\322\377\302\314\342\377\203\227\304\377\226\246\314\377\222"
- "\243\313\377\215\236\307\377`x\262\377q\206\267\351\370\367\364\20\363"
- "\363\363\0\372\372\372\0\244\244\244\0yyy\0\364\363\362\0\354\357\361"
- "2+\206\350\376\22x\346\377:\215\351\3776\212\347\377(\200\345\377@\215"
- "\346\377d\242\352\377\177\261\355\377\211\266\356\377v\251\352\377\210"
- "\264\353\377\204\261\352\377\222\271\354\377\230\274\355\377\214\263"
- "\351\377\217\265\351\377\204\254\346\377\215\262\347\377\206\255\345"
- "\377~\246\342\377l\230\334\377n\232\334\377n\230\333\377k\224\331\377"
- "s\232\332\377\\\211\323\377Z\206\321\377p\225\326\3778i\303\377\201\240"
- "\330\377r\224\322\377Fm\301\377\236\265\337\377\201\235\323\377\212\244"
- "\326\377\270\310\345\377\242\265\334\377\222\250\325\377\237\262\332"
- "\377\217\245\322\377\203\232\314\377\205\234\315\377\246\266\332\377"
- "Wu\266\377\200\226\307\377\261\276\335\377\317\327\351\377\215\237\313"
- "\377\225\246\315\377\227\250\316\377\241\261\322\377\207\231\305\377"
- "bz\263\377Zs\256\377B^\242\377f}\263\377!B\221\377\334\337\347N\377\377"
- "\377\0\214\214\214\0\0\0\0\0\0\0\0\0\377\374\370\0\326\345\364b\17v\346"
- "\377\24y\346\377*\204\347\377\77\217\351\377`\241\353\377\203\265\357"
- "\377\216\272\357\377\231\301\360\377\224\275\357\377\202\261\354\377"
- "g\240\346\377L\215\340\377F\210\336\377A\203\335\377H\207\334\377R\215"
- "\335\377Y\220\335\377W\215\333\377\\\220\334\377k\231\336\377n\231\335"
- "\377e\223\332\377w\236\335\377\210\252\341\377\210\251\340\377\227\263"
- "\343\377\211\250\336\377\204\244\333\377\204\242\332\377{\233\326\377"
- "k\216\317\377[\202\311\377l\216\316\377e\210\312\377U{\303\377i\210\310"
- "\377r\220\312\377s\217\311\377\210\240\321\377\203\233\315\377\217\245"
- "\321\377f\202\277\377\243\264\330\377\231\254\323\377r\212\301\377s\212"
- "\300\377~\223\304\377g\200\271\377Up\257\377`z\264\377;Y\241\377_x\261"
- "\377`x\261\377Oi\250\377\22""4\211\377$C\221\377&B\220\377\277\310\337"
- "\231\253\251\246\0\0\0\0\0\0\0\0\0\0\0\0\0OJG\0\216\256\317\220\0r\353"
- "\377\37\177\347\377Y\240\355\377\200\265\360\377\217\275\361\377\233"
- "\304\362\377t\253\353\377U\227\347\377J\220\344\377O\221\343\377\\\230"
- "\344\377h\237\345\377m\241\345\377s\244\346\377x\246\345\377t\243\344"
- "\377e\230\337\377W\215\333\377P\207\331\377W\213\331\377U\210\327\377"
- "I~\323\377I~\322\377H|\320\377G{\316\377N~\317\377S\201\317\377U\201"
- "\315\377`\207\317\377o\222\322\377\204\241\330\377\213\246\331\377\224"
- "\255\333\377\202\236\323\377\201\235\322\377d\205\306\377w\223\314\377"
- "d\203\304\377c\202\302\377Xy\274\377Gj\264\377;_\255\377Qq\264\377Sr"
- "\264\377Ur\263\377\\w\265\377Ol\257\377u\213\277\377Yt\261\377\77]\243"
- "\377Fb\246\377\24""7\213\377\"C\222\377\5(\201\377\77Y\236\377\200\221"
- "\276\377\245\262\324\377\334\340\350\343\40\40\36\14\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0Eu\250\266;\226\367\377\203\270\362\377\231\304\364\377"
- "|\263\360\377Z\235\353\377A\216\346\377R\226\347\377m\246\353\377\177"
- "\260\354\377x\253\352\377g\237\346\377\\\227\343\377L\214\337\377^\227"
- "\342\377t\244\345\377s\243\343\377w\244\343\377|\247\343\377{\245\342"
- "\377x\242\341\377\222\263\345\377\244\277\351\377\255\305\352\377\246"
- "\277\350\377\233\267\344\377\231\265\343\377\225\261\341\377\202\242"
- "\332\377U\177\314\377Cp\304\377'[\271\377+]\271\377-^\270\377Dn\276\377"
- "X|\303\377q\217\312\377u\221\313\377p\215\310\377p\215\307\377Xx\273"
- "\377Ww\272\377Jk\263\377Ef\257\377Jj\260\377,P\241\377Cc\252\377(K\234"
- "\377&I\231\377\35A\224\377\27;\220\377Hc\246\377^v\257\377\212\233\305"
- "\377\213\234\305\377\300\310\337\377\337\343\357\377\243\261\320\377"
- "f}\265\377;=DT\0\0\0\0\0\0\0\1\0\0\0\0\17\14\11\12\204\253\325\337\207"
- "\300\376\377j\254\362\377W\240\360\377[\241\357\377x\261\362\377\223"
- "\300\364\377\234\305\365\377\215\273\362\377~\261\360\377y\255\356\377"
- "y\254\355\377~\256\354\377o\244\351\377`\231\346\377e\233\345\377Y\222"
- "\341\377R\214\337\377I\205\333\377d\227\341\377|\246\344\377\230\271"
- "\352\377\211\255\346\377q\233\337\377u\235\337\377}\242\340\377\211\252"
- "\342\377\207\250\341\377~\240\334\377\230\263\343\377\254\301\351\377"
- "\263\306\352\377\210\246\333\377\177\235\326\377s\223\321\377^\202\307"
- "\377X|\304\377d\205\307\377`\201\304\377s\220\313\377t\221\312\377\201"
- "\232\316\377s\216\307\377\177\227\313\377l\207\301\377|\223\307\377n"
- "\207\300\377\177\225\306\377~\224\305\377\230\251\320\377\250\266\330"
- "\377\255\272\331\377\237\256\322\377\220\241\312\377\243\261\322\377"
- "\222\242\311\377g|\263\377Vm\252\3775S\237\377it\216\273\3\3\2\13\0\0"
- "\0\3\0\0\0\0\27\25\24\24\232\270\327\337\177\262\352\365\220\272\350"
- "\365\242\304\351\366\251\307\351\367\231\275\347\367}\254\342\367i\237"
- "\336\367c\232\334\370f\232\334\370d\231\333\370g\232\332\370h\231\331"
- "\370k\233\331\370x\242\332\370z\243\332\371\202\247\333\371\202\246\332"
- "\371\204\247\331\371\202\245\331\371x\235\325\371Y\206\315\371\77s\305"
- "\3708m\301\370;n\301\370Et\302\370S}\305\370a\207\307\370p\221\312\370"
- "\200\234\316\370\220\247\322\370\231\256\324\370\250\270\327\370\270"
- "\305\334\370\246\267\326\370\252\271\326\370\253\271\326\370\256\273"
- "\327\370\243\262\322\370\251\267\324\370\230\252\314\370\233\253\315"
- "\370\260\274\325\370\267\302\327\370\275\306\332\370\265\277\326\370"
- "\233\252\312\367\234\252\311\367\214\234\301\367\220\240\302\367|\216"
- "\270\367i}\256\367s\205\262\366|\215\266\366\231\246\304\366|\214\264"
- "\366bv\247\365\202\220\267\365\214\233\277\364\227\241\271\341\24\24"
- "\23%\0\0\0\1\0\0\0\0\0\0\0\1\25\26\26\34\"\40\35+!\36\34""1\34\33\32"
- "6\30\30\31:\25\26\27=\30\31\31@\35\35\36C\34\34\33E\33\33\33G\33\33\33"
- "I\32\33\33K\32\33\33L\33\33\33N\32\32\33P\32\33\33Q\35\35\33S\36\35\34"
- "T\40\37\34U\35\35\34V\35\34\33W\35\34\33W\37\36\33V\36\35\32W\34\34\32"
- "W\33\33\32X\32\31\31X\30\30\31Y\31\31\31Y\31\31\31Y\32\32\31Y\31\31\31"
- "Y\32\32\31Y\30\30\31Y\30\31\31X\26\27\30X\27\27\30W\30\30\31W\32\31\31"
- "V\32\32\32V\33\32\32U\34\34\32T\32\32\32S\31\31\31R\32\32\32Q\34\34\33"
- "O\36\35\33N\30\30\31L\27\27\30K\30\30\31I\30\30\31G\37\36\34E!\40\35"
- "C\35\34\33A\34\33\33=\31\31\32;\37\36\35""7\37\36\35""3\36\35\34/\24"
- "\24\25#\1\1\1\13\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0QQQ\0eee\1bb"
- "b\3aa`\4""443\4\0\0\0\3\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\7\0\0\0\10\0\0"
- "\0\11\0\0\0\12\0\0\0\13\0\0\0\14\0\0\0\14\0\0\0\15\0\0\0\15\0\0\0\16"
- "\0\0\0\17\0\0\0\17\0\0\0\20\0\0\0\20\0\0\0\20\0\0\0\20\0\0\0\21\0\0\0"
- "\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\20\0\0\0\20\0"
- "\0\0\20\0\0\0\20\0\0\0\17\0\0\0\17\0\0\0\16\0\0\0\16\0\0\0\15\0\0\0\15"
- "\0\0\0\14\0\0\0\13\0\0\0\12\0\0\0\12\0\0\0\10\0\0\0\7\0\0\0\7\0\0\0\6"
- "\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\1\0\0\0\0\0\0\0\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (wsiconcap_16_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 wsiconcap_16_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 wsiconcap_16_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (1024) */
- "\0\0\4\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (64) */
- "\0\0\0@"
- /* width (16) */
- "\0\0\0\20"
- /* height (16) */
- "\0\0\0\20"
- /* pixel_data: */
- "\256\346\237\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\261\350\241\30""0\303\10D.\302\6i(\300\3\200l\324P^"
- "\256\346\237\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\372\376\371"
- "\20\311\357\277Yo\324T\2443\302\14\3260\300\11\361)\276\3\374M\311,\300"
- "\256\346\237\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\371\375\367\12\272\353\255{i\321M\347"
- ",\275\6\377\"\270\0\377'\270\2\377&\267\1\377%\267\1\377$\266\0j\256"
- "\346\237\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\331\364\3225}\327e\323@\303\36\377$\267\0\377#\264\0\377#"
- "\262\1\377\"\262\1\377\"\261\1\377\"\261\1\333!\261\1\7\260\347\242\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\303\355\270"
- "Ob\316F\3659\276\30\377\"\263\0\377!\261\0\377!\257\1\377\40\255\1\377"
- "\37\254\1\377\37\253\1\377\37\253\1\206\37\253\1\0\244\343\223\0\354"
- "\371\350\0\354\371\350\0\353\371\350\0\275\353\260Dd\316I\371>\276\36"
- "\377\37\260\0\377\40\257\1\377\36\254\0\377\36\251\1\377\35\246\1\377"
- "\34\244\1\377\34\243\1\377\33\242\1B\33\242\1\0""6\302\21\0;\303\30\0"
- ";\303\27\0""8\302\26\37X\312:\352T\3058\377\40\260\0\377\37\255\0\377"
- "\34\250\0\377\31\244\0\377\20\235\0\377\17\232\0\377\30\235\1\377\30"
- "\234\1\364\30\234\1\34\30\234\1\0%\273\0\0$\273\0\0!\272\0\0:\301\26"
- "\266b\312I\377'\263\10\377\36\254\0\377\33\247\0\377+\251\23\377\306"
- "\347\300\377\207\313{\377q\301d\377\17\223\0\377\25\225\0\343\25\225"
- "\0\14\25\225\0\0(\274\1\0'\274\0\0)\274\3R\\\311A\377:\272\34\377\35"
- "\254\0\377\24\244\0\377\\\273J\377\326\353\323\377|\274r\377\177\274"
- "v\377\315\344\311\3770\235\"\377\17\212\0\332\22\213\0\10\22\213\0\0"
- "(\274\1\0$\273\0\4B\303\40\316V\305<\377\40\257\1\377\36\251\0\377\22"
- "\237\0\377n\301^\377\221\311\210\377\261\335\251\377\277\341\272\377"
- "\206\300~\377\272\330\265\377\11\177\0\336\17\202\0\11\20\202\0\0(\274"
- "\1\0'\274\1GZ\310=\3778\271\33\377\34\253\0\377\34\245\1\377\20\232\0"
- "\377\241\321\230\377\244\322\235\377\203\275z\377\211\273\203\377\244"
- "\320\236\377g\252^\377\2s\0\353\15x\0\22\15x\0\0%\273\0\0""7\300\23\247"
- "X\306>\377#\260\4\377\35\250\0\377\33\241\1\377\27\233\0\377\12\215\0"
- "\377\303\337\276\377\252\320\244\377\250\320\243\377\261\315\255\377"
- "I\222B\377\2k\0\373\14o\1*\15p\2\0%\273\0\22I\304)\353B\275%\377\33\253"
- "\0\377\31\244\0\377\25\235\0\377\22\227\0\377\15\216\0\3773\223%\377"
- ">\2223\377\210\265\202\377\10m\0\377\3h\0\377\27q\15\377&y\36Q(z\40\0"
- "*\275\3HN\3051\377*\264\12\377(\257\15\377;\260$\377:\253'\3774\244\""
- "\377'\227\26\377\33\212\14\377\26\201\11\377\24w\11\377#{\32\377,|$\377"
- "8\2001\377E\207\77\214@\204<\0&\274\0\205O\3042\377f\310O\377|\315k\377"
- "~\313p\377\200\310t\377\177\305t\377r\271g\377f\257\\\377f\252_\377d"
- "\244_\377Y\231S\377`\231Z\377j\235f\377h\232d\324h\232f\4l\322R\247\206"
- "\326q\355\177\321m\354o\310]\354s\305c\354u\303h\354q\276e\353y\274o"
- "\353{\271r\354}\265u\354w\257r\354t\251o\354g\234b\354h\233e\354v\241"
- "r\352\214\261\2120"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (wsiconcap_24_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 wsiconcap_24_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 wsiconcap_24_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (2304) */
- "\0\0\11\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (96) */
- "\0\0\0`"
- /* width (24) */
- "\0\0\0\30"
- /* height (24) */
- "\0\0\0\30"
- /* pixel_data: */
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\241\342\220"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\376\377\377\0\227\340\203\30""3\304\14B/\303\6m0\303\10\2162\303\12"
- "\242&\300\0\262\203\333k[\241\342\220\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\362\373\357\36\301\355\265q{\327b\302D\307!\3616\302\21\377"
- "1\300\13\377/\277\11\377-\276\7\377%\274\0\377K\310-\263\241\342\220"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\350\370\344%\255\346\235\234l\323Q\3648\302\24\377&"
- "\273\0\377'\273\1\377(\272\2\377'\271\1\377&\270\0\377&\270\0\377&\270"
- "\0\377%\270\1C\241\342\220\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\367\375\366\6\260\347\241|r\324X\364K\307+\377-\274"
- "\10\377%\270\0\377%\267\1\377%\265\1\377$\264\1\377$\264\1\377$\263\1"
- "\377#\263\1\377#\263\1\257#\263\1\0\241\342\220\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\341\366\333!\200\331i\304`\316D\377C\303\"\377("
- "\270\3\377$\265\0\377$\264\1\377#\262\1\377\"\262\1\377\"\261\1\377!"
- "\260\1\377!\260\1\377!\260\1\377!\260\1E!\260\1\0\241\342\220\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\315\360\3047f\320J\345`\314D\377=\277\34\377%\265"
- "\1\377#\263\0\377\"\261\1\377!\261\1\377!\257\1\377\40\256\1\377\40\255"
- "\1\377\37\254\1\377\37\254\1\377\37\254\1\326\37\254\1\6\37\254\1\0\241"
- "\342\220\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\313\357\3018\\\315>\355e\315J\3775\273\23\377"
- "#\263\0\377\"\261\0\377!\260\1\377\40\257\1\377\37\255\1\377\37\253\1"
- "\377\37\252\1\377\36\250\1\377\36\247\1\377\36\247\1\377\35\247\1\223"
- "\35\247\1\0\35\247\1\0\232\340\210\0\352\370\345\0\346\367\341\0\346"
- "\367\341\0\346\367\341\0\352\370\346\0\312\357\300'X\313:\346q\321Y\377"
- ">\275\36\377!\261\0\377!\261\1\377\40\257\1\377\37\255\1\377\37\252\1"
- "\377\36\250\1\377\35\246\1\377\34\245\1\377\34\243\1\377\33\243\1\377"
- "\33\242\1\377\33\241\1T\33\241\1\0\33\241\1\0=\304\31\0C\306\40\0B\306"
- "\37\0B\306\37\0B\306\37\0A\306\36\14\77\303\34\313r\321Y\377Q\3045\377"
- "\"\262\0\377!\260\0\377\40\256\1\377\37\253\1\377\33\247\1\377\22\241"
- "\0\377\33\243\1\377\31\241\1\377\31\237\1\377\31\236\1\377\31\235\1\377"
- "\30\235\1\375\30\234\1,\30\234\1\0\30\234\1\0$\273\1\0\"\273\0\0\"\273"
- "\0\0\"\273\0\0!\273\0\0$\273\1\223e\315I\377c\312J\377(\264\7\377\37"
- "\257\0\377\37\255\1\377\36\251\1\377\30\245\0\377+\252\25\377a\277O\377"
- "\23\234\6\377\21\231\2\377\24\232\2\377\26\232\1\377\27\232\1\377\27"
- "\231\1\355\26\231\1\24\26\231\1\0\26\231\1\0(\274\1\0(\274\1\0(\274\1"
- "\0(\274\1\0%\273\0FM\306-\377o\316W\3776\271\27\377\37\257\0\377\37\255"
- "\1\377\36\251\1\377\33\245\3\377\20\236\0\377\177\312s\377\377\377\377"
- "\377\246\331\236\377\271\342\262\377\223\316\211\377\15\222\0\377\25"
- "\224\0\377\25\223\0\335\24\223\0\10\24\223\0\0\24\223\0\0(\274\1\0(\274"
- "\1\0(\274\1\0&\274\0\4""2\276\15\311j\315Q\377I\300-\377!\260\1\377\37"
- "\255\0\377\36\251\1\377\22\241\0\377|\311l\377\342\364\337\377\334\353"
- "\332\377{\270q\377{\267r\377\351\357\350\377\301\340\274\377\2\207\0"
- "\377\17\215\0\377\23\215\0\325\22\215\0\2\22\215\0\0\22\215\0\0(\274"
- "\1\0(\274\1\0(\274\1\0%\273\0^S\3075\377a\311H\377+\264\13\377\36\256"
- "\0\377\37\252\1\377\35\246\1\377\20\236\0\377g\271Z\377\373\372\373\377"
- "@\2421\377g\272Z\377w\300l\377.\224\40\377\332\351\330\377\270\336\263"
- "\377*\224\32\377\14\204\0\325\21\206\0\2\21\206\0\0\21\206\0\0(\274\1"
- "\0(\274\1\0&\273\0\4""2\276\16\316i\314Q\377D\275'\377\37\257\0\377\37"
- "\253\1\377\35\247\1\377\32\243\0\377\25\235\0\377\203\312v\377\266\333"
- "\263\377E\252;\377\377\377\377\377\377\377\377\377\\\255V\377\217\304"
- "\215\377\367\366\367\3774\222'\377\10~\0\333\17\201\0\7\17\201\0\0\17"
- "\201\0\0(\274\1\0(\274\1\0%\273\0OM\305/\377b\311I\377*\264\12\377\36"
- "\255\0\377\36\250\1\377\34\244\1\377\25\236\0\377-\242\30\377\371\373"
- "\370\377\315\350\311\377,\230\"\377\344\354\343\377\366\365\365\3777"
- "\2220\377\266\331\262\377n\254j\377\0r\0\377\16{\0\352\16z\0\21\16z\0"
- "\0\16z\0\0(\274\1\0'\274\0\0,\274\6\257d\313J\377J\277.\377\37\257\0"
- "\377\37\253\1\377\35\246\1\377\33\242\1\377\30\235\0\377\27\231\2\377"
- "=\235/\377\316\343\312\377\213\307\202\377-\216\37\377+\210\36\377m\262"
- "d\377\377\377\377\377\247\314\242\377\3p\0\377\13t\0\371\14t\0#\14t\0"
- "\0\14t\0\0(\274\1\0%\273\0\40\77\301\35\363e\312L\3772\267\24\377\36"
- "\255\0\377\36\251\1\377\34\244\1\377\32\237\1\377\30\233\1\377\26\230"
- "\0\377\0\211\0\377\227\312\223\377\377\377\377\377\322\345\317\377\344"
- "\363\342\377\331\345\330\377q\243k\377I\217A\377\5m\0\377\11n\0\377\11"
- "m\0A\12m\0\0\12m\0\0(\274\1\0&\273\0fR\3064\377R\3037\377$\261\4\377"
- "\36\254\0\377\36\247\1\377\33\242\0\377\30\235\0\377\27\232\1\377\25"
- "\225\0\377\17\216\0\377>\2300\377Y\237O\3772\211'\377\326\341\323\377"
- "g\242e\377\0b\0\377\3h\0\377\12l\0\377\23o\11\377'{\36o/\201'\0.\200"
- "&\0'\274\0\0.\275\11\261\\\311A\377>\274\40\377\37\257\0\377\33\251\0"
- "\377\30\244\0\377\31\241\1\377\26\233\1\377\22\227\0\377\17\221\0\377"
- "\16\213\0\377\6\201\0\377\2{\0\377\4x\0\377\11o\3\377\5k\0\377\14n\1"
- "\377\32t\20\377&y\35\377*y\"\377'v\37\245\37q\27\0\37q\27\0%\274\0\17"
- ";\301\30\346Y\307>\377*\264\13\377\34\255\0\3774\261\31\377H\2662\377"
- "G\2623\377F\2574\377F\2555\377:\244*\377/\231\37\377-\223\36\377&\214"
- "\31\377#\205\30\377*\205\37\3771\206(\3774\204,\3772\200+\377/{(\377"
- "9\1772\377R\216L\334L\212F\10N\214H\0%\275\0:=\301\33\377G\300)\377J"
- "\277/\377p\313]\377\203\317s\377\202\314s\377\204\313w\377\204\312y\377"
- "}\304q\377x\277m\377m\267c\377d\257Z\377b\252X\377_\245W\377a\243Y\377"
- "V\232O\377L\221E\377Q\220J\377q\243l\377u\244q\377\205\255\201\377h\232"
- "d8l\235h\0#\274\0jK\305+\377w\320a\377\213\326z\377}\317k\377r\311`\377"
- "x\310h\377r\303c\377t\303g\377|\304p\377~\302t\377s\271i\377m\263d\377"
- "s\262j\377z\263r\377q\254k\377g\243a\377i\241c\377m\241h\377^\225Y\377"
- "P\211J\377M\207I\377m\234i\210|\247x\0~\330f\210\215\332y\364\211\327"
- "v\347z\320f\346p\313]\346l\306Y\346u\307e\346u\304g\347|\306o\346l\274"
- "_\345p\273e\345}\276t\345\202\276z\345v\264n\346y\263r\346|\262u\346"
- "x\255r\345v\251q\346f\234`\346j\234e\346\200\251}\347\215\260\212\355"
- "y\243v\300\226\270\223\3"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (wsiconcap_32_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 wsiconcap_32_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 wsiconcap_32_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (4096) */
- "\0\0\20\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (128) */
- "\0\0\0\200"
- /* width (32) */
- "\0\0\0\40"
- /* height (32) */
- "\0\0\0\40"
- /* pixel_data: */
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0p\324V\0\376\377\375\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\367\374\365\0\213"
- "\335u\0""1\304\12\0+\302\2\22,\302\3+-\303\4C.\303\6V/\303\7d#\277\0"
- "`\266\352\250\21p\324V\0\376\377\375\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\4\325\362\3151q\326Vj;\306\25\240"
- "6\304\17\3113\303\14\3464\303\16\3655\303\17\3775\302\16\377&\277\0\377"
- "\203\332k\204p\324V\0\376\377\375\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\351\371"
- "\344.\270\352\252\203w\327]\324E\310\"\3775\302\17\3776\302\21\3772\301"
- "\15\377.\277\10\377-\276\6\377+\275\4\377)\275\3\377\"\273\0\377R\312"
- "3\235p\324V\0\376\377\375\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\330\364\320B\237\343\215\264m\323R\374"
- "C\306\40\377.\277\10\377+\275\5\377*\274\4\377)\273\3\377)\272\2\377"
- "'\272\1\377'\271\1\377'\271\1\377'\271\1\377'\271\1\361%\271\0\"p\324"
- "V\0\376\377\375\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\341\366\333"
- "(\227\340\204\252q\324V\377W\3149\3778\301\24\377*\274\3\377(\272\2\377"
- "'\270\2\377&\267\1\377&\267\1\377%\266\1\377%\266\1\377%\265\1\377$\265"
- "\1\377$\265\1\377$\265\1\206$\265\1\0p\324V\0\376\377\375\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\376\0\253\346\232pl\323Q\362g\320K\377L\307,\377/\274\12\377"
- "'\270\1\377&\267\1\377%\265\1\377$\264\1\377$\264\1\377#\263\1\377#\262"
- "\1\377#\262\1\377#\262\1\377#\262\1\377#\262\1\361#\262\1\30#\262\1\0"
- "p\324V\0\376\377\375\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\355\372\352\21\200\331h\252c\317G\377g\317L"
- "\377A\302\40\377+\271\6\377&\266\1\377$\265\1\377$\263\1\377#\262\1\377"
- "#\262\1\377\"\261\1\377\"\261\1\377!\261\1\377!\260\1\377!\260\1\377"
- "!\260\1\377!\260\1\231!\260\1\0!\260\1\0p\324V\0\376\377\375\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\337\365\331!a\317D\320"
- "f\320K\377c\315H\377;\277\31\377)\267\5\377$\264\1\377$\263\1\377#\262"
- "\1\377\"\261\1\377!\261\1\377!\260\1\377\40\257\1\377\40\256\1\377\37"
- "\256\1\377\37\255\1\377\37\255\1\377\37\254\1\377\37\254\1:\37\254\1"
- "\0\37\254\1\0p\324V\0\376\377\375\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\332\364\323&T\3135\335k\321Q\377_\313B\3772\273\20\377&\265\3"
- "\377$\263\1\377#\262\1\377\"\261\1\377!\260\1\377\40\257\1\377\40\255"
- "\1\377\37\254\1\377\37\253\1\377\37\253\1\377\37\252\1\377\37\251\1\377"
- "\36\251\1\377\36\250\1\335\36\251\1\6\36\251\1\0\36\251\1\0q\324W\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\337\365\331\40N\311.\334l\321"
- "R\377h\316N\3771\272\16\377#\264\0\377#\262\1\377\"\261\1\377!\260\1"
- "\377\40\257\1\377\37\255\1\377\37\253\1\377\37\252\1\377\37\251\1\377"
- "\36\250\1\377\35\247\1\377\35\246\1\377\35\246\1\377\35\245\1\377\35"
- "\245\1\241\35\245\1\0\35\245\1\0\35\245\1\0p\324V\0\345\370\340\0\345"
- "\367\341\0\345\367\341\0\345\367\341\0\345\367\341\0\345\367\341\0\346"
- "\367\341\0\325\362\315\16T\3125\320c\316G\377x\323a\377<\275\34\377#"
- "\263\0\377#\261\1\377!\261\1\377\40\257\1\377\37\255\1\377\37\253\1\377"
- "\37\251\1\377\36\250\1\377\35\246\1\377\35\245\1\377\34\244\1\377\34"
- "\243\1\377\33\242\1\377\33\242\1\377\33\241\1\377\32\241\1g\32\241\1"
- "\0\32\241\1\0\32\241\1\0""9\303\25\0C\306!\0B\306\40\0C\306\40\0C\306"
- "\40\0C\306\40\0C\306\40\0B\306\40\0""6\301\21\250X\312:\377\177\325j"
- "\377L\303/\377%\263\3\377\"\261\1\377!\260\1\377\40\256\1\377\37\254"
- "\1\377\37\252\1\377\36\250\1\377\34\246\0\377\34\245\1\377\34\243\1\377"
- "\33\242\1\377\32\240\1\377\32\237\1\377\31\236\1\377\31\235\1\377\31"
- "\235\1\377\30\235\1;\30\235\1\0\30\235\1\0\30\235\1\0%\274\0\0#\274\0"
- "\0#\274\0\0#\274\0\0#\274\0\0#\274\0\0#\274\0\0\40\273\0oG\305&\377~"
- "\324h\377[\307A\377+\265\11\377!\261\0\377\40\260\1\377\37\255\1\377"
- "\37\253\1\377\36\251\1\377\36\247\1\377\23\241\0\377\26\241\0\377\30"
- "\240\0\377\32\237\1\377\22\233\0\377\27\234\0\377\30\234\1\377\27\233"
- "\1\377\27\233\1\377\27\233\1\367\27\233\1\35\27\233\1\0\27\233\1\0\27"
- "\233\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0&\273\0"
- "+6\300\21\366r\321Z\377h\314P\3776\271\27\377!\260\0\377\40\257\1\377"
- "\37\255\1\377\37\252\1\377\35\250\0\377\34\245\0\377\24\240\0\377\216"
- "\321\201\377\303\346\274\377#\242\15\377\11\225\0\377>\254,\377\32\234"
- "\4\377\26\231\1\377\26\230\1\377\26\230\0\377\26\227\0\345\26\227\0\15"
- "\26\227\0\0\26\227\0\0\26\227\0\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0"
- "(\274\1\0'\274\0\0)\274\2\274]\312@\377r\320[\377D\276'\377$\262\3\377"
- "\40\257\1\377\37\255\1\377\37\252\1\377\35\247\1\377\32\244\0\377\25"
- "\240\0\377#\243\15\377\354\367\351\377\377\377\377\377\330\360\323\377"
- "\254\334\245\377\372\375\372\377\231\320\220\377\14\221\0\377\25\224"
- "\0\377\25\223\0\377\24\223\0\327\24\223\0\4\24\223\0\0\24\223\0\0\24"
- "\223\0\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0&\273\0V@\302\37"
- "\377q\320Z\377T\3049\377+\265\14\377\40\257\0\377\37\255\1\377\37\252"
- "\1\377\36\247\1\377\24\241\1\377\210\320z\377\312\351\305\377\341\363"
- "\335\377\353\357\351\377\232\303\226\377\232\302\227\377\346\353\345"
- "\377\377\377\377\377\232\313\222\377\0\206\0\377\20\216\0\377\23\217"
- "\0\377\23\216\0\320\23\216\0\0\23\216\0\0\23\216\0\0\23\216\0\0(\274"
- "\1\0(\274\1\0(\274\1\0(\274\1\0'\274\0\12+\274\5\332a\313G\377d\312L"
- "\3779\271\32\377!\260\1\377\37\256\1\377\37\253\1\377\36\250\1\377\34"
- "\245\0\377\26\236\3\377\266\331\260\377\377\377\377\377\325\344\322\377"
- "!\220\25\377\30\224\10\377\37\225\16\377\17\204\4\377\255\316\247\377"
- "\347\364\345\377J\250\77\377\40\221\22\377\17\210\0\377\22\211\0\317"
- "\22\210\0\0\22\210\0\0\22\210\0\0\22\210\0\0(\274\1\0(\274\1\0(\274\1"
- "\0(\274\1\0%\273\0hC\302!\377p\316X\377N\3012\377(\263\10\377\37\256"
- "\0\377\37\254\1\377\36\250\1\377\35\246\1\377\34\243\1\377\13\231\0\377"
- "K\254:\377\377\376\377\377;\237*\377I\257<\377\354\367\352\377\365\373"
- "\363\377o\274e\377\25\206\7\377\354\362\354\377\377\377\377\377\233\314"
- "\224\377\2}\0\377\20\204\0\320\20\204\0\0\20\204\0\0\20\204\0\0\20\204"
- "\0\0(\274\1\0(\274\1\0(\274\1\0'\274\0\7+\274\5\331`\313E\377e\312M\377"
- "7\271\31\377\40\260\1\377\37\254\1\377\37\251\1\377\35\246\1\377\34\243"
- "\1\377\27\237\1\377#\242\25\377\243\330\233\377\356\365\355\377\20\220"
- "\0\377\301\342\272\377\377\377\377\377\377\377\377\377\347\363\345\377"
- "\14\202\0\377\301\335\275\377\357\362\356\377h\246b\377\7}\0\377\17\200"
- "\0\331\17\200\0\5\17\200\0\0\17\200\0\0\17\200\0\0(\274\1\0(\274\1\0"
- "(\274\1\0&\273\0Q>\301\34\377n\316W\377N\3023\377&\262\6\377\37\256\0"
- "\377\37\253\1\377\36\250\1\377\34\244\1\377\32\241\1\377\13\230\0\377"
- "\177\305s\377\377\377\377\377\363\372\362\377\31\223\6\377\213\301\203"
- "\377\377\377\377\377\377\377\377\377\267\323\262\377\6|\0\377\341\357"
- "\337\377\203\266|\377\0n\0\377\17}\0\377\16{\0\346\16{\0\16\16{\0\0\16"
- "{\0\0\16{\0\0(\274\1\0(\274\1\0(\274\0\0(\273\1\270X\310;\377i\313Q\377"
- "9\271\34\377\37\257\0\377\37\254\1\377\36\251\1\377\35\246\1\377\33\242"
- "\1\377\31\237\1\377\22\232\0\377;\242*\377\236\303\231\377\367\370\366"
- "\377\220\313\207\377\4~\0\377i\244a\377w\252p\377\12w\4\377\\\252R\377"
- "\377\377\377\377\246\316\240\377\13x\6\377\14w\0\377\15w\0\367\15v\0"
- "\35\15v\0\0\15v\0\0\15v\0\0(\274\1\0(\274\1\0&\273\0%4\276\20\371h\314"
- "O\377X\305>\377*\264\13\377\37\256\0\377\37\253\1\377\36\247\1\377\34"
- "\244\1\377\32\240\1\377\30\235\1\377\30\233\1\377\21\225\0\377\0\203"
- "\0\377\177\272v\377\377\377\377\377\232\316\223\3773\226+\377)\216!\377"
- "}\273w\377\375\376\375\377\377\376\377\377\343\353\342\377\27x\17\377"
- "\11q\0\377\14r\0\377\14q\0""7\14q\0\0\14q\0\0\14q\0\0(\274\1\0(\274\1"
- "\0&\273\0}H\303'\377h\314P\377D\276'\377\"\260\2\377\37\254\0\377\37"
- "\251\1\377\35\246\1\377\33\242\1\377\31\236\1\377\27\233\1\377\27\231"
- "\1\377\25\226\0\377\6\214\0\377\200\300w\377\377\377\377\377\377\375"
- "\377\377\377\374\377\377\377\377\377\377\377\377\377\377\202\255}\377"
- "8\2005\3773\177*\377\6m\0\377\14o\0\377\12m\0\377\7k\0[\6j\0\0\6j\0\0"
- "\6j\0\0(\274\1\0'\274\0\1*\274\4\314Z\311=\377[\306A\3771\267\23\377"
- "\37\257\0\377\37\253\1\377\36\250\1\377\34\244\1\377\32\241\1\377\31"
- "\235\1\377\27\233\1\377\26\230\0\377\25\224\0\377\20\217\0\377/\221!"
- "\377\221\271\213\377:\215/\3776\207.\377\353\357\352\377\350\355\347"
- "\377\20s\5\377\0k\0\377\4k\0\377\12m\0\377\10j\0\377\20n\10\377)}\40"
- "\2128\2060\0""6\205.\0""6\205.\0(\274\1\0&\274\0&6\277\22\373a\312G\377"
- "J\300.\377'\263\7\377\37\256\0\377\37\253\1\377\35\247\1\377\32\243\0"
- "\377\30\237\0\377\26\233\0\377\26\231\0\377\25\226\0\377\24\222\0\377"
- "\24\216\0\377\15\207\0\377\4{\0\377\10~\0\377\5x\0\3773\202)\377*z!\377"
- "\13p\0\377\11m\0\377\10k\0\377\23o\12\377\35t\25\377\"v\33\377#v\34\274"
- "\37s\27\0\36s\26\0\36s\26\0(\274\1\0&\273\0gE\303%\377_\311E\377=\274"
- "\37\377\"\261\2\377\36\255\0\377\32\250\0\377\31\244\0\377\36\244\5\377"
- "\37\241\10\377\34\235\6\377\27\231\2\377\21\223\0\377\15\215\0\377\14"
- "\210\0\377\13\203\0\377\14\201\0\377\14}\0\377\13y\0\377\2q\0\377\2m"
- "\0\377\13o\0\377\31u\17\377,\177%\3772\200+\3770}*\3776\1770\3771{*\353"
- ")v\"\17(u\40\0(u\40\0'\275\0\0)\274\2\247S\3075\377W\306;\3770\266\20"
- "\377\31\256\0\377!\255\5\377\77\265'\377T\274@\377V\272D\377P\265\77"
- "\377Q\264A\377T\263D\377P\257A\377\77\2441\3779\235,\3778\231*\3773\224"
- "&\377/\216#\377.\213$\3775\214+\377A\220:\377B\216:\377>\2127\3776\202"
- ".\3773~,\377,x%\3777}1\377U\221P\377E\205\77@J\211E\0I\210C\0'\276\0"
- "\10.\276\10\333T\3077\377@\276!\377/\266\20\377V\303\77\377z\315i\377"
- "\206\320v\377~\314o\377{\311l\377\205\313y\377\207\313{\377|\305p\377"
- "w\300l\377s\274h\377g\263]\377`\255V\377W\246N\377P\237G\377P\234G\377"
- "V\235N\377L\225D\377;\2103\3778\2040\3776\200/\377R\220L\377q\243m\377"
- "r\242m\377\250\306\246\377\211\260\205\210\225\270\223\0\223\267\220"
- "\0%\276\0*)\274\2\372F\302&\377d\312K\377\212\326y\377\222\330\202\377"
- "}\316l\377x\313f\377|\312l\377y\310k\377}\307p\377u\303i\377u\301h\377"
- "|\302q\377z\277p\377z\274p\377o\265e\377z\271r\377z\266s\377\202\270"
- "{\377\177\265z\377w\256q\377\201\262|\377|\255w\377\220\270\215\377{"
- "\251v\377\202\254\177\377e\230a\377;|7\377.s(\3263v0\4""4w.\0+\277\6"
- "WP\3100\377~\325h\377\207\326t\377}\321j\377x\316e\377p\311]\377o\307"
- "^\377w\310h\377m\302^\377l\300^\377~\307q\377\203\307x\377\200\304v\377"
- "{\277q\377i\263_\377g\260_\377i\257a\377i\254b\377p\255i\377j\250d\377"
- "T\231M\377S\226L\377P\221J\377O\216I\377D\205\77\377@\200<\377I\204E"
- "\377q\236n\377\233\273\231\377\266\315\265=\302\325\301\0\226\337\204"
- "t\217\334{\347\217\332|\347\210\326v\346~\322k\345v\316c\345o\311\\\345"
- "k\305X\345r\306a\345s\305e\346|\307p\346z\305m\345c\271U\344i\271]\343"
- "r\273h\343\206\302~\344\216\304\207\344\203\275}\345{\266u\345\203\270"
- "~\345\203\266}\345\205\266\200\344\214\271\210\344\210\264\203\345t\246"
- "o\344w\246s\344\201\253}\345\223\266\220\346\220\263\215\345g\226c\345"
- "h\230d\177\200\251\177\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (wsiconcap_48_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 wsiconcap_48_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 wsiconcap_48_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (9216) */
- "\0\0$\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (192) */
- "\0\0\0\300"
- /* width (48) */
- "\0\0\0""0"
- /* height (48) */
- "\0\0\0""0"
- /* pixel_data: */
- ";\304\30\0\317\361\306\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\372\376\372\0\316\361\305\0o\325"
- "S\0""7\305\21\0.\303\5\14,\302\4)-\303\5H.\303\6d/\303\7{0\303\10\220"
- "1\303\11\2402\303\12\255.\302\7\2605\304\16n\340\366\332\5;\304\30\0"
- "\317\361\306\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\353\371\350\30\250\345\227M\\\317=\211"
- "@\307\34\271<\305\27\3417\304\21\3725\303\16\3775\303\16\3776\303\17"
- "\3776\303\20\3777\303\20\3775\302\16\3775\302\15\377\"\275\0\377\235"
- "\342\212_;\304\30\0\317\361\306\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\357\372\354\40\307\356\274i\220\336z\271`\320B\354A\306\35\377"
- ":\304\25\377:\304\25\3778\303\23\3773\301\16\3770\300\12\3770\300\12"
- "\377/\277\11\377.\277\10\377,\276\6\377+\276\4\377*\276\3\377\34\272"
- "\0\377\201\330j\211;\304\30\0\317\361\306\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\376\377\376\1\327\363\320"
- "I\246\345\225\251w\326^\362U\3144\377\77\305\33\3775\301\20\3771\300"
- "\14\377/\277\11\377/\277\11\377.\276\10\377,\275\6\377+\274\4\377*\274"
- "\2\377(\273\1\377(\273\1\377'\273\1\377'\273\1\377(\273\1\377$\272\1"
- "\367<\302\31/;\304\30\0\317\361\306\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\374\376\374\2\310\357\275Y\222\337}\306t\325Z\377`\317C\377"
- "H\307'\3776\301\22\377/\276\11\377-\275\6\377+\274\5\377*\274\3\377)"
- "\273\3\377(\272\2\377(\272\1\377'\271\1\377'\271\1\377'\271\1\377&\270"
- "\1\377'\270\1\377'\270\1\377'\270\1\377'\271\1\211#\270\0\0;\304\30\0"
- "\317\361\306\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\314\360\302F\206\332o\305"
- "q\324W\377n\323T\377X\314:\377=\303\31\377/\276\11\377+\274\4\377)\273"
- "\3\377(\272\2\377(\271\2\377'\270\2\377&\267\1\377&\267\1\377%\267\1"
- "\377%\266\1\377%\266\1\377%\266\1\377%\266\1\377%\266\1\377%\266\1\377"
- "%\266\1\345%\266\1\23%\266\1\0;\304\30\0\317\361\306\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\346\370\341"
- "\35\214\334v\242g\321J\377s\324Z\377h\320M\377J\307)\3775\277\20\377"
- "+\273\5\377)\272\3\377(\270\2\377'\267\2\377&\267\1\377%\266\1\377%\265"
- "\1\377%\265\1\377%\265\1\377$\265\1\377$\264\1\377$\264\1\377$\264\1"
- "\377#\264\1\377$\263\1\377$\263\1\377#\264\1w$\264\1\0$\264\1\0;\304"
- "\30\0\317\361\306\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\266\351\250Y`\317B\344i\321N\377u\324\\\377[\313=\377\77\302\35"
- "\377/\274\13\377)\271\4\377'\270\2\377&\266\2\377%\266\1\377%\265\1\377"
- "$\264\1\377$\264\1\377$\263\1\377#\263\1\377#\262\1\377#\262\1\377#\262"
- "\1\377#\261\1\377#\261\1\377#\261\1\377\"\261\1\377\"\261\1\351#\261"
- "\1\21#\261\1\0#\261\1\0;\304\30\0\317\361\306\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\365\374\363\11\206\332o\224Q\3120\377t\324\\\377p\322V\377Q\310"
- "1\3779\300\26\377-\272\10\377'\270\2\377&\266\2\377%\265\2\377$\264\1"
- "\377$\264\1\377#\263\1\377#\262\1\377#\261\1\377\"\261\1\377\"\261\1"
- "\377\"\261\1\377\"\261\1\377\"\261\1\377!\261\1\377!\261\1\377!\261\1"
- "\377!\261\1\377!\261\1\216!\261\1\0!\261\1\0!\261\1\0;\304\30\0\317\361"
- "\306\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\342\366\334\36b\320E\301R\3123\377{\326c\377j\320"
- "P\377K\305,\3776\276\24\377+\271\7\377&\266\2\377%\265\2\377$\264\1\377"
- "#\263\1\377#\262\1\377#\261\1\377\"\261\1\377\"\261\1\377\"\261\1\377"
- "!\261\1\377!\260\1\377\40\260\1\377\40\260\1\377\40\257\1\377\40\257"
- "\1\377\40\257\1\377\40\256\1\377\40\256\1\374\40\256\1.\40\256\1\0\40"
- "\256\1\0\40\256\1\0;\304\30\0\317\361\306\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\322\361\3110K\311+\334X"
- "\314:\377|\326e\377e\316J\377G\303&\3774\274\22\377*\270\7\377&\265\2"
- "\377$\264\1\377#\263\1\377#\262\1\377#\261\1\377\"\261\1\377!\261\1\377"
- "!\260\1\377\40\260\1\377\40\257\1\377\40\256\1\377\40\256\1\377\37\255"
- "\1\377\37\255\1\377\37\255\1\377\37\254\1\377\37\254\1\377\37\254\1\377"
- "\37\254\1\310\37\254\1\1\37\254\1\0\37\254\1\0\37\254\1\0;\304\30\0\317"
- "\361\306\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\310"
- "\356\276:\77\304\34\351[\314=\377}\326e\377a\314F\377@\300\40\3770\272"
- "\15\377(\266\5\377%\264\2\377$\263\1\377#\262\1\377#\261\1\377\"\261"
- "\1\377!\261\1\377\40\260\1\377\40\257\1\377\40\256\1\377\40\255\1\377"
- "\37\255\1\377\37\254\1\377\37\253\1\377\37\253\1\377\37\253\1\377\37"
- "\252\1\377\37\252\1\377\37\252\1\377\37\251\1\377\37\251\1x\37\251\1"
- "\0\37\251\1\0\37\251\1\0\37\251\1\0;\304\30\0\317\361\306\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\310\357\277::\303\26\354Z\314<\377\200"
- "\327i\377b\314G\377<\276\33\377*\267\7\377%\265\2\377$\263\2\377#\262"
- "\1\377\"\261\1\377\"\261\1\377!\261\1\377\40\260\1\377\40\256\1\377\40"
- "\255\1\377\37\255\1\377\37\254\1\377\37\253\1\377\37\252\1\377\37\252"
- "\1\377\37\251\1\377\36\251\1\377\36\250\1\377\36\250\1\377\36\247\1\377"
- "\36\247\1\377\35\247\1\376\35\247\1""5\35\247\1\0\35\247\1\0\35\247\1"
- "\0\35\247\1\0;\304\30\0\317\361\306\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\322"
- "\362\312/9\302\25\352T\3125\377\202\327l\377m\317T\377A\300!\377)\267"
- "\6\377$\264\1\377$\262\2\377#\261\1\377\"\261\1\377!\261\1\377\40\260"
- "\1\377\40\256\1\377\40\255\1\377\37\254\1\377\37\253\1\377\37\252\1\377"
- "\37\251\1\377\36\250\1\377\36\250\1\377\36\247\1\377\35\247\1\377\35"
- "\246\1\377\35\246\1\377\35\245\1\377\35\245\1\377\34\245\1\377\34\245"
- "\1\335\34\244\1\10\34\244\1\0\34\244\1\0\34\244\1\0\34\244\1\0;\304\30"
- "\0\322\362\311\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\342\366\335\34@\305\36\335I\306)\377\201"
- "\327k\377x\323a\377O\3041\377-\267\13\377$\263\1\377$\262\2\377#\261"
- "\1\377!\261\1\377\40\260\1\377\40\257\1\377\40\255\1\377\37\254\1\377"
- "\37\253\1\377\37\252\1\377\37\251\1\377\36\250\1\377\35\247\1\377\35"
- "\246\1\377\35\245\1\377\35\245\1\377\34\244\1\377\34\244\1\377\34\243"
- "\1\377\33\243\1\377\33\242\1\377\33\242\1\377\33\242\1\253\33\242\1\0"
- "\33\242\1\0\33\242\1\0\33\242\1\0\33\242\1\0\77\305\34\0\242\343\220"
- "\0\252\345\234\0\253\346\234\0\253\346\234\0\253\346\234\0\253\346\234"
- "\0\253\346\234\0\253\346\234\0\253\346\234\0\253\346\234\0\253\346\234"
- "\0\240\342\217\12H\307&\304>\302\33\377{\324d\377~\325i\377\\\310A\377"
- "4\272\24\377$\263\2\377#\261\1\377\"\261\1\377!\261\1\377\40\257\1\377"
- "\40\256\1\377\37\254\1\377\37\253\1\377\37\252\1\377\37\251\1\377\36"
- "\250\1\377\35\247\1\377\35\246\1\377\35\245\1\377\34\244\1\377\34\243"
- "\1\377\33\242\1\377\33\242\1\377\32\241\1\377\32\241\1\377\32\240\1\377"
- "\32\240\1\377\32\237\1\377\32\237\1}\32\237\1\0\32\237\1\0\32\237\1\0"
- "\32\237\1\0\32\237\1\0*\277\4\0""3\301\16\0""0\301\13\0""0\301\13\0""0"
- "\301\13\0""0\301\13\0""0\301\13\0""0\301\13\0""0\301\13\0""0\301\13\0"
- "0\301\13\0""0\301\13\0+\276\4\2325\300\21\377q\321X\377\201\325k\377"
- "f\314M\377>\275\37\377&\264\4\377#\261\1\377\"\261\1\377!\260\1\377\40"
- "\257\1\377\37\255\1\377\37\254\1\377\37\253\1\377\37\251\1\377\36\250"
- "\1\377\35\247\1\377\35\246\1\377\35\244\1\377\34\243\1\377\33\242\1\377"
- "\33\241\1\377\32\240\1\377\32\240\1\377\32\237\1\377\31\236\1\377\31"
- "\236\1\377\31\235\1\377\31\235\1\377\30\235\1\377\30\235\1O\30\234\1"
- "\0\30\234\1\0\30\234\1\0\30\234\1\0\30\234\1\0(\276\0\0%\275\0\0%\275"
- "\0\0%\275\0\0%\275\0\0%\275\0\0%\275\0\0%\275\0\0%\275\0\0%\275\0\0%"
- "\275\0\0$\274\0_/\276\11\377b\315F\377\200\325k\377m\316U\377H\301*\377"
- "*\265\10\377#\261\1\377\"\261\1\377\40\260\1\377\40\256\1\377\37\255"
- "\1\377\37\253\1\377\37\252\1\377\36\251\1\377\35\247\1\377\35\246\1\377"
- "\34\245\1\377\34\243\1\377\33\242\1\377\32\241\1\377\32\240\1\377\31"
- "\237\0\377\26\234\0\377\30\235\0\377\30\234\1\377\30\234\1\377\30\233"
- "\1\377\27\233\1\377\27\233\1\377\27\233\1\374\27\233\1,\27\233\1\0\27"
- "\233\1\0\27\233\1\0\27\233\1\0\27\233\1\0(\274\1\0(\274\1\0(\274\1\0"
- "(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0'\274"
- "\0$*\275\3\357P\3071\377|\324f\377s\320\\\377S\3057\3771\267\20\377#"
- "\261\1\377\"\261\1\377\40\260\1\377\40\256\1\377\37\255\1\377\37\253"
- "\1\377\37\251\1\377\36\250\1\377\35\247\1\377\35\245\1\377\34\243\1\377"
- "\33\242\1\377\32\241\1\377\32\240\1\377\31\236\1\377\31\236\1\377\26"
- "\234\0\377!\240\14\377\24\232\0\377\22\231\0\377\13\225\0\377\25\232"
- "\0\377\27\232\1\377\27\232\1\377\27\231\1\354\27\231\1\23\27\231\1\0"
- "\27\231\1\0\27\231\1\0\27\231\1\0\27\231\1\0(\274\1\0(\274\1\0(\274\1"
- "\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\1'\274"
- "\0\272>\302\33\377q\320X\377x\322b\377\\\310B\377;\273\34\377%\262\4"
- "\377!\261\1\377\40\260\1\377\40\256\1\377\37\254\1\377\37\252\1\377\37"
- "\251\1\377\36\250\1\377\35\246\1\377\35\245\1\377\33\243\1\377\32\242"
- "\1\377\32\240\1\377\31\237\1\377\31\235\1\377\20\231\0\377\2\222\0\377"
- "Y\266J\377\344\364\342\377\\\270L\377'\241\26\377k\276]\377#\236\16\377"
- "\24\226\0\377\26\227\0\377\26\227\0\333\25\227\0\10\25\227\0\0\25\227"
- "\0\0\25\227\0\0\25\227\0\0\25\227\0\0(\274\1\0(\274\1\0(\274\1\0(\274"
- "\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0'\274\0d0\275\12\377"
- "_\313C\377y\322c\377d\312K\377E\277(\377*\264\12\377\"\261\1\377\40\260"
- "\1\377\40\256\1\377\37\254\1\377\37\253\1\377\37\251\1\377\35\247\1\377"
- "\35\246\1\377\34\244\1\377\33\242\1\377\32\241\1\377\32\237\1\377\31"
- "\236\1\377\30\234\1\377\23\231\0\377C\2561\377F\257<\377\312\350\304"
- "\377\377\375\377\377\353\360\352\377\362\371\361\377\377\377\377\377"
- "V\256H\377\10\217\0\377\25\224\0\377\25\224\0\315\25\224\0\1\25\224\0"
- "\0\25\224\0\0\25\224\0\0\25\224\0\0\25\224\0\0(\274\1\0(\274\1\0(\274"
- "\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0'\274\0\26(\274\1\351"
- "H\304(\377t\321]\377k\315S\377O\3023\3772\267\22\377#\261\2\377!\260"
- "\1\377\40\256\1\377\37\254\1\377\37\253\1\377\36\251\1\377\35\247\1\377"
- "\35\245\1\377\34\244\1\377\33\242\1\377\32\240\1\377\31\237\1\377\30"
- "\235\1\377\30\233\1\377\24\231\0\377!\235\16\377\342\360\340\377\377"
- "\377\377\377\270\320\264\3771\212(\377#\204\32\377l\245d\377\366\366"
- "\366\377s\273g\377\5\213\0\377\22\221\0\377\24\221\0\303\24\221\0\0\24"
- "\221\0\0\24\221\0\0\24\221\0\0\24\221\0\0\24\221\0\0(\274\1\0(\274\1"
- "\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0'\273\0\2244"
- "\277\20\377e\315K\377p\317Y\377X\306=\377;\272\35\377&\262\5\377!\260"
- "\1\377\40\256\1\377\37\254\1\377\37\253\1\377\37\251\1\377\35\247\1\377"
- "\35\245\1\377\34\243\1\377\32\242\1\377\32\240\1\377\31\236\1\377\30"
- "\234\1\377\27\233\1\377\27\233\1\377\27\232\1\377\11\216\0\377\245\316"
- "\236\377\335\350\334\377\30\207\10\377\211\311\202\377\265\336\257\377"
- "4\233)\377f\250\\\377\371\374\370\377\274\340\270\377\34\222\12\377\20"
- "\215\0\275\23\216\0\0\23\216\0\0\23\216\0\0\23\216\0\0\23\216\0\0\23"
- "\216\0\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1"
- "\0'\274\0+)\273\2\370N\306/\377s\320[\377`\311G\377F\276)\377,\264\13"
- "\377!\260\1\377\40\256\1\377\37\255\1\377\37\253\1\377\37\251\1\377\35"
- "\247\1\377\35\245\1\377\34\243\1\377\32\241\1\377\32\237\1\377\30\235"
- "\0\377\30\234\1\377\25\232\0\377\16\227\0\377\25\230\0\377\24\227\0\377"
- "\40\233\25\377\304\344\277\377\213\302\202\377O\254@\377\377\377\377"
- "\377\377\377\377\377\311\346\304\377\35\214\14\377\370\371\367\377\320"
- "\335\316\377\36\214\21\377\16\211\0\275\22\212\0\0\22\212\0\0\22\212"
- "\0\0\22\212\0\0\22\212\0\0\22\212\0\0(\274\1\0(\274\1\0(\274\1\0(\274"
- "\1\0(\274\1\0(\274\1\0(\274\1\0'\273\0\2506\277\23\377h\315N\377m\315"
- "U\377R\3037\3776\270\27\377#\261\2\377\40\257\1\377\37\255\1\377\37\253"
- "\1\377\37\251\1\377\35\247\1\377\35\245\1\377\34\244\1\377\32\242\1\377"
- "\32\240\1\377\20\232\0\377\17\230\0\377\15\226\0\377\32\234\4\377F\256"
- "5\377\37\233\13\377\5\215\0\377\215\307\203\377\377\377\377\377\232\317"
- "\222\377/\224!\377\367\367\367\377\377\377\377\377\232\304\224\377-\224"
- "\36\377\353\362\352\377#\203\25\377\11\202\0\377\21\207\0\275\21\206"
- "\0\0\21\206\0\0\21\206\0\0\21\206\0\0\21\206\0\0\21\206\0\0(\274\1\0"
- "(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0'\274\0""1)\273\3\373O\306"
- "1\377r\320[\377a\310H\377E\275(\377)\263\11\377\40\260\1\377\40\256\1"
- "\377\37\254\1\377\37\252\1\377\36\250\1\377\35\246\1\377\34\244\1\377"
- "\32\242\1\377\32\240\1\377\22\233\0\377j\276[\377\247\331\237\3778\251"
- ".\377\207\313{\377\377\377\377\377i\271\\\377\0\205\0\377.\221\"\377"
- "\210\263\202\377\356\365\355\377>\2351\377.\204(\377O\221H\377\22|\10"
- "\377\254\327\246\377\377\377\377\377Z\252N\377\6\177\0\377\20\204\0\277"
- "\20\204\0\0\20\204\0\0\20\204\0\0\20\204\0\0\20\204\0\0\20\204\0\0(\274"
- "\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0'\273\0\2436\276\22"
- "\377g\314M\377m\316V\377T\3039\3776\270\27\377\"\261\2\377\40\256\1\377"
- "\37\254\1\377\37\253\1\377\36\250\1\377\35\246\1\377\35\244\1\377\33"
- "\242\1\377\32\240\1\377\17\232\0\377\0\221\0\377\254\326\245\377\377"
- "\377\377\377\364\365\363\377\342\350\342\377\354\357\354\377\355\366"
- "\353\377\216\313\207\377\246\324\240\377,\220\35\377\316\342\313\377"
- "\373\377\372\377\234\316\227\377s\265o\377\304\341\277\377\342\350\341"
- "\377\316\332\316\377W\237N\377\5~\0\377\17\202\0\307\17\202\0\0\17\202"
- "\0\0\17\202\0\0\17\202\0\0\17\202\0\0\17\202\0\0(\274\1\0(\274\1\0(\274"
- "\1\0(\274\1\0(\274\1\0(\274\0$(\273\2\367L\304-\377p\317Y\377b\311I\377"
- "D\275(\377)\263\11\377\40\257\1\377\37\255\1\377\37\253\1\377\37\251"
- "\1\377\35\247\1\377\35\245\1\377\33\243\1\377\32\240\1\377\26\236\0\377"
- "Q\265B\377s\302f\377\360\367\357\377\230\277\222\377=\2204\377>\2244"
- "\3777\215.\377k\243e\377\372\367\372\377\377\377\377\377P\237D\377\246"
- "\311\240\377\317\332\315\377\242\275\241\377\377\377\377\377\375\373"
- "\375\377#{\30\377\12o\1\377\14y\0\377\17\177\0\377\17~\0\322\17~\0\3"
- "\17~\0\0\17~\0\0\17~\0\0\17~\0\0\17\203\0\0(\274\1\0(\274\1\0(\274\1"
- "\0(\274\1\0(\274\1\0'\273\0\2112\275\15\377b\313G\377m\315V\377T\304"
- ":\3773\267\25\377\"\261\2\377\40\256\1\377\37\254\1\377\37\252\1\377"
- "\36\250\1\377\35\246\1\377\34\244\1\377\32\241\1\377\25\236\0\377'\241"
- "\23\377\354\363\352\377\377\377\377\377\213\273\203\377=\2340\377\323"
- "\354\320\377\374\376\373\377\356\371\354\377s\266k\377E\2229\377\372"
- "\371\372\377O\243C\377\2q\0\377\26y\11\377\0o\0\377k\240c\377n\241g\377"
- "\12{\0\377\14}\0\377\16|\0\377\16{\0\377\16z\0\340\15z\0\13\15z\0\0\15"
- "z\0\0\15{\0\0\16\201\0\0\11S\0\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0"
- "(\274\1\15'\273\0\344D\302$\377n\316V\377e\312M\377G\276*\377(\263\10"
- "\377\40\257\1\377\37\255\1\377\37\253\1\377\37\251\1\377\35\247\1\377"
- "\35\245\1\377\33\242\1\377\32\240\1\377\30\236\1\377\15\223\2\377\212"
- "\300\202\377\354\362\353\3777\233&\377\356\371\353\377\301\324\276\377"
- "H\217F\377\205\261~\377\377\377\377\377[\250O\377\227\301\221\377\351"
- "\364\347\377\222\311\217\377\10\177\0\377\17\201\0\377\4t\0\377\2q\0"
- "\377\16{\0\377\16z\0\377\15y\0\377\15x\0\377\15w\0\360\15w\0\30\15w\0"
- "\0\15w\0\0\16\177\0\0\10I\0\0\0\0\0\0(\274\1\0(\274\1\0(\274\1\0(\274"
- "\1\0'\274\0[-\274\7\377Y\310=\377n\316W\377[\306A\3779\271\33\377\"\261"
- "\2\377\40\256\1\377\37\254\1\377\37\252\1\377\36\250\1\377\35\246\1\377"
- "\34\243\1\377\32\241\1\377\31\236\1\377\27\234\1\377\15\227\3\377\236"
- "\324\224\377\270\331\263\377d\266V\377\376\374\377\377$\214\25\377\1"
- "\205\0\377\0x\0\377\275\327\271\377\300\337\273\377[\245Q\377\377\377"
- "\377\377\267\317\262\377\15|\2\377\15|\0\377\16{\0\377\16z\0\377\15x"
- "\0\377\15w\0\377\15v\0\377\15u\0\377\14t\0\375\14t\0""0\14t\0\0\15{\0"
- "\0\10N\0\0\0\1\0\0\0\0\0\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0'\273\0"
- "\267:\277\27\377g\314N\377g\313O\377O\3014\377-\265\16\377\40\257\1\377"
- "\37\255\1\377\37\253\1\377\37\251\1\377\35\247\1\377\35\244\1\377\33"
- "\242\1\377\32\240\1\377\31\235\1\377\12\225\0\377{\304p\377\377\377\377"
- "\377\261\331\252\377^\257Q\377\377\377\377\377/\233\36\377\0\201\0\377"
- "\1\200\0\377\306\342\302\377\270\326\264\377g\256]\377\336\350\335\377"
- "\15p\1\377\13z\0\377\16z\0\377\15x\0\377\15w\0\377\15u\0\377\14t\0\377"
- "\14s\0\377\14r\0\377\14q\0\377\13q\0P\14w\0\0\11V\0\0\0\4\0\0\0\0\0\0"
- "\0\0\0\0(\274\1\0(\274\1\0(\274\1\0(\274\0\"(\273\2\366L\304-\377k\315"
- "S\377^\307E\377A\274$\377%\262\5\377\40\256\1\377\37\255\1\377\37\252"
- "\1\377\36\250\1\377\35\246\1\377\34\243\1\377\32\241\1\377\31\236\1\377"
- "\30\234\1\377\17\230\0\377J\244\77\377\273\320\267\377\355\367\354\377"
- "5\230&\377\336\351\334\377\330\356\324\377f\264c\377\244\323\234\377"
- "\377\377\377\377K\225A\377\251\322\243\377\335\353\334\377\35\204\25"
- "\377\12x\0\377\15w\0\377\15u\0\377\14t\0\377\14r\0\377\13q\0\377\13o"
- "\0\377\13o\0\377\13n\0\377\13r\0y\12b\0\0\1\13\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0(\274\1\0(\274\1\0(\274\1\0'\274\0m0\275\13\377]\311A\377f\313"
- "N\377R\3037\3773\267\25\377!\260\1\377\40\256\1\377\37\253\1\377\37\251"
- "\1\377\35\247\1\377\35\245\1\377\33\242\1\377\32\240\1\377\31\235\1\377"
- "\27\233\1\377\30\233\1\377\15\221\0\377\17\204\0\377\333\350\331\377"
- "\244\324\234\377/\212$\377\266\314\265\377\360\360\357\377\327\337\327"
- "\377X\226S\377T\240J\377\377\377\377\377\377\377\377\377X\235O\377\2"
- "q\0\377\15t\0\377\14s\0\377\14q\0\377\13p\0\377\13n\0\377\13n\0\377\13"
- "m\0\377\12m\0\377\7f\0\241\2\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0("
- "\274\1\0(\274\1\0(\274\1\0'\273\0\276=\300\32\377e\314L\377]\310D\377"
- "E\276(\377)\263\11\377\40\257\1\377\37\255\1\377\37\253\1\377\36\251"
- "\1\377\35\246\1\377\34\244\1\377\32\241\1\377\31\237\1\377\30\234\1\377"
- "\27\233\1\377\27\231\1\377\22\226\0\377\40\230\21\377\344\360\342\377"
- "\377\377\377\377\272\336\266\377G\227A\3778\2071\377>\2158\377\201\271"
- "{\377\362\367\361\377\203\253~\377\77\202=\377\24u\10\377\12t\0\377\14"
- "s\0\377\13p\0\377\13o\0\377\13n\0\377\13m\0\377\12k\0\377\7i\0\377\16"
- "q\5\377\36b\27\314\3\0\3\7\0\0\0\6\0\0\0\10\0\0\0\7\0\0\0\3(\274\1\0"
- "(\274\1\0(\274\0\36)\273\2\365L\305.\377f\313L\377S\3048\3779\271\32"
- "\377$\262\3\377\40\257\1\377\37\255\1\377\37\252\1\377\36\250\1\377\35"
- "\245\1\377\33\243\1\377\32\241\1\377\31\236\1\377\30\233\1\377\27\233"
- "\1\377\26\230\1\377\23\226\0\377\26\217\7\377\205\264~\377t\246n\377"
- "\261\312\255\377\377\377\377\377\363\372\363\377\353\357\352\377\377"
- "\377\377\377\364\367\363\377\22u\5\377\0o\0\377\13t\0\377\14s\0\377\14"
- "p\0\377\13n\0\377\13m\0\377\11k\0\377\6h\0\377\20m\7\377$x\33\3775\204"
- ".\377\40p\31\364\0\11\0C\0\0\0)\0\0\0(\0\0\0\35\0\0\0\14(\274\1\0(\274"
- "\1\0'\274\0Z/\275\12\377Z\311=\377`\311F\377J\300.\3770\266\21\377!\260"
- "\1\377\40\256\1\377\37\254\1\377\37\251\1\377\36\247\1\377\34\245\1\377"
- "\32\242\0\377\30\237\0\377\27\234\0\377\26\232\0\377\27\232\0\377\26"
- "\227\0\377\25\225\0\377\23\222\0\377\11\204\0\377\1~\0\377\26\200\10"
- "\377\351\354\351\377\265\315\262\377\36r\35\377d\232\\\377\177\251y\377"
- "\20x\7\377\13u\0\377\14s\0\377\14q\0\377\13n\0\377\10l\0\377\10j\0\377"
- "\25p\14\377-~$\377*{#\377\31o\22\377\17i\11\377%z\35\377\25)\23n\0\0"
- "\0\35\0\0\0\26\0\0\0\13\0\0\0\3(\274\1\0(\274\1\0'\273\0\244:\300\26"
- "\377a\313F\377Y\307>\377C\276&\377*\264\12\377!\260\1\377\40\256\1\377"
- "\37\253\1\377\35\251\0\377\31\245\0\377\34\244\1\377!\244\10\377\"\242"
- "\12\377\37\237\11\377\34\235\7\377\30\232\2\377\23\225\0\377\21\222\0"
- "\377\21\220\0\377\21\216\0\377\21\213\0\377\16\204\0\377$}\27\377\32"
- "|\15\377\4|\0\377\2r\0\377\0k\0\377\11u\0\377\10r\0\377\7n\0\377\5k\0"
- "\377\10l\0\377\30t\17\3774\204,\3776\202.\377,|%\377%v\37\377\77\205"
- "9\377R\221L\377D\215=\377\35@\33\206\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "(\276\1\0(\274\1\6(\274\1\333G\303&\377b\313G\377Q\3045\377;\272\35\377"
- "%\262\5\377\40\257\1\377\34\254\0\377\27\250\0\377\36\250\2\3775\257"
- "\35\377A\262+\377;\256'\3778\253$\3779\252&\377<\253*\377>\252,\377>"
- "\250.\377/\237\36\377\"\227\21\377\35\222\13\377\27\214\6\377\25\210"
- "\5\377\17\204\0\377\26\206\7\377\34\205\15\377\33\202\16\377\32\200\16"
- "\377\27{\13\377!~\26\377+\202\"\3779\2111\377C\217=\377D\215=\377<\206"
- "5\3773\200,\377=\2056\377>\2048\3772{,\377\36n\31\377(v!\377\35a\27\277"
- "\21+\20\0\12\17\11\0\0\0\0\0\0\0\0\0'\270\1\0(\302\0++\274\4\373Q\307"
- "2\377]\311B\377I\301,\3772\267\22\377\36\257\0\377\32\255\0\377.\262"
- "\23\377V\277A\377|\314k\377|\313m\377{\311l\377u\306f\377q\303c\377j"
- "\277\\\377o\301b\377s\301f\377w\302k\377o\274c\377g\267[\377f\265[\377"
- "e\262Z\377m\264c\377`\255V\377W\246L\377N\237C\377L\234C\377N\233E\377"
- "T\235L\377a\243Z\377^\240W\377F\220\77\3779\2073\3771\200*\3770~*\377"
- "5\177.\377,x&\377&s\40\377&r\40\377[\224V\377\252\307\250\377v\247q\363"
- "p\246l\32&E$\0\0\1\0\0\0\0\0\0\6\34\0\0\31{\0d1\306\12\377U\3107\377"
- "S\3057\3778\273\31\377'\263\7\377<\272\40\377m\313Y\377\211\324z\377"
- "~\316m\377w\312h\377z\312i\377h\302W\377z\310k\377{\307n\377\211\314"
- "}\377\211\314~\377w\302k\377\200\305u\377o\274c\377y\277n\377\\\257P"
- "\377a\257V\377N\244D\377Q\245H\377L\237B\377D\231:\377F\230<\377E\225"
- "<\377L\227C\377F\222>\377<\2134\3775\205,\3772\201*\3773\200,\377-{("
- "\377$s\36\377g\235b\377\215\265\212\377V\220Q\377\202\254~\377\254\310"
- "\252\377\243\306\240\377L]LU\3\2\3\0\0\0\0\0\0\0\0\0\0\0\0\0\26m\0\233"
- "5\312\16\377H\303)\377\77\276\37\377I\300-\377n\314Y\377\223\331\204"
- "\377\223\330\204\377\212\324z\377~\316n\377\221\324\204\377\221\323\204"
- "\377\210\316{\377\213\317\177\377\220\317\204\377\202\311v\377{\305o"
- "\377u\301h\377~\304s\377t\276j\377y\277o\377p\271f\377r\270h\377s\267"
- "i\377b\255X\377\212\300\203\377s\263l\377\225\304\217\377~\265x\377\202"
- "\266|\377w\257p\377m\247f\377\213\271\206\377W\230R\377\206\263\201\377"
- "\257\315\255\377w\247s\377\216\265\212\377\257\312\255\377\221\266\216"
- "\377t\243p\377U\216P\377W\223Q\377\1""6\0\251\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\2\34\222\0\310+\303\3\377H\303(\377n\316V\377\232\334\213\377"
- "\231\332\211\377\217\327~\377}\320k\377m\311Y\377e\304Q\377e\303R\377"
- "i\303X\377h\301X\377`\274P\377e\275V\377m\300`\377b\272T\377k\275^\377"
- "u\300j\377~\303t\377\200\302w\377~\277u\377\212\303\201\377}\275t\377"
- "q\265h\377|\270t\377i\255`\377o\256g\377{\263t\377}\263w\377\203\265"
- "}\377k\247e\377\203\264~\377\204\263\177\377q\246m\377{\253w\377v\247"
- "r\377^\226Y\377Q\214L\377H\205C\377G\203B\377\37h\32\377,r'\377O\202"
- "L\353\21\21\21\34\0\0\0\0\0\0\0\0\1\23\0\22,\264\12\352g\322K\377\222"
- "\333\177\377\213\330x\377z\321e\377g\311P\377n\314Y\377s\314`\377l\310"
- "Z\377i\306W\377u\311e\377\202\315s\377|\311n\377z\310m\377o\301a\377"
- "t\303g\377x\304l\377~\305r\377x\301m\377t\276j\377t\274j\377b\261X\377"
- "O\245E\377R\246H\377e\256]\377j\257b\377v\264o\377v\262o\377s\257m\377"
- "j\250d\377S\231L\377O\225H\377F\216\77\377M\221G\377M\217G\377B\206;"
- "\377N\215I\377%o\37\3774x0\3770u+\377K\206I\377`\223]\377\301\325\277"
- "\377\265\321\263\3776B6Z\0\0\0\0\0\0\0\0\35""7\27""8\217\354v\377\223"
- "\347}\377\201\337i\377~\335f\377\216\342{\377\234\345\212\377\227\343"
- "\206\377\212\336x\377\204\332r\377~\326l\377x\323e\377~\324m\377v\320"
- "f\377o\313_\377\201\321s\377\237\336\224\377\250\341\237\377\225\327"
- "\212\377\225\326\213\377\234\330\223\377\233\326\222\377\225\321\214"
- "\377\236\325\227\377\227\321\220\377s\274k\377l\266e\377d\260\\\377h"
- "\260a\377n\261g\377x\266q\377{\267u\377~\267x\377v\261q\377n\252h\377"
- "m\250f\377l\246g\377m\246h\377\201\261~\377\231\300\226\377\235\302\233"
- "\377\251\311\246\377\255\313\252\377\224\272\221\377`\232[\3776b3\274"
- "\3\2\3\3\0\0\0\0\"-\37""2Y\215K\250V\206J\262a\207X\267b\207X\273O\202"
- "D\276=z/\300:x,\302=y0\304>x2\305>w2\306Cx9\307Gy=\310M|D\312K{C\313"
- "LyD\313;r2\313\33b\21\312\20[\5\312\26[\13\312\"`\31\312.d&\312<j6\312"
- "SuO\313_{[\313p\203m\313m\201j\313c{`\313d|a\313`y^\313`x^\312YsV\312"
- "cxa\310r\201p\310v\203t\310i{g\307ZqX\306VmT\304RjP\303<[9\302<\\:\301"
- "HcF\276MeK\272*L'\266HbF\262I_G\236\6\10\6\24\0\0\0\0\0\0\0\0\0\0\0\12"
- "\14\7\16\40\34\31\35.\32\27\32""7\2\0\3:\0\0\0>\0\0\0C\0\0\0G\0\0\0K"
- "\0\0\0N\0\0\0Q\0\0\0S\0\0\0U\0\0\0W\0\0\0X\0\0\0Z\0\0\0[\0\0\0[\0\0\0"
- "\\\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0\\\0\0\0\\\0"
- "\0\0[\0\0\0Z\0\0\0Y\0\0\0W\0\0\0V\0\0\0T\0\0\0R\0\0\0O\0\0\0K\0\0\0H"
- "\0\0\0E\0\0\0@\0\0\0;\0\0\0""4\0\0\0,\0\0\0\"\0\0\0\23\0\0\0\11\0\0\0"
- "\0\0\0\0\0\0\0\0\2ppp\15qqq\20\36\36\36\15\3\2\3\14\0\0\0\15\0\0\0\17"
- "\0\0\0\21\0\0\0\22\0\0\0\24\0\0\0\25\0\0\0\27\0\0\0\30\0\0\0\30\0\0\0"
- "\31\0\0\0\32\0\0\0\33\0\0\0\34\0\0\0\34\0\0\0\35\0\0\0\35\0\0\0\35\0"
- "\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\34\0\0\0\33\0\0\0\33"
- "\0\0\0\32\0\0\0\31\0\0\0\30\0\0\0\27\0\0\0\26\0\0\0\24\0\0\0\23\0\0\0"
- "\21\0\0\0\20\0\0\0\16\0\0\0\14\0\0\0\12\0\0\0\11\0\0\0\6\0\0\0\4\0\0"
- "\0\1\0\0\0\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (wsiconcap_64_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 wsiconcap_64_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 wsiconcap_64_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (16384) */
- "\0\0@\30"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (256) */
- "\0\0\1\0"
- /* width (64) */
- "\0\0\0@"
- /* height (64) */
- "\0\0\0@"
- /* pixel_data: */
- "+\277\5\0\224\337\200\0\374\376\373\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\371\375\370\0\341"
- "\366\334\0\247\345\226\0a\320D\0""9\306\23\0.\303\6\0+\302\2\0*\302\1"
- "\4+\302\2\26,\302\3.,\302\4F-\303\5^.\303\6s/\303\7\2040\303\10\2200"
- "\303\10\2340\303\10\237!\277\0~o\325S\25\377\377\377\2+\277\5\0\224\337"
- "\200\0\374\376\373\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\350\370\345\0\246\345"
- "\225\4`\320A&\77\307\32T:\306\24\2058\305\21\2626\304\17\3245\303\15"
- "\3565\303\16\3755\303\16\3776\303\17\3777\303\20\3777\304\20\3778\304"
- "\21\3777\303\20\3776\303\20\3772\302\12\377-\301\5\312\332\364\322\21"
- "+\277\5\0\224\337\200\0\374\376\373\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\357\372\354\37\306\356\273Z\216"
- "\336x\235_\320@\324I\311%\370C\307\37\377@\306\33\377;\305\26\3776\303"
- "\17\3774\302\15\3774\302\15\3774\302\16\3774\302\16\3774\302\16\3773"
- "\302\15\3772\301\14\3771\301\13\3770\301\11\3770\301\11\377!\274\0\377"
- "\264\350\246U+\277\5\0\224\337\200\0\374\376\373\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\360\373\355\36\310\357\275i\227\341\203\271k\323N\362M\312"
- "+\377\77\305\32\377;\304\26\3779\304\24\3778\303\23\3777\303\23\3775"
- "\302\20\3772\301\14\3770\300\13\377/\300\12\377/\277\11\377.\277\10\377"
- ",\276\6\377+\276\5\377*\276\4\377)\276\3\377)\275\2\377(\275\2\377\34"
- "\272\0\377\242\342\221U+\277\5\0\224\337\200\0\374\376\373\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\376\377\375\3\330\364"
- "\321H\247\345\225\250~\331e\360c\321E\377Q\3130\377E\307!\377;\304\27"
- "\3775\302\20\3772\301\15\3770\300\13\3770\277\13\3770\277\13\377/\277"
- "\11\377-\276\7\377,\275\5\377*\274\4\377)\274\2\377)\274\1\377(\273\1"
- "\377(\273\1\377(\273\1\377(\273\1\377(\273\1\377(\273\1\377\"\272\0\334"
- "M\307-\20+\277\5\0\224\337\200\0\374\376\373\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\370\375\367\12\305\356\272b\220\336{\312v\326\\\377k\323P\377"
- "\\\316>\377I\310'\377:\303\27\3773\301\16\3770\277\12\377.\276\10\377"
- "-\276\7\377,\275\5\377+\274\4\377*\274\4\377*\273\3\377)\273\2\377(\272"
- "\2\377(\272\1\377'\272\1\377'\272\1\377'\272\1\377'\272\1\377'\272\1"
- "\377'\272\1\377'\272\1\377'\272\1\377(\272\1Q#\271\0\0+\277\5\0\224\337"
- "\200\0\374\376\373\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\372\376\371\6\276\354\261c\201\332i\324r\325W\377"
- "u\326\\\377i\322M\377Q\3121\377=\304\32\3773\300\16\377.\276\10\377,"
- "\275\6\377+\274\5\377*\274\4\377)\273\3\377)\272\2\377(\272\2\377(\271"
- "\2\377'\271\1\377'\270\1\377&\270\1\377&\270\1\377&\270\1\377&\267\1"
- "\377&\267\1\377&\267\1\377&\267\1\377&\267\1\377&\267\1\377&\267\1\270"
- "&\270\1\0&\270\1\0+\277\5\0\224\337\200\0\374\376\373\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\310\357\275L{\330a\312i"
- "\322M\377x\327`\377t\325[\377\\\316\77\377E\306$\3776\300\22\377/\276"
- "\11\377,\274\5\377*\273\4\377)\273\3\377(\272\2\377(\271\2\377'\270\2"
- "\377'\270\1\377&\267\1\377&\267\1\377&\267\1\377%\266\1\377%\266\1\377"
- "%\266\1\377%\266\1\377%\266\1\377%\266\1\377%\266\1\377%\266\1\377%\266"
- "\1\377%\266\1\373%\266\1""4%\266\1\0%\266\1\0+\277\5\0\224\337\200\0"
- "\374\376\373\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\343\367\335\"\205\333n\247"
- "]\316>\377s\325Z\377{\327c\377h\321M\377Q\3111\377>\303\33\3772\276\15"
- "\377,\274\7\377*\273\4\377)\272\3\377(\271\2\377'\270\2\377'\267\2\377"
- "&\267\1\377%\266\1\377%\266\1\377%\266\1\377%\265\1\377%\265\1\377$\265"
- "\1\377$\264\1\377$\264\1\377$\264\1\377$\264\1\377$\264\1\377$\264\1"
- "\377$\264\1\377$\264\1\377$\264\1\252$\264\1\0$\264\1\0$\264\1\0+\277"
- "\5\0\224\337\200\0\374\376\373\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\256\347\236eX\3158\352"
- "b\320E\377|\327e\377s\324[\377]\315@\377G\305&\3778\300\24\377/\275\12"
- "\377*\273\5\377(\271\3\377'\270\2\377'\267\2\377&\266\2\377%\266\1\377"
- "%\265\1\377%\265\1\377$\265\1\377$\264\1\377$\264\1\377$\264\1\377#\263"
- "\1\377#\263\1\377#\263\1\377#\262\1\377#\262\1\377#\262\1\377#\262\1"
- "\377#\262\1\377#\262\1\377#\262\1\374#\262\1""4#\262\1\0#\262\1\0#\262"
- "\1\0+\277\5\0\224\337\200\0\374\376\373\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\351\371\345\30x\327^\251J\311(\377p\323"
- "V\377|\327e\377k\321Q\377T\3115\377A\303\37\3774\276\20\377-\273\10\377"
- ")\271\4\377'\267\2\377&\266\2\377&\266\2\377%\265\2\377$\265\1\377$\264"
- "\1\377$\264\1\377$\263\1\377#\263\1\377#\262\1\377#\262\1\377#\262\1"
- "\377#\261\1\377#\261\1\377#\261\1\377#\261\1\377#\261\1\377\"\261\1\377"
- "\"\261\1\377\"\261\1\377\"\261\1\377\"\261\1\271\"\261\1\0\"\261\1\0"
- "\"\261\1\0\"\261\1\0+\277\5\0\224\337\200\0\374\376\373\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\310\356\275>Q\3130\332P\3120\377y\326"
- "a\377y\326b\377e\317I\377N\307/\377>\301\33\3772\274\16\377+\271\7\377"
- "(\270\3\377&\266\2\377&\265\2\377%\265\2\377$\264\1\377$\264\1\377#\263"
- "\1\377#\263\1\377#\262\1\377#\261\1\377#\261\1\377#\261\1\377\"\261\1"
- "\377\"\261\1\377\"\261\1\377\"\261\1\377\"\261\1\377!\261\1\377!\261"
- "\1\377!\261\1\377!\261\1\377!\261\1\377!\261\1\377!\261\1Q!\261\1\0!"
- "\261\1\0!\261\1\0!\261\1\0+\277\5\0\224\337\200\0\374\376\373\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\245\344\224g<\304\30\367Z\315<\377|\327e\377w\325"
- "^\377a\315D\377K\306+\377;\300\31\3771\273\15\377*\270\6\377'\266\2\377"
- "&\265\2\377%\265\2\377$\264\1\377$\263\1\377#\263\1\377#\262\1\377#\261"
- "\1\377#\261\1\377\"\261\1\377\"\261\1\377\"\261\1\377!\261\1\377!\261"
- "\1\377!\260\1\377!\260\1\377\40\260\1\377\40\257\1\377\40\257\1\377\40"
- "\257\1\377\40\257\1\377\40\257\1\377\40\257\1\377\40\257\1\337\40\257"
- "\1\11\40\257\1\0\40\257\1\0\40\257\1\0\40\257\1\0+\277\5\0\224\337\200"
- "\0\374\376\373\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\376\376\375\0\210\333q\2104\302\17\377a\317E\377}\327"
- "f\377u\323\\\377]\313@\377H\304(\377:\276\27\377/\272\14\377*\267\6\377"
- "&\266\2\377%\265\2\377$\264\2\377#\263\1\377#\262\1\377#\262\1\377#\261"
- "\1\377\"\261\1\377\"\261\1\377\"\261\1\377!\261\1\377!\260\1\377\40\260"
- "\1\377\40\257\1\377\40\257\1\377\40\256\1\377\40\256\1\377\40\256\1\377"
- "\40\256\1\377\40\255\1\377\40\255\1\377\37\255\1\377\37\255\1\377\37"
- "\255\1\377\37\255\1\214\37\255\1\0\37\255\1\0\37\255\1\0\37\255\1\0\37"
- "\255\1\0+\277\5\0\224\337\200\0\374\376\373\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\370\375\367\5s\325Y\2401\301\14\377e\320"
- "I\377~\327g\377s\323Y\377Y\312<\377D\302$\3776\275\24\377.\271\13\377"
- "(\267\4\377&\265\2\377%\264\2\377$\263\1\377#\262\1\377#\261\1\377#\261"
- "\1\377\"\261\1\377\"\261\1\377!\261\1\377!\260\1\377\40\257\1\377\40"
- "\257\1\377\40\256\1\377\40\256\1\377\40\256\1\377\37\255\1\377\37\255"
- "\1\377\37\254\1\377\37\254\1\377\37\254\1\377\37\254\1\377\37\253\1\377"
- "\37\253\1\377\37\253\1\377\37\253\1\376\37\253\1""9\37\253\1\0\37\253"
- "\1\0\37\253\1\0\37\253\1\0\37\253\1\0+\277\5\0\224\337\200\0\374\376"
- "\373\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\366\374\364\10g\322"
- "K\2550\300\13\377f\320K\377~\327g\377r\322X\377V\3118\377\77\300\36\377"
- "2\273\20\377+\270\10\377'\266\3\377%\264\2\377$\263\2\377#\262\1\377"
- "#\261\1\377#\261\1\377\"\261\1\377\"\261\1\377!\260\1\377\40\260\1\377"
- "\40\257\1\377\40\256\1\377\40\256\1\377\40\255\1\377\37\255\1\377\37"
- "\254\1\377\37\254\1\377\37\253\1\377\37\253\1\377\37\252\1\377\37\252"
- "\1\377\37\252\1\377\37\252\1\377\37\252\1\377\37\251\1\377\37\251\1\377"
- "\37\251\1\332\37\251\1\6\37\251\1\0\37\251\1\0\37\251\1\0\37\251\1\0"
- "\37\251\1\0+\277\5\0\224\337\200\0\374\376\373\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\366\374\363\7e\321I\257.\277\10\377e\317I\377\200\327i\377t\323"
- "\\\377U\3108\377<\276\32\377.\271\13\377(\266\4\377%\265\2\377$\263\2"
- "\377#\262\1\377#\262\1\377#\261\1\377\"\261\1\377!\261\1\377!\260\1\377"
- "\40\257\1\377\40\257\1\377\40\256\1\377\40\255\1\377\37\255\1\377\37"
- "\254\1\377\37\253\1\377\37\253\1\377\37\252\1\377\37\252\1\377\37\251"
- "\1\377\37\251\1\377\37\251\1\377\36\250\1\377\36\250\1\377\36\250\1\377"
- "\36\250\1\377\36\250\1\377\35\247\1\377\35\247\1\230\35\247\1\0\35\247"
- "\1\0\35\247\1\0\35\247\1\0\35\247\1\0\35\247\1\0+\277\5\0\224\337\200"
- "\0\374\376\373\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\372\375\371\4h\321M\252*\276\4\377a\316"
- "D\377\200\327j\377z\325c\377\\\312@\377=\277\34\377,\270\11\377&\265"
- "\3\377%\264\2\377$\263\2\377#\262\1\377\"\261\1\377\"\261\1\377\"\261"
- "\1\377!\260\1\377\40\257\1\377\40\257\1\377\40\256\1\377\40\255\1\377"
- "\37\254\1\377\37\254\1\377\37\253\1\377\37\252\1\377\37\252\1\377\37"
- "\251\1\377\37\251\1\377\36\250\1\377\36\250\1\377\35\247\1\377\35\247"
- "\1\377\35\246\1\377\35\246\1\377\35\246\1\377\35\246\1\377\35\246\1\377"
- "\35\246\1\377\35\246\1T\35\246\1\0\35\246\1\0\35\246\1\0\35\246\1\0\35"
- "\246\1\0\35\246\1\0+\277\5\0\224\337\200\0\374\376\373\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0v\326]\232&\274\0\377Z\313=\377\177\326h\377\200\326j\377f\315L\377"
- "E\301&\377.\270\14\377&\265\3\377$\263\2\377$\262\2\377#\261\2\377\""
- "\261\1\377\"\261\1\377!\261\1\377\40\260\1\377\40\257\1\377\40\256\1"
- "\377\37\255\1\377\37\254\1\377\37\253\1\377\37\253\1\377\37\252\1\377"
- "\37\251\1\377\37\251\1\377\36\250\1\377\35\247\1\377\35\247\1\377\35"
- "\246\1\377\35\246\1\377\35\245\1\377\35\245\1\377\35\245\1\377\35\244"
- "\1\377\34\244\1\377\34\244\1\377\34\244\1\377\34\244\1\366\34\243\1\37"
- "\34\243\1\0\34\243\1\0\34\243\1\0\34\243\1\0\34\243\1\0\34\243\1\0+\277"
- "\5\0\223\337\177\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\214\334x~\"\273\0\377R\3113\377{\325"
- "c\377\203\327m\377o\320W\377O\3042\3774\272\22\377'\265\4\377$\263\2"
- "\377$\262\2\377#\261\1\377\"\261\1\377!\261\1\377!\260\1\377\40\257\1"
- "\377\40\256\1\377\40\255\1\377\37\254\1\377\37\253\1\377\37\253\1\377"
- "\37\252\1\377\37\251\1\377\36\250\1\377\35\247\1\377\35\247\1\377\35"
- "\246\1\377\35\246\1\377\35\245\1\377\35\245\1\377\34\244\1\377\34\244"
- "\1\377\34\243\1\377\34\243\1\377\33\243\1\377\33\242\1\377\33\242\1\377"
- "\33\242\1\377\32\242\1\322\32\242\1\3\32\242\1\0\32\242\1\0\32\242\1"
- "\0\32\242\1\0\32\242\1\0\32\242\1\0-\300\10\0\224\337\201\0\266\351\251"
- "\0\270\352\253\0\270\352\253\0\270\352\253\0\270\352\253\0\270\352\253"
- "\0\270\352\253\0\270\352\253\0\270\352\253\0\270\352\253\0\270\352\253"
- "\0\270\352\253\0\270\352\253\0\270\352\253\0\270\351\253\0\177\331hZ"
- "(\275\1\377H\305&\377t\323\\\377\204\327n\377v\322_\377Y\310>\377;\275"
- "\33\377(\265\6\377$\263\2\377$\262\2\377#\261\2\377\"\261\1\377!\260"
- "\1\377\40\257\1\377\40\256\1\377\40\255\1\377\37\254\1\377\37\253\1\377"
- "\37\253\1\377\37\252\1\377\37\251\1\377\36\250\1\377\35\247\1\377\35"
- "\247\1\377\35\246\1\377\35\245\1\377\35\244\1\377\34\244\1\377\34\243"
- "\1\377\33\243\1\377\33\242\1\377\32\242\1\377\32\241\1\377\32\241\1\377"
- "\32\241\1\377\32\240\1\377\32\240\1\377\32\240\1\377\32\240\1\244\32"
- "\240\1\0\32\240\1\0\32\240\1\0\32\240\1\0\32\240\1\0\32\240\1\0\32\240"
- "\1\0(\276\2\0O\312/\0O\3120\0P\3120\0P\3120\0P\3120\0P\3120\0P\3120\0"
- "P\3120\0P\3120\0P\3120\0P\3120\0P\3120\0P\3120\0P\3120\0P\3120\0M\311"
- "-2%\274\0\363>\302\33\377k\320R\377\202\327m\377z\323c\377b\312H\377"
- "C\300%\377,\267\12\377$\263\2\377$\261\2\377#\261\2\377!\261\1\377!\260"
- "\1\377\40\257\1\377\40\256\1\377\37\255\1\377\37\254\1\377\37\253\1\377"
- "\37\252\1\377\37\251\1\377\36\250\1\377\35\247\1\377\35\246\1\377\35"
- "\245\1\377\35\245\1\377\34\244\1\377\34\243\1\377\33\243\1\377\33\242"
- "\1\377\32\241\1\377\32\241\1\377\32\240\1\377\32\240\1\377\32\237\1\377"
- "\31\237\1\377\32\237\1\377\31\236\1\377\31\236\1\377\31\236\1\377\31"
- "\236\1v\31\236\1\0\31\236\1\0\31\236\1\0\31\236\1\0\31\236\1\0\31\236"
- "\1\0\31\236\1\0(\276\1\0!\274\0\0\40\274\0\0\40\274\0\0\40\274\0\0\40"
- "\274\0\0\40\274\0\0\40\274\0\0\40\274\0\0\40\274\0\0\40\274\0\0\40\274"
- "\0\0\40\274\0\0\40\274\0\0\40\274\0\0\40\274\0\17!\273\0\3266\300\22"
- "\377`\315D\377\177\326i\377|\324f\377g\314O\377K\302.\3771\270\20\377"
- "%\263\3\377$\261\2\377#\261\1\377!\261\1\377\40\260\1\377\40\257\1\377"
- "\40\256\1\377\37\254\1\377\37\253\1\377\37\252\1\377\37\251\1\377\36"
- "\250\1\377\35\247\1\377\35\246\1\377\35\246\1\377\35\245\1\377\34\244"
- "\1\377\34\243\1\377\33\242\1\377\32\241\1\377\32\241\1\377\32\240\1\377"
- "\32\237\1\377\32\237\1\377\31\236\1\377\31\236\1\377\30\235\1\377\30"
- "\235\1\377\30\234\1\377\30\234\1\377\30\234\1\377\30\234\1\377\30\233"
- "\1M\30\233\1\0\30\233\1\0\30\233\1\0\30\233\1\0\30\233\1\0\30\233\1\0"
- "\30\233\1\0(\276\1\0(\276\1\0(\276\1\0(\276\1\0(\276\1\0(\276\1\0(\276"
- "\1\0(\276\1\0(\276\1\0(\276\1\0(\276\1\0(\276\1\0(\276\1\0(\276\1\0("
- "\276\1\0(\275\1\2420\276\12\377S\3104\377y\324b\377~\324h\377m\316U\377"
- "R\3047\3776\272\27\377&\264\5\377#\261\2\377\"\261\1\377!\261\1\377\40"
- "\260\1\377\40\256\1\377\40\255\1\377\37\254\1\377\37\253\1\377\37\252"
- "\1\377\37\251\1\377\36\250\1\377\35\247\1\377\35\246\1\377\35\245\1\377"
- "\34\244\1\377\34\243\1\377\33\242\1\377\32\241\1\377\32\240\1\377\32"
- "\240\1\377\32\237\1\377\31\236\1\377\31\235\1\377\30\235\1\377\30\234"
- "\1\377\30\234\1\377\30\233\1\377\30\233\1\377\27\233\1\377\27\233\1\377"
- "\27\233\1\377\27\233\1\374\27\233\1.\27\233\1\0\27\233\1\0\27\233\1\0"
- "\27\233\1\0\27\233\1\0\27\233\1\0\27\233\1\0(\274\1\0(\274\1\0(\274\1"
- "\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274"
- "\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1]+\275\5\377E\304$\377p\321W\377"
- "~\325i\377q\320Z\377Z\307@\377>\275\40\377*\264\11\377#\261\2\377\"\261"
- "\1\377!\261\1\377\40\257\1\377\40\256\1\377\40\255\1\377\37\254\1\377"
- "\37\253\1\377\37\251\1\377\36\250\1\377\35\247\1\377\35\246\1\377\35"
- "\245\1\377\35\244\1\377\34\243\1\377\33\242\1\377\32\241\1\377\32\240"
- "\1\377\32\237\1\377\32\237\1\377\31\236\1\377\25\233\0\377\13\226\0\377"
- "\16\227\0\377\27\233\0\377\30\233\1\377\25\232\0\377\26\232\0\377\27"
- "\233\1\377\27\233\1\377\27\232\1\377\27\232\1\377\27\232\1\357\27\232"
- "\1\26\27\232\1\0\27\232\1\0\27\232\1\0\27\232\1\0\27\232\1\0\27\232\1"
- "\0\27\232\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0("
- "\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1"
- "\36(\274\1\3548\300\25\377b\315G\377}\324g\377u\321^\377a\311G\377G\300"
- "*\377/\267\20\377$\262\3\377#\261\2\377!\261\1\377\40\257\1\377\40\256"
- "\1\377\40\255\1\377\37\254\1\377\37\252\1\377\37\251\1\377\36\250\1\377"
- "\35\247\1\377\35\246\1\377\35\245\1\377\34\244\1\377\33\242\1\377\32"
- "\241\1\377\32\240\1\377\32\240\1\377\31\236\1\377\31\236\1\377\30\235"
- "\1\377\24\232\0\377*\242\26\377\224\321\212\377\221\317\206\377\13\225"
- "\0\377\11\224\0\377\33\234\6\377\23\230\0\377\23\227\0\377\27\231\1\377"
- "\27\230\1\377\26\230\1\377\26\230\0\334\26\230\0\10\26\230\0\0\26\230"
- "\0\0\26\230\0\0\26\230\0\0\26\230\0\0\26\230\0\0\26\230\0\0(\274\1\0"
- "(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274"
- "\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\257/\276\11\377R\310"
- "3\377w\323_\377x\322b\377f\314M\377O\3032\3777\271\30\377'\263\6\377"
- "\"\261\2\377\"\261\1\377\40\257\1\377\40\256\1\377\40\255\1\377\37\253"
- "\1\377\37\252\1\377\37\251\1\377\36\250\1\377\35\246\1\377\35\245\1\377"
- "\35\244\1\377\34\243\1\377\33\242\1\377\32\241\1\377\32\240\1\377\32"
- "\237\1\377\31\236\1\377\31\235\1\377\24\232\0\377\13\225\0\377\1\222"
- "\0\377P\261\77\377\377\377\377\377\377\377\377\377\207\313|\377R\263"
- "H\377\314\351\307\377\260\334\250\377#\235\24\377\22\225\0\377\25\226"
- "\0\377\26\226\0\377\25\226\0\312\25\226\0\0\25\226\0\0\25\226\0\0\25"
- "\226\0\0\25\226\0\0\25\226\0\0\25\226\0\0\25\226\0\0(\274\1\0(\274\1"
- "\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274"
- "\1\0(\274\1\0(\274\1\0(\274\1U*\274\3\377A\303\37\377k\320R\377y\322"
- "c\377k\315S\377V\305;\377>\274\40\377+\264\12\377#\261\2\377\"\261\1"
- "\377\40\257\1\377\40\256\1\377\40\255\1\377\37\253\1\377\37\252\1\377"
- "\37\251\1\377\35\250\1\377\35\246\1\377\35\245\1\377\34\244\1\377\33"
- "\243\1\377\32\241\1\377\32\240\1\377\32\237\1\377\31\236\1\377\30\235"
- "\1\377\30\234\1\377\23\231\0\377+\244\27\377r\302e\377T\265H\377\322"
- "\354\316\377\377\377\377\377\367\365\367\377\377\372\377\377\377\377"
- "\377\377\377\377\377\377\371\371\371\3770\233\35\377\17\222\0\377\25"
- "\224\0\377\25\223\0\377\25\223\0\273\25\223\0\0\25\223\0\0\25\223\0\0"
- "\25\223\0\0\25\223\0\0\25\223\0\0\25\223\0\0\25\223\0\0(\274\1\0(\274"
- "\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0("
- "\274\1\0(\274\1\0(\274\1\17(\274\1\3374\276\17\377[\312>\377w\322`\377"
- "o\317X\377\\\310B\377F\277)\3770\266\21\377$\262\3\377\"\261\2\377\40"
- "\260\1\377\40\256\1\377\40\255\1\377\37\253\1\377\37\252\1\377\37\251"
- "\1\377\35\247\1\377\35\246\1\377\35\245\1\377\34\244\1\377\33\242\1\377"
- "\32\241\1\377\32\240\1\377\32\237\1\377\30\236\1\377\30\234\1\377\30"
- "\233\1\377\27\233\1\377\15\226\0\377\245\330\235\377\377\377\377\377"
- "\377\377\377\377\354\356\353\377g\240a\377#~\27\377$\177\31\377n\242"
- "h\377\353\356\352\377\356\365\355\377+\231\31\377\0\211\0\377\21\220"
- "\0\377\24\222\0\377\24\221\0\255\24\221\0\0\24\221\0\0\24\221\0\0\24"
- "\221\0\0\24\221\0\0\24\221\0\0\24\221\0\0\24\221\0\0(\274\1\0(\274\1"
- "\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274"
- "\1\0(\274\1\0(\274\0\205+\274\5\377H\304'\377o\320W\377r\320\\\377a\311"
- "H\377M\3022\3778\271\31\377'\263\7\377\"\261\2\377!\260\1\377\40\256"
- "\1\377\37\255\1\377\37\254\1\377\37\252\1\377\37\251\1\377\35\247\1\377"
- "\35\246\1\377\35\245\1\377\34\244\1\377\33\242\1\377\32\241\1\377\32"
- "\240\1\377\31\236\1\377\30\235\1\377\30\234\1\377\30\233\1\377\27\233"
- "\1\377\27\233\1\377\17\224\0\377p\257e\377\375\375\375\377\357\362\357"
- "\3775\213+\377\7\205\0\377\\\263M\377X\261J\377\2\200\0\377\77\2165\377"
- "\364\366\364\377\306\345\301\377u\277q\377#\230\22\377\20\216\0\377\23"
- "\217\0\241\23\217\0\0\23\217\0\0\23\217\0\0\23\217\0\0\23\217\0\0\23"
- "\217\0\0\23\217\0\0\23\217\0\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274"
- "\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1#(\274\1\364"
- "7\277\23\377`\313E\377t\321]\377f\314N\377S\3048\377\77\274\"\377,\264"
- "\14\377#\261\2\377!\260\1\377\40\256\1\377\40\255\1\377\37\254\1\377"
- "\37\252\1\377\37\251\1\377\35\250\1\377\35\246\1\377\35\245\1\377\34"
- "\244\1\377\33\242\1\377\32\241\1\377\32\237\1\377\31\236\1\377\30\235"
- "\1\377\30\234\1\377\30\233\1\377\27\233\1\377\27\232\1\377\27\231\1\377"
- "\15\224\0\377\40\222\15\377\374\374\373\377\221\300\211\377\3\205\0\377"
- "\267\340\260\377\377\377\377\377\377\377\377\377\253\331\244\377\0\177"
- "\0\377\234\303\226\377\377\377\377\377\377\377\377\377b\262V\377\6\206"
- "\0\377\23\214\0\236\23\214\0\0\23\214\0\0\23\214\0\0\23\214\0\0\23\214"
- "\0\0\23\214\0\0\23\214\0\0\23\214\0\0(\274\1\0(\274\1\0(\274\1\0(\274"
- "\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\0\242"
- ",\274\7\377L\305-\377p\317X\377m\316V\377Z\307@\377G\277+\3772\267\23"
- "\377$\262\4\377!\260\2\377\40\257\1\377\40\255\1\377\37\254\1\377\37"
- "\252\1\377\37\251\1\377\35\250\1\377\35\246\1\377\35\245\1\377\34\244"
- "\1\377\33\242\1\377\32\241\1\377\32\237\1\377\31\236\1\377\30\234\1\377"
- "\30\233\1\377\26\233\0\377\23\231\0\377\26\231\0\377\27\230\1\377\24"
- "\226\0\377\33\231\16\377\205\307z\377\377\377\377\377X\252K\3771\236"
- "\36\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "#\223\21\377f\256[\377\377\377\377\377\307\325\304\377;\2232\377\13\207"
- "\0\377\22\211\0\236\22\211\0\0\22\211\0\0\22\211\0\0\22\211\0\0\22\211"
- "\0\0\22\211\0\0\22\211\0\0\22\211\0\0(\274\1\0(\274\1\0(\274\1\0(\274"
- "\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1""0(\273\1\373"
- "9\300\26\377c\313G\377s\320\\\377d\313K\377P\3025\377;\272\36\377(\264"
- "\10\377\"\261\2\377\40\257\1\377\40\256\1\377\37\254\1\377\37\253\1\377"
- "\37\251\1\377\36\250\1\377\35\246\1\377\35\245\1\377\34\244\1\377\33"
- "\242\1\377\32\241\1\377\32\237\1\377\24\234\0\377\14\227\0\377\27\232"
- "\0\377\27\233\1\377\30\233\2\377\"\236\15\377\24\227\0\377\25\226\0\377"
- "\10\217\0\377u\275h\377\377\377\377\377\377\377\377\377n\271b\377\26"
- "\211\13\377\354\360\352\377\377\377\377\377\377\377\377\377\342\352\340"
- "\377\15\200\4\377\200\277w\377\374\374\374\377&\200\31\377\5}\0\377\22"
- "\210\0\377\21\207\0\236\21\207\0\0\21\207\0\0\21\207\0\0\21\207\0\0\21"
- "\207\0\0\21\207\0\0\21\207\0\0\21\207\0\0(\274\1\0(\274\1\0(\274\1\0"
- "(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\252-\274"
- "\7\377M\306.\377p\317Y\377m\316V\377Z\306@\377F\277*\3770\266\21\377"
- "#\262\3\377!\260\2\377\40\256\1\377\37\255\1\377\37\253\1\377\37\252"
- "\1\377\36\250\1\377\35\247\1\377\35\245\1\377\34\244\1\377\33\242\1\377"
- "\32\241\1\377\32\237\1\377\27\235\1\377+\245\26\377c\273T\377\23\231"
- "\0\377\0\217\0\377W\264G\377\344\363\341\377\237\323\230\377\13\220\0"
- "\377\14\217\0\377B\2354\377\325\337\326\377\373\371\373\377\313\347\306"
- "\377\6\203\0\377D\217=\377\276\317\273\377\273\315\270\377:\2104\377"
- "\13\201\4\377\330\354\325\377\364\367\363\377,\221\36\377\13\203\0\377"
- "\21\205\0\377\21\204\0\237\21\204\0\0\21\204\0\0\21\204\0\0\21\204\0"
- "\0\21\204\0\0\21\204\0\0\21\204\0\0\21\204\0\0(\274\1\0(\274\1\0(\274"
- "\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1""0(\273\1\373"
- "9\300\25\377b\313H\377s\320\\\377e\312L\377Q\3036\377;\272\35\377(\263"
- "\10\377!\260\2\377\40\257\1\377\40\255\1\377\37\254\1\377\37\252\1\377"
- "\37\250\1\377\35\247\1\377\35\246\1\377\34\244\1\377\33\242\1\377\32"
- "\241\1\377\32\240\1\377\26\235\0\377\34\234\11\377\316\350\312\377\377"
- "\377\377\377\241\327\230\377\232\324\230\377\343\364\340\377\377\377"
- "\377\377\342\360\340\377+\234\32\377\5\214\0\377&\223\25\377\11r\2\377"
- "j\242b\377\376\375\376\377\242\322\231\377\21\204\7\377\0k\0\377\0j\0"
- "\377\25\203\14\377\256\327\247\377\377\377\377\377\377\377\377\377\242"
- "\315\234\377\5}\0\377\20\204\0\377\20\204\0\250\20\204\0\0\20\204\0\0"
- "\20\204\0\0\20\204\0\0\20\204\0\0\20\204\0\0\20\204\0\0\20\204\0\0(\274"
- "\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0("
- "\274\0\241,\274\6\377K\305,\377o\317W\377n\316V\377\\\307B\377G\277+"
- "\3770\266\21\377#\262\3\377!\257\1\377\40\256\1\377\37\254\1\377\37\252"
- "\1\377\37\251\1\377\35\250\1\377\35\246\1\377\35\245\1\377\34\243\1\377"
- "\32\241\1\377\33\240\1\377\23\234\0\377\17\231\0\377\16\223\0\377\313"
- "\343\307\377\377\377\377\377\377\377\377\377\372\365\373\377\341\345"
- "\341\377\351\354\351\377\377\377\377\377\364\374\362\377\242\323\235"
- "\377\350\365\346\377\205\306z\377\37\212\17\377\361\365\360\377\377\377"
- "\377\377\357\372\354\377\261\332\255\377\254\326\250\377\347\363\344"
- "\377\377\374\377\377\256\304\254\377\313\326\312\377I\222@\377\7~\0\377"
- "\17\202\0\377\17\201\0\265\17\201\0\0\17\201\0\0\17\201\0\0\17\201\0"
- "\0\17\201\0\0\17\201\0\0\17\201\0\0\17\201\0\0(\274\1\0(\274\1\0(\274"
- "\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1#(\273\1\3666\277\23\377"
- "_\312D\377q\320Z\377e\313M\377R\3037\377;\272\35\377(\263\10\377!\260"
- "\2\377\40\256\1\377\37\255\1\377\37\253\1\377\37\251\1\377\36\250\1\377"
- "\35\247\1\377\35\245\1\377\34\243\1\377\32\242\1\377\32\240\1\377\24"
- "\234\0\3776\252\"\3771\246$\377\212\314\177\377\377\377\377\377\322\336"
- "\320\377T\226M\377\33}\17\377\27|\11\377\31z\15\377I\216C\377\313\330"
- "\310\377\377\377\377\377\377\377\377\377\263\320\257\377;\2240\377\364"
- "\365\364\377\372\371\372\377\265\307\265\377\346\350\346\377\377\377"
- "\377\377\377\377\377\377d\233\\\377\0e\0\377\16m\1\377\13y\0\377\17\200"
- "\0\377\17\177\0\377\17~\0\303\17~\0\0\17~\0\0\17~\0\0\17~\0\0\17~\0\0"
- "\17~\0\0\17~\0\0\17\200\0\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274"
- "\1\0(\274\1\0(\274\1\0(\274\0\210*\273\4\377G\303'\377l\316T\377m\316"
- "V\377\\\307C\377F\276)\377/\266\17\377#\261\3\377\40\257\1\377\40\256"
- "\1\377\37\254\1\377\37\252\1\377\37\251\1\377\35\247\1\377\35\246\1\377"
- "\34\244\1\377\33\242\1\377\32\241\1\377\27\236\0\377\36\240\13\377\327"
- "\357\323\377\367\374\366\377\377\377\377\377\273\322\267\377\22|\10\377"
- "J\246@\377\262\335\253\377\324\356\317\377\270\337\261\377U\251M\377"
- "\13s\2\377\247\303\242\377\377\377\377\377w\263o\377\0r\0\377=\2043\377"
- "M\215D\377\0i\0\377!w\26\377\337\345\337\377\342\347\342\377*\207\36"
- "\377\7}\0\377\15~\0\377\16~\0\377\17}\0\377\16|\0\377\16|\0\322\16{\0"
- "\3\16{\0\0\16{\0\0\16{\0\0\16{\0\0\16{\0\0\17\200\0\0\15t\0\0(\274\1"
- "\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\16(\273\0\345"
- "2\275\16\377Z\310>\377p\317Y\377g\313O\377S\3049\3779\271\33\377&\263"
- "\6\377!\260\2\377\40\256\1\377\37\254\1\377\37\253\1\377\37\251\1\377"
- "\36\250\1\377\35\246\1\377\35\245\1\377\33\243\1\377\32\241\1\377\32"
- "\240\1\377\25\235\0\377*\235\30\377\321\337\316\377\377\377\377\377\347"
- "\356\346\377\33\206\14\377y\303o\377\377\377\377\377\377\377\377\377"
- "\355\354\357\377\377\377\377\377\377\377\377\377\216\310\206\377\15v"
- "\2\377\333\346\332\377\346\364\344\377*\222\35\377\13~\0\377\5z\0\377"
- "\17\205\0\377\12}\0\377%v\32\377\32o\17\377\15y\0\377\16}\0\377\16{\0"
- "\377\16{\0\377\16z\0\377\15z\0\377\15y\0\344\15y\0\14\15y\0\0\15y\0\0"
- "\15y\0\0\15y\0\0\16\200\0\0\14h\0\0\3\26\0\0(\274\1\0(\274\1\0(\274\1"
- "\0(\274\1\0(\274\1\0(\274\1\0(\274\1^)\273\2\377A\302\37\377h\315O\377"
- "n\316W\377`\311H\377J\300.\377/\266\17\377\"\261\2\377\40\257\1\377\40"
- "\256\1\377\37\254\1\377\37\252\1\377\37\251\1\377\35\247\1\377\35\245"
- "\1\377\34\244\1\377\32\242\1\377\32\240\1\377\32\237\1\377\31\236\1\377"
- "\13\222\0\377J\237<\377\377\377\377\377\206\274}\3771\236\40\377\377"
- "\377\376\377\347\354\345\377L\220D\377\27w\17\377\77\2108\377\332\344"
- "\331\377\377\377\377\377@\2344\377j\246a\377\377\377\377\377\362\370"
- "\360\377\237\316\231\377\5}\0\377\17\200\0\377\17\177\0\377\11z\0\377"
- "\12z\0\377\16{\0\377\16z\0\377\15y\0\377\15y\0\377\15x\0\377\15x\0\377"
- "\15w\0\364\15w\0\35\15w\0\0\15w\0\0\15w\0\0\16}\0\0\14g\0\0\2\16\0\0"
- "\0\0\0\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\273\0"
- "\300.\274\11\377R\3065\377n\317W\377i\314Q\377Y\305\77\377\77\273\"\377"
- "(\264\10\377!\260\1\377\40\256\1\377\37\254\1\377\37\253\1\377\37\251"
- "\1\377\35\250\1\377\35\246\1\377\35\244\1\377\33\242\1\377\32\241\1\377"
- "\32\237\1\377\30\235\1\377\30\234\1\377\1\222\0\377h\274Z\377\377\377"
- "\377\377H\2448\377~\303r\377\377\377\377\377p\255g\377\0~\0\377\17\216"
- "\0\377\0|\0\377Y\235N\377\377\377\377\377\227\311\217\3772\216%\377\376"
- "\376\376\377\377\377\377\377\300\327\274\377\12{\0\377\16}\0\377\16|"
- "\0\377\16{\0\377\16z\0\377\15y\0\377\15x\0\377\15w\0\377\15v\0\377\15"
- "v\0\377\15u\0\377\14u\0\376\14t\0""4\14t\0\0\14t\0\0\15y\0\0\13j\0\0"
- "\2\22\0\0\0\0\0\0\0\0\0\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1"
- "\0(\274\1,(\273\1\3738\277\26\377a\313G\377n\316V\377b\311J\377P\302"
- "5\3774\270\26\377$\262\3\377!\257\1\377\40\255\1\377\37\254\1\377\37"
- "\252\1\377\37\251\1\377\35\247\1\377\35\245\1\377\34\244\1\377\32\242"
- "\1\377\32\240\1\377\31\236\1\377\30\234\1\377\21\230\0\377m\300c\377"
- "\335\357\331\377\377\377\377\377\77\242.\377\215\307\204\377\377\377"
- "\377\377T\252G\377\5\210\0\377\23\215\0\377\6\205\0\377>\2321\377\377"
- "\377\377\377\245\316\240\377-\216\37\377\376\377\376\377\246\302\242"
- "\377\30p\26\377\15|\0\377\16|\0\377\16z\0\377\15y\0\377\15x\0\377\15"
- "w\0\377\15v\0\377\15u\0\377\14t\0\377\14s\0\377\14s\0\377\14s\0\377\14"
- "r\0R\14r\0\0\14v\0\0\13n\0\0\2\30\0\0\0\0\0\0\0\0\0\0\0\0\0\0(\274\1"
- "\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\0\204*\273\4\377H\303(\377"
- "j\315Q\377i\314Q\377\\\307B\377E\275)\377,\265\14\377\"\260\2\377\40"
- "\256\1\377\37\255\1\377\37\253\1\377\37\252\1\377\36\250\1\377\35\246"
- "\1\377\35\244\1\377\33\242\1\377\32\241\1\377\32\237\1\377\30\235\1\377"
- "\30\233\1\377\12\223\0\377\267\332\260\377\377\377\377\377\377\377\377"
- "\377a\264S\377X\250K\377\377\377\377\377\260\331\252\377\11\210\0\377"
- "\0\201\0\377\2\200\0\377\232\314\224\377\377\377\377\377n\253f\377H\235"
- "<\377\377\377\377\377\\\237S\377\0q\0\377\17{\0\377\16z\0\377\15y\0\377"
- "\15w\0\377\15v\0\377\14t\0\377\14t\0\377\14s\0\377\14r\0\377\14q\0\377"
- "\14q\0\377\13p\0\377\13p\0v\14q\0\0\14r\0\0\4#\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1\5'\273\0\327"
- "1\275\14\377W\310:\377k\316S\377c\312J\377S\3038\377:\272\34\377&\263"
- "\6\377!\260\1\377\40\256\1\377\37\254\1\377\37\252\1\377\37\251\1\377"
- "\35\247\1\377\35\245\1\377\34\244\1\377\32\242\1\377\32\240\1\377\31"
- "\236\1\377\30\234\1\377\27\233\1\377\21\230\1\377F\2349\377\206\256\177"
- "\377\367\370\367\377\300\343\273\377\16\203\0\377\314\334\311\377\377"
- "\377\377\377\302\342\274\377\200\300~\377\267\333\261\377\377\377\377"
- "\377\336\346\334\377\17v\5\377\245\320\237\377\377\377\377\377\221\301"
- "\213\377\20|\13\377\13x\0\377\15x\0\377\15w\0\377\15u\0\377\14t\0\377"
- "\14s\0\377\14r\0\377\14q\0\377\13p\0\377\13o\0\377\13n\0\377\13n\0\377"
- "\13n\0\237\14u\0\0\5""3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0("
- "\274\1\0(\274\1\0(\274\1\0(\274\1\0(\274\1:(\273\1\377<\300\32\377c\313"
- "H\377h\314P\377[\307B\377I\300-\3770\266\21\377#\261\3\377\40\257\1\377"
- "\40\255\1\377\37\254\1\377\37\252\1\377\36\250\1\377\35\246\1\377\35"
- "\244\1\377\33\243\1\377\32\241\1\377\32\237\1\377\30\235\1\377\30\233"
- "\1\377\27\233\1\377\30\233\1\377\15\220\0\377\0|\0\377\222\276\213\377"
- "\377\377\377\377e\265Y\377\30{\20\377\270\314\266\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\305\323\303\377#v\35\377L\236B\377\377"
- "\377\377\377\377\377\377\377\377\377\377\3774\212*\377\5t\0\377\15v\0"
- "\377\14t\0\377\14s\0\377\14r\0\377\14q\0\377\13o\0\377\13n\0\377\13n"
- "\0\377\13n\0\377\13m\0\377\13m\0\377\13q\0\307\7G\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0(\274\1\0(\274\1\0(\274\1\0(\274\1\0"
- "(\274\0\213+\274\5\377J\305+\377h\315O\377b\312I\377S\3048\377>\273!"
- "\377)\264\11\377!\260\1\377\40\256\1\377\37\255\1\377\37\253\1\377\37"
- "\251\1\377\35\247\1\377\35\246\1\377\34\244\1\377\33\242\1\377\32\240"
- "\1\377\31\236\1\377\30\234\1\377\27\233\1\377\27\233\1\377\27\231\1\377"
- "\26\230\0\377\12\221\0\377q\267f\377\377\377\377\377\375\377\375\377"
- "o\267f\377\14t\4\377.|&\377M\212D\3773|*\377\12m\4\377\\\246U\377\366"
- "\373\364\377\343\351\343\377\221\257\220\377\206\253\201\377\10p\0\377"
- "\14v\0\377\14t\0\377\14s\0\377\14r\0\377\13p\0\377\13n\0\377\13n\0\377"
- "\13n\0\377\13m\0\377\13l\0\377\12l\0\377\6j\0\377\7f\0\352\2\15\1\22"
- "\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0(\274\1\0(\274\1\0(\274"
- "\1\0(\274\1\4'\273\0\3242\275\15\377X\310;\377g\314O\377[\307A\377J\300"
- ".\3775\270\26\377%\262\5\377!\260\1\377\40\256\1\377\37\254\1\377\37"
- "\252\1\377\37\250\1\377\35\247\1\377\35\245\1\377\34\243\1\377\32\241"
- "\1\377\32\240\1\377\31\236\1\377\30\233\1\377\27\233\1\377\27\232\1\377"
- "\26\230\1\377\24\226\0\377\20\220\2\377\267\326\262\377\377\377\377\377"
- "\370\366\370\377\377\377\377\377\324\353\321\377\207\300\201\377k\255"
- "d\377\204\276\177\377\315\347\312\377\377\377\377\377\352\357\351\377"
- "7~/\377\0a\0\377\4i\0\377\14v\0\377\14t\0\377\14s\0\377\14q\0\377\13"
- "o\0\377\13n\0\377\13n\0\377\13m\0\377\13l\0\377\11k\0\377\7i\0\377\7"
- "h\0\377#y\34\377A\2149\376\23!\22E\0\0\0\12\0\0\0\24\0\0\0\24\0\0\0\23"
- "\0\0\0\16\0\0\0\6(\274\1\0(\274\1\0(\274\1\0(\274\1""0(\273\1\375<\300"
- "\32\377a\313F\377c\312J\377T\3059\377B\275&\377-\265\16\377\"\261\2\377"
- "\40\257\1\377\40\255\1\377\37\254\1\377\37\252\1\377\36\250\1\377\35"
- "\246\1\377\35\244\1\377\33\242\1\377\32\241\1\377\32\237\1\377\30\235"
- "\1\377\30\233\1\377\27\233\1\377\27\231\1\377\26\227\0\377\25\226\0\377"
- "\20\221\0\377+\211\34\377\203\254}\3771\200(\377w\244r\377\363\364\363"
- "\377\377\377\377\377\377\377\377\377\377\373\377\377\365\363\365\377"
- "\377\377\377\377\353\362\352\377\24y\10\377\11x\0\377\15w\0\377\14t\0"
- "\377\14s\0\377\14q\0\377\13o\0\377\13n\0\377\13n\0\377\13l\0\377\11k"
- "\0\377\5g\0\377\15l\6\377\"w\32\3779\2052\377<\2066\377\34w\24\377\2"
- ")\0\206\0\0\0)\0\0\0""3\0\0\0.\0\0\0&\0\0\0\31\0\0\0\12(\274\1\0(\274"
- "\1\0(\274\1\0'\274\0u+\274\4\377H\305)\377e\314K\377^\311C\377N\3022"
- "\377;\272\36\377(\264\10\377!\261\2\377\40\257\1\377\37\255\1\377\37"
- "\253\1\377\37\251\1\377\35\250\1\377\35\246\1\377\34\244\1\377\33\242"
- "\1\377\32\240\1\377\31\236\1\377\30\234\1\377\27\233\1\377\27\233\1\377"
- "\27\231\1\377\25\227\0\377\25\225\0\377\25\223\0\377\17\214\0\377\6}"
- "\0\377\12\206\0\377\0r\0\377\266\322\262\377\377\377\377\377\243\301"
- "\237\377!p!\377+v\40\377\300\317\276\377\204\251\177\377\23x\12\377\13"
- "v\0\377\14u\0\377\14s\0\377\14q\0\377\13o\0\377\13n\0\377\13n\0\377\10"
- "k\0\377\6h\0\377\21n\10\3774\202,\377=\2076\377&x\37\377\21k\13\377\0"
- "^\0\377\17n\6\377\26J\21\266\0\0\0*\0\0\0)\0\0\0\34\0\0\0\21\0\0\0\11"
- "\0\0\0\3(\274\1\0(\274\1\0(\274\1\0'\274\0\2730\275\13\377T\3107\377"
- "d\313J\377X\307=\377I\300,\3776\270\27\377%\262\5\377!\260\1\377\40\256"
- "\1\377\37\254\1\377\37\252\1\377\37\251\1\377\35\247\1\377\34\245\0\377"
- "\32\243\0\377\26\240\0\377\27\236\0\377\25\234\0\377\25\232\0\377\24"
- "\232\0\377\25\231\0\377\25\230\0\377\25\226\0\377\25\223\0\377\24\222"
- "\0\377\23\220\0\377\23\216\0\377\22\213\0\377\15\207\0\377<\2122\377"
- "r\235l\377.\204\"\377\2z\0\377\11y\0\377\14j\0\377\1i\0\377\13v\0\377"
- "\15v\0\377\14s\0\377\14r\0\377\13p\0\377\13n\0\377\10l\0\377\6i\0\377"
- "\27s\20\3773\202,\3778\2041\377*{#\377\15h\7\377\23k\13\377-{&\377R\221"
- "L\377Q\223J\377b\215^\333\2\3\2\32\0\0\0\10\0\0\0\3\0\0\0\1\0\0\0\0\0"
- "\0\0\0(\274\1\0(\274\1\0(\274\1\24(\274\0\3569\300\25\377]\312A\377a"
- "\312F\377R\3057\377C\276&\3770\266\20\377#\261\2\377\40\260\1\377\40"
- "\256\1\377\37\254\1\377\37\252\1\377\35\250\0\377\31\245\0\377\37\246"
- "\4\377+\251\22\3772\253\34\3775\252\37\3773\250\37\377/\245\33\377,\244"
- "\30\377#\237\16\377\34\232\7\377\24\225\0\377\21\221\0\377\21\220\0\377"
- "\21\216\0\377\22\213\0\377\21\211\0\377\20\206\0\377\7|\0\377\0s\0\377"
- "\6z\0\377\14\177\0\377\14|\0\377\10x\0\377\11x\0\377\12t\0\377\10q\0"
- "\377\7o\0\377\5m\0\377\4j\0\377\11m\0\377\34v\23\3776\206/\377I\217A"
- "\377:\2053\377)z#\3776\201.\377=\2057\377Y\225S\377Q\220J\377M\215G\377"
- "\35o\26\377\17d\10\372\2\17\0*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0(\274\1\0(\274\1\0(\274\1G)\274\2\377C\303!\377a\313F\377\\\310A\377"
- "N\3031\377>\274\40\377+\264\12\377\"\261\2\377\40\257\1\377\37\255\0"
- "\377\34\253\0\377\26\247\0\377\40\251\4\377;\262$\377E\265/\377A\262"
- ",\3778\255#\3774\252\37\3776\251\"\3777\251%\377<\253*\377<\251+\377"
- "E\2544\377B\2513\3775\241$\377$\230\23\377\34\222\12\377\24\214\3\377"
- "\21\211\1\377\24\210\4\377\25\207\4\377\33\212\13\377#\214\25\377$\212"
- "\27\377\40\206\23\377&\207\32\377#\204\27\377!\200\25\377)\203\36\377"
- "4\211*\377;\2132\377I\224B\377Y\234S\377U\231N\377A\213;\3775\202.\377"
- "0~)\377E\212>\3779\2022\377B\206<\377\"q\33\377\32l\25\377\20e\13\377"
- ".x(\3779\2013\377\"]\36b\35""9\32\0\16\24\15\0\1\1\0\0\0\0\0\0\0\0\0"
- "\0*\307\1\0*\307\1\0'\275\0\204,\275\6\377L\306,\377a\313F\377V\306;"
- "\377H\300*\3776\271\27\377'\263\6\377\40\260\0\377\32\255\0\377\33\253"
- "\0\377)\257\17\377W\277B\377\202\317r\377~\315o\377x\311h\377}\312n\377"
- "y\307j\377z\307l\377s\303f\377n\301`\377w\304j\377x\304l\377v\302i\377"
- "\177\305t\377v\277k\377{\301q\377\200\302v\377\177\300v\377y\274o\377"
- "|\274s\377i\262`\377U\247K\377R\243G\377D\2329\377;\223/\377\77\2255"
- "\377<\2212\377D\224<\377S\233K\377`\241X\377X\234Q\377G\221@\377/\202"
- "(\3771\202*\3772\201,\377/~(\3773\200-\377/{(\377\40p\32\377#r\36\377"
- "/y)\377:\1774\377o\241j\377\270\320\265\377i\235d\377L\215G\247_\240"
- "Z\0""5f0\0\2\11\2\0\0\0\0\0\0\0\0\0\20M\1\0\34\205\1\0'\273\0\2751\277"
- "\13\377R\3074\377]\312B\377O\3043\377@\275!\377-\265\14\377\35\257\0"
- "\377%\262\7\377G\275/\377x\315f\377\234\332\217\377\231\330\213\377}"
- "\315n\377u\311d\377i\303Z\377s\306d\377k\302[\377k\301\\\377y\306l\377"
- "o\301b\377\177\307t\377k\276]\377y\303m\377q\276d\377]\264P\377X\260"
- "K\377>\2410\377@\2414\377B\2404\377L\243@\377P\245E\377N\243C\377X\246"
- "N\377^\250U\377]\246T\377e\251]\377p\255h\377u\260n\377m\252f\377b\242"
- "[\377R\231K\377\77\2147\377I\222B\377D\214=\3772\200,\377)y\"\3775\177"
- "/\3776\1771\377X\223R\377f\234a\377\23d\17\377I\210D\377d\231`\377\267"
- "\317\265\377\327\345\326\377\262\314\257\346rzq\15\16\22\16\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\2\12\0\20$\257\0\3515\303\20\377S\3075\377U"
- "\3078\377C\300$\377/\267\16\3771\267\22\377Q\3017\377\200\322n\377\223"
- "\330\204\377\201\321p\377l\310Y\377X\277B\377\207\321z\377{\313k\377"
- "\204\315v\377i\302Y\377\220\321\203\377\207\314z\377\231\323\217\377"
- "\217\317\205\377\212\314\177\377\212\313\200\377e\272W\377\226\316\215"
- "\377o\274c\377\241\322\231\377\221\312\211\377x\274n\377\217\306\207"
- "\377i\262_\377Q\245F\377n\263f\377J\236@\3771\217&\377B\2279\3771\214"
- "&\377\37\177\24\377'\202\35\377.\205%\377\"|\30\377(\177\36\3776\207"
- ".\377\40x\27\377\37t\30\377I\216C\377]\231W\377\15e\11\377E\207@\377"
- "y\250t\377\321\341\320\377\250\306\245\377\206\257\203\377\246\303\244"
- "\377}\250y\377\210\260\205\377C\205>\377\4\27\3E\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\11+\0<(\300\0\3776\301\22\377J\304*\377\77\277\36"
- "\377<\275\34\377\\\307C\377|\321h\377\217\330\177\377\224\331\205\377"
- "\204\323s\377\230\331\212\377\223\326\205\377\234\331\220\377\236\331"
- "\222\377\220\323\203\377\225\324\211\377\213\317~\377\221\322\205\377"
- "\213\316\177\377\205\313z\377t\304h\377w\304k\377w\302k\377u\301j\377"
- "y\301m\377g\270]\377^\262R\377t\274k\377C\2427\377s\270j\377\204\300"
- "|\377C\235>\377\212\302\203\377\234\312\226\377v\264n\377\303\336\300"
- "\377\246\315\241\377\241\311\235\377\245\313\240\377\234\305\230\377"
- "\222\276\216\377\205\266\200\377\256\317\253\377~\260y\377q\247k\377"
- "\236\302\232\377\333\351\332\377\250\310\245\377\223\271\220\377\227"
- "\273\224\377\226\272\222\377\225\271\222\377i\233e\377f\231b\377=~8\377"
- "i\233d\377E\210\77\377\4""3\3\226\0\0\0\0\0\0\0\2\0\0\0\0\0\0\0\0\0\0"
- "\0\0\21N\0n)\307\0\377/\275\11\377<\300\31\377U\3078\377x\322b\377\225"
- "\333\204\377\232\334\213\377\246\340\231\377\231\333\212\377\211\324"
- "x\377k\311Y\377W\277B\377T\276\77\377Q\273=\377Y\275F\377a\277O\377f"
- "\300V\377c\276S\377h\277Y\377u\304g\377v\304i\377m\277`\377}\305q\377"
- "\213\312\201\377\215\312\203\377\234\321\224\377\220\312\207\377\217"
- "\310\206\377\206\303~\377\212\303\201\377p\266g\377f\260\\\377l\261c"
- "\377o\262g\377Y\243O\377h\254`\377l\254d\377w\261p\377|\263v\377\203"
- "\266~\377\223\277\217\377e\243_\377\214\272\210\377\244\307\240\377z"
- "\255u\377k\242g\377|\254x\377k\240g\377`\230]\377U\220O\377Z\222U\377"
- ">\1778\377l\235h\377]\223X\377)p%\377\32e\27\377%n!\3774l1\340\5\6\5"
- "\27\0\0\0\3\0\0\0\1\0\0\0\0\0\0\0\0\25r\0\227&\306\0\377B\303\40\377"
- "t\322\\\377\220\332~\377\236\336\217\377\240\336\221\377x\317c\377a\310"
- "J\377\\\305E\377a\306L\377n\312[\377x\314f\377z\314j\377\200\316q\377"
- "\203\315t\377\177\313p\377o\304`\377b\276R\377Z\271I\377`\273Q\377_\272"
- "P\377S\263C\377R\262B\377R\260C\377P\256B\377T\257H\377X\257K\377Y\256"
- "N\377a\260V\377q\266h\377\205\300}\377\215\304\205\377\231\311\223\377"
- "\213\300\204\377\207\275\200\377o\257g\377x\262p\377n\254f\377f\246`"
- "\377d\243]\377K\224D\377H\221A\377D\216=\377^\234X\377M\220G\377m\243"
- "h\377G\212@\377r\244m\377q\243m\3778|1\377X\220S\377\40j\33\377\37i\32"
- "\377\26b\21\377\25a\22\377k\232j\377\221\265\216\377\315\340\314\377"
- "FGEL\0\0\0\0\0\0\0\1\0\0\0\0\0\6\0\0-\241\17\277j\327N\377\233\337\211"
- "\377\240\340\217\377\202\325l\377d\312K\377T\3049\377i\312R\377\200\323"
- "n\377\214\327|\377\202\322q\377r\313`\377g\306T\377[\300G\377m\306\\"
- "\377\200\315q\377\177\313p\377\202\314u\377\206\314y\377\205\313y\377"
- "\202\311v\377\231\323\220\377\252\332\243\377\262\335\254\377\254\331"
- "\244\377\241\323\230\377\240\322\230\377\236\320\226\377\213\306\203"
- "\377b\260X\377K\243B\3771\225$\377/\223$\3772\222'\377D\232:\377X\243"
- "P\377s\261k\377u\260n\377y\262r\377n\252g\377k\247e\377M\225G\377`\240"
- "Y\377;\2104\377X\230Q\377/}(\377C\210;\3773|+\377(t\"\377&r\40\377\25"
- "d\17\3772w,\377]\223[\377j\233f\377\242\300\240\377\220\264\215\377\341"
- "\352\337\377\323\341\322\377y\250u\3777Y5\232\0\0\0\0\0\0\0\0\0\0\0\0"
- "\11\17\10\15\210\323u\353\235\354\207\377z\334a\377o\327T\377w\330_\377"
- "\225\342\202\377\250\350\231\377\255\351\236\377\234\343\214\377\220"
- "\336\177\377\213\334z\377\216\334~\377\217\333~\377\200\325n\377s\317"
- "`\377w\317f\377k\312Y\377e\306T\377[\301J\377v\313g\377\213\323\177\377"
- "\246\337\234\377\231\330\216\377\200\315t\377\203\315w\377\213\317\200"
- "\377\225\323\213\377\225\322\214\377\212\313\200\377\240\325\230\377"
- "\264\336\256\377\276\343\272\377\234\321\225\377\206\304\177\377\201"
- "\277y\377l\263e\377^\252U\377m\260e\377l\257f\377p\261i\377\204\273\177"
- "\377\202\271|\377\204\272\177\377\203\270~\377y\260s\377\200\263{\377"
- "w\255r\377\202\263|\377\204\264\200\377\226\276\222\377\245\310\242\377"
- "\273\326\271\377\252\312\247\377\234\301\231\377\244\304\241\377\240"
- "\301\235\377\216\265\213\377a\225]\377L\211G\377A{=\361\20\23\20\33\0"
- "\0\0\0\0\0\0\0\26\33\25\32q\252a\302d\253Q\320w\256i\323\203\261w\325"
- "\207\261|\326s\252f\330\\\242K\331N\233;\331G\2315\332J\232:\333H\230"
- "7\333K\230;\334K\227;\334N\227>\335Z\233M\335[\233N\336b\235W\337`\235"
- "U\340b\235X\340a\233V\340V\226L\3407\210*\337\36z\17\337\25u\6\336\27"
- "s\10\336\37u\21\336-{\"\336:\2001\336G\205>\336W\214P\336h\224a\337q"
- "\230l\337|\236w\337\223\251\220\337\200\237{\340\205\241\201\337\201"
- "\236}\337\211\242\206\337}\233z\337\177\233{\337w\227t\337n\221j\336"
- "\203\234\200\335\216\242\214\335\227\250\225\335\220\244\216\336~\227"
- "{\335v\222s\335a\203^\333p\215m\333X|U\332GpD\331@m=\333TyQ\332Z}X\330"
- "s\215q\3269e6\324EmB\322`\200^\321i\210f\315\40*\40H\0\0\0\1\0\0\0\0"
- "\0\0\0\4\0\0\0\17\3\0\4$\5\2\6""4\2\1\3>\2\3\2F\5\6\4M\1\1\1Q\0\0\0T"
- "\0\0\0X\0\0\0\\\0\0\0_\0\0\0a\0\0\0d\0\0\0f\0\0\0h\0\0\0j\0\0\0k\1\0"
- "\1m\3\0\3n\0\0\0o\0\0\0p\0\0\0p\1\0\2q\0\0\0q\0\0\0q\0\0\0q\0\0\0q\0"
- "\0\0r\0\0\0r\0\0\0r\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0r\0\0\0r"
- "\0\0\0q\0\0\0q\0\0\0p\0\0\0o\0\0\0n\0\0\0m\0\0\0l\0\0\0k\0\0\0j\1\0\1"
- "h\0\0\0f\0\0\0c\0\0\0a\0\0\0^\0\0\0[\5\2\6Y\1\0\1U\0\0\0P\0\0\0K\0\0"
- "\0D\1\0\2<\1\0\1""3\0\0\0#\0\0\0\24\0\0\0\5\0\0\0\0\0\0\0\2\0\0\0\7\0"
- "\0\0\21<;<\40LLL'EEE,)()-\5\5\5+\0\0\0-\0\0\0""1\0\0\0""3\0\0\0""5\0"
- "\0\0""8\0\0\0:\0\0\0<\0\0\0=\0\0\0\77\0\0\0A\0\0\0B\0\0\0C\0\0\0D\0\0"
- "\0E\0\0\0F\0\0\0G\0\0\0H\0\0\0H\0\0\0I\0\0\0I\0\0\0I\0\0\0I\0\0\0J\0"
- "\0\0I\0\0\0J\0\0\0I\0\0\0I\0\0\0I\0\0\0I\0\0\0H\0\0\0H\0\0\0G\0\0\0F"
- "\0\0\0E\0\0\0D\0\0\0C\0\0\0B\0\0\0A\0\0\0\77\0\0\0=\0\0\0<\0\0\0:\0\0"
- "\0""8\0\0\0""6\0\0\0""3\0\0\0""1\0\0\0.\0\0\0+\0\0\0(\0\0\0$\0\0\0\37"
- "\0\0\0\32\0\0\0\23\0\0\0\12\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\250"
- "\250\250\15|||\13!!!\7\4\4\4\6\0\0\0\6\0\0\0\10\0\0\0\11\0\0\0\12\0\0"
- "\0\12\0\0\0\13\0\0\0\14\0\0\0\15\0\0\0\16\0\0\0\16\0\0\0\17\0\0\0\20"
- "\0\0\0\20\0\0\0\21\0\0\0\22\0\0\0\22\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0"
- "\24\0\0\0\24\0\0\0\24\0\0\0\24\0\0\0\24\0\0\0\24\0\0\0\24\0\0\0\24\0"
- "\0\0\24\0\0\0\24\0\0\0\24\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\22\0\0\0\22"
- "\0\0\0\21\0\0\0\20\0\0\0\20\0\0\0\20\0\0\0\17\0\0\0\16\0\0\0\15\0\0\0"
- "\14\0\0\0\13\0\0\0\13\0\0\0\12\0\0\0\11\0\0\0\10\0\0\0\7\0\0\0\6\0\0"
- "\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\0\0\0\0\0"};
-
-/* GdkPixbuf RGBA C-Source image dump */
-#ifdef __SUNPRO_C
-#pragma align 4 (wssplash_pb_data)
-#endif
-#ifdef __GNUC__
-const guint8 wssplash_pb_data[] __attribute__ ((__aligned__ (4))) =
-#else
-const guint8 wssplash_pb_data[] =
-#endif
-{ ""
- /* Pixbuf magic (0x47646b50) */
- "GdkP"
- /* length: header (24) + pixel_data (42408) */
- "\0\0\245\300"
- /* pixdata_type (0x1010002) */
- "\1\1\0\2"
- /* rowstride (744) */
- "\0\0\2\350"
- /* width (186) */
- "\0\0\0\272"
- /* height (57) */
- "\0\0\0""9"
- /* pixel_data: */
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3`\253P\2^\250\237\1[\242\337"
- "\1\\\244\377\0\\\244\377\0]\247\377\0]\247\377\0^\247\377\0^\250\377"
- "\0^\250\377\0`\254\377\0`\253\377\0b\256\377\0a\254\377\0d\261\377\0"
- "d\262\377\0e\262\377\0f\264\377\0e\264\377\0h\266\377\0f\264\377\0d\261"
- "\377\0f\264\377\0g\266\377\0i\271\377\0i\271\377\0g\266\377\0j\273\377"
- "\0k\275\377\0k\272\377\0m\277\377\0m\277\377\0o\302\377\0o\302\377\0"
- "n\300\377\0o\300\377\0q\305\377\0q\305\377\0s\310\377\0s\311\377\0t\311"
- "\377\0t\312\377\0t\312\377\0u\313\377\0y\322\377\0y\320\377\0v\314\377"
- "\0u\313\377\0v\313\377\0y\321\377\0x\317\377\0x\320\377\0z\323\377\0"
- "{\325\377\0}\326\377\0|\325\377\0~\330\377\0~\332\377\0~\331\377\0~\331"
- "\377\0\177\331\377\0\200\333\377\0\201\335\377\1\201\335\377\1\203\340"
- "\377\1\204\341\377\1\204\343\377\1\205\342\377\2\205\342\377\2\206\344"
- "\377\2\210\347\377\2\211\350\377\2\205\343\377\2\206\344\377\2\206\344"
- "\377\2\207\346\377\3\210\350\377\3\207\345\377\3\205\342\377\3\211\351"
- "\377\3\207\346\377\3\210\346\377\3\207\346\377\3\211\350\377\4\213\352"
- "\377\4\211\350\377\4\213\353\377\4\213\353\377\4\212\351\377\4\214\354"
- "\377\4\214\353\377\4\213\353\377\4\212\351\377\4\211\350\377\4\207\344"
- "\377\4\210\346\377\4\211\347\377\4\207\345\377\3\204\340\377\3\203\336"
- "\377\3\204\337\377\3\207\345\377\3\204\340\377\3\205\343\377\3\206\344"
- "\377\2\205\342\377\2\203\340\377\2\203\340\377\2\204\342\377\2\203\340"
- "\377\2\177\331\377\1\177\332\377\1}\327\377\1~\327\377\1{\324\377\0{"
- "\324\377\0{\324\377\0|\326\377\0{\326\377\0z\324\377\0z\323\377\0w\316"
- "\377\0v\315\377\0v\314\377\0u\312\377\0u\312\377\0v\314\377\0w\320\377"
- "\0v\315\377\0t\311\377\0t\311\377\0t\311\377\0r\305\377\1s\307\377\1"
- "p\303\377\1r\306\377\1p\304\377\1n\300\377\1n\277\377\1m\276\377\1m\276"
- "\377\2m\276\377\2j\272\377\2j\271\377\2j\271\377\2h\265\377\2h\266\377"
- "\2h\266\377\2g\264\377\2e\262\377\2e\261\377\2e\262\377\2f\263\377\2"
- "d\257\377\3d\256\377\3d\257\377\3c\256\377\3c\256\377\3b\254\377\3b\254"
- "\377\3b\254\377\3_\250\377\3^\245\377\3^\245\377\3]\243\377\3\\\243\377"
- "\3[\241\377\3\\\243\377\3\\\244\377\3\\\244\337\4_\251\237\2_\253@\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0Z\2430\0W\235\277\1U\231\377\1R\224\377\1"
- "R\223\377\1R\224\377\0T\226\377\0U\230\377\0U\230\377\0U\231\377\0U\231"
- "\377\0V\231\377\0X\234\377\0X\234\377\0Y\236\377\0Y\236\377\0[\241\377"
- "\0\\\242\377\0\\\243\377\0]\245\377\0]\245\377\0^\247\377\0_\250\377"
- "\0^\246\377\0_\250\377\0`\252\377\0b\255\377\0b\254\377\0_\250\377\0"
- "a\253\377\0c\255\377\0b\254\377\0e\261\377\0e\261\377\0g\264\377\0f\263"
- "\377\0h\265\377\0g\264\377\0i\267\377\0h\266\377\0j\271\377\0j\271\377"
- "\0j\271\377\0j\272\377\0k\272\377\0k\272\377\0o\301\377\0n\277\377\0"
- "n\277\377\0o\277\377\0o\300\377\0r\305\377\0p\301\377\0q\303\377\0r\305"
- "\377\0t\310\377\0u\311\377\0t\311\377\0v\314\377\0w\314\377\0t\311\377"
- "\0u\312\377\0w\314\377\0w\314\377\0x\317\377\0x\316\377\0y\317\377\0"
- "z\323\377\0|\325\377\0{\325\377\0{\323\377\0|\324\377\0}\327\377\0~\330"
- "\377\0}\327\377\0~\330\377\0\177\331\377\0\177\332\377\0\200\334\377"
- "\0~\331\377\0}\327\377\0\200\334\377\0\177\332\377\0\200\333\377\0\200"
- "\333\377\0\200\334\377\0\202\337\377\0\200\334\377\0\201\334\377\0\200"
- "\333\377\0\200\332\377\0\200\334\377\0\200\334\377\0\200\333\377\0~\331"
- "\377\0\200\333\377\0|\326\377\0}\327\377\0\177\332\377\0~\330\377\0|"
- "\325\377\0|\325\377\0|\324\377\0|\325\377\0z\322\377\0|\325\377\0|\325"
- "\377\0{\323\377\0{\322\377\0z\321\377\1{\324\377\1y\320\377\1w\315\377"
- "\1x\317\377\1v\314\377\1v\314\377\1u\312\377\1v\313\377\1v\313\377\1"
- "u\313\377\2u\311\377\2t\307\377\2t\307\377\2s\307\377\2s\305\377\2r\305"
- "\377\2q\302\377\2p\301\377\2o\300\377\1p\302\377\2n\276\377\1l\274\377"
- "\1l\274\377\1k\273\377\1j\270\377\1j\271\377\1h\266\377\1j\271\377\1"
- "h\266\377\1f\263\377\0f\262\377\0e\261\377\0e\261\377\0e\263\377\0c\256"
- "\377\0c\257\377\0c\256\377\0a\253\377\0a\253\377\0`\252\377\0`\251\377"
- "\0^\246\377\0]\245\377\0]\246\377\0]\246\377\0[\242\377\0Z\240\377\0"
- "Z\240\377\0Z\240\377\0Z\240\377\0X\235\377\0X\236\377\0X\236\377\0U\231"
- "\377\0T\227\377\0T\227\377\0S\225\377\0S\225\377\0Q\222\377\0R\224\377"
- "\0Q\222\377\0P\221\377\0P\221\377\0S\227\377\0X\240\301\0X\2373\0\0\0"
- "\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "`\2540\0Z\243\357\1U\231\377\1U\232\377\0X\236\377\0W\235\377\0X\236"
- "\377\0X\237\377\1Z\242\377\1Z\241\377\1Z\242\377\1\\\244\377\1\\\243"
- "\377\1]\246\377\1]\246\377\1_\251\377\1_\251\377\1`\253\377\1a\253\377"
- "\1a\254\377\1b\256\377\1b\256\377\1d\261\377\1e\262\377\1d\257\377\1"
- "e\262\377\1f\264\377\1h\267\377\1g\266\377\2f\263\377\2h\266\377\2i\270"
- "\377\2h\266\377\2i\270\377\3k\272\377\3m\275\377\3l\273\377\3l\273\377"
- "\3m\274\377\3n\277\377\2m\275\377\1o\301\377\1n\300\377\2o\300\377\2"
- "o\300\377\2q\302\377\2p\302\377\2u\311\377\2u\310\377\2t\310\377\2t\307"
- "\377\2t\310\377\2w\315\377\2t\311\377\2v\313\377\2v\315\377\2x\317\377"
- "\2y\321\377\2x\320\377\2z\323\377\2{\324\377\2y\321\377\1z\322\377\1"
- "{\323\377\1{\322\377\1|\325\377\1|\324\377\1}\326\377\1~\331\377\1\177"
- "\332\377\1\177\332\377\1~\331\377\1\177\332\377\1\200\334\377\1\201\336"
- "\377\1\201\336\377\1\201\336\377\1\202\337\377\0\202\340\377\0\204\343"
- "\377\0\201\336\377\0\200\335\377\0\203\341\377\0\202\337\377\0\201\335"
- "\377\0\203\341\377\40\223\345\377O\253\354\377~\277\356\377\215\307\361"
- "\377\276\337\366\377\216\307\357\377\0\202\340\377\0\203\341\377\0\202"
- "\340\377\0\201\334\377\0\202\337\377\1\200\332\377\1\200\333\377\1\201"
- "\336\377\1\200\334\377\1\177\332\377\1~\330\377\1~\330\377\1~\331\377"
- "\1{\325\377\1}\327\377\1~\331\377\2}\326\377\2}\326\377\2{\323\377\2"
- "}\327\377\2z\324\377\2y\320\377\1z\322\377\1y\320\377\2x\317\377\1w\316"
- "\377\1v\315\377\1w\315\377\1w\316\377\1w\315\377\1u\312\377\1u\311\377"
- "\1u\312\377\1t\311\377\1t\311\377\0r\306\377\0q\305\377\0q\304\377\0"
- "s\307\377\0q\304\377\0o\301\377\0p\302\377\0n\277\377\0l\274\377\1m\276"
- "\377\1k\273\377\2m\276\377\2l\273\377\2j\271\377\3j\270\377\3i\267\377"
- "\3i\267\377\3i\267\377\3h\264\377\3g\264\377\2f\263\377\2e\260\377\2"
- "c\257\377\2d\260\377\2c\257\377\2a\253\377\2`\252\377\1a\254\377\1a\254"
- "\377\1^\250\377\0^\250\377\0^\250\377\0^\250\377\0^\250\377\0\\\245\377"
- "\0\\\246\377\0\\\245\377\0Y\240\377\0X\235\377\0X\236\377\0W\234\377"
- "\0W\234\377\0U\230\377\0V\232\377\0U\231\377\0S\227\377\0R\224\377\0"
- "Q\223\377\0Q\222\377\0X\236\360\0N\2178\0\0\0\4\0\0\0\2\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0]\252\40\0Z\243\357\0X\236\377\0X\237\377"
- "\0Z\242\377\0\\\246\377\0[\245\377\0\\\246\377\0\\\247\377\0^\251\377"
- "\0\\\250\377\0]\250\377\0_\253\377\0_\254\377\0`\256\377\0b\257\377\1"
- "d\262\377\1d\263\377\1f\264\377\1f\264\377\1g\267\377\1g\270\377\1g\270"
- "\377\1h\272\377\1j\275\377\1j\273\377\1j\274\377\1l\277\377\1n\302\377"
- "\1o\301\377\1m\277\377\2o\302\377\2o\304\377\2n\302\377\2o\302\377\2"
- "p\305\377\2r\307\377\2q\305\377\3q\305\377\3r\307\377\3t\311\377\3s\310"
- "\377\3v\315\377\3v\313\377\3v\314\377\3w\314\377\4x\316\377\4y\316\377"
- "\4}\326\377\4|\326\377\4|\325\377\4|\323\377\4{\323\377\5}\327\377\4"
- "z\322\377\4{\323\377\5|\325\377\5~\330\377\5\200\332\377\5\177\330\377"
- "\5\201\335\377\7\202\335\377\7\200\332\377\7~\330\377\7\201\333\377\7"
- "\177\331\377\7\202\334\377\7\201\333\377\6\201\334\377\6\204\340\377"
- "\6\204\341\377\6\204\340\377\6\204\340\377\5\204\340\377\5\206\342\377"
- "\5\207\345\377\4\205\344\377\3\205\343\377\3\205\343\377\3\206\345\377"
- "\3\207\347\377\3\204\342\377\2\204\341\377\2\205\344\3770\232\346\377"
- "\211\303\355\377\325\350\366\377\363\366\371\377\363\366\371\377\364"
- "\367\372\377\365\370\372\377\366\370\373\377\366\370\373\377\1\205\343"
- "\377\1\206\345\377\1\205\345\377\1\203\341\377\1\204\342\377\1\202\337"
- "\377\1\200\337\377\0\202\342\377\0\200\337\377\0\200\336\377\0\177\334"
- "\377\0~\333\377\0~\335\377\0}\330\377\0\200\333\377\0\200\336\377\0\177"
- "\334\377\0\200\334\377\0\177\332\377\0\200\335\377\0~\331\377\0|\325"
- "\377\0}\330\377\0|\326\377\0{\325\377\0z\324\377\0x\317\377\0x\321\377"
- "\0x\321\377\0w\320\377\0u\315\377\0u\314\377\0v\316\377\0u\315\377\0"
- "u\315\377\0t\313\377\0r\310\377\0r\306\377\0s\312\377\0q\307\377\0n\303"
- "\377\0o\305\377\0n\302\377\0m\300\377\0n\302\377\0m\277\377\0n\303\377"
- "\0l\277\377\0k\275\377\0j\273\377\0j\273\377\0i\272\377\0j\275\377\0"
- "i\272\377\0i\273\377\0h\270\377\0g\267\377\0f\265\377\0g\267\377\0f\264"
- "\377\0c\261\377\0b\260\377\0c\260\377\0c\260\377\0`\253\377\0`\255\377"
- "\0a\257\377\0a\254\377\0a\255\377\0_\252\377\0`\253\377\0_\252\377\0"
- "\\\245\377\0\\\245\377\0[\245\377\0Y\242\377\0Z\243\377\0Y\237\377\0"
- "Y\241\377\0Y\240\377\0X\237\377\0X\236\377\0V\235\377\0U\232\377\0T\231"
- "\377\0W\236\361\0\77s.\0\0\0\7\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\\\246\277\0Z\241\377\0[\244\377\0\\\246\377\0^\251\377\0^\253\377"
- "\0_\254\377\0^\252\377\0^\254\377\0_\254\377\0]\252\377\0^\252\377\0"
- "_\255\377\0`\255\377\0a\261\377\0c\262\377\0d\263\377\0e\266\377\0e\266"
- "\377\0e\266\377\0f\270\377\0g\270\377\0g\272\377\0h\273\377\0i\276\377"
- "\0i\275\377\0i\275\377\0m\302\377\0n\304\377\0o\305\377\1n\303\377\1"
- "o\304\377\1p\306\377\1o\304\377\1o\303\377\2p\306\377\2q\310\377\2p\306"
- "\377\3q\307\377\3r\311\377\3t\314\377\3s\312\377\3w\320\377\4x\320\377"
- "\4w\320\377\4y\320\377\5{\323\377\4{\324\377\4~\331\377\4\177\332\377"
- "\4~\330\377\4}\330\377\4|\325\377\4}\331\377\3y\324\377\3y\324\377\3"
- "{\326\377\3|\331\377\3~\334\377\3~\333\377\3\200\335\377\4\200\336\377"
- "\4~\332\377\4|\330\377\4~\332\377\4|\330\377\4\177\333\377\4}\331\377"
- "\4}\332\377\4\201\337\377\4\200\337\377\4\177\336\377\3\201\336\377\3"
- "\202\337\377\3\203\342\377\3\204\344\377\3\203\342\377\3\201\337\377"
- "\3\202\337\377\3\203\341\377\3\203\343\377\2\200\337\377<\233\342\377"
- "\256\322\356\377\347\355\363\377\347\355\363\377\350\356\364\377\331"
- "\350\363\377\256\323\357\377u\267\350\377\353\360\365\377\354\361\366"
- "\377\205\277\353\377\1\203\343\377\1\203\344\377\1\204\344\377\1\201"
- "\340\377\1\202\342\377\1\200\336\377\1\177\335\377\0\200\340\377\0~\334"
- "\377\0}\333\377\0|\331\377\0{\331\377\0}\333\377\0{\330\377\0~\334\377"
- "\0\177\336\377\0\200\336\377\0\200\337\377\0\177\336\377\0\200\340\377"
- "\0\177\335\377\0|\330\377\0~\333\377\0}\331\377\0|\331\377\0{\330\377"
- "\0x\322\377\0x\323\377\0x\323\377\0v\321\377\0u\316\377\0u\317\377\0"
- "w\320\377\0v\317\377\0u\320\377\0u\317\377\0r\312\377\0r\312\377\0s\314"
- "\377\0q\311\377\0n\304\377\0o\306\377\0m\304\377\0m\302\377\0m\304\377"
- "\0m\302\377\0n\304\377\0l\301\377\0k\276\377\0j\275\377\0j\274\377\0"
- "i\272\377\0i\276\377\0i\275\377\0j\275\377\0i\273\377\0h\272\377\0g\270"
- "\377\0h\271\377\0g\270\377\0d\264\377\0c\262\377\0b\261\377\0b\262\377"
- "\0`\256\377\0a\257\377\0a\260\377\0a\257\377\0a\260\377\0_\254\377\0"
- "`\255\377\0_\255\377\0]\251\377\0]\251\377\0]\251\377\0[\245\377\0[\247"
- "\377\0Z\244\377\0[\245\377\0[\246\377\0[\245\377\0Z\243\377\0Z\243\377"
- "\0Y\241\377\0X\240\377\0W\237\377\0T\232\311\0\0\0\24\0\0\0\10\0\0\0"
- "\2\0\0\0\0\0\0\0\0\0\\\2460\0]\251\377\0]\250\377\0_\253\377\1`\254\377"
- "\1`\255\377\1a\257\377\1a\256\377\1^\253\377\1_\255\377\1^\253\377\1"
- "\\\252\377\1\\\251\377\1^\254\377\1^\254\377\1`\257\377\1`\260\377\1"
- "b\261\377\2c\264\377\1c\264\377\2c\264\377\2d\265\377\2c\266\377\2e\267"
- "\377\2e\270\377\2f\273\377\2g\272\377\2g\272\377\2j\277\377\2l\302\377"
- "\2m\303\377\2l\300\377\2l\301\377\3m\303\377\2k\277\377\3k\277\377\3"
- "l\303\377\3l\302\377\3l\302\377\3n\304\377\3o\305\377\3q\311\377\3p\307"
- "\377\3t\315\377\4t\316\377\4u\315\377\4v\317\377\5y\323\377\4{\324\377"
- "\4~\331\377\4~\332\377\4}\327\377\4}\330\377\4y\323\377\4z\326\377\3"
- "v\320\377\3u\320\377\3v\322\377\2x\324\377\2y\327\377\2z\330\377\2{\331"
- "\377\2|\333\377\2y\325\377\2w\323\377\1y\327\377\1w\325\377\1y\330\377"
- "\1x\326\377\0w\326\377\0{\333\377\0{\334\377\0z\331\377\0z\332\377\0"
- "|\334\377\0~\337\377\0\200\341\377\0\177\340\377\0~\335\377\0|\334\377"
- "\0}\335\377\16\203\337\377z\267\346\377\330\343\354\377\327\342\353\377"
- "\327\342\353\377\207\273\344\377)\216\333\377\0{\333\377\0}\334\3777"
- "\227\340\377\336\347\357\377\320\341\356\377\16\203\336\377\0~\336\377"
- "\0\200\341\377\0\177\340\377\0|\334\377\0~\337\377\0{\332\377\0z\327"
- "\377\0z\332\377\0x\326\377\0w\325\377\0u\321\377\0u\321\377\0w\323\377"
- "\0v\322\377\0z\327\377\0}\332\377\0|\331\377\0~\335\377\0\177\336\377"
- "\0~\335\377\0}\335\377\0y\326\377\0{\331\377\0z\330\377\0y\326\377\0"
- "w\324\377\0t\317\377\0t\317\377\0t\317\377\0r\314\377\0p\312\377\0q\314"
- "\377\0s\317\377\0r\315\377\0s\316\377\0t\316\377\0q\312\377\0p\311\377"
- "\0o\312\377\0n\307\377\0m\305\377\0l\305\377\0k\302\377\0k\301\377\0"
- "l\303\377\0k\301\377\1l\303\377\1i\300\377\1i\276\377\1i\276\377\1i\276"
- "\377\2h\274\377\2i\277\377\2j\276\377\2k\277\377\2i\273\377\2i\274\377"
- "\2h\272\377\3i\275\377\3h\273\377\3e\266\377\2c\263\377\2c\264\377\3"
- "b\263\377\3a\260\377\3a\261\377\3a\260\377\3a\260\377\3b\261\377\3a\257"
- "\377\3a\257\377\3`\256\377\3]\252\377\3^\252\377\3_\254\377\3]\250\377"
- "\3^\253\377\2^\252\377\2^\252\377\2`\255\377\2^\252\377\2^\252\377\1"
- "_\253\377\1^\251\377\1]\250\377\1]\247\377\1\\\246\377\1""6bP\0\0\0\24"
- "\0\0\0\7\0\0\0\1\0\0\0\0\0[\246\217\0]\250\377\0]\251\377\0_\253\377"
- "\0`\255\377\0_\255\377\0_\256\377\0^\253\377\0\\\252\377\0[\251\377\1"
- "Z\246\377\1W\244\377\1W\243\377\1X\245\377\1Y\247\377\1[\251\377\1[\252"
- "\377\2\\\253\377\2]\255\377\2]\255\377\2]\255\377\2^\255\377\2^\256\377"
- "\2_\260\377\2_\261\377\2a\264\377\2a\263\377\2b\264\377\2e\271\377\2"
- "g\273\377\3h\275\377\3h\273\377\2g\273\377\2h\274\377\2e\271\377\2e\271"
- "\377\2e\272\377\2d\271\377\2d\271\377\2g\274\377\2i\277\377\3k\301\377"
- "\3j\300\377\3o\307\377\3o\310\377\4p\307\377\5s\312\377\5x\320\377\5"
- "x\321\377\6{\325\377\6}\327\377\6{\324\377\5z\324\377\5v\317\377\4u\317"
- "\377\3p\312\377\3p\311\377\3p\312\377\3r\315\377\2s\316\377\2u\321\377"
- "\2v\322\377\2v\322\377\2p\313\377\2p\312\377\2q\317\377\2q\314\377\3"
- "s\320\377\2q\315\377\2p\314\377\2s\320\377\2t\321\377\2r\317\377\2s\321"
- "\377\2u\323\377\2x\326\377\2y\331\377\2x\330\377\1w\326\377\1u\323\377"
- "%\210\327\377\237\302\336\377\304\324\342\377\304\324\342\377z\257\334"
- "\377\30\200\325\377\0s\322\377\0u\322\377\0v\325\377\0w\325\377\177\265"
- "\340\377\316\333\347\377\200\267\342\377\0x\327\377\0x\327\377\0x\332"
- "\377\0y\331\377\0w\326\377\0y\331\377\0v\324\377\0t\323\377\0v\325\377"
- "\0t\322\377\0q\317\377\0p\315\377\0q\315\377\0s\320\377\0t\321\377\0"
- "x\326\377\0{\332\377\0z\327\377\0{\331\377\0|\333\377\0{\332\377\0x\325"
- "\377\0t\317\377\0v\322\377\0t\320\377\0r\316\377\0p\313\377\0l\304\377"
- "\0k\305\377\0k\303\377\0h\300\377\0g\277\377\0i\301\377\0k\304\377\0"
- "k\303\377\0k\304\377\0l\304\377\0i\277\377\0g\277\377\0g\275\377\0e\273"
- "\377\0d\271\377\0d\270\377\0b\267\377\0b\265\377\0b\266\377\0a\265\377"
- "\0b\266\377\0_\262\377\0_\262\377\0_\262\377\0`\262\377\0_\261\377\0"
- "a\263\377\0a\264\377\0b\264\377\0`\261\377\0`\261\377\0`\261\377\0`\261"
- "\377\0`\261\377\0]\254\377\0\\\252\377\0[\252\377\0[\252\377\0Y\246\377"
- "\0Y\247\377\0Y\246\377\0X\244\377\0X\244\377\0V\243\377\0W\243\377\0"
- "V\242\377\0T\236\377\0V\240\377\0W\242\377\0U\240\377\0X\243\377\0X\242"
- "\377\0Y\244\377\0[\247\377\0[\244\377\0[\245\377\0\\\247\377\0[\246\377"
- "\0[\245\377\0Z\244\377\0Z\244\377\0G\201\237\0\0\0%\0\0\0\20\0\0\0\4"
- "\0\0\0\0\2\\\245\277\2]\250\377\2]\250\377\1^\252\377\1_\253\377\1_\252"
- "\377\1]\251\377\1[\246\377\1Y\245\377\40k\215\377n\231T\377n\231S\377"
- "n\230R\377n\230S\377n\231T\377/q\177\377\0S\240\377\0T\240\377\0T\241"
- "\377\77|u\377n\231U\377n\232V\377n\232V\377n\233V\377n\233W\377n\234"
- "Y\377\77~z\377\254\304-\377\254\304.\377\37o\227\377\0^\257\377\0]\257"
- "\377\0]\256\377n\237]\377\254\305.\377^\225g\377\77\201~\377n\235[\377"
- "n\235Z\377n\236\\\377n\237^\377n\240`\377n\240_\377\77\207\210\377\0"
- "d\272\377\254\3072\377\254\3102\377\0n\306\377\0p\307\377\0r\313\377"
- "\0t\315\377\0r\313\377\0p\311\377\0l\304\377\37|\252\377}\255Y\377\254"
- "\3103\377\254\3103\377}\256[\377\37z\250\377\0i\303\377\0j\305\377\0"
- "j\305\377}\254Y\377\254\3072\377\254\3073\377\254\3073\377\254\3103\377"
- "\215\265L\377\77\207\213\377\1g\302\377\1g\302\377\255\3103\377\255\310"
- "4\377\255\3115\377\21t\274\377\1n\314\377\1n\314\377\1m\312\377\233\277"
- "Q\377\330\3379\377\332\3409\377\257\305\252\377+\177\312\377n\246i\377"
- "n\246j\377n\247k\377n\247k\377n\250l\377n\247l\377\311\327t\377\271\314"
- "\334\377T\233\250\377\254\3127\377\254\3127\377\20x\302\377\0q\321\377"
- "\0o\315\377/\212\247\377\254\3126\377}\261_\377\77\217\226\377n\247l"
- "\377n\246i\377n\246j\377n\246i\377n\247k\377o\251l\377o\254p\377@\227"
- "\235\377\2w\324\377\1y\330\377\1y\327\377~\265c\377\255\3138\377O\230"
- "\207\377\0p\313\377\0o\312\377\0l\307\377N\224\202\377\254\3073\377}"
- "\254Y\377\77\207\211\377n\241b\377n\240a\377n\242c\377n\243e\377n\243"
- "d\377n\243d\377\77\211\212\377\0b\270\377}\252U\377\254\3060\377\254"
- "\305/\377\254\305/\377\254\304.\377\254\304.\377}\247P\377\20e\241\377"
- "\0[\255\377\0[\255\377N\211q\377\274\315\"\377\353\353\0\377\353\353"
- "\0\377\254\304,\377N\212p\377\0Z\253\377\0[\254\377}\246N\377\254\304"
- "-\377/w\207\377\0Z\251\377\0Y\250\377\0W\245\377^\221a\377\235\2716\377"
- "\254\303+\377\235\2705\377^\220`\377\0R\236\377\0R\235\377\0Q\235\377"
- "^\217^\377\254\302*\377\215\255>\377\0O\227\377\0O\230\377\0P\234\377"
- "^\216\\\377\254\303*\377^\220_\377\0V\240\377\0Y\244\377\0Z\243\377\1"
- "[\245\377\1\\\247\377\1\\\247\377\1\\\246\377\2\\\245\377\2[\245\377"
- "\2R\223\323\0\0\0""6\0\0\0\33\0\0\0\11\0\0\0\1\4]\245\300\4_\251\377"
- "\4_\251\377\4`\253\377\4a\254\377\3_\253\377\3]\247\377\3Y\244\377\3"
- "W\243\377@|u\377\353\353\0\377\353\353\0\377\353\353\0\377\353\353\0"
- "\377\353\353\0\377\353\353\0\377\255\301)\377\21X\215\377\0N\231\377"
- "n\227Q\377\353\353\0\377\353\353\0\377\353\353\0\377\353\353\0\377\353"
- "\353\0\377\353\353\0\377n\232V\377\235\2706\377\353\353\0\377n\234Y\377"
- "\0X\250\377\0W\247\377\0U\245\377\333\341\13\377\353\353\0\377/r\204"
- "\377n\232W\377\353\353\0\377\353\353\0\377\353\353\0\377\353\353\0\377"
- "\353\353\0\377\353\353\0\377n\237_\377\0`\265\377\353\353\0\377\353\353"
- "\0\377\0i\302\377\0m\304\377\0o\307\377\0p\313\377\0o\310\377\0l\305"
- "\377^\234s\377\333\342\15\377\353\353\0\377\353\353\0\377\353\353\0\377"
- "\353\353\0\377\333\342\15\377^\231q\377\0c\275\377\0c\275\377\254\306"
- "1\377\353\353\0\377\353\353\0\377\353\353\0\377\353\353\0\377\353\353"
- "\0\377\353\353\0\377\77\204\210\377\1_\271\377\353\353\0\377\353\353"
- "\0\377\353\353\0\377_\232s\377\1e\303\377\1e\302\3779\205\252\377\353"
- "\353\0\377\353\353\0\377\353\353\0\377F\211\212\377\1`\274\377\353\353"
- "\0\377\353\353\0\377\353\353\0\377\353\353\0\377\353\353\0\377\353\353"
- "\0\377\353\353\0\377\235\272\323\377\77\214\221\377\353\353\0\377\353"
- "\353\0\377~\255\\\377\1g\306\377\1f\303\377\77\214\221\377\353\353\0"
- "\377\255\3104\377n\245i\377\353\353\0\377\353\353\0\377\353\353\0\377"
- "\353\353\0\377\353\353\0\377\353\353\0\377\353\353\0\377n\254p\377\0"
- "t\322\377\0v\323\377\0w\324\377n\252o\377\353\353\0\377\235\277A\377"
- "\0i\303\377\0g\302\377\0e\277\377\235\275>\377\353\353\0\377n\240a\377"
- "n\236^\377\353\353\0\377\353\353\0\377\353\353\0\377\353\353\0\377\353"
- "\353\0\377\353\353\0\377n\240a\377\0]\263\377\254\305/\377\353\353\0"
- "\377\353\353\0\377\353\353\0\377\353\353\0\377\353\353\0\377\353\353"
- "\0\377\274\315!\377\0V\247\377N\207q\377\353\353\0\377\353\353\0\377"
- "\254\302,\377\274\315!\377\353\353\0\377\353\353\0\377\77~{\377\0X\251"
- "\377\254\303,\377\353\353\0\377\77~z\377\0V\245\377\20^\230\377\254\302"
- "+\377\353\353\0\377\353\353\0\377\353\353\0\377\353\353\0\377\353\353"
- "\0\377\254\301)\377\20W\215\377\0L\227\377n\226O\377\353\353\0\377\353"
- "\353\0\377N~a\377\0I\221\377\0K\224\377n\226N\377\353\353\0\377n\231"
- "R\377\0T\234\377\0W\242\377\0Y\243\377\0[\245\377\0\\\250\377\0\\\247"
- "\377\0[\246\377\0[\244\377\0Y\243\377\0O\217\326\0\0\0D\0\0\0'\0\0\0"
- "\20\0\0\0\3\0Y\241\301\0\\\246\377\0\\\246\377\0]\250\377\0^\251\377"
- "\0\\\247\377\0Z\243\377\0V\237\377\0S\235\377\77zr\377\353\353\0\377"
- "\274\313\35\377\77sj\377\77tk\377^\212X\377\314\325\24\377\353\353\0"
- "\377\215\2519\377\0H\222\377n\223M\377\353\353\0\377\215\251:\377\77"
- "tm\377\77vo\377\77vp\377\77xr\377\37e\211\377^\216^\377\353\353\0\377"
- "\274\314\40\377\0Q\240\377\0R\240\377N\204j\377\353\353\0\377\314\326"
- "\25\377\0P\240\377n\227U\377\353\353\0\377\215\254\77\377\77{x\377\77"
- "|z\377\77~|\377\77}z\377\37n\231\377\0]\263\377\353\353\0\377\353\353"
- "\0\377\0h\277\377\0k\303\377\0k\303\377\0m\306\377\0l\303\377\37z\247"
- "\377\333\342\14\377\353\353\0\377n\241b\377\0_\266\377\0`\267\377n\241"
- "c\377\353\353\0\377\333\342\14\377\37p\236\377\0]\265\377\254\304/\377"
- "\353\353\0\377\77\177\201\377\0X\260\377\0[\265\377\215\260G\377\353"
- "\353\0\377\215\261H\377\0Y\263\377\353\353\0\377\353\353\0\377\353\353"
- "\0\377\235\273<\377\0\\\270\377\11a\267\377\241\272t\377\353\353\0\377"
- "\353\353\0\377\353\353\0\377\77\177\203\377\1Y\263\377\353\353\0\377"
- "\353\353\0\377\77\203\207\377\77\206\213\377\77\207\213\377i\236\220"
- "\377\263\306\230\377x\244\314\377\77\210\215\377\353\353\0\377\353\353"
- "\0\377\353\353\0\3770|\226\377\1_\272\377\77\206\213\377\353\353\0\377"
- "\255\3072\377\40v\246\377\77\207\214\377\77\205\210\377\215\264K\377"
- "\353\353\0\377\215\266M\377\77\214\220\377@\220\224\377!\204\266\377"
- "\2u\322\377\2v\323\377\2u\322\377!\201\261\377\353\353\0\377\353\353"
- "\0\377\22k\257\377\2a\271\377\22g\252\377\353\353\0\377\353\353\0\377"
- "!l\227\377o\234\\\377\353\353\0\377\216\257D\377@\200\177\377@\202\203"
- "\377@\202\202\377@\203\203\377!p\232\377\2[\260\377\255\304.\377\353"
- "\353\0\377@|y\377\2S\245\377\2Q\242\377!f\215\377\333\341\13\377\353"
- "\353\0\377@zv\377\255\302+\377\353\353\0\377P\203i\377\2Q\240\377\1Q"
- "\241\377n\230T\377\353\353\0\377\235\2706\377\1S\243\377\255\301*\377"
- "\353\353\0\377\77zu\377\1Q\237\377~\243J\377\353\353\0\377\274\314\37"
- "\377\40f\212\377\1Q\237\377\40d\207\377\274\314\37\377\353\353\0\377"
- "~\237E\377\1H\222\377n\224M\377\353\353\0\377\353\353\0\377\314\325\23"
- "\377\20O\203\377\0G\220\377n\224M\377\353\353\0\377n\227Q\377\0R\234"
- "\377\0V\242\377\0X\243\377\0[\245\377\0]\251\377\0\\\250\377\0\\\247"
- "\377\0\\\247\377\0[\246\377\0O\220\327\0\0\0N\0\0\0""1\0\0\0\26\0\0\0"
- "\5\1Z\243\301\1^\251\377\1]\250\377\1_\252\377\1^\250\377\1^\251\377"
- "\1Z\245\377\1W\240\377\1T\236\377\77zr\377\353\353\0\377\255\300'\377"
- "\1H\221\377\1J\223\377\1I\222\377\40^\177\377\353\353\0\377\353\353\0"
- "\377\21O\205\377n\221K\377\353\353\0\377n\222L\377\1H\224\377\1J\227"
- "\377\1K\230\377\1M\233\377\1P\235\377\21Y\222\377\353\353\0\377\353\353"
- "\0\377\40c\210\377\1O\235\377\215\254>\377\353\353\0\377~\241H\377\1"
- "M\234\377n\226R\377\353\353\0\377n\225R\377\1O\236\377\1Q\242\377\1Q"
- "\244\377\1R\242\377\1W\252\377\1Z\256\377\353\353\0\377\353\353\0\377"
- "\0d\272\377\0f\275\377\0g\276\377\0h\300\377\0g\275\377n\244d\377\353"
- "\353\0\377\215\263H\377\0^\264\377\0]\261\377\0]\263\377\0^\265\377\215"
- "\262H\377\353\353\0\377n\235]\377\0W\257\377\254\303-\377\353\353\0\377"
- "\77|}\377\0U\253\377\0X\260\377\77}~\377\353\353\0\377\254\303.\377\0"
- "T\254\377\353\353\0\377\353\353\0\377\314\327\27\377\353\353\0\377\20"
- "\\\240\377I\177\264\377\305\321\77\377\353\353\0\377\316\330\27\377\353"
- "\353\0\377\77{|\377\0S\253\377\353\353\0\377\353\353\0\377\0X\261\377"
- "\0\\\266\377\0]\266\377J\207\301\377\230\264\314\377U\220\306\377\77"
- "\204\210\377\353\353\0\377\333\341\14\377\353\353\0\377\254\304/\377"
- "\0W\257\377\77\201\204\377\353\353\0\377\254\3051\377\0^\270\377\0`\274"
- "\377\0^\267\377n\240b\377\353\353\0\377n\243e\377\0h\303\377\0m\311\377"
- "\0t\321\377\0v\323\377\0v\324\377\0u\322\377\0m\311\377\274\320&\377"
- "\353\353\0\377^\226m\377\0Z\262\377^\222i\377\353\353\0\377\274\315!"
- "\377\1T\250\377n\231Y\377\353\353\0\377n\230W\377\1T\251\377\1W\255\377"
- "\1W\253\377\1X\255\377\1Y\255\377\1W\253\377\255\302,\377\353\353\0\377"
- "\77yv\377\0O\241\377\0M\237\377\0M\237\377\254\301*\377\353\353\0\377"
- "\77vr\377\235\2664\377\353\353\0\377\215\253>\377\37a\206\377\0L\234"
- "\377\20U\216\377\77vo\377/m}\377\0M\234\377\254\300'\377\353\353\0\377"
- "\77uo\377\0K\227\377\333\340\12\377\353\353\0\377\37b\203\377\0N\232"
- "\377\0O\233\377\0L\227\377\37_\200\377\353\353\0\377\333\340\11\377\0"
- "A\211\377n\220H\377\353\353\0\377\333\337\11\377\353\353\0\377n\216E"
- "\377\0@\206\377n\220G\377\353\353\0\377n\225M\377\0N\225\377\0R\233\377"
- "\0U\235\377\0X\242\377\0Z\245\377\0[\245\377\0Z\242\377\0Y\243\377\0"
- "X\240\377\0L\213\330\0\0\0R\0\0\0""8\0\0\0\32\0\0\0\7\7^\246\301\7b\254"
- "\377\7b\253\377\7b\255\377\7b\253\377\7a\254\377\5]\247\377\4Y\242\377"
- "\4V\240\377B{r\377\353\353\0\377\255\300'\377\2H\221\377\2J\223\377\2"
- "H\222\377\2H\221\377\274\312\35\377\353\353\0\377\77og\377n\220J\377"
- "\353\353\0\377\314\324\23\377\255\277'\377\255\300(\377\255\300(\377"
- "\255\300)\3770m}\377\1M\233\377\235\2663\377\353\353\0\377_\213\\\377"
- "\1K\232\377\333\340\12\377\353\353\0\3770k|\377\1L\234\377n\225R\377"
- "\353\353\0\377\314\325\24\377\255\301*\377\255\301+\377\255\301+\377"
- "\255\301+\3770r\206\377\1W\253\377\353\353\0\377\353\353\0\377\0`\266"
- "\377\0c\271\377\0c\270\377\0d\272\377\0d\272\377\254\3061\377\353\353"
- "\0\377N\214x\377\0]\263\377\0[\261\377\0\\\263\377\0\\\263\377N\213v"
- "\377\353\353\0\377\254\303.\377\0T\253\377\254\302-\377\353\353\0\377"
- "n\231Z\377\77|}\377\77~\200\377\274\315\"\377\353\353\0\377}\245P\377"
- "\0S\253\377\353\353\0\377\353\353\0\377}\242M\377\353\353\0\377n\226"
- "e\377q\227\250\377\353\353\0\377\301\317\"\377\254\301,\377\353\353\0"
- "\377\77xy\377\0O\247\377\353\353\0\377\353\353\0\377\254\302.\377\254"
- "\304/\377\254\304/\377\276\3172\377\300\316]\377I\207\302\377\77\201"
- "\205\377\353\353\0\377\254\303.\377\215\257F\377\353\353\0\377^\220g"
- "\377\77~\201\377\353\353\0\377\254\3050\377\0]\266\377\0`\274\377\0_"
- "\271\377n\241c\377\353\353\0\377n\244f\377\0k\306\377\0o\313\377\0v\323"
- "\377\1x\325\377\1x\327\377\1u\323\377\1m\310\377n\244f\377\353\353\0"
- "\377\215\261G\377\1W\257\377\235\2719\377\353\353\0\377n\231Y\377\1R"
- "\247\377n\230Y\377\353\353\0\377\314\326\26\377\255\302-\377\255\303"
- "-\377\255\303-\377\255\303.\3771u\212\377\2V\253\377\255\302,\377\353"
- "\353\0\377n\230V\377\77yv\377\77xu\377_\214_\377\353\353\0\377\314\326"
- "\25\377\1L\234\3770l}\377\333\340\12\377\353\353\0\377\353\353\0\377"
- "\274\313\37\377~\237G\377\77uo\377\2M\233\377\2L\233\377\255\300'\377"
- "\353\353\0\377@uo\377@vo\377\353\353\0\377\274\313\36\377\2M\232\377"
- "\2P\234\377\2O\234\377\2M\231\377\1K\226\377\274\312\35\377\353\353\0"
- "\377\77oe\377n\220I\377\353\353\0\377n\216F\377\314\324\21\377\353\353"
- "\0\377\37Us\377n\217G\377\353\353\0\377n\224M\377\0N\226\377\0S\234\377"
- "\0V\237\377\0Y\243\377\0Z\245\377\0Z\244\377\0Z\243\377\0Y\242\377\0"
- "X\241\377\0L\213\330\0\0\0T\0\0\0:\0\0\0\34\0\0\0\10\2Z\243\301\2]\250"
- "\377\2]\247\377\2^\251\377\1]\247\377\1]\251\377\1Y\243\377\1U\237\377"
- "\1S\236\377\77yo\377\353\353\0\377\255\277&\377\0F\216\377\0G\220\377"
- "\0F\220\377\0E\217\377\254\276&\377\353\353\0\377\77nd\377n\217H\377"
- "\353\353\0\377\353\353\0\377\353\353\0\377\353\353\0\377\353\353\0\377"
- "\353\353\0\377\77vq\377\0L\231\377n\225Q\377\353\353\0\377\235\2652\377"
- "/ix\377\353\353\0\377\314\325\24\377\0J\231\377\0K\233\377n\225Q\377"
- "\353\353\0\377\353\353\0\377\353\353\0\377\353\353\0\377\353\353\0\377"
- "\353\353\0\377\77{x\377\0T\247\377\353\353\0\377\353\353\0\377\0\\\260"
- "\377\0^\263\377\0^\262\377\0_\264\377\0`\266\377\254\305/\377\353\353"
- "\0\377\77\201\201\377\0[\257\377\0Z\256\377\0Z\257\377\0Z\257\377\77"
- "\177\200\377\353\353\0\377\254\302-\377\0S\247\377\254\302,\377\353\353"
- "\0\377\353\353\0\377\353\353\0\377\353\353\0\377\353\353\0\377\314\327"
- "\27\377\37k\226\377\0T\253\377\353\353\0\377\353\353\0\377/l\201\377"
- "\353\353\0\377\272\311;\377\232\263k\377\353\353\0\377n\227W\377\254"
- "\300+\377\353\353\0\377\77ww\377\0N\245\377\353\353\0\377\353\353\0\377"
- "\353\353\0\377\353\353\0\377\353\353\0\377\353\353\0\377\322\3325\377"
- "I\206\300\377\77\201\203\377\353\353\0\377\254\302-\377\20]\240\377\333"
- "\341\13\377\333\341\13\377N\206s\377\353\353\0\377\254\304/\377\0\\\264"
- "\377\0`\271\377\0_\270\377n\241c\377\353\353\0\377n\244f\377\0l\305\377"
- "\0p\313\377\0v\323\377\0x\325\377\0y\326\377\0u\321\377\0l\307\377/\177"
- "\230\377\353\353\0\377\333\341\14\377\1U\252\377\333\341\13\377\353\353"
- "\0\377\37e\216\377\1Q\246\377n\230X\377\353\353\0\377\353\353\0\377\353"
- "\353\0\377\353\353\0\377\353\353\0\377\353\353\0\377\77~{\377\1U\250"
- "\377\255\302+\377\353\353\0\377\353\353\0\377\353\353\0\377\353\353\0"
- "\377\353\353\0\377\353\353\0\377N\200g\377\0K\232\377\0K\233\377\37_"
- "\204\377n\224Q\377\274\313\37\377\353\353\0\377\353\353\0\377\353\353"
- "\0\377^\211Z\377\0H\226\377\254\276&\377\353\353\0\377\77sl\377\77sm"
- "\377\353\353\0\377\254\300'\377\0J\225\377\0L\227\377\0L\227\377\0J\224"
- "\377\0H\221\377\254\276&\377\353\353\0\377\77mc\377n\217G\377\353\353"
- "\0\377n\215D\377\77k^\377\353\353\0\377\254\274\"\377n\216E\377\353\353"
- "\0\377n\224L\377\0L\224\377\0R\231\377\0V\236\377\0Y\243\377\0[\246\377"
- "\0[\245\377\1[\245\377\1[\245\377\2Z\243\377\2O\215\330\0\0\0U\0\0\0"
- "<\0\0\0\34\0\0\0\10\0Y\241\301\0[\246\377\0[\245\377\0\\\250\377\0\\"
- "\246\377\0[\247\377\0X\242\377\0U\236\377\0S\235\377\77yo\377\353\353"
- "\0\377\254\300'\377\0G\217\377\0G\221\377\0G\220\377\0F\217\377\314\325"
- "\23\377\353\353\0\377\37Yx\377n\220J\377\353\353\0\377n\221J\377\0F\221"
- "\377\0I\224\377\0K\230\377\0M\233\377\0P\235\377\0O\234\377\37b\206\377"
- "\353\353\0\377\353\353\0\377\215\253=\377\353\353\0\377}\240H\377\0M"
- "\234\377\0N\236\377n\226S\377\353\353\0\377n\226S\377\0O\237\377\0O\241"
- "\377\0P\242\377\0Q\243\377\0U\247\377\0V\253\377\353\353\0\377\353\353"
- "\0\377\0\\\262\377\0^\263\377\0]\262\377\0_\265\377\0`\267\377\215\263"
- "H\377\353\353\0\377n\237_\377\0]\264\377\0[\262\377\0\\\263\377\0\\\262"
- "\377n\236_\377\353\353\0\377\215\257E\377\0V\256\377\254\303.\377\353"
- "\353\0\377\215\260F\377n\237a\377n\241c\377^\227n\377\20g\252\377\0_"
- "\270\377\0\\\265\377\353\353\0\377\353\353\0\377\0Q\247\377\321\332\27"
- "\377\353\353\0\377\276\314<\377\353\353\0\377\37e\221\377\254\302-\377"
- "\353\353\0\377\77z{\377\0S\254\377\353\353\0\377\353\353\0\377\0V\256"
- "\377\0Y\261\377\0Z\262\377H\205\276\377\227\263\314\377M\213\305\377"
- "\77\204\210\377\353\353\0\377\254\304/\377\0W\261\377n\234]\377\353\353"
- "\0\377\274\315#\377\353\353\0\377\254\3050\377\0_\270\377\0d\276\377"
- "\0d\275\377n\244e\377\353\353\0\377n\247j\377\0n\311\377\0s\316\377\0"
- "x\325\377\0z\327\377\0{\330\377\0v\323\377\0n\311\377\0f\300\377\314"
- "\330\30\377\353\353\0\377\215\257D\377\353\353\0\377\274\315\"\377\0"
- "R\247\377\0S\247\377n\232Z\377\353\353\0\377n\231X\377\0S\247\377\0T"
- "\251\377\0T\250\377\0U\251\377\0V\251\377\0V\251\377\254\302,\377\353"
- "\353\0\377n\231W\377\77{x\377\77zw\377n\230U\377\353\353\0\377\333\341"
- "\12\377\0M\234\377\77wr\377\77up\377\0K\232\377\0K\234\377\20V\221\377"
- "n\225P\377\353\353\0\377\333\340\12\377\0I\227\377\254\277'\377\353\353"
- "\0\377\77tm\377\37_\202\377\353\353\0\377\333\340\12\377\0L\227\377\0"
- "N\232\377\0N\232\377\0L\226\377\0I\223\377\333\340\12\377\353\353\0\377"
- "\37Yx\377n\221J\377\353\353\0\377n\217G\377\0\77\205\377\235\261,\377"
- "\353\353\0\377\274\311\32\377\353\353\0\377n\224L\377\0L\225\377\0Q\232"
- "\377\0U\235\377\0Y\242\377\0Z\244\377\0Z\242\377\0Z\243\377\0Y\243\377"
- "\0X\241\377\0L\213\330\0\0\0U\0\0\0<\0\0\0\34\0\0\0\10\0Z\242\301\0\\"
- "\250\377\0\\\247\377\0]\251\377\0\\\250\377\0]\250\377\0Y\244\377\0V"
- "\241\377\0U\241\377\77zr\377\353\353\0\377\254\300(\377\1I\222\377\1"
- "J\225\377\1I\222\377n\225N\377\353\353\0\377\314\325\24\377\1G\220\377"
- "n\223M\377\353\353\0\377n\224N\377\1J\227\377\1N\233\377\1Q\236\377\1"
- "R\241\377\1T\242\377\1S\242\377\1R\241\377\274\314\40\377\353\353\0\377"
- "\353\353\0\377\353\353\0\3770p\202\377\1S\243\377\1U\246\377n\232W\377"
- "\353\353\0\377n\231V\377\1S\246\377\1T\250\377\1U\250\377\1V\252\377"
- "\1X\255\377\1Z\257\377\353\353\0\377\353\353\0\377\1^\263\377\1^\264"
- "\377\0^\263\377\0_\266\377\0a\271\377^\230n\377\353\353\0\377\314\330"
- "\30\377\20h\253\377\0]\263\377\0_\265\377\20g\250\377\314\330\30\377"
- "\353\353\0\377^\225k\377\0[\263\377\254\3040\377\353\353\0\377\77\204"
- "\207\377\0d\276\377\0g\301\377\0g\301\377\0f\277\377\0f\301\377\0c\275"
- "\377\353\353\0\377\353\353\0\377\0V\256\377\261\304X\377\353\353\0\377"
- "\353\353\0\377\274\315\"\377\0T\253\377\254\303.\377\353\353\0\377\77"
- "~\177\377\0X\261\377\353\353\0\377\353\353\0\377\0X\260\377\0\\\264\377"
- "\0\\\265\377L\211\302\377\237\271\320\377R\221\311\377\77\206\211\377"
- "\353\353\0\377\254\3051\377\0\\\265\377\0Z\263\377\274\316#\377\353\353"
- "\0\377\353\353\0\377\254\3051\377\0a\272\377\0f\301\377\0h\301\377n\245"
- "g\377\353\353\0\377n\250k\377\0p\314\377\0u\317\377\0y\326\377\0|\330"
- "\377\0}\333\377\0w\324\377\0p\313\377\0h\302\377}\252U\377\353\353\0"
- "\377\353\353\0\377\353\353\0\377n\234\\\377\0W\255\377\0X\254\377n\235"
- "]\377\353\353\0\377n\234[\377\0W\254\377\0X\255\377\0X\255\377\0Y\256"
- "\377\0Z\257\377\0Z\256\377\254\304.\377\353\353\0\377\77~}\377\0X\255"
- "\377\0W\252\377\0U\251\377\274\315!\377\353\353\0\377\77{w\377\333\341"
- "\13\377\353\353\0\377/m\177\377\0P\241\377\0O\240\377\20W\222\377\353"
- "\353\0\377\353\353\0\377\0N\234\377\254\300)\377\353\353\0\377\77wr\377"
- "\0N\233\377\314\326\25\377\353\353\0\377n\227S\377\0O\235\377\0O\234"
- "\377\0N\231\377n\226Q\377\353\353\0\377\314\325\23\377\0H\221\377n\224"
- "M\377\353\353\0\377n\221K\377\0C\214\377\37Yx\377\333\340\11\377\353"
- "\353\0\377\353\353\0\377n\225N\377\0P\230\377\0S\234\377\0V\241\377\0"
- "Z\244\377\0[\246\377\0[\244\377\0[\245\377\0[\245\377\0Y\243\377\0M\214"
- "\330\0\0\0U\0\0\0<\0\0\0\34\0\0\0\10\1Z\243\301\1]\250\377\1]\250\377"
- "\1^\251\377\1]\250\377\2]\247\377\2Z\244\377\2X\242\377\2V\241\377@z"
- "r\377\353\353\0\377\333\340\12\377\255\300'\377\255\300(\377\314\326"
- "\24\377\353\353\0\377\353\353\0\377@wo\377\2K\225\377o\226P\377\353\353"
- "\0\377\314\326\24\377\255\301)\377\255\301*\377\255\302*\377\255\303"
- "+\377~\245L\377\1V\244\377\1U\245\377n\231V\377\353\353\0\377\353\353"
- "\0\377\314\327\26\377\1U\246\377\0W\250\377\0X\252\377n\233Z\377\353"
- "\353\0\377\314\327\26\377\254\303-\377\254\303-\377\254\303-\377\254"
- "\304-\377}\247Q\377\0Z\257\377\353\353\0\377\353\353\0\377\254\305/\377"
- "\254\3050\377\254\305/\377\254\3060\377}\253W\377\0a\270\377\255\306"
- "1\377\353\353\0\377\314\330\31\377n\240a\377n\241b\377\314\331\30\377"
- "\353\353\0\377\255\3062\377\1a\272\377\1b\274\377\255\3072\377\353\353"
- "\0\377@\213\215\377\2l\306\377\2p\313\377\2p\313\377\3p\312\377\3q\313"
- "\377\3l\307\377\353\353\0\377\353\353\0\377(v\276\377\245\274\242\377"
- "\353\353\0\377\353\353\0\377n\240b\377\1^\267\377\254\3051\377\353\353"
- "\0\377\77\204\207\377\0_\272\377\353\353\0\377\353\353\0\377\254\305"
- "0\377\254\3061\377\254\3061\377\301\3224\377\330\3378\377\215\264\246"
- "\377\77\211\215\377\353\353\0\377\254\3073\377\0b\274\377\0b\274\377"
- "\77\205\210\377\353\353\0\377\353\353\0\377\254\3073\377\0h\301\377\1"
- "l\310\377\1m\310\377n\250k\377\353\353\0\377o\253n\377\2u\320\377\2y"
- "\324\377\2}\332\377\3\200\335\377\2\202\341\377\2{\331\377\1t\321\377"
- "\0n\310\377/\201\231\377\353\353\0\377\353\353\0\377\353\353\0\377\37"
- "q\236\377\0]\263\377\0]\262\377n\237`\377\353\353\0\377\314\330\27\377"
- "\255\304.\377\255\304.\377\255\304.\377\255\305/\377~\250R\377\1^\262"
- "\377\255\305/\377\353\353\0\377\77\203\202\377\2_\264\377\1]\260\377"
- "\1\\\257\377\255\304.\377\353\353\0\377\77~z\377n\233Y\377\353\353\0"
- "\377\333\341\13\377~\244M\377n\231W\377\314\326\25\377\353\353\0\377"
- "\235\2675\377\1R\241\377\254\302*\377\353\353\0\377\77{v\377\0Q\240\377"
- "\77zt\377\353\353\0\377\353\353\0\377\215\255@\377n\230T\377\215\254"
- ">\377\353\353\0\377\353\353\0\377\77vm\377\0M\227\377n\226Q\377\353\353"
- "\0\377n\225N\377\1I\222\377\1H\221\377n\224L\377\353\353\0\377\353\353"
- "\0\377n\227P\377\1Q\232\377\1T\235\377\1W\241\377\1Z\244\377\1[\245\377"
- "\1Z\243\377\1[\244\377\1Z\243\377\1Y\241\377\1M\213\330\0\0\0U\0\0\0"
- "<\0\0\0\34\0\0\0\10\3[\244\301\3]\247\377\2]\250\377\2^\252\377\2^\251"
- "\377\1]\251\377\1[\245\377\1Y\244\377\1X\244\377\77|u\377\353\353\0\377"
- "\353\353\0\377\353\353\0\377\353\353\0\377\353\353\0\377\235\2672\377"
- "\77yr\377\0P\234\377\0O\231\377n\230S\377\353\353\0\377\353\353\0\377"
- "\353\353\0\377\353\353\0\377\353\353\0\377\353\353\0\377\254\304,\377"
- "\0W\244\377\0W\246\377\37j\216\377\353\353\0\377\353\353\0\377}\246M"
- "\377\0Z\253\377\0[\254\377\0]\257\377n\236[\377\353\353\0\377\353\353"
- "\0\377\353\353\0\377\353\353\0\377\353\353\0\377\353\353\0\377\254\305"
- "/\377\0]\262\377\353\353\0\377\353\353\0\377\353\353\0\377\353\353\0"
- "\377\353\353\0\377\353\353\0\377\254\3072\377\0c\273\377\20m\257\377"
- "}\254W\377\353\353\0\377\353\353\0\377\353\353\0\377\353\353\0\377~\255"
- "Z\377\21p\264\377\1g\300\377\1i\303\377\255\3115\377\353\353\0\377\77"
- "\217\223\377\1r\316\377\2u\322\377\2u\323\377\2u\321\377\2v\323\377\2"
- "s\316\377\353\353\0\377\353\353\0\377p\243\321\377\253\302\325\377\331"
- "\340\33\377\353\353\0\377!y\247\377\2g\301\377\255\3104\377\353\353\0"
- "\377@\212\216\377\2i\305\377\353\353\0\377\353\353\0\377\353\353\0\377"
- "\353\353\0\377\353\353\0\377\353\353\0\377\353\353\0\377\245\303\236"
- "\377A\217\224\377\353\353\0\377\255\3126\377\3m\310\377\3m\310\377\3"
- "k\306\377\216\270P\377\353\353\0\377\255\3126\377\3q\314\377\3s\317\377"
- "\3t\320\377p\254o\377\353\353\0\377p\256q\377\4z\325\377\4|\327\377\4"
- "\200\336\377\3\202\340\377\3\204\343\377\3~\334\377\2z\326\377\2r\317"
- "\377\2l\307\377\314\332\32\377\353\353\0\377\274\320%\377\1g\301\377"
- "\0e\275\377\0d\275\377n\242d\377\353\353\0\377\353\353\0\377\353\353"
- "\0\377\353\353\0\377\353\353\0\377\353\353\0\377\254\3060\377\0b\266"
- "\377\254\3060\377\353\353\0\377\77\207\206\377\0d\272\377\0c\270\377"
- "\0a\266\377}\252T\377\353\353\0\377_\225h\377\1Z\254\377~\246O\377\353"
- "\353\0\377\353\353\0\377\353\353\0\377\353\353\0\377\255\303,\377\21"
- "`\233\377\1W\247\377\255\303-\377\353\353\0\377\77\200{\377\1X\247\377"
- "\1W\246\377\77~z\377\314\327\26\377\353\353\0\377\353\353\0\377\353\353"
- "\0\377\314\327\25\377@{t\377\2R\235\377\2U\240\377o\233U\377\353\353"
- "\0\377o\231S\377\3R\233\377\4Q\233\377\3O\227\377\314\326\24\377\353"
- "\353\0\377o\232S\377\3V\240\377\4Y\242\377\4[\245\377\4^\247\377\4^\250"
- "\377\4]\245\377\4]\246\377\4]\246\377\3[\244\377\3O\215\330\0\0\0U\0"
- "\0\0<\0\0\0\34\0\0\0\10\3\\\244\301\2]\247\377\3^\251\377\2_\253\377"
- "\2_\253\377\2_\251\377\2]\246\377\2\\\247\377\1[\250\377\1X\244\377\2"
- "U\240\377\1T\240\377\2S\236\377\2T\240\377\2S\236\377\2U\240\377\2W\244"
- "\377\1X\245\377\1V\242\377\1X\245\377\1V\243\377\1V\244\377\1W\244\377"
- "\0Y\246\377\0Z\251\377\0[\252\377\0\\\252\377\0]\254\377\0^\256\377\0"
- "]\256\377\0]\256\377\0_\262\377\0^\256\377\0a\263\377\0b\264\377\0c\266"
- "\377\0a\263\377\0`\264\377\0`\263\377\0`\263\377\0`\264\377\0a\265\377"
- "\0a\265\377\0b\267\377\0e\272\377\0b\266\377\0a\266\377\0d\273\377\0"
- "d\273\377\0e\272\377\0f\275\377\0i\302\377\0h\276\377\0i\300\377\0h\300"
- "\377\20q\263\377\77\211\212\377\77\213\215\377\21r\263\377\1k\305\377"
- "\1m\305\377\1l\305\377\1n\307\377\1p\312\377\2p\313\377\2s\315\377\2"
- "w\322\377\2y\325\377\2z\326\377\3y\325\377\3{\327\377\2w\322\377\2t\320"
- "\377\2q\314\377\274\321\343\377\304\324\342\3771\207\320\377\1l\307\377"
- "\2o\312\377\2o\312\377\1p\314\377\1o\313\377\1p\315\377\1q\317\377\1"
- "n\313\377\1n\313\377\1n\311\377\2p\315\377\2o\311\377\32~\322\377\307"
- "\326\343\377\314\332\346\377\2v\324\377\2u\322\377\2v\323\377\2u\321"
- "\377\3u\322\377\3t\320\377\3t\320\377\3u\321\377\2u\320\377\2v\323\377"
- "\3x\325\377\3x\325\377\2w\323\377\2y\326\377\2{\327\377\2z\327\377\2"
- "|\331\377\1\200\334\377\1\201\336\377\1\202\341\377\1~\332\377\0z\330"
- "\377\0v\323\377\0q\313\377\0o\312\377\0l\305\377\0k\302\377\0n\311\377"
- "\0l\304\377\0j\302\377\0k\302\377\0g\275\377\0e\275\377\0e\273\377\0"
- "d\272\377\0d\271\377\0d\271\377\0d\270\377\0f\272\377\0e\271\377\0f\272"
- "\377\0f\272\377\0h\275\377\0f\273\377\0e\267\377\0c\266\377\0b\264\377"
- "\0_\257\377\0^\260\377\0\\\255\377\20e\241\377\77\201~\377\77\201|\377"
- "\20c\235\377\0Y\250\377\0[\251\377\0Z\252\377\0Z\250\377\0[\253\377\0"
- "[\252\377\0[\250\377\0Y\247\377\0Y\247\377\0V\243\377/t\203\377\77~w"
- "\377/s\200\377\0T\237\377\0T\240\377\0T\237\377\0V\242\377\0W\242\377"
- "\0U\240\377\0T\236\377\0U\237\377\0S\235\377\0R\233\377\0P\231\377\0"
- "Q\233\377\0T\235\377\0V\237\377\0W\240\377\0X\242\377\0Y\244\377\0[\245"
- "\377\0X\241\377\0X\241\377\0X\241\377\0W\237\377\0K\212\330\0\0\0U\0"
- "\0\0<\0\0\0\34\0\0\0\10\4[\244\301\4]\246\377\4^\247\377\4_\251\377\4"
- "_\251\377\4_\251\377\4^\247\377\4]\251\377\4^\252\377\4[\247\377\3Y\243"
- "\377\3Y\245\377\2X\244\377\2Y\245\377\2X\243\377\2Z\245\377\1\\\252\377"
- "\1]\252\377\0[\251\377\0]\255\377\0\\\253\377\0]\253\377\0\\\252\377"
- "\0^\255\377\0_\256\377\0`\257\377\0`\257\377\0b\262\377\0c\264\377\0"
- "b\263\377\0c\264\377\0d\266\377\0b\263\377\0e\267\377\0f\270\377\0g\273"
- "\377\0e\270\377\0f\271\377\0e\271\377\0f\272\377\0f\272\377\0g\274\377"
- "\0g\275\377\0h\275\377\0j\300\377\0h\275\377\0h\275\377\0j\301\377\0"
- "j\300\377\0k\301\377\0l\303\377\0n\307\377\0l\304\377\0m\306\377\0m\306"
- "\377\0m\307\377\0l\304\377\0n\307\377\0o\307\377\0r\316\377\0s\316\377"
- "\0s\315\377\0u\320\377\0w\323\377\0w\323\377\0y\326\377\0{\330\377\0"
- "}\332\377\0~\334\377\0}\331\377\0}\333\377\0{\331\377\0w\324\377E\231"
- "\334\377\334\345\356\377\313\334\352\377\0t\321\377\0r\316\377\0t\321"
- "\377\0t\317\377\0u\321\377\0t\320\377\0u\320\377\0u\323\377\0s\316\377"
- "\0s\317\377\0r\315\377\0t\321\377\0r\313\377\0u\321\377\312\333\352\377"
- "\334\345\356\377*\214\330\377\0v\322\377\0x\325\377\0v\321\377\0w\323"
- "\377\0u\321\377\0t\317\377\0v\322\377\0v\321\377\0w\322\377\0x\324\377"
- "\0x\324\377\0w\322\377\0x\324\377\0y\325\377\0z\324\377\0z\324\377\0"
- "}\332\377\0\177\334\377\0\200\335\377\0|\331\377\0|\330\377\0x\323\377"
- "\0u\320\377\0t\316\377\0r\313\377\0q\311\377\0t\316\377\0q\313\377\0"
- "p\311\377\0p\311\377\0m\305\377\0m\305\377\0l\305\377\0l\303\377\0k\303"
- "\377\0j\302\377\0j\300\377\0l\302\377\0l\301\377\0m\304\377\0n\304\377"
- "\0o\307\377\0n\305\377\0l\301\377\0k\301\377\0j\277\377\0f\271\377\0"
- "e\272\377\0d\270\377\0d\267\377\0c\266\377\0a\264\377\0`\262\377\0a\263"
- "\377\0b\263\377\0b\264\377\0a\263\377\0b\264\377\0a\262\377\0a\261\377"
- "\0`\260\377\0_\257\377\0\\\254\377\0]\253\377\0\\\252\377\0Z\250\377"
- "\0Z\247\377\0Z\250\377\0Z\246\377\0[\251\377\0\\\251\377\0Z\247\377\0"
- "Y\245\377\0Y\245\377\0X\243\377\0Y\244\377\0V\237\377\0X\243\377\0X\242"
- "\377\0Y\243\377\0Y\243\377\0Z\244\377\0[\246\377\0[\245\377\0Y\241\377"
- "\0Y\242\377\0X\241\377\0W\237\377\0L\212\330\0\0\0U\0\0\0<\0\0\0\34\0"
- "\0\0\10\0X\240\301\0Y\241\377\0Z\244\377\0\\\246\377\0\\\247\377\0\\"
- "\247\377\0\\\246\377\0]\250\377\0]\251\377\0\\\251\377\0[\246\377\1["
- "\251\377\1\\\250\377\1]\252\377\2\\\250\377\2]\253\377\2a\260\377\3b"
- "\261\377\3a\256\377\3c\262\377\4c\262\377\4c\263\377\4c\261\377\4d\264"
- "\377\3e\264\377\3e\265\377\3f\265\377\3i\272\377\3j\273\377\3j\273\377"
- "\3j\275\377\4l\300\377\3k\275\377\3m\301\377\3m\302\377\2n\304\377\2"
- "l\300\377\2m\302\377\2m\303\377\2l\302\377\1l\302\377\1m\304\377\1m\303"
- "\377\1m\305\377\1o\307\377\1n\304\377\0n\305\377\0p\311\377\0p\310\377"
- "\0p\310\377\0q\312\377\0t\317\377\0q\312\377\0s\314\377\0s\314\377\0"
- "t\315\377\0q\311\377\0r\313\377\0s\314\377\0w\322\377\0w\322\377\0w\323"
- "\377\0x\323\377\0z\327\377\0{\327\377\0|\330\377\0}\331\377\0\177\335"
- "\377\0\177\335\377\0}\332\377\0\177\334\377\0~\333\377\0{\330\377\204"
- "\275\350\377\353\360\365\377\221\303\351\377\0z\327\377\0x\324\377\0"
- "z\326\377\0y\325\377\0z\327\377\0z\326\377\0{\327\377\0{\331\377\0y\326"
- "\377\0z\327\377\0x\324\377\0z\330\377\0w\322\377\0y\326\377\235\310\352"
- "\377\350\356\364\377g\257\345\377\0{\331\377\0|\332\377\0{\330\377\0"
- "}\333\377\0}\333\377\0|\330\377\0|\332\377\0{\327\377\0}\333\377\0}\333"
- "\377\0}\333\377\0|\330\377\0~\334\377\0~\333\377\0}\330\377\0|\331\377"
- "\0\177\334\377\0\200\335\377\0\200\336\377\0\177\332\377\0~\334\377\0"
- "|\330\377\0z\326\377\0y\325\377\0w\321\377\0w\321\377\0z\325\377\0x\323"
- "\377\0v\320\377\0v\321\377\0s\315\377\0s\316\377\0r\313\377\0r\313\377"
- "\0q\312\377\0p\310\377\0o\307\377\0q\312\377\0q\310\377\1s\313\377\1"
- "s\313\377\1t\315\377\1s\313\377\2q\310\377\2r\311\377\2p\306\377\2l\301"
- "\377\2m\302\377\2l\302\377\3k\300\377\2j\276\377\2h\273\377\2h\272\377"
- "\1h\273\377\2h\273\377\1h\272\377\1h\273\377\1g\272\377\0g\271\377\0"
- "f\270\377\0e\266\377\0d\266\377\0b\262\377\0a\261\377\0`\261\377\0^\256"
- "\377\0^\254\377\0_\255\377\0^\252\377\0_\255\377\0_\254\377\0^\253\377"
- "\0]\251\377\0\\\250\377\0Z\245\377\0[\246\377\0X\241\377\0Y\242\377\0"
- "Y\242\377\0X\242\377\0X\240\377\0Y\241\377\0Y\242\377\0Y\242\377\0W\237"
- "\377\0X\240\377\0X\240\377\0V\235\377\0K\211\330\0\0\0U\0\0\0<\0\0\0"
- "\34\0\0\0\10\1Y\241\301\1Y\242\377\1[\245\377\0\\\247\377\0\\\247\377"
- "\0]\250\377\0[\246\377\0^\251\377\0]\252\377\0^\252\377\0\\\251\377\0"
- "^\254\377\0^\254\377\0_\255\377\0_\254\377\0`\256\377\0c\262\377\0c\264"
- "\377\0c\261\377\0d\264\377\1d\263\377\1d\265\377\1c\263\377\1e\265\377"
- "\1e\265\377\1f\265\377\1f\265\377\1i\272\377\1j\273\377\1k\274\377\2"
- "l\276\377\2m\301\377\2l\277\377\1m\302\377\1n\303\377\1o\304\377\1n\303"
- "\377\1o\305\377\1o\305\377\0p\306\377\0n\305\377\0o\306\377\0p\306\377"
- "\0q\310\377\0r\313\377\0p\307\377\0q\311\377\0t\314\377\0s\313\377\0"
- "s\313\377\0u\315\377\0w\322\377\0v\320\377\0w\320\377\0w\321\377\0w\322"
- "\377\0u\315\377\0v\317\377\0x\322\377\0{\327\377\0{\326\377\0{\327\377"
- "\0{\326\377\0}\332\377\1}\332\377\1~\332\377\1\200\332\377\1\201\335"
- "\377\1\201\336\377\1\200\333\377\2\201\336\377\2\177\332\377\2\177\334"
- "\377\270\332\362\377\365\370\372\377]\255\347\377\2\200\334\377\3~\330"
- "\377\3\177\334\377\3~\332\377\2\200\335\377\2~\334\377\2\200\337\377"
- "\2\201\337\377\2\177\334\377\2\177\335\377\2\177\333\377\2\200\337\377"
- "\2~\332\377\2\177\335\377j\263\351\377\362\366\371\377\306\341\365\377"
- "\2\201\337\377\2\202\342\377\2\201\337\377\2\203\342\377\2\203\342\377"
- "\2\201\337\377\2\202\341\377\2\201\336\377\1\203\342\377\1\202\341\377"
- "\2\202\342\377\1\200\336\377\1\202\342\377\1\202\340\377\1\200\336\377"
- "\1\200\335\377\1\202\340\377\1\203\341\377\1\203\341\377\1\200\336\377"
- "\1\202\341\377\1\177\335\377\1~\333\377\1~\334\377\1}\327\377\1{\327"
- "\377\1\177\334\377\1|\331\377\1z\325\377\1|\330\377\1x\322\377\1y\324"
- "\377\1x\322\377\1w\321\377\2v\317\377\2t\314\377\2t\313\377\2v\316\377"
- "\2u\315\377\2w\316\377\2w\317\377\3x\320\377\3w\316\377\3u\313\377\3"
- "u\314\377\3t\313\377\3p\305\377\2r\307\377\2q\307\377\2o\305\377\2n\303"
- "\377\2l\301\377\2l\277\377\2k\276\377\2m\300\377\2k\276\377\3l\300\377"
- "\3l\276\377\3k\276\377\2j\274\377\1i\273\377\1h\272\377\1f\270\377\1"
- "f\267\377\1e\266\377\0c\263\377\0c\262\377\0c\263\377\0b\260\377\0c\262"
- "\377\0b\262\377\0b\260\377\0a\256\377\0`\255\377\0_\253\377\0^\255\377"
- "\0\\\247\377\0\\\247\377\0\\\251\377\0\\\247\377\0[\246\377\0Z\244\377"
- "\0[\245\377\0Z\244\377\0W\237\377\0W\240\377\0V\236\377\0U\234\377\0"
- "I\207\330\0\0\0U\0\0\0<\0\0\0\34\0\0\0\10\0X\240\301\0Y\242\377\0[\245"
- "\377\0\\\247\377\0\\\247\377\1]\250\377\1]\247\377\1_\252\377\1^\251"
- "\377\1_\254\377\1`\254\377\1a\255\377\1b\257\377\0c\260\377\0b\257\377"
- "\0c\261\377\0d\264\377\0f\267\377\0e\264\377\0g\270\377\0f\266\377\0"
- "g\271\377\1g\267\377\1h\272\377\1i\273\377\1h\270\377\1i\272\377\1j\273"
- "\377\1l\277\377\1m\300\377\1n\301\377\1o\304\377\1m\301\377\1o\304\377"
- "\1p\305\377\0q\306\377\0p\304\377\0q\306\377\0q\310\377\0r\311\377\0"
- "r\311\377\0r\311\377\0r\311\377\0s\312\377\0t\315\377\0s\312\377\0t\314"
- "\377\0v\317\377\0u\316\377\0v\317\377\0v\317\377\0y\323\377\0x\322\377"
- "\0x\322\377\0x\322\377\0y\324\377\0w\320\377\0x\322\377\0y\323\377\0"
- "|\330\377\0|\326\377\0|\327\377\0|\327\377\0}\331\377\0~\331\377\0~\332"
- "\377\0~\333\377\0\200\335\377\0\201\336\377\0\177\334\377\0\202\340\377"
- "\0\177\333\377\0\200\336\377\374\375\376\377\374\375\376\377/\232\347"
- "\377\0\201\336\377\0\177\333\377\0\201\337\377\0\200\336\377\0\202\341"
- "\377\0\201\337\377\1\203\343\377\1\204\343\377\1\203\341\377\1\204\342"
- "\377\2\202\340\377\2\204\344\377\2\201\336\377\2\204\342\377\40\223\346"
- "\377\372\373\375\377\373\374\375\377\37\221\344\377\1\204\345\377\1\202"
- "\340\377\0\204\343\377\0\204\344\377\0\202\341\377\0\203\342\377\0\202"
- "\340\377\0\204\344\377\0\203\341\377\0\203\342\377\0\200\336\377\0\203"
- "\343\377\0\202\340\377\0\200\336\377\0\201\336\377\0\201\337\377\0\202"
- "\340\377\0\201\337\377\0\200\335\377\0\202\337\377\0~\333\377\1~\333"
- "\377\1~\333\377\1}\331\377\1}\330\377\1~\332\377\1|\330\377\1y\323\377"
- "\1}\327\377\1y\323\377\1z\325\377\1y\323\377\1y\322\377\1w\320\377\1"
- "u\315\377\1t\313\377\1v\315\377\1u\312\377\1v\314\377\2u\315\377\2v\315"
- "\377\3u\313\377\3s\310\377\3u\313\377\3t\312\377\3r\305\377\3r\307\377"
- "\3s\310\377\3r\307\377\3p\303\377\3o\302\377\3o\302\377\3m\300\377\3"
- "n\300\377\3m\277\377\2m\300\377\1k\276\377\1k\275\377\2k\275\377\2j\274"
- "\377\2j\274\377\2h\271\377\2h\271\377\2g\270\377\2f\266\377\1f\264\377"
- "\1f\264\377\1c\261\377\1d\263\377\1c\262\377\1c\261\377\1b\257\377\1"
- "a\256\377\1`\255\377\0`\256\377\0]\250\377\0]\251\377\0]\251\377\0\\"
- "\250\377\0\\\247\377\1[\245\377\1\\\245\377\1\\\246\377\1X\240\377\1"
- "Y\242\377\1W\237\377\1V\235\377\0J\207\330\0\0\0U\0\0\0<\0\0\0\34\0\0"
- "\0\10\1Y\242\301\1Z\243\377\1\\\246\377\1]\247\377\1]\250\377\1^\251"
- "\377\1]\250\377\1_\253\377a\233\313\377\300\330\353\377\300\330\353\377"
- "\300\330\354\377\300\330\354\377\300\331\354\377\300\330\354\377\300"
- "\331\354\377\300\331\355\377\300\331\356\377\277\331\355\377\277\332"
- "\356\377\277\331\356\377\277\332\356\377\277\331\356\377\277\332\357"
- "\377\277\332\357\377\277\332\356\377\277\332\356\377\277\332\357\377"
- "\277\333\360\377\277\333\360\377\277\333\360\377\277\333\361\377\277"
- "\333\360\377\277\333\361\377\277\334\361\377\277\334\361\377\277\334"
- "\361\377\277\334\361\377\277\334\362\377\277\334\362\377\277\334\362"
- "\377\277\334\362\377\277\334\362\377\277\335\362\377\277\335\363\377"
- "\277\335\362\377\277\335\363\377\277\335\364\377\277\335\363\377\277"
- "\335\364\377\277\336\364\377\277\336\365\377\277\336\364\377\277\336"
- "\365\377\277\336\365\377\276\335\365\377\276\335\364\377\276\335\365"
- "\377\276\335\365\377\277\337\366\377\277\337\366\377\277\337\366\377"
- "\277\337\366\377\277\337\366\377\277\337\366\377\277\337\367\377\277"
- "\337\366\377\277\337\367\377\277\340\367\377\277\337\367\377\277\340"
- "\367\377\277\337\366\377\277\340\367\377\377\377\377\377\377\377\377"
- "\377\0\202\341\377\0\201\336\377\0\177\333\377\0\201\335\377\0\177\334"
- "\377\0\201\337\377\0\200\335\377\0\202\341\377\0\203\341\377\0\202\337"
- "\377\0\203\341\377\0\201\336\377\0\203\342\377\0\201\335\377\0\203\341"
- "\377\0\204\342\377\277\340\370\377\377\377\377\377\317\350\371\377\277"
- "\340\370\377\277\340\367\377\277\340\370\377\277\340\370\377\277\340"
- "\367\377\277\340\370\377\277\340\370\377\277\341\371\377\277\340\370"
- "\377\277\340\370\377\277\340\367\377\277\340\370\377\277\340\370\377"
- "\277\340\367\377\277\340\367\377\277\340\367\377\277\340\370\377\300"
- "\340\367\377\300\340\367\377\300\340\370\377\300\340\367\377\300\340"
- "\367\377\300\340\367\377\300\337\367\377\300\337\366\377\300\340\367"
- "\377\300\337\366\377\300\336\365\377\300\340\366\377\300\337\365\377"
- "\300\337\366\377\300\337\365\377\300\337\365\377\300\336\365\377\300"
- "\336\364\377\301\336\363\377\301\336\364\377\301\336\363\377\301\336"
- "\364\377\301\336\364\377\301\336\364\377\301\336\363\377\301\335\363"
- "\377\301\336\363\377\301\335\363\377\301\335\362\377\301\335\362\377"
- "\301\335\362\377\300\334\362\377\300\334\362\377\300\333\361\377\300"
- "\333\361\377\301\334\361\377\301\334\361\377\301\334\360\377\301\334"
- "\361\377\301\333\360\377\301\333\360\377\301\333\360\377\301\333\357"
- "\377\301\333\357\377\300\332\357\377\300\332\357\377\300\331\357\377"
- "\300\331\356\377\277\331\355\377\300\332\356\377\300\331\355\377\300"
- "\331\355\377\300\331\355\377\300\331\355\377\300\331\354\377\300\330"
- "\354\377\300\330\354\377\300\330\354\377\300\330\352\377\300\330\352"
- "\377\300\330\353\3771|\272\377\2]\251\377\1\\\246\377\1\\\247\377\1["
- "\246\377\1X\241\377\1Y\242\377\1X\241\377\1W\237\377\1K\212\330\0\0\0"
- "U\0\0\0<\0\0\0\34\0\0\0\10\0Y\241\301\0Y\242\377\0[\246\377\0\\\247\377"
- "\0\\\250\377\0]\251\377\0]\250\377\0^\252\377\200\256\324\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\320\350\371\377\4\207\345\377\4\205\342\377\4\203\337\377"
- "\4\204\342\377\5\204\340\377\5\206\343\377\5\205\341\377\5\207\345\377"
- "\5\207\345\377\5\206\344\377\6\207\345\377\6\205\343\377\7\210\345\377"
- "\7\206\342\377\7\207\345\377\7\211\347\377d\265\361\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377@\204\274\377\0[\245\377\0Z\242"
- "\377\0Z\244\377\0Z\243\377\0W\236\377\0X\240\377\0W\236\377\0U\235\377"
- "\0J\210\330\0\0\0U\0\0\0<\0\0\0\34\0\0\0\10\0W\236\301\0W\240\377\0Z"
- "\244\377\0[\245\377\0\\\246\377\0]\250\377\0\\\247\377\0]\251\377\40"
- "q\263\377@\207\300\377@\210\303\377@\211\304\377@\212\305\377@\212\305"
- "\377@\212\306\377A\213\306\377A\214\310\377B\216\311\377B\215\311\377"
- "B\217\313\377B\220\315\377C\221\315\377C\220\314\377C\222\316\377C\222"
- "\317\377C\221\316\377B\221\315\377B\221\316\377A\222\320\377A\222\320"
- "\377A\223\322\377A\224\323\377A\223\322\377A\224\324\377@\225\325\377"
- "@\225\326\377@\225\326\377@\225\325\377@\226\327\377@\227\331\377@\227"
- "\330\377@\227\331\377@\227\331\377@\227\331\377@\231\333\377@\230\332"
- "\377@\231\333\377@\231\334\377@\231\333\377@\232\335\377@\232\335\377"
- "@\231\333\377@\233\336\377@\232\336\377@\233\336\377@\234\340\377@\233"
- "\336\377@\234\340\377@\234\337\377@\233\337\377@\233\336\377@\234\337"
- "\377@\234\340\377@\234\337\377@\235\341\377@\236\343\377@\235\341\377"
- "@\236\343\377@\236\343\377@\235\341\377@\237\344\377@\236\343\377@\236"
- "\344\377@\240\345\377!\217\337\377\2\202\340\377\2\200\334\377\2\177"
- "\332\377\2\200\334\377\2\200\333\377\2\201\336\377\2\200\333\377\2\202"
- "\336\377\2\202\337\377\2\201\335\377\2\202\337\377\2\202\337\377\2\204"
- "\342\377\2\202\336\377\1\205\343\377\1\205\344\377\1\205\345\377@\242"
- "\350\377@\241\350\377@\241\351\377@\242\351\377@\242\351\377@\243\352"
- "\377@\243\352\377A\242\350\377A\243\352\377A\244\354\377A\242\350\377"
- "B\242\350\377B\241\346\377C\243\351\377C\241\346\377C\242\347\377C\242"
- "\347\377C\242\347\377C\241\346\377C\241\345\377C\240\344\377C\242\347"
- "\377B\240\344\377B\240\345\377B\240\345\377A\240\345\377A\236\343\377"
- "A\236\343\377A\236\343\377@\234\340\377@\236\342\377@\234\340\377@\234"
- "\341\377@\234\340\377@\234\337\377@\232\335\377@\230\332\377@\230\332"
- "\377@\230\332\377@\227\330\377@\227\330\377@\227\331\377@\230\331\377"
- "@\226\327\377@\225\324\377@\226\327\377@\225\325\377@\224\323\377@\224"
- "\323\377@\224\323\377@\223\323\377@\223\322\377@\221\320\377@\222\321"
- "\377@\221\320\377@\220\316\377@\217\314\377@\221\317\377@\217\313\377"
- "@\217\313\377@\217\314\377@\216\312\377@\215\310\377@\214\310\377@\214"
- "\307\377@\214\310\377@\213\306\377@\212\305\377@\212\305\377@\210\302"
- "\377@\211\303\377@\207\301\377@\210\302\377@\210\301\377@\206\277\377"
- "@\207\277\377@\206\275\377@\203\272\377@\204\273\377@\203\272\377\20"
- "d\251\377\0Y\242\377\0X\237\377\0Y\242\377\0Y\242\377\0V\235\377\0W\236"
- "\377\0T\232\377\0S\231\377\0H\204\330\0\0\0U\0\0\0<\0\0\0\34\0\0\0\10"
- "\1V\234\301\1W\236\377\1Y\242\377\0Z\243\377\0Z\244\377\0[\245\377\0"
- "[\244\377\0\\\245\377\0[\245\377\0]\250\377\0_\252\377\0_\253\377\0a"
- "\256\377\0a\255\377\0a\256\377\0a\256\377\0b\260\377\0d\261\377\0c\261"
- "\377\0d\263\377\0f\266\377\0e\265\377\0f\266\377\0g\267\377\0g\267\377"
- "\0g\267\377\0g\266\377\0h\270\377\0i\272\377\0i\272\377\0k\275\377\0"
- "l\277\377\0k\275\377\0l\277\377\0n\301\377\0n\302\377\0o\302\377\0n\302"
- "\377\0p\305\377\0q\307\377\0q\306\377\0r\307\377\0r\310\377\0s\311\377"
- "\0t\313\377\0s\312\377\0u\314\377\0v\315\377\0u\315\377\0w\317\377\0"
- "w\317\377\0v\315\377\0x\321\377\0x\321\377\0y\322\377\0z\324\377\0z\323"
- "\377\0{\326\377\0y\322\377\1{\325\377\1{\326\377\1|\326\377\1}\330\377"
- "\1|\327\377\2\177\332\377\2\200\334\377\2~\331\377\2\200\333\377\2\200"
- "\334\377\2\177\331\377\2\201\335\377\3\200\333\377\3\201\335\377\3\202"
- "\337\377\3\201\334\377\3\203\337\377\3\201\334\377\4\200\332\377\4\201"
- "\334\377\4\200\333\377\4\202\336\377\4\201\333\377\4\203\336\377\3\203"
- "\336\377\3\201\334\377\3\202\336\377\3\202\336\377\3\203\341\377\3\200"
- "\334\377\3\202\337\377\2\203\340\377\2\203\340\377\2\201\335\377\2\200"
- "\334\377\2\201\335\377\1\201\335\377\1\201\336\377\1\202\337\377\1\201"
- "\337\377\1\201\337\377\0\201\337\377\1\203\342\377\1\200\335\377\0\200"
- "\334\377\0\177\333\377\0\201\337\377\0\177\333\377\0\177\334\377\0\200"
- "\335\377\0\200\334\377\0~\332\377\0}\330\377\0~\331\377\0\200\335\377"
- "\0}\330\377\0~\332\377\0}\331\377\1}\331\377\1|\327\377\1|\327\377\0"
- "|\327\377\0z\323\377\0{\326\377\0z\324\377\0z\324\377\0y\323\377\0x\322"
- "\377\0w\317\377\0u\313\377\0t\313\377\0u\315\377\0s\311\377\0s\311\377"
- "\0s\311\377\0t\313\377\0r\310\377\0p\304\377\0q\306\377\0p\305\377\0"
- "o\302\377\0o\302\377\0o\302\377\0n\302\377\0m\300\377\0l\276\377\0l\277"
- "\377\0l\276\377\0j\274\377\0h\271\377\0j\274\377\0h\270\377\0h\270\377"
- "\0h\270\377\0g\267\377\0e\263\377\0e\264\377\0d\262\377\0e\264\377\0"
- "d\262\377\0c\261\377\0c\261\377\0a\256\377\0b\257\377\0`\255\377\0a\256"
- "\377\0a\256\377\0_\253\377\0`\255\377\0`\255\377\0]\250\377\0^\252\377"
- "\0]\251\377\0]\250\377\0\\\247\377\1Z\244\377\1\\\246\377\1[\245\377"
- "\2X\240\377\2Z\242\377\2X\240\377\2W\236\377\3L\212\330\0\0\0U\0\0\0"
- "<\0\0\0\34\0\0\0\10\1W\236\301\1Y\242\377\1Z\244\377\1[\246\377\1\\\246"
- "\377\1]\250\377\1\\\247\377\0]\250\377\40r\263\377\200\257\325\377\200"
- "\260\326\377@\210\302\377\0b\261\377\0b\260\377\0c\261\377\0c\261\377"
- "\0d\263\377\0e\265\377\40x\275\377\200\263\333\377\200\264\335\377\200"
- "\264\334\377\1i\272\377\1j\273\377\1i\272\377\1i\273\377\0i\272\377\0"
- "k\274\377\0k\275\377P\232\323\377\200\266\340\377\200\267\341\377\40"
- "\177\307\377\0o\304\377\0n\303\377`\246\334\377\200\267\342\377\200\267"
- "\340\377\0p\305\377\0r\307\377\0q\306\377\0r\307\377\40\204\317\377\200"
- "\271\345\377\200\272\345\377\200\271\345\377\200\272\346\377\200\272"
- "\346\377\200\272\346\377\200\273\350\377\200\273\350\3770\217\326\377"
- "\0x\321\377\0x\320\377\0y\322\377\0z\323\377\0y\323\377\0{\326\377\0"
- "y\322\377\0z\324\377`\254\345\377\200\275\352\377\200\275\353\377\200"
- "\275\352\377\200\276\354\377\200\277\355\377\200\276\353\377\201\277"
- "\355\377\201\277\355\377\201\277\354\377\201\300\356\377\201\277\355"
- "\377\"\217\337\377\2\201\335\377\2\200\333\377\2\202\336\377\2\200\333"
- "\377\3\200\332\377\"\220\340\377\221\310\360\377\321\350\372\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\357\370\376\377\277\340"
- "\370\377\237\320\363\377p\271\357\3770\230\343\377\2\203\341\377\2\204"
- "\342\377\2\204\343\377\2\202\337\377\2\202\336\377`\261\354\377\200\300"
- "\357\377\200\300\357\377\200\301\360\377\200\301\360\377!\223\344\377"
- "\2\203\341\377\3\205\344\377\2\202\337\377\2\201\335\377\3\201\335\377"
- "\3\202\340\377\200\277\356\377\200\300\356\377\200\300\357\377\201\300"
- "\356\377\201\277\355\377\3\177\332\377\3\177\332\377\3\202\336\377\4"
- "\177\330\377\4\177\332\377\4~\331\377\4\177\331\377\4}\327\377\4~\327"
- "\377\201\276\353\377\201\275\351\377\201\276\352\377\201\275\351\377"
- "\201\275\352\377\201\275\351\377\22\203\326\377\2x\320\377\2w\316\377"
- "\1w\317\377\1x\321\377\1u\315\377\0u\313\377\0t\313\377\0u\316\377\200"
- "\271\344\377\200\270\342\377\200\270\343\377\200\270\342\377\200\267"
- "\341\377\200\266\340\377\200\267\341\377\200\267\341\377\200\266\340"
- "\377\200\266\337\377P\233\325\377\21w\306\377\1m\300\377\1k\274\377\1"
- "m\301\377\1k\274\377\2k\275\377\2l\275\377\2l\275\377A\215\311\377\200"
- "\263\333\377\200\263\332\377\200\263\333\377\200\263\332\377B\214\307"
- "\377\3g\266\377\3e\262\377\3e\263\377\4e\262\377\4e\262\3772\201\300"
- "\377\201\260\326\377\201\261\327\377\201\261\327\377\201\257\325\377"
- "\200\257\325\377Q\221\305\377\2^\250\377\2]\247\377\2[\244\377\2\\\246"
- "\377\2[\244\377\1X\237\377\1Y\241\377\1V\235\377\1U\234\377\1I\206\330"
- "\0\0\0U\0\0\0<\0\0\0\34\0\0\0\10\1V\234\301\1X\237\377\1Y\241\377\1Y"
- "\242\377\1Z\244\377\1[\245\377\1[\245\377\0[\245\377\40p\261\377\377"
- "\377\377\377\377\377\377\377\257\315\345\377\0`\255\377\0`\255\377\0"
- "a\256\377\0a\256\377\0b\257\377\0c\261\377P\223\310\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377@\214\310\377\0g\270\377\0g\266\377\0"
- "g\270\377\0g\266\377\0h\271\377\0i\272\377\317\343\362\377\377\377\377"
- "\377\377\377\377\377\0j\274\377\0m\300\377\0m\300\377\277\333\361\377"
- "\377\377\377\377\377\377\377\377\0p\304\377\0q\306\377\0o\304\377\0q"
- "\306\377@\225\324\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\277\336\364\377\20\200\322\377\0x\321\377"
- "\0y\322\377\0x\320\377\0z\325\377\0x\321\377\0{\324\377\277\336\364\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377@\237\344\377\1\177\334\377\1"
- "\200\334\377\1\201\336\377\1\200\334\377\200\300\356\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377B\242\346\377\4\204\340\377\4\204\341\377"
- "\4\202\335\377\4\201\334\377\300\340\367\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377C\240\345\377\4\203\336\377\4"
- "\205\342\377\4\201\334\377\3\200\333\377\2\177\332\377\2\201\334\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\1}\327\377\1|\327\377\1\177\333\377\1|\326\377\1}\327\377"
- "\1{\326\377\1|\327\377\1{\326\377P\244\342\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377`\253\344\377\0w\320\377\0u\315\377\0v\315\377\0u\315\377\0t\312"
- "\377\0s\312\377\0t\313\377\0u\315\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\357\366\374\377\200\266\340\377\1k\273\377\1l\277\377\1i\272"
- "\377\1j\273\377\1j\274\377\1j\273\377\200\263\332\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\200\261\330\377\2e\263"
- "\377\2b\257\377\2c\260\377\2b\257\3772\200\276\377\360\365\372\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\317\340"
- "\356\377\21f\254\377\2\\\245\377\2[\244\377\2Y\242\377\2Z\243\377\2Y"
- "\241\377\1W\236\377\1X\240\377\1U\234\377\1U\233\377\1I\206\330\0\0\0"
- "U\0\0\0<\0\0\0\34\0\0\0\10\2X\237\301\2Z\242\377\2[\244\377\1[\245\377"
- "\2\\\247\377\2]\247\377\2^\251\377\2^\251\377\1^\251\377\337\353\364"
- "\377\377\377\377\377\357\365\372\377\2b\260\377\2c\260\377\2c\261\377"
- "\2c\261\377\2e\264\377\2e\264\377\220\273\335\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377q\253\330\377\3j\274\377\3j\272\377\2k\273"
- "\377\2j\272\377\2k\275\377\2l\276\377\377\377\377\377\377\377\377\377"
- "\317\343\363\377\2m\277\377\2o\302\377\2o\303\377\300\334\361\377\377"
- "\377\377\377\377\377\377\377\1r\307\377\1r\310\377\1q\306\377\1r\310"
- "\377@\226\326\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\317\346\367\377\0x\321\377\0"
- "y\323\377\0x\320\377\0z\325\377\0x\321\377\0z\324\377\277\336\364\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377@\236\342\377\0~\331\377\0~\333"
- "\377\0\177\334\377`\256\347\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377@\237\344\377\0\177\335\377\0\200\335\377\0~\331\377"
- "\0}\331\377\277\337\366\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377@\236\342\377\0\177\334\377\0\201\336\377\0~\332"
- "\377\0~\332\377\0}\330\377\0~\332\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\1|\326\377\1{\325\377"
- "\1}\331\377\1{\325\377\1{\326\377\1{\325\377\1|\326\377\1{\324\377\240"
- "\315\357\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\260\325\361\377\1w\320\377\1"
- "v\315\377\1w\317\377\1v\315\377\1t\313\377\1t\313\377\1u\313\377\1v\316"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\200\265\336\377\2m\301\377\2j\273\377\2k\275\377\2l\276\377"
- "\2j\273\377\200\264\335\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\200\262\330\377\1e\265\377\1c\261\377\1c\262\377"
- "\20l\265\377\337\353\365\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\357\365\372\377\40q\262\377\0\\\247\377\0[\245"
- "\377\0Z\244\377\0Y\242\377\0Y\244\377\0Y\241\377\0W\236\377\0W\240\377"
- "\0U\234\377\0U\233\377\0H\206\330\0\0\0U\0\0\0<\0\0\0\34\0\0\0\10\4Z"
- "\241\301\4Z\241\377\4[\244\377\4\\\245\377\3]\247\377\3^\247\377\3^\247"
- "\377\3^\251\377\3_\251\377\260\315\344\377\377\377\377\377\377\377\377"
- "\377\"v\272\377\3c\260\377\2c\260\377\2c\260\377\2e\263\377\2e\263\377"
- "\300\330\353\377\377\377\377\377\377\377\377\377\377\377\377\377\260"
- "\321\352\377\2j\273\377\2i\271\377\2j\273\377\2i\272\377\2j\274\377A"
- "\220\316\377\377\377\377\377\377\377\377\377\220\277\342\377\1l\276\377"
- "\1n\302\377\1n\302\377\300\334\361\377\377\377\377\377\377\377\377\377"
- "\1r\307\377\1r\307\377\1p\305\377\1r\307\377@\225\325\377\377\377\377"
- "\377\377\377\377\377\200\271\344\377\0t\314\377\0t\313\377\0t\313\377"
- "\0w\320\377p\263\345\377\357\366\374\377\377\377\377\377\377\377\377"
- "\377`\252\341\377\0y\321\377\0x\321\377\0z\324\377\0x\320\377\0z\324"
- "\377\277\336\364\377\377\377\377\377\377\377\377\377\0y\322\377\0{\325"
- "\377\0{\325\377\0z\324\377\0{\326\377\0|\326\377\0z\324\377\0|\330\377"
- "\0|\330\377\0}\330\377\0~\331\377\0}\331\377\0~\331\377\357\367\375\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377@\237\345\377"
- "\0\200\335\377\0\201\336\377\0~\332\377\0~\332\377\277\337\366\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377@\237\345"
- "\377\0\200\335\377\0\202\340\377\0~\333\377\0\200\335\377\0~\332\377"
- "\0\177\334\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\1}\331\377\1|\327\377\1}\330\377\1|\326\377"
- "\1}\327\377\1|\326\377\1}\330\377\2{\325\377\357\367\374\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\22\201\323\377\2w\316\377\2w\316"
- "\377\2w\316\377\2u\313\377\2u\314\377\2u\313\377\2v\315\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\"\200\310\377\2i\272\377\2j\273\377\2k\275\377\2i\272\377\200"
- "\263\334\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\200\261\330\377\1d\263\377\1b\257\377\21l\265\377\320\342\360"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\357\365\372\3770z\266\377\0[\245\377\0[\245\377\0Z\243\377\0Y\242\377"
- "\0X\240\377\0X\241\377\0W\237\377\0U\234\377\0V\236\377\0T\232\377\0"
- "S\231\377\0G\203\330\0\0\0U\0\0\0<\0\0\0\34\0\0\0\10\1V\235\301\1W\235"
- "\377\1X\240\377\1Y\241\377\1Z\243\377\1Z\244\377\1Z\244\377\1[\245\377"
- "\1]\247\377p\243\315\377\377\377\377\377\377\377\377\377a\234\314\377"
- "\1a\255\377\2a\256\377\2a\256\377\2b\257\377\2d\261\377\377\377\377\377"
- "\377\377\377\377\260\317\350\377\377\377\377\377\340\355\367\377\2i\272"
- "\377\2h\270\377\2i\272\377\2i\271\377\2i\272\377\201\265\336\377\377"
- "\377\377\377\377\377\377\377Q\232\322\377\2m\276\377\2o\302\377\2n\301"
- "\377\300\334\361\377\377\377\377\377\377\377\377\377\3s\310\377\3r\307"
- "\377\2q\305\377\2s\310\377A\226\326\377\377\377\377\377\377\377\377\377"
- "\200\271\345\377\1u\315\377\1u\314\377\0v\316\377\0x\321\377\0w\320\377"
- "p\262\343\377\377\377\377\377\377\377\377\377\257\324\360\377\0y\322"
- "\377\0y\322\377\0z\324\377\0y\321\377\0{\325\377\277\336\364\377\377"
- "\377\377\377\377\377\377\377\1z\323\377\1{\325\377\1|\326\377\1|\326"
- "\377\1|\327\377\1}\331\377\1|\326\377\1~\331\377\1~\331\377\1\177\333"
- "\377\1\200\335\377\1\200\335\377A\240\346\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\320\350\371\377Q\247\346\377"
- "\21\211\340\377\2\200\334\377!\217\340\377Q\251\350\377\240\320\363\377"
- "\357\367\375\377\377\377\377\377A\240\346\377\1\201\337\377\1\201\337"
- "\377\1\177\333\377\1\177\333\377\300\337\366\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377@\237\345\377\1\200\335\377"
- "\1\202\337\377\1\177\333\377\1\200\335\377\1~\332\377\1\177\333\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\1}\330\377\1{\326\377\1{\326\377\1|\326\377\1{\325\377\2{\325"
- "\377\2|\327\377Q\243\341\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377d\254\341\377\7y\316\377\7x\316\377\7z\320\377\7"
- "w\313\377\7x\314\377\7x\315\377\7x\315\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\202\270\342\377"
- "\202\271\343\377\201\270\342\377\300\333\360\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377b\244\330"
- "\377\3j\272\377\2k\274\377\2k\274\377\2i\272\377\200\263\333\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\200\261"
- "\330\377\1d\263\377\21l\264\377\317\342\361\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\357\365\371\3770{\270\377\0"
- "[\246\377\0[\245\377\0[\245\377\0Z\243\377\0Y\242\377\0X\240\377\0X\241"
- "\377\0W\237\377\0V\235\377\0V\236\377\0T\232\377\0S\232\377\0G\204\330"
- "\0\0\0U\0\0\0<\0\0\0\34\0\0\0\10\4Z\241\301\4Y\240\377\4[\243\377\4["
- "\244\377\3]\246\377\3]\246\377\3]\247\377\3^\247\377\4_\252\377B\206"
- "\276\377\377\377\377\377\377\377\377\377\221\272\333\377\3b\256\377\3"
- "c\257\377\3b\257\377\2c\260\377A\213\305\377\377\377\377\377\377\377"
- "\377\377B\215\311\377\377\377\377\377\377\377\377\377\"}\304\377\2j\272"
- "\377\2j\273\377\2j\272\377\2i\272\377\260\321\352\377\377\377\377\377"
- "\377\377\377\377\"\177\306\377\2l\276\377\2o\302\377\2n\301\377\300\334"
- "\361\377\377\377\377\377\377\377\377\377\2r\310\377\2r\307\377\1p\305"
- "\377\1s\310\377@\225\325\377\377\377\377\377\377\377\377\377\200\271"
- "\344\377\1u\314\377\0t\313\377\0u\315\377\0w\317\377\0v\316\377\40\207"
- "\323\377\377\377\377\377\377\377\377\377\277\335\362\377\0x\321\377\0"
- "x\321\377\0y\323\377\0y\322\377\0z\324\377\277\336\364\377\377\377\377"
- "\377\377\377\377\377\0x\320\377\0y\322\377\0z\323\377\0y\321\377\0y\322"
- "\377\0z\324\377\0y\322\377\0{\325\377\0z\324\377\0|\327\377\0|\327\377"
- "\0|\327\377p\266\351\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377P\245\344\377\0|\326\377\0~\331\377\0|\326\377\0"
- "|\327\377\0|\327\377\0{\325\377\0|\325\377`\255\346\377\40\215\336\377"
- "\0\177\332\377\0\177\333\377\0}\330\377\0}\330\377\277\336\365\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377@\236\343"
- "\377\0\177\333\377\0\200\335\377\0}\331\377\0\177\334\377\0}\330\377"
- "\0}\331\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\0|\330\377\0{\325\377\0z\324\377\1{\324\377\1z\324"
- "\377\1{\325\377\1|\327\377\260\325\361\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\260\324\357\377\2v\315\377\2v\316\377"
- "\1v\316\377\1t\312\377\1t\313\377\1u\314\377\1t\313\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\0o\304"
- "\377\0p\305\377\0n\303\377\0m\301\377\317\344\363\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\200\265\336\377\0g\266"
- "\377\0h\271\377\0h\271\377\0g\267\377\200\262\331\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\200\260\327\377\0c\260"
- "\377\317\341\360\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\3770{\267\377\0\\\246\377\0[\244\377\0Z"
- "\242\377\0Y\243\377\0X\242\377\0X\241\377\0W\237\377\0X\240\377\0V\236"
- "\377\0T\233\377\0U\234\377\0S\230\377\0S\230\377\0G\203\330\0\0\0U\0"
- "\0\0<\0\0\0\34\0\0\0\10\1V\235\301\1V\234\377\1X\237\377\1X\240\377\1"
- "Y\242\377\1Y\241\377\1Z\243\377\1[\243\377\1\\\246\377\1\\\246\377\377"
- "\377\377\377\377\377\377\377\317\341\357\377\1_\252\377\1_\254\377\1"
- "_\253\377\1`\254\377\200\260\326\377\377\377\377\377\337\353\365\377"
- "\1e\264\377\357\365\372\377\377\377\377\377`\240\322\377\1g\267\377\1"
- "g\267\377\1f\266\377\1f\266\377\357\366\373\377\377\377\377\377\337\354"
- "\367\377\1j\272\377\1i\272\377\1l\276\377\1k\275\377\277\333\360\377"
- "\377\377\377\377\377\377\377\377\1o\303\377\1n\303\377\0n\301\377\0p"
- "\305\377@\223\322\377\377\377\377\377\377\377\377\377\200\270\342\377"
- "\0r\310\377\0r\307\377\0s\312\377\0u\315\377\0u\314\377\0t\313\377\377"
- "\377\377\377\377\377\377\377\277\334\362\377\0v\317\377\0w\317\377\0"
- "x\321\377\0x\321\377\0y\323\377\277\336\364\377\377\377\377\377\377\377"
- "\377\377\0w\317\377\0x\321\377\0y\323\377\0y\322\377\0z\324\377\0z\325"
- "\377\0y\323\377\0z\324\377\0{\326\377\0}\331\377\0}\331\377\0}\331\377"
- "\200\276\353\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377P\246\344\377\0}\331\377\0\177\333\377\0|\326\377\0}\327"
- "\377\0}\330\377\0|\325\377\0|\327\377\0|\327\377\0}\330\377\0~\331\377"
- "\0~\333\377\0}\327\377\0}\330\377\277\337\366\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377@\235\342\377\0}\330\377"
- "\0}\332\377\0|\327\377\0|\330\377\0{\326\377\0}\327\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\0{\325"
- "\377\0y\321\377\0x\320\377\0y\323\377\0w\320\377\0y\322\377\20\202\327"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\317\346\367\377\277\335\363\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\20|\315\377\1s\312\377\0s\311\377\0q\306"
- "\377\0r\310\377\0r\310\377\0p\305\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\0n\301\377\0n\302\377"
- "\0l\300\377\0l\276\377\200\265\336\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\200\264\335\377\0f\265\377\0g\267\377"
- "\0f\266\377\0f\265\377\200\261\331\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\200\257\325\377\237\303\340\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377`\230\306\377\0[\246\377\0[\244\377\0Z\243\377\0X\241\377\0X"
- "\240\377\0X\240\377\0W\237\377\0V\235\377\0W\237\377\0V\235\377\0T\233"
- "\377\0S\232\377\0Q\227\377\0Q\227\377\0G\202\330\0\0\0U\0\0\0<\0\0\0"
- "\34\0\0\0\10\2W\236\301\3W\236\377\3Y\241\377\3Z\242\377\3\\\245\377"
- "\3[\245\377\3]\247\377\3]\247\377\3_\251\377\3]\250\377\300\327\351\377"
- "\377\377\377\377\377\377\377\377\23k\261\377\4b\255\377\4b\255\377\3"
- "b\256\377\260\316\346\377\377\377\377\377\241\305\342\377\2f\265\377"
- "\300\331\355\377\377\377\377\377\220\274\340\377\1h\270\377\1h\270\377"
- "\1g\267\3770\203\304\377\377\377\377\377\377\377\377\377\237\310\347"
- "\377\0i\273\377\0i\272\377\0l\276\377\0j\274\377\277\333\360\377\377"
- "\377\377\377\377\377\377\377\0n\303\377\0n\302\377\0m\301\377\0p\305"
- "\377@\223\322\377\377\377\377\377\377\377\377\377\200\270\342\377\0r"
- "\307\377\0r\307\377\1s\312\377\1t\313\377\1t\313\3770\216\323\377\377"
- "\377\377\377\377\377\377\377\277\334\362\377\1v\315\377\1v\315\377\1"
- "w\320\377\1x\320\377\1y\322\377\277\336\364\377\377\377\377\377\377\377"
- "\377\377\1x\317\377\1x\321\377\1y\322\377\1y\321\377\1z\323\377\1z\324"
- "\377\1z\323\377\1z\323\377\1|\327\377\1}\330\377\1}\330\377\0}\330\377"
- "`\256\347\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\337\357\372\377`\255\346\377\20\206\334\377\0{\325\377\0{\325"
- "\377\0{\326\377\0z\323\377\0{\325\377\0{\325\377\0|\326\377\0|\327\377"
- "\0|\330\377\0z\324\377\0{\325\377\277\336\364\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377@\234\340\377\0|\330\377"
- "\0}\331\377\0|\327\377\0|\330\377\0|\326\377\0|\330\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\0|\327"
- "\377\1y\323\377\1y\321\377\1{\325\377\1y\322\377\1{\324\377a\255\345"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "q\264\346\377q\264\345\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377b\252\340\377\4w\316\377\4u\313\377\4t\311\377\4"
- "v\314\377\3v\314\377\3s\310\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\1o\303\377\1o\304\377\1n\301"
- "\377\1m\300\377\220\277\343\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377`\242\326\377\0f\266\377\0h\270\377\0g\267\377"
- "\0f\266\377\200\262\331\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\357\365\372\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377`\232\311\377\0[\244"
- "\377\0\\\246\377\0[\244\377\0Z\243\377\0Y\242\377\0X\242\377\0X\242\377"
- "\0X\240\377\0W\237\377\0X\241\377\0W\240\377\0V\236\377\1V\235\377\1"
- "T\233\377\2U\233\377\2I\205\330\0\0\0U\0\0\0<\0\0\0\34\0\0\0\10\1S\231"
- "\301\1U\232\377\1V\235\377\1W\236\377\1Y\241\377\1Y\242\377\1Z\244\377"
- "\2[\244\377\2\\\246\377\0[\244\377\200\255\321\377\377\377\377\377\377"
- "\377\377\377@\206\276\377\0^\252\377\0^\252\377\0_\253\377\357\365\372"
- "\377\377\377\377\377p\247\323\377\1e\263\377\200\262\332\377\377\377"
- "\377\377\317\342\361\377\1f\267\377\1f\267\377\0g\267\377`\237\321\377"
- "\377\377\377\377\377\377\377\377p\253\332\377\0j\273\377\0i\272\377\0"
- "l\277\377\0j\275\377\277\333\360\377\377\377\377\377\377\377\377\377"
- "\0n\302\377\0o\303\377\0o\303\377\0p\306\377@\223\323\377\377\377\377"
- "\377\377\377\377\377\200\270\343\377\0r\311\377\0r\311\377\0t\313\377"
- "\0u\315\377\0u\315\377\257\324\357\377\377\377\377\377\377\377\377\377"
- "\220\303\351\377\1x\317\377\1w\317\377\1y\321\377\1y\322\377\1{\325\377"
- "\300\336\365\377\377\377\377\377\377\377\377\377A\233\336\377A\234\336"
- "\377A\234\337\377A\234\337\377A\235\340\377B\235\340\377B\235\340\377"
- "B\235\340\3772\227\340\377\3\177\333\377\3~\331\377\3~\332\3772\227\342"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\337\357\372\377\240"
- "\316\360\377a\256\346\377\"\214\332\377\2}\327\377\2}\327\377\2~\330"
- "\377\2~\331\377\2~\332\377\2}\330\377\2~\331\377\300\336\365\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\0{\326\377\0y\323\377"
- "\0x\321\377\0z\324\377\0x\321\377\0y\323\377\257\325\361\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377#\211\325\377"
- "#\212\327\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\261\325\360\377\5w\315\377\5v\313\377\5t\311\377\4v\314\377"
- "\5v\314\377\6u\311\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\4p\303\377\4q\304\377\3n\301\377\23"
- "w\304\377\337\355\367\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377!}\305\377\1g\267\377\0i\271\377\0h\270\377\0g\270"
- "\377\200\262\332\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377`\232\311\377\0]\250\377\0[\245\377\0[\246"
- "\377\0Z\243\377\0Y\242\377\0X\241\377\0X\240\377\0W\237\377\0V\236\377"
- "\0V\234\377\0V\235\377\0U\234\377\0S\231\377\0R\231\377\0Q\226\377\0"
- "Q\226\377\0F\202\330\0\0\0U\0\0\0<\0\0\0\34\0\0\0\10\3T\232\301\2V\234"
- "\377\2V\236\377\2W\236\377\2Y\241\377\1X\241\377\1Z\243\377\1Z\244\377"
- "\0[\245\377\0[\245\377P\216\300\377\377\377\377\377\377\377\377\377\200"
- "\255\323\377\0]\250\377\0]\250\377\40r\264\377\377\377\377\377\377\377"
- "\377\3770~\274\377\0b\261\377P\224\313\377\377\377\377\377\377\377\377"
- "\377\0e\263\377\0e\264\377\0e\264\377\237\305\343\377\377\377\377\377"
- "\377\377\377\3770\205\307\377\0g\267\377\0g\267\377\0j\274\377\0h\271"
- "\377\277\333\357\377\377\377\377\377\377\377\377\377\0l\277\377\0m\300"
- "\377\0n\301\377\0o\304\377@\222\321\377\377\377\377\377\377\377\377\377"
- "\237\311\351\377@\225\325\377@\225\325\377@\226\327\377P\237\333\377"
- "\257\324\357\377\377\377\377\377\377\377\377\377\357\366\374\377\40\207"
- "\325\377\0v\316\377\0v\316\377\0w\317\377\1y\322\377\1z\324\377\300\336"
- "\364\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\300\337\365\377\3~\331\377\3~\330\377"
- "\3}\327\377\3\177\332\377\300\337\366\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\241"
- "\317\361\377\"\216\335\377\2~\331\377\1~\332\377\1\177\333\377\1}\331"
- "\377\1~\332\377\300\340\367\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\0z\324\377\0x\321\377\0v\316\377\0x\321\377\0v\315\377\20"
- "\200\322\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\337\356\370\377\2u\313\377\2v\315\377\317\346\366\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\23}\315\377"
- "\4s\306\377\4q\304\377\3s\307\377\3s\307\377\3q\305\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\300"
- "\333\360\377\300\333\360\377\300\333\357\377\357\366\373\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\220\274\337"
- "\377\1h\270\377\1e\264\377\0f\266\377\0f\265\377\0e\264\377\200\261\330"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\237"
- "\302\336\377\0]\250\377\0\\\246\377\0Z\244\377\0[\245\377\0Y\242\377"
- "\0X\241\377\0X\241\377\0W\240\377\0W\237\377\0V\236\377\0V\235\377\0"
- "U\235\377\0U\234\377\0S\232\377\0S\231\377\0R\230\377\0R\230\377\0G\203"
- "\330\0\0\0U\0\0\0<\0\0\0\34\0\0\0\10\3U\231\301\3V\235\377\3X\237\377"
- "\2X\240\377\2Z\243\377\2Z\242\377\2[\245\377\2[\245\377\2\\\247\377\2"
- "\\\247\377\21f\252\377\377\377\377\377\377\377\377\377\300\327\351\377"
- "\1_\252\377\1_\252\377`\234\313\377\377\377\377\377\377\377\377\377\2"
- "b\257\377\1d\263\377\21o\272\377\377\377\377\377\377\377\377\377A\215"
- "\310\377\1g\267\377\1g\267\377\317\342\361\377\377\377\377\377\377\377"
- "\377\377\0j\274\377\0h\271\377\0h\271\377\0k\276\377\0i\272\377\277\333"
- "\360\377\377\377\377\377\377\377\377\377\0l\276\377\0l\277\377\0m\300"
- "\377\0o\303\377@\222\320\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\357\366\374\377`\245\332\377\0s"
- "\312\377\0r\310\377\0r\311\377\0s\311\377\0t\314\377\0v\316\377\277\335"
- "\363\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\277\336\364\377\0z\324\377\0y\322\377"
- "\0x\321\377\0{\325\377\40\213\332\377\357\367\375\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\357\367\374\3770\223\335\377\1{\325\377\1|\327\377\0{\325\377"
- "\0|\326\377\277\337\366\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\0w\317\377\0v\315\377\0t\312\377\0u\314\377\0s\311\377`\250"
- "\337\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\217\301\347\377\0r\307\377\0s\311\377\200\272\345\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377`\245\332\377\0n"
- "\302\377\0n\300\377\0o\303\377\0o\303\377\0m\300\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\217\275\341\377\0g\267\377\0"
- "g\270\377\0e\264\377\0e\264\377\0d\263\377\0d\263\377\200\261\330\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377`\231\310"
- "\377\0\\\246\377\0Z\244\377\0Y\242\377\0Z\243\377\0X\240\377\0X\240\377"
- "\0Y\242\377\0X\240\377\0W\237\377\0W\237\377\0U\235\377\0V\235\377\0"
- "U\234\377\0S\231\377\0S\231\377\0R\227\377\0R\227\377\0F\203\330\0\0"
- "\0U\0\0\0<\0\0\0\34\0\0\0\10\6V\232\301\5W\235\377\5Y\237\377\4Y\240"
- "\377\4Z\243\377\4Z\242\377\4\\\244\377\4\\\245\377\4]\247\377\4^\247"
- "\377\4]\245\377\340\353\365\377\377\377\377\377\357\365\372\377\3_\252"
- "\377\3_\252\377\221\272\332\377\377\377\377\377\300\330\353\377\2b\257"
- "\377\1d\263\377\1e\264\377\337\353\365\377\377\377\377\377\200\262\332"
- "\377\1f\266\377\21o\272\377\377\377\377\377\377\377\377\377\277\331\355"
- "\377\0h\271\377\0f\266\377\0f\266\377\0i\273\377\0g\267\377\277\332\357"
- "\377\377\377\377\377\377\377\377\377\0k\275\377\0k\276\377\0m\300\377"
- "\0o\303\377@\221\320\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377p\261\342\377\0q\306\377\0u\314\377\0"
- "t\313\377\0t\313\377\0t\313\377\0v\317\377\0w\317\377\277\335\363\377"
- "\377\377\377\377\377\377\377\377@\230\332\377@\230\332\377@\231\332\377"
- "@\230\333\377@\231\334\377@\231\333\377@\231\333\377@\231\333\3770\223"
- "\334\377\0z\325\377\0y\323\377\0x\321\377\0{\325\377\0z\325\377\20\203"
- "\330\377\237\315\356\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\300\336\365\377\1z\323"
- "\377\1{\325\377\0z\323\377\0{\324\377\277\336\365\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\0u\314\377\0u\313\377\0r\307\377"
- "\0s\312\377\0r\307\377\257\324\360\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\3770\214\321\377\0q\307\377\0r\310\3770"
- "\216\324\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\257\322\354\377\0n\301\377\0n\300\377\0o\304\377\0o\304\377"
- "\0n\302\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\317\343\362\377\20q"
- "\274\377\0f\266\377\0f\266\377\0d\262\377\0e\264\377\0d\262\377\0d\263"
- "\377\200\261\330\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377`\231\310\377\0[\245\377\0Y\243\377\0Z\244"
- "\377\0Y\241\377\0X\240\377\0X\241\377\0W\237\377\0W\237\377\0V\236\377"
- "\0U\235\377\0V\236\377\0T\234\377\0S\232\377\0S\231\377\0R\230\377\0"
- "R\231\377\0G\204\330\0\0\0U\0\0\0<\0\0\0\34\0\0\0\10\0P\224\301\0Q\227"
- "\377\0S\231\377\0T\233\377\0V\235\377\0V\235\377\0W\237\377\0W\237\377"
- "\0X\241\377\0X\241\377\0W\237\377\237\302\335\377\377\377\377\377\377"
- "\377\377\3770z\265\377\0[\244\377\317\340\356\377\377\377\377\377\200"
- "\256\324\377\0^\252\377\0a\255\377\0b\257\377\237\304\340\377\377\377"
- "\377\377\257\316\346\377\0d\262\377@\213\305\377\377\377\377\377\377"
- "\377\377\377\200\262\332\377\0f\266\377\0e\264\377\0e\264\377\0h\271"
- "\377\0f\264\377\277\332\356\377\377\377\377\377\377\377\377\377\0i\272"
- "\377\0i\272\377\0k\274\377\0l\277\377@\220\314\377\377\377\377\377\377"
- "\377\377\377\237\307\346\377@\222\320\377@\222\321\377P\234\327\377\217"
- "\300\345\377\377\377\377\377\377\377\377\377\377\377\377\377P\233\325"
- "\377\0r\307\377\0q\307\377\0q\306\377\0q\307\377\0s\312\377\0t\312\377"
- "\277\334\362\377\377\377\377\377\377\377\377\377\0s\312\377\0s\312\377"
- "\0s\312\377\0u\314\377\0v\316\377\0v\315\377\0v\315\377\0v\316\377\0"
- "y\323\377\0y\323\377\0x\322\377\0w\320\377\0z\324\377\0z\324\377\0{\326"
- "\377\0y\323\377\20\202\327\377`\254\345\377\237\316\360\377\317\347\370"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377!\214\332\377\1|\330"
- "\377\1{\326\377\1}\327\377\277\337\366\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377p\264\346\377@\232\336\377@\234\340"
- "\377@\234\340\377@\233\336\377@\233\336\377@\231\334\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\0x\321\377\0w\320\377\1u\314\377\1w\316\377\20}\316\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\337\355\370\377"
- "\1s\312\377\1s\310\377\2t\313\377\1t\313\377\337\355\370\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\21x\306\377"
- "\2n\301\377\1p\304\377\1p\304\377\1o\302\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\317\343\362\377\20p\273\377\0g\266\377"
- "\0d\262\377\0e\264\377\0c\262\377\0d\263\377\200\261\330\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\357\365\371\3770z\266\377\0Y\242\377\0Y\242\377\0X\240\377\0W\237\377"
- "\0X\237\377\0V\235\377\0V\235\377\0U\235\377\0U\233\377\0U\234\377\0"
- "T\232\377\0R\227\377\0R\227\377\0Q\226\377\0Q\227\377\0G\203\330\0\0"
- "\0U\0\0\0<\0\0\0\34\0\0\0\10\0P\225\301\0Q\227\377\0S\231\377\0T\232"
- "\377\0V\235\377\0U\234\377\0W\237\377\0W\237\377\0X\240\377\0Y\243\377"
- "\0W\237\377`\230\306\377\377\377\377\377\377\377\377\377p\243\315\377"
- "\20f\253\377\377\377\377\377\377\377\377\377P\220\305\377\0_\253\377"
- "\0a\257\377\0b\261\377p\246\321\377\377\377\377\377\357\365\372\377\0"
- "e\264\377\200\262\332\377\377\377\377\377\377\377\377\377@\215\312\377"
- "\0h\271\377\0f\266\377\0g\270\377\0i\274\377\0g\267\377\277\332\357\377"
- "\377\377\377\377\377\377\377\377\0j\274\377\0k\275\377\0l\300\377\0n"
- "\302\377@\221\317\377\377\377\377\377\377\377\377\377\200\266\340\377"
- "\0o\304\377\0o\303\377\0o\303\377\0o\303\377@\225\325\377\377\377\377"
- "\377\377\377\377\377\357\366\373\377\20|\315\377\0s\311\377\0r\311\377"
- "\0r\310\377\0t\314\377\0u\314\377\277\334\362\377\377\377\377\377\377"
- "\377\377\377\0t\313\377\0t\312\377\0t\312\377\0t\313\377\0u\315\377\0"
- "u\314\377\0u\314\377\0v\315\377\0x\321\377\0x\322\377\0x\321\377\0v\316"
- "\377\0y\322\377\0y\323\377\0z\324\377\0y\322\377\0x\321\377\0y\323\377"
- "\0z\323\377\0{\325\377\40\210\325\377\200\273\350\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377@\232"
- "\335\377\0z\324\377\0y\322\377\0z\323\377\277\336\365\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377@\231\333\377\0w"
- "\317\377\0y\322\377\0y\323\377\0x\320\377\0x\320\377\0v\316\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\0w\320\377\0w\320\377\0t\313\377\0u\315\377`\250\335\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\357\366\374"
- "\377\277\334\362\377\277\334\361\377\277\335\363\377\277\335\363\377"
- "\357\366\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377`\246\333\377\0n\302\377\0p\305\377\0p\305\377\0n\302\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377@\217\314\377@\217\314\377\200\263\333\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\217"
- "\273\335\377\0e\263\377\0c\260\377\0c\261\377\0a\257\377\0c\261\377\200"
- "\260\327\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\317\341\357\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\357\365\372\3770w\262\377\0X\241"
- "\377\0W\237\377\0W\236\377\0W\237\377\0V\235\377\0V\234\377\0U\234\377"
- "\0T\233\377\0T\234\377\0T\233\377\0R\226\377\0R\227\377\0R\227\377\1"
- "R\227\377\1G\203\330\0\0\0U\0\0\0<\0\0\0\34\0\0\0\10\0Q\225\301\0R\227"
- "\377\0S\232\377\0U\234\377\0W\237\377\0V\236\377\0W\240\377\0X\240\377"
- "\0X\240\377\0Z\244\377\0X\241\3770y\265\377\377\377\377\377\377\377\377"
- "\377\237\303\337\377@\205\275\377\377\377\377\377\377\377\377\377\20"
- "h\257\377\0_\253\377\0a\257\377\0b\260\3770~\275\377\377\377\377\377"
- "\377\377\377\3770\202\302\377\277\330\354\377\377\377\377\377\377\377"
- "\377\377\20p\274\377\0g\270\377\0f\265\377\0g\267\377\0i\272\377\0f\266"
- "\377\277\332\357\377\377\377\377\377\377\377\377\377\0j\272\377\0j\273"
- "\377\0l\277\377\0m\300\377@\220\316\377\377\377\377\377\377\377\377\377"
- "\200\265\337\377\0n\301\377\0m\301\377\0m\300\377\0m\300\377\0p\305\377"
- "\217\300\344\377\377\377\377\377\377\377\377\377\200\270\343\377\0s\311"
- "\377\0r\310\377\0r\307\377\0t\313\377\0t\313\377\277\334\362\377\377"
- "\377\377\377\377\377\377\377\0t\312\377\0s\310\377\0s\311\377\0s\311"
- "\377\0u\314\377\0u\313\377\0t\313\377\0u\314\377\0w\317\377\0x\320\377"
- "\0w\316\377\0u\314\377\0x\321\377\0x\321\377\0y\322\377\0x\320\377\0"
- "w\320\377\0x\321\377\0y\322\377\0y\323\377\0v\316\377\0x\320\377\237"
- "\315\356\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377@\231\333\377\0y\322\377\0x\317\377\0x\321\377\277\336\364\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377@\227"
- "\331\377\0u\314\377\0w\316\377\0x\320\377\0v\316\377\0w\316\377\0u\313"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\0v\316\377\0v\316\377\0r\310\377\0t\313\377\257\323"
- "\355\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\257\322\355\377\0n\301\377\0o\303\377\0"
- "n\302\377\0m\300\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\0i\272\377\0i\273\377\0g\267\377p\252"
- "\330\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\40x\275\377\0c\261\377\0c\261\377\0b\260\377\0c"
- "\262\377\200\261\330\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\200\257\325\377`\232\312\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\357\365"
- "\371\3770x\264\377\0X\240\377\0W\237\377\0X\240\377\0W\236\377\0V\236"
- "\377\0V\236\377\0U\234\377\0U\235\377\0U\234\377\0R\230\377\0R\230\377"
- "\0S\230\377\1S\230\377\1G\203\330\0\0\0U\0\0\0<\0\0\0\34\0\0\0\10\0P"
- "\224\301\0Q\226\377\0S\230\377\0T\232\377\0U\235\377\0U\234\377\0V\236"
- "\377\0W\237\377\0W\237\377\0Y\242\377\0W\237\377\0Y\242\377\357\365\371"
- "\377\377\377\377\377\337\353\364\377\200\255\322\377\377\377\377\377"
- "\337\352\364\377\0\\\247\377\0]\247\377\0`\255\377\0a\256\377\0a\255"
- "\377\377\377\377\377\377\377\377\377`\236\316\377\377\377\377\377\377"
- "\377\377\377\317\342\361\377\0f\266\377\0g\266\377\0e\264\377\0f\266"
- "\377\0h\271\377\0f\265\377\277\332\356\377\377\377\377\377\377\377\377"
- "\377\0i\271\377\0i\272\377\0k\277\377\0l\277\377@\220\316\377\377\377"
- "\377\377\377\377\377\377\200\265\337\377\0n\301\377\0n\301\377\0m\301"
- "\377\0m\301\377\0p\304\377\20x\307\377\377\377\377\377\377\377\377\377"
- "\357\366\373\377\20{\314\377\0r\307\377\0r\307\377\0s\312\377\0t\312"
- "\377\277\334\362\377\377\377\377\377\377\377\377\377\0t\313\377\0s\311"
- "\377\0s\311\377\0s\311\377\0u\314\377\0u\314\377\0u\313\377\0u\314\377"
- "\0w\320\377\0w\321\377\0w\320\377\0u\314\3770\221\332\377\217\304\353"
- "\377\20\201\325\377\0w\321\377\0w\320\377\0x\321\377\0x\322\377\0y\322"
- "\377\0v\315\377\0x\321\377\217\304\354\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377@\231\333\377\0x\322\377\0w\320\377"
- "\0x\321\377\277\336\364\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377@\227\330\377\0u\314\377\0v\316\377\0w\320\377\0"
- "v\316\377\0u\315\377\0u\315\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\0u\315\377\0u\314\377\0r\307"
- "\377\20|\315\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\20u\302\377\0n\302\377\0n\302\377\0m\300\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\0i\272\377\0"
- "i\272\377\0h\271\377\0h\270\377\337\354\366\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\200\262\332\377\0c\262\377\0"
- "d\262\377\0c\260\377\0c\262\377\200\261\330\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\200\257\325\377\1^\252\377`"
- "\233\313\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\317\340\356\377\21c\247\377\1X\240\377\1Y\241"
- "\377\1W\237\377\1W\237\377\1W\237\377\2V\235\377\2V\236\377\2V\235\377"
- "\2T\231\377\1S\231\377\1S\231\377\1S\231\377\1G\204\330\0\0\0U\0\0\0"
- "<\0\0\0\34\0\0\0\10\0Q\226\301\0Q\226\377\0S\230\377\0T\232\377\0U\235"
- "\377\0U\235\377\0V\237\377\0W\240\377\0W\237\377\0Y\242\377\0X\241\377"
- "\0Y\243\377\277\325\347\377\377\377\377\377\377\377\377\377\317\340\356"
- "\377\377\377\377\377\237\302\336\377\0^\251\377\0_\253\377\0a\256\377"
- "\0b\260\377\0b\257\377\277\327\352\377\377\377\377\377\317\342\361\377"
- "\377\377\377\377\377\377\377\377\220\273\336\377\0g\267\377\0h\271\377"
- "\0f\265\377\0g\270\377\0i\273\377\0g\266\377\277\332\357\377\377\377"
- "\377\377\377\377\377\377\0i\273\377\0j\274\377\0m\300\377\0m\301\377"
- "@\221\317\377\377\377\377\377\377\377\377\377\200\266\340\377\0o\303"
- "\377\0o\303\377\0n\302\377\0n\302\377\0p\306\377\0q\306\377\240\312\351"
- "\377\377\377\377\377\377\377\377\377`\250\337\377\1s\311\377\1s\311\377"
- "\1t\313\377\1u\314\377\277\334\362\377\377\377\377\377\377\377\377\377"
- "\1t\313\377\1t\313\377\2t\313\377\1t\312\377\1v\316\377\1v\315\377\1"
- "v\315\377\2v\315\377\2x\321\377\2y\322\377\2y\321\377\2w\316\377A\233"
- "\335\377\377\377\377\377\377\377\377\377\240\314\355\377Q\243\340\377"
- "\2z\322\377\2z\323\377\2z\323\377\2x\317\377B\233\335\377\357\367\374"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "2\222\331\377\3z\323\377\3y\322\377\3z\322\377\300\336\365\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377B\231\332\377"
- "\3w\316\377\3x\320\377\3z\322\377\3y\320\377\3x\317\377\4x\317\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\4x\316\377\4x\316\377\4u\313\377b\251\337\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377`\245\331\377\1p\305\377\1p\304\377"
- "\1n\301\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\0i\273\377\0h\271\377\0i\272\377\0h\271\377`\240"
- "\322\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\357\365\372\377\20l\266\377\0c\261\377\0b\257\377\0b\261\377\200"
- "\260\327\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\200\256\324\377\1]\250\377\1^\251\377\237\302\337\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\320\340\355\377\21b\245\377\1W\237\377\1V\235\377\1V\235\377\1U"
- "\235\377\1T\232\377\1U\234\377\1U\233\377\1R\230\377\1R\227\377\1R\227"
- "\377\1R\227\377\1G\203\330\0\0\0U\0\0\0<\0\0\0\34\0\0\0\10\0P\225\301"
- "\0P\224\377\0Q\226\377\0R\230\377\0S\232\377\0S\232\377\0U\234\377\0"
- "U\234\377\0U\234\377\0W\237\377\0V\235\377\0W\240\377\200\254\320\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377p\242"
- "\313\377\0\\\246\377\0]\247\377\0_\252\377\0`\254\377\0_\253\377\200"
- "\256\323\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377`\235\316\377\0d\263\377\0e\263\377\0c\260\377\0d\263\377\0f"
- "\266\377\0d\262\377\277\331\356\377\377\377\377\377\377\377\377\377\0"
- "g\267\377\0h\267\377\0j\273\377\0j\273\377@\217\314\377\377\377\377\377"
- "\377\377\377\377\200\265\335\377\0k\276\377\0l\276\377\0k\275\377\0k"
- "\276\377\0m\300\377\0m\301\377\40\200\312\377\377\377\377\377\377\377"
- "\377\377\337\355\370\377\0p\304\377\0p\304\377\0q\306\377\0q\306\377"
- "\277\333\361\377\377\377\377\377\377\377\377\377\0q\307\377\0q\306\377"
- "\0q\306\377\0q\306\377\0s\311\377\0s\311\377\0s\310\377\0s\312\377\0"
- "t\314\377\0v\315\377\0u\314\377\0s\311\377@\230\332\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\317"
- "\345\365\377\277\334\362\377\337\355\370\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\337\356\371"
- "\377\0u\314\377\0v\317\377\0v\316\377\0v\316\377\277\334\362\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377@\226\327"
- "\377\0t\312\377\0u\314\377\0v\315\377\0u\314\377\0t\312\377\0s\310\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\0r\310\377\0s\311\377\0q\306\377\257\323\356\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377p\257\337\377"
- "@\223\322\377@\224\324\377@\223\322\377@\225\325\377@\225\325\377@\224"
- "\323\377p\256\335\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\260\321\352\377\1n\301\377\1m\300\377\1k\275\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\2h\270\377\2g\266\377\2g\267\377\2g\266\377\22p\272\377\357"
- "\366\373\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377q\246\320\377\2b\257\377\2b\256\377\2b\256\377\201\260\326\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\201"
- "\257\324\377\3]\247\377\3^\247\377\3\\\246\377\241\302\336\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\317\337\354\377\23b\243\377\3V\234\377\3V\233\377\3U\233\377\3T"
- "\230\377\3U\232\377\3T\231\377\3Q\224\377\3R\225\377\4R\225\377\4R\225"
- "\377\4G\202\330\0\0\0U\0\0\0<\0\0\0\34\0\0\0\10\0P\225\301\1P\225\377"
- "\1R\226\377\1S\230\377\1T\233\377\1U\233\377\1V\235\377\1V\235\377\1"
- "V\235\377\1X\240\377\1X\237\377\1Y\241\377A\203\271\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\3772{\266\377\2^\250\377"
- "\2_\251\377\2`\255\377\2a\256\377\2a\256\377Q\222\306\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377!w\274\377\2f\265"
- "\377\2f\265\377\1d\262\377\1f\265\377\1h\267\377\1e\264\377\300\332\356"
- "\377\377\377\377\377\377\377\377\377\1i\273\377\1i\272\377\1k\276\377"
- "\1k\276\377@\220\316\377\377\377\377\377\377\377\377\377\200\265\337"
- "\377\0m\300\377\0m\300\377\0m\300\377\0m\300\377\0n\302\377\0o\303\377"
- "\0p\306\377\257\322\354\377\377\377\377\377\377\377\377\377`\246\334"
- "\377\0q\307\377\0r\311\377\0r\311\377\277\334\361\377\377\377\377\377"
- "\377\377\377\377\277\334\362\377\277\334\362\377\277\334\362\377\277"
- "\334\362\377\277\335\363\377\277\334\362\377\277\335\362\377\277\335"
- "\363\377\277\335\363\377`\252\342\377\1v\317\377\1t\313\377@\231\334"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\200\272\345\377\0v\315\377\0w\320\377\0v\316\377\0v\317\377"
- "\277\335\363\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377@\226\327\377\0u\313\377\0u\314\377\0v\315\377\0u\315\377"
- "\0t\313\377\0t\312\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\0s\311\377\0s\311\377\20z\312\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\20z\312\377\0n\302\377\0p\305\377\0n\301\377\0p\305\377\0p\306"
- "\377\0o\304\377\0o\302\377\357\366\373\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\20v\305\377\0l\300\377\0j\275\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\0g\267\377\0e\265\377\0e\264\377\0e\264\377\0d\263\377\200"
- "\262\331\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\337\353\365\377\0a\256\377\0a\255\377\0`\254\377\200\257\325"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\200\256\323\377\0\\\246\377\0[\246\377\0[\244\377\0Y\241\377\240\301"
- "\335\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\237\277\332\377\1T\233\377\1S\232\377\1S\231\377"
- "\1R\227\377\1S\230\377\1R\230\377\1O\223\377\1P\224\377\1P\224\377\1"
- "O\223\377\1E\200\330\0\0\0U\0\0\0<\0\0\0\34\0\0\0\10\0M\217\242\2R\226"
- "\377\4T\231\377\4V\233\377\4W\236\377\3W\236\377\4W\236\377\4X\237\377"
- "\3X\237\377\3Z\242\377\3Z\242\377\3Z\243\377\3[\243\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\3]\247\377\3_\252\377"
- "\3`\253\377\3a\256\377\3b\257\377\3c\257\377\22k\263\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\357\365\372\377\2d\262\377\2g\267"
- "\377\2f\267\377\1e\263\377\1g\266\377\1h\271\377\1f\265\377\300\332\357"
- "\377\377\377\377\377\377\377\377\377\1i\272\377\1h\272\377\1k\275\377"
- "\1k\275\377@\220\316\377\377\377\377\377\377\377\377\377\200\265\337"
- "\377\0l\277\377\0l\300\377\0l\300\377\0l\277\377\0m\300\377\0m\301\377"
- "\0o\305\377@\222\320\377\377\377\377\377\377\377\377\377\277\333\360"
- "\377\0q\307\377\0q\306\377\0q\306\377\277\333\360\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\200\272\345\377\0t\314\377\0s\311\3770\217\326"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\237\312"
- "\353\377\0t\313\377\0t\312\377\0u\314\377\0t\313\377\0t\312\377\277\335"
- "\363\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377@\225\325\377\0t\312\377\0s\312\377\0t\313\377\0t\313\377\0s\311"
- "\377\0s\311\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\0q\307\377\0r\310\377`\246\333\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\257\322\355\377"
- "\0p\306\377\0n\302\377\0p\304\377\0n\302\377\0p\305\377\0q\306\377\0"
- "o\305\377\0n\303\377\257\322\355\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377`\244\330\377\0m\300\377\0k\275\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\0h\271\377\0g\267\377\0f\266\377\0g\267\377\0f\266\377\40y\277"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377`\234\315\377\1b\257\377\1a\256\377\200\257\326\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\200\256"
- "\324\377\0]\251\377\0\\\247\377\0\\\246\377\0[\246\377\20e\253\377\317"
- "\340\356\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\240\277\332\377\1U\234\377\1T\233\377\1S\230"
- "\377\1T\233\377\1S\232\377\1P\224\377\1Q\226\377\1P\226\377\1O\223\377"
- "\1;m\272\0\0\0U\0\0\0<\0\0\0\34\0\0\0\10\0AxU\3L\213\377\4R\225\377\4"
- "U\232\377\5W\234\377\4W\235\377\4W\235\377\4X\236\377\4X\237\377\4Z\241"
- "\377\4Z\241\377\3Z\242\377\3[\242\377\241\302\334\377\301\327\351\377"
- "\301\327\351\377\221\270\330\377\3^\247\377\3^\251\377\3_\252\377\3a"
- "\256\377\3b\256\377\3b\256\377\3b\255\377\261\317\347\377\301\331\354"
- "\377\301\330\354\377\221\273\335\377\2d\262\377\2f\266\377\2g\266\377"
- "\2d\262\377\2f\265\377\2h\270\377\2e\264\377\221\276\341\377\300\332"
- "\356\377\300\332\355\377\2h\270\377\2i\271\377\2k\274\377\2k\274\377"
- "1\207\311\377\300\333\357\377\300\332\356\377a\244\327\377\1l\277\377"
- "\1m\277\377\1m\300\377\1m\277\377\1m\300\377\1m\301\377\1p\304\377\1"
- "m\300\377\240\312\352\377\300\334\360\377\300\334\361\377!\203\316\377"
- "\1q\306\377\1q\306\377\220\301\346\377\300\334\361\377\300\334\362\377"
- "\300\334\361\377\300\334\361\377\300\334\361\377\300\334\361\377\300"
- "\334\362\377\300\334\362\377\300\334\361\377\300\334\362\377\300\334"
- "\362\377a\251\340\377\2v\316\377\2u\313\377\2x\320\377\"\210\325\377"
- "p\261\343\377\257\324\360\377\357\366\374\377\377\377\377\377\377\377"
- "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
- "\377\317\345\365\377`\251\340\377\3v\314\377\3w\316\377\3w\315\377\3"
- "x\317\377\3w\315\377\3w\316\377\220\304\352\377\277\335\362\377\277\335"
- "\362\377\277\335\362\377\277\334\362\3773\217\324\377\4w\315\377\5v\314"
- "\377\5w\315\377\4x\316\377\4v\313\377\4v\313\377\300\334\362\377\300"
- "\334\362\377\300\334\362\377\300\334\362\377\300\334\361\377\4t\310\377"
- "\4u\312\377\202\271\344\377\300\334\362\377\300\333\360\377\300\334\361"
- "\377\300\334\361\377R\236\327\377\4r\306\377\4p\303\377\4r\306\377\4"
- "p\303\377\4s\307\377\4s\307\377\4r\305\377\4q\303\377R\236\327\377\300"
- "\333\360\377\300\333\357\377\300\333\357\377\300\333\357\377\202\267"
- "\340\377\4o\301\377\4m\276\377\301\332\356\377\301\332\357\377\301\332"
- "\355\377\301\332\356\377\301\332\356\377\4j\271\377\4i\270\377\4h\267"
- "\377\4h\267\377\4h\266\377\4g\266\377\202\263\332\377\301\331\354\377"
- "\301\331\355\377\301\331\354\377\301\330\353\377\202\261\327\377\3c\257"
- "\377\3a\255\377b\235\313\377\301\330\352\377\301\327\352\377\300\330"
- "\352\377\300\327\351\377a\233\312\377\3_\251\377\2]\247\377\2\\\246\377"
- "\2\\\245\377\2[\245\377\22e\251\377\260\313\341\377\300\325\347\377\300"
- "\325\347\377\300\325\346\377\300\325\346\377\300\324\346\377`\225\301"
- "\377\1T\232\377\1S\230\377\1T\232\377\1S\231\377\1P\223\377\1P\224\377"
- "\1N\221\377\1F\202\377\1$C\224\0\0\0T\0\0\0;\0\0\0\34\0\0\0\10\0\0\0"
- "\10\3=p\342\4J\206\377\4P\222\377\4U\232\377\4V\233\377\4V\234\377\4"
- "V\235\377\4W\236\377\4Y\240\377\5Y\241\377\5Z\241\377\5[\241\377\5[\242"
- "\377\5[\243\377\5\\\244\377\5]\246\377\5]\246\377\5^\247\377\5^\250\377"
- "\5a\254\377\5b\255\377\5b\255\377\5b\254\377\5d\260\377\5d\260\377\5"
- "c\257\377\5c\257\377\4e\261\377\5g\264\377\4g\264\377\4d\260\377\4f\264"
- "\377\4h\267\377\4e\261\377\3g\265\377\3h\267\377\3g\265\377\3g\265\377"
- "\3h\266\377\3i\271\377\3i\272\377\3j\272\377\2j\274\377\2i\272\377\2"
- "k\275\377\2j\274\377\1k\274\377\1k\275\377\1k\274\377\1k\275\377\1l\277"
- "\377\1n\302\377\1l\276\377\1o\303\377\1n\302\377\1p\303\377\1p\304\377"
- "\1p\304\377\1o\303\377\1p\304\377\1o\303\377\1q\307\377\1p\304\377\1"
- "o\302\377\1p\305\377\1p\305\377\0q\306\377\0q\306\377\0p\305\377\0q\306"
- "\377\0r\307\377\0s\311\377\0r\310\377\0p\304\377\0t\312\377\0t\312\377"
- "\0r\307\377\0r\310\377\0r\310\377\20z\313\377@\225\325\377@\224\324\377"
- "@\223\323\377@\225\325\377\0p\306\377\0o\304\377\0q\307\377\0p\305\377"
- "\0q\306\377\0q\306\377\0r\307\377\0q\306\377\0q\306\377\0q\307\377\0"
- "q\306\377\0q\307\377\0q\307\377\0p\305\377\0o\303\377\0o\304\377\0p\305"
- "\377\0q\306\377\0q\307\377\0o\304\377\0o\302\377\0p\305\377\1q\306\377"
- "\1q\306\377\1p\305\377\1p\304\377\1o\302\377\1o\303\377\1p\304\377\1"
- "p\304\377\1m\300\377\1n\302\377\1n\301\377\1m\300\377\1m\300\377\1l\277"
- "\377\1m\300\377\1l\276\377\1n\301\377\1n\302\377\1m\300\377\1l\276\377"
- "\1m\301\377\1l\277\377\1k\276\377\1k\275\377\1j\274\377\1k\276\377\1"
- "k\275\377\1i\272\377\1h\270\377\1i\273\377\1h\270\377\1g\267\377\1h\267"
- "\377\2f\266\377\2f\266\377\2e\264\377\2e\263\377\2e\264\377\2e\265\377"
- "\2e\264\377\2b\257\377\2d\263\377\2b\261\377\2`\255\377\2a\255\377\2"
- "`\255\377\2^\252\377\1^\252\377\1_\253\377\1]\247\377\1^\252\377\1\\"
- "\247\377\1^\251\377\1]\250\377\1Z\244\377\1Z\243\377\1Z\243\377\1Y\242"
- "\377\1Y\243\377\1W\236\377\2W\237\377\1V\236\377\1T\232\377\2U\234\377"
- "\2T\233\377\1T\232\377\2S\230\377\2Q\226\377\2S\231\377\2R\226\377\2"
- "N\220\377\2K\213\377\2D}\377\2""5c\354\0\0\0b\0\0\0S\0\0\0""8\0\0\0\32"
- "\0\0\0\10\0\0\0\6\0+O`\0""5d\377\0C}\377\0K\213\377\0M\220\377\0N\223"
- "\377\0O\223\377\0P\225\377\0Q\227\377\0S\230\377\0S\231\377\0T\231\377"
- "\0T\232\377\0T\232\377\0U\234\377\0V\236\377\0W\237\377\0X\240\377\1"
- "X\240\377\1[\245\377\1\\\247\377\2]\247\377\2\\\246\377\2_\252\377\2"
- "_\251\377\2^\251\377\3_\252\377\3`\253\377\3b\256\377\3b\257\377\4`\253"
- "\377\3b\256\377\3c\260\377\3`\253\377\3d\257\377\3e\261\377\3c\257\377"
- "\2c\260\377\2d\261\377\2f\263\377\2f\264\377\2f\265\377\2f\265\377\2"
- "e\263\377\2g\266\377\1f\265\377\1f\266\377\1g\267\377\1g\267\377\1g\267"
- "\377\0h\272\377\0i\273\377\0g\267\377\0k\275\377\0i\273\377\0j\275\377"
- "\0k\275\377\0k\275\377\0j\274\377\0j\275\377\0j\274\377\0l\277\377\0"
- "k\275\377\0i\273\377\0k\276\377\0k\275\377\0l\277\377\0k\275\377\0k\275"
- "\377\0k\276\377\0l\277\377\0m\301\377\0m\301\377\0k\275\377\0n\303\377"
- "\0o\303\377\0m\300\377\0m\301\377\0m\301\377\0m\301\377\0n\303\377\0"
- "m\300\377\0l\277\377\0n\302\377\0m\300\377\1l\276\377\1n\302\377\1m\300"
- "\377\1l\277\377\1n\300\377\1n\301\377\1l\276\377\1n\300\377\2n\302\377"
- "\1m\300\377\2n\301\377\2n\301\377\2l\276\377\2k\274\377\2l\276\377\2"
- "m\277\377\2m\277\377\2n\301\377\2l\276\377\2l\276\377\3m\300\377\3m\277"
- "\377\3m\300\377\2l\277\377\2l\275\377\2k\273\377\2l\275\377\2l\277\377"
- "\2k\275\377\2j\273\377\2k\274\377\2k\275\377\2j\273\377\2j\274\377\2"
- "i\271\377\2j\273\377\2i\271\377\1j\274\377\1k\275\377\1j\274\377\1i\272"
- "\377\1j\274\377\1h\272\377\1h\270\377\1h\271\377\1g\270\377\1h\270\377"
- "\1h\270\377\1e\263\377\2d\262\377\2f\265\377\2e\264\377\2d\262\377\2"
- "d\262\377\3c\261\377\2c\260\377\2a\255\377\2a\256\377\2a\256\377\1b\257"
- "\377\1a\256\377\1^\251\377\1`\255\377\0_\252\377\0\\\247\377\0\\\247"
- "\377\0\\\246\377\0Z\242\377\0Y\243\377\0Z\243\377\0X\240\377\0Y\242\377"
- "\0X\237\377\0X\241\377\0W\237\377\0U\233\377\0T\232\377\0T\232\377\0"
- "S\230\377\0S\231\377\0P\225\377\0P\225\377\0O\223\377\0N\221\377\0O\222"
- "\377\0N\221\377\0N\220\377\0M\217\377\0L\215\377\0M\217\377\0K\214\377"
- "\0E\201\377\0\77v\377\0""4a\377\0\23$\214\0\0\0`\0\0\0O\0\0\0""3\0\0"
- "\0\27\0\0\0\6\0\0\0\4\0\0\0\22\2$C{\1""7e\377\1Ay\377\2H\206\377\2L\214"
- "\377\2L\215\377\2N\220\377\2O\221\377\2O\222\377\2P\223\377\2Q\224\377"
- "\2Q\224\377\2R\225\377\3S\227\377\3T\231\377\3U\232\377\3U\232\377\2"
- "U\232\377\3X\237\377\3Y\240\377\2X\237\377\2X\240\377\2Z\243\377\2Y\241"
- "\377\1Y\241\377\1Z\243\377\1[\244\377\1\\\246\377\1\\\247\377\1Z\243"
- "\377\1\\\246\377\0]\251\377\0[\244\377\0^\251\377\0^\252\377\0\\\246"
- "\377\0]\250\377\0]\250\377\0^\252\377\0_\253\377\0`\254\377\0`\254\377"
- "\0_\253\377\0a\256\377\0_\254\377\0_\253\377\0a\255\377\0a\256\377\0"
- "a\255\377\0b\260\377\0c\262\377\0a\255\377\0d\262\377\0d\261\377\0d\262"
- "\377\0d\263\377\0c\260\377\0d\261\377\0d\262\377\0c\261\377\0d\263\377"
- "\0d\262\377\0b\256\377\0d\261\377\0c\261\377\0d\262\377\0d\261\377\0"
- "c\260\377\0c\261\377\0c\261\377\0d\261\377\0d\261\377\0b\256\377\0d\262"
- "\377\0e\263\377\0d\261\377\0d\261\377\0d\260\377\0d\261\377\0e\262\377"
- "\0d\260\377\0b\256\377\0d\261\377\0c\256\377\0b\256\377\0d\261\377\0"
- "c\257\377\0b\257\377\0d\260\377\0c\261\377\0c\256\377\0c\261\377\0e\262"
- "\377\0d\261\377\0d\261\377\0e\262\377\0d\261\377\0c\257\377\0d\262\377"
- "\0d\261\377\0d\261\377\0e\264\377\1d\260\377\1f\263\377\1e\263\377\1"
- "e\262\377\1e\262\377\1d\261\377\1c\260\377\1c\260\377\1d\261\377\1e\263"
- "\377\1d\262\377\1c\261\377\1d\261\377\1d\261\377\2d\261\377\2d\262\377"
- "\2d\260\377\2d\261\377\2e\261\377\3e\262\377\3f\263\377\3e\262\377\4"
- "d\260\377\4f\263\377\4e\260\377\4c\256\377\4d\257\377\5c\257\377\5d\260"
- "\377\4c\256\377\3`\252\377\3`\251\377\4a\253\377\4`\252\377\4_\251\377"
- "\2_\250\377\2^\247\377\2]\246\377\2\\\244\377\2[\244\377\1\\\245\377"
- "\1\\\246\377\1\\\245\377\1Y\241\377\1[\244\377\1Y\241\377\1W\236\377"
- "\1X\237\377\1X\236\377\1V\233\377\1V\234\377\1V\235\377\1U\232\377\1"
- "V\235\377\1T\232\377\1U\234\377\0T\232\377\0Q\226\377\0P\223\377\0P\224"
- "\377\0P\223\377\0P\223\377\0M\217\377\0M\216\377\0L\215\377\0K\213\377"
- "\0K\214\377\0K\213\377\0I\211\377\0I\210\377\0H\206\377\0G\204\377\0"
- "C~\377\0""9m\377\0""0[\377\0\31/\240\0\0\0e\0\0\0\\\0\0\0G\0\0\0*\0\0"
- "\0\21\0\0\0\4\0\0\0\2\0\0\0\13\0\0\0\37\0\36""8\205\0""0[\364\0""9l\377"
- "\0\77v\377\0Ay\377\0B|\377\0C}\377\0D~\377\0E\200\377\0F\202\377\0F\202"
- "\377\0G\204\377\0H\205\377\0I\206\377\0I\207\377\0I\207\377\0J\211\377"
- "\0L\214\377\0M\216\377\0N\217\377\0N\217\377\0P\222\377\0O\221\377\0"
- "O\221\377\0P\223\377\0Q\224\377\0R\225\377\0R\226\377\0P\222\377\0Q\224"
- "\377\0S\226\377\0P\222\377\0Q\224\377\0R\225\377\0Q\222\377\0R\224\377"
- "\0R\226\377\0S\227\377\0T\230\377\0T\230\377\0T\230\377\0S\227\377\0"
- "V\232\377\0U\231\377\0T\230\377\0U\232\377\0W\235\377\0W\235\377\0Z\241"
- "\377\0Z\242\377\0W\235\377\0Z\241\377\0Y\240\377\0Y\237\377\0Y\237\377"
- "\0X\235\377\0Y\236\377\0Y\240\377\0X\236\377\1Y\240\377\1Z\240\377\1"
- "X\235\377\1Z\240\377\1Z\237\377\1[\241\377\1Z\241\377\1Y\237\377\1Z\240"
- "\377\1Y\237\377\1Z\241\377\1Z\241\377\1X\235\377\1Z\240\377\1\\\242\377"
- "\2[\241\377\1\\\242\377\2[\241\377\2Z\236\377\1[\241\377\1Y\236\377\1"
- "X\234\377\2Z\237\377\2X\234\377\2X\234\377\1Y\236\377\2X\235\377\1X\234"
- "\377\1Y\235\377\1Y\235\377\1W\232\377\1X\234\377\1Y\235\377\1X\234\377"
- "\1X\234\377\1Y\236\377\1X\235\377\1W\233\377\1Y\235\377\1Y\235\377\1"
- "Y\235\377\1Z\240\377\1X\235\377\1Z\240\377\1Y\236\377\1X\235\377\1X\235"
- "\377\1X\234\377\1W\232\377\1W\233\377\1W\233\377\1X\235\377\1X\234\377"
- "\1W\233\377\1X\234\377\1X\234\377\1W\233\377\1X\235\377\2X\234\377\2"
- "Y\235\377\2Y\235\377\3Z\236\377\4Z\237\377\4Z\236\377\4Y\234\377\4Z\237"
- "\377\4Y\234\377\4X\233\377\3X\234\377\4X\233\377\3Y\235\377\3W\233\377"
- "\4V\230\377\4U\227\377\4V\231\377\4V\230\377\3U\227\377\3U\227\377\3"
- "S\225\377\2S\224\377\2R\223\377\2Q\223\377\2R\224\377\2R\224\377\2Q\223"
- "\377\2O\220\377\1Q\223\377\1P\221\377\1N\216\377\0N\217\377\0N\217\377"
- "\0M\215\377\0L\214\377\0M\215\377\0K\213\377\0L\214\377\0J\211\377\0"
- "K\213\377\0I\207\377\0G\203\377\0F\201\377\0G\202\377\0E\201\377\0E\201"
- "\377\0D~\377\0C~\377\0B{\377\0@x\377\0@y\377\0@w\377\0\77w\377\0\77u"
- "\377\0=s\377\0;p\377\0""5d\377\0+Q\365\0\27,\240\0\0\0e\0\0\0a\0\0\0"
- "R\0\0\0:\0\0\0\36\0\0\0\13\0\0\0\2\0\0\0\0\0\0\0\6\0\0\0\23\0\0\0*\0"
- "\14\27[\0(J\300\0-U\365\0""0Z\377\0""4a\377\1""4a\377\1""5b\377\1""5"
- "d\377\1""6e\377\1""6e\377\1""8g\377\1""8h\377\1""9i\377\1:k\377\1:k\377"
- "\1;m\377\1<o\377\1>q\377\1\77t\377\1\77s\377\1By\377\1Aw\377\1Aw\377"
- "\1Bx\377\1Bx\377\1By\377\1Dz\377\1Bw\377\2Cy\377\2D{\377\2Bx\377\2D{"
- "\377\2Cy\377\2Au\377\2Bw\377\2Bw\377\2Cx\377\2Cy\377\2Dz\377\2Dy\377"
- "\2Cx\377\2E{\377\2Dz\377\2Dy\377\2Dz\377\2E|\377\2F}\377\2I\201\377\2"
- "H\201\377\2G~\377\2H\201\377\2G\177\377\2H\177\377\2G\177\377\2G}\377"
- "\2Dz\377\2E{\377\2Dz\377\2Ez\377\2E{\377\2Dy\377\2Ez\377\2Dz\377\1Dz"
- "\377\1Bw\377\1Bv\377\1Bv\377\1Bw\377\1Cx\377\0Cx\377\0Au\377\0Cx\377"
- "\0Au\377\0Au\377\0Cx\377\0Bx\377\0Bw\377\0Cw\377\0At\377\0@s\377\0Bv"
- "\377\0At\377\0At\377\0Au\377\0@r\377\0\77r\377\0At\377\0\77p\377\0=m"
- "\377\0>o\377\0\77q\377\0\77q\377\0\77p\377\0\77q\377\0\77p\377\0\77p"
- "\377\0@s\377\0Au\377\1Bu\377\0Cx\377\0Bw\377\1At\377\1\77p\377\1@q\377"
- "\1@r\377\1@r\377\1@r\377\2@s\377\2As\377\2Bu\377\2Bu\377\2At\377\1Au"
- "\377\1Au\377\1Cx\377\1Dz\377\1Cy\377\1Dz\377\1Dz\377\0Dz\377\0E|\377"
- "\0D{\377\0Cz\377\0E|\377\0Cz\377\0Cz\377\0D{\377\0Bx\377\0Av\377\0@t"
- "\377\0>p\377\0>p\377\0>q\377\0>q\377\0>p\377\0>q\377\0>p\377\0=p\377"
- "\0=o\377\0=o\377\0=p\377\0=p\377\0=p\377\0=o\377\1>r\377\1>p\377\1<n"
- "\377\1=o\377\1=p\377\1<o\377\0<o\377\0<o\377\0<n\377\0<o\377\0""9h\377"
- "\0:k\377\0""6f\377\0""5c\377\0""5b\377\0""5c\377\0""4a\377\0""3a\377"
- "\0""3_\377\0""1\\\377\0""1[\377\0""0Z\377\0""0[\377\0/Z\377\0/X\377\0"
- "-U\377\0+R\377\0.X\365\0%F\305\0\17\33y\0\0\0e\0\0\0a\0\0\0W\0\0\0C\0"
- "\0\0*\0\0\0\22\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\11\0\0\0\30\0\0"
- "\0.\0\0\0E\0\0\0V\0\13\25}\0\16\31\213\0\21\36\214\1\21\37\214\1\21\40"
- "\214\0\21\40\214\1\22!\214\0\22!\214\1\22\"\214\1\23\"\214\1\23#\214"
- "\1\23#\214\0\20\35\214\0\17\34\214\0\17\34\214\0\17\33\214\0\17\34\214"
- "\1\21\36\214\1\24%\214\1\24%\214\1\25%\214\1\25&\214\1\25&\214\1\25'"
- "\214\1\25&\214\1\25&\214\1\25'\214\1\25%\214\1\25'\214\1\25'\214\1\25"
- "&\214\1\25&\214\1\24$\214\1\21\36\214\1\21\36\214\0\21\36\214\0\21\36"
- "\214\0\21\35\214\1\21\36\214\1\21\36\214\1\21\36\214\1\21\36\214\1\21"
- "\36\214\1\21\37\214\1\24#\214\1\26(\214\1\26'\214\1\27(\214\1\26'\214"
- "\1\26'\214\1\26'\214\1\26'\214\1\26'\214\1\26'\214\0\23\"\214\0\21\40"
- "\214\0\21\40\214\0\21\37\214\0\21\40\214\0\22\40\214\0\22\40\214\0\21"
- "\40\214\0\21\40\214\0\22\40\214\0\22\40\214\0\22!\214\0\22!\214\0\22"
- "\40\214\0\22!\214\0\22!\214\0\21\40\214\0\22!\214\0\22!\214\0\23!\214"
- "\0\23\"\214\0\23\"\214\0\23\"\214\0\24#\214\0\23#\214\0\24#\214\0\24"
- "$\214\0\24$\214\0\24$\214\0\25%\214\0\23#\214\0\22!\214\0\23!\214\0\23"
- "\"\214\0\23\"\214\0\23\"\214\0\24#\214\0\24$\214\0\24$\214\0\24$\214"
- "\0\25%\214\0\25%\214\0\25&\214\0\25%\214\0\24#\214\0\22!\214\1\23!\214"
- "\1\23!\214\1\23!\214\1\23!\214\1\23\"\214\1\23\"\214\1\24\"\214\1\24"
- "\"\214\1\24\"\214\1\24#\214\1\24#\214\1\24#\214\1\24$\214\0\24$\214\0"
- "\24$\214\0\24$\214\0\24$\214\0\24%\214\0\24%\214\0\24$\214\0\24%\214"
- "\0\24%\214\0\24$\214\0\24%\214\0\21\36\214\0\20\36\214\0\21\36\214\0"
- "\21\36\214\0\20\36\214\0\21\36\214\0\21\36\214\0\21\36\214\0\21\37\214"
- "\0\21\37\214\0\21\37\214\0\21\37\214\0\21\37\214\0\21\40\214\0\21\40"
- "\214\0\21\40\214\0\21\40\214\0\21!\214\0\21!\214\0\21\40\214\0\21!\214"
- "\0\21!\214\0\21!\214\0\21!\214\0\22!\214\0\22!\214\0\16\33\214\0\16\33"
- "\214\0\17\33\214\0\17\33\214\0\17\33\214\0\17\33\214\0\17\34\214\0\17"
- "\34\214\0\17\34\214\0\17\34\214\0\17\34\214\0\17\34\214\0\17\34\214\0"
- "\17\34\214\0\17\34\214\0\16\33\214\0\16\32\214\0\20\37\203\0\0\0f\0\0"
- "\0e\0\0\0d\0\0\0_\0\0\0V\0\0\0E\0\0\0.\0\0\0\30\0\0\0\11\0\0\0\2\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\13\0\0\0\32\0\0\0-\0\0\0@\0\0\0N\0"
- "\0\0W\0\0\0[\0\0\0]\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^"
- "\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0"
- "^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0"
- "\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0"
- "\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^"
- "\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0"
- "^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0"
- "\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0"
- "\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^"
- "\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0"
- "^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0"
- "\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0"
- "\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^"
- "\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0"
- "^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0"
- "\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0"
- "\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^\0\0\0^"
- "\0\0\0^\0\0\0]\0\0\0[\0\0\0W\0\0\0N\0\0\0@\0\0\0-\0\0\0\31\0\0\0\12\0"
- "\0\0\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\12\0\0\0"
- "\26\0\0\0%\0\0\0""4\0\0\0>\0\0\0F\0\0\0H\0\0\0J\0\0\0J\0\0\0J\0\0\0J"
- "\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0"
- "J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0"
- "\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0"
- "\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J"
- "\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0"
- "J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0"
- "\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0"
- "\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J"
- "\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0"
- "J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0"
- "\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0"
- "\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J"
- "\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0"
- "J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0"
- "\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0"
- "\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0J"
- "\0\0\0J\0\0\0J\0\0\0J\0\0\0J\0\0\0H\0\0\0F\0\0\0>\0\0\0""4\0\0\0%\0\0"
- "\0\26\0\0\0\12\0\0\0\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\2\0\0\0\7\0\0\0\17\0\0\0\30\0\0\0\40\0\0\0&\0\0\0)\0"
- "\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*"
- "\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0"
- "*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0"
- "\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0"
- "\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*"
- "\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0"
- "*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0"
- "\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0"
- "\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*"
- "\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0"
- "*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0"
- "\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0"
- "\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*"
- "\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0"
- "*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0"
- "\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0"
- "\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0)\0\0\0&"
- "\0\0\0\40\0\0\0\30\0\0\0\17\0\0\0\7\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0"
- "\7\0\0\0\13\0\0\0\16\0\0\0\20\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0"
- "\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21"
- "\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0"
- "\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0"
- "\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21"
- "\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0"
- "\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0"
- "\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21"
- "\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0"
- "\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0"
- "\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21"
- "\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0"
- "\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0"
- "\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21"
- "\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0"
- "\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0"
- "\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21"
- "\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0"
- "\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0"
- "\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21"
- "\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0"
- "\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\21\0\0\0\20\0"
- "\0\0\16\0\0\0\13\0\0\0\7\0\0\0\3\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0"};
diff --git a/ui/gtk/pixbuf-csource.h b/ui/gtk/pixbuf-csource.h
deleted file mode 100644
index 3066f1bc8c..0000000000
--- a/ui/gtk/pixbuf-csource.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* This file was automatically generated. DO NOT EDIT. */
-
-#ifndef __PIXBUF_CSOURCE_HEADER__
-#define __PIXBUF_CSOURCE_HEADER__
-
-#include <glib.h>
-
-extern const guint8 expert_chat_pb_data[];
-extern const guint8 expert_error_pb_data[];
-extern const guint8 expert_none_pb_data[];
-extern const guint8 expert_note_pb_data[];
-extern const guint8 expert_warn_pb_data[];
-extern const guint8 expert_ok_pb_data[];
-extern const guint8 capture_comment_add_pb_data[];
-extern const guint8 capture_comment_update_pb_data[];
-extern const guint8 capture_comment_disabled_pb_data[];
-extern const guint8 network_bluetooth_pb_data[];
-extern const guint8 network_usb_pb_data[];
-extern const guint8 network_wired_pb_data[];
-extern const guint8 network_wireless_pb_data[];
-extern const guint8 remote_arrow_pb_data[];
-extern const guint8 remote_globe_pb_data[];
-extern const guint8 remote_sat_pb_data[];
-extern const guint8 pipe_pb_data[];
-extern const guint8 capture_interfaces_16_pb_data[];
-extern const guint8 capture_interfaces_24_pb_data[];
-extern const guint8 gnome_emblem_web_16_pb_data[];
-extern const guint8 gnome_emblem_web_24_pb_data[];
-extern const guint8 toolbar_wireshark_file_16_pb_data[];
-extern const guint8 toolbar_wireshark_file_24_pb_data[];
-extern const guint8 capture_options_alt1_16_pb_data[];
-extern const guint8 capture_options_alt1_24_pb_data[];
-extern const guint8 capture_restart_16_pb_data[];
-extern const guint8 capture_restart_24_pb_data[];
-extern const guint8 capture_start_16_pb_data[];
-extern const guint8 capture_start_24_pb_data[];
-extern const guint8 capture_stop_16_pb_data[];
-extern const guint8 capture_stop_24_pb_data[];
-extern const guint8 layout_1_pb_data[];
-extern const guint8 layout_2_pb_data[];
-extern const guint8 layout_3_pb_data[];
-extern const guint8 layout_4_pb_data[];
-extern const guint8 layout_5_pb_data[];
-extern const guint8 layout_6_pb_data[];
-extern const guint8 wsicon_16_pb_data[];
-extern const guint8 wsicon_24_pb_data[];
-extern const guint8 wsicon_32_pb_data[];
-extern const guint8 wsicon_48_pb_data[];
-extern const guint8 wsicon_64_pb_data[];
-extern const guint8 wsiconcap_16_pb_data[];
-extern const guint8 wsiconcap_24_pb_data[];
-extern const guint8 wsiconcap_32_pb_data[];
-extern const guint8 wsiconcap_48_pb_data[];
-extern const guint8 wsiconcap_64_pb_data[];
-extern const guint8 wssplash_pb_data[];
-
-#endif /*__PIXBUF_CSOURCE_HEADER__*/
diff --git a/ui/gtk/pixmap_save.c b/ui/gtk/pixmap_save.c
deleted file mode 100644
index c92dccf5d2..0000000000
--- a/ui/gtk/pixmap_save.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/* pixmap_save.c
- * Routines for saving pixmaps using the Gdk-Pixmap library
- * Copyright 2007, Stephen Fisher (see AUTHORS file)
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-
-#include "config.h"
-#include <errno.h>
-
-#include <gtk/gtk.h>
-
-#include <wsutil/filesystem.h>
-
-#include "ui/last_open_dir.h"
-#include "ui/simple_dialog.h"
-#include "ui/util.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-#include "ui/gtk/pixmap_save.h"
-#include "ui/gtk/file_dlg.h"
-#include "ui/gtk/gui_utils.h"
-
-#if GTK_CHECK_VERSION(2,22,0)
-#if !GTK_CHECK_VERSION(3,0,0)
-#include "ui/gtk/gui_utils.h"
-#endif
-#endif
-
-void
-pixmap_save_cb(GtkWidget *w, gpointer pixmap_ptr _U_)
-{
- GtkWidget *save_as_w;
-#if GTK_CHECK_VERSION(2,22,0)
- surface_info_t *surface_info = (surface_info_t *)g_object_get_data(G_OBJECT(w), "surface-info");
-#else
- GdkPixmap *pixmap = (GdkPixmap *)g_object_get_data(G_OBJECT(w), "pixmap");
-#endif
- GdkPixbuf *pixbuf;
- GdkPixbufFormat *pixbuf_format;
- GtkWidget *main_vb, *save_as_type_hb, *type_lb, *type_cm;
- GSList *file_formats,*ffp;
- GtkWidget *parent;
-
- gchar *format_name;
- guint format_index = 0;
- guint default_index = 0;
-
- gchar *filename, *file_type;
- GError *error = NULL;
- gboolean ret;
- GtkWidget *msg_dialog;
-
-#if GTK_CHECK_VERSION(2,22,0)
- pixbuf = gdk_pixbuf_get_from_surface (surface_info->surface,
- 0, 0, surface_info->width, surface_info->height);
-#else
- pixbuf = gdk_pixbuf_get_from_drawable(NULL, pixmap, NULL,
- 0, 0, 0, 0, -1, -1);
-#endif
- if(!pixbuf) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "%sCould not get image from graph%s",
- simple_dialog_primary_start(),
- simple_dialog_primary_end());
- return;
- }
-
- parent = gtk_widget_get_toplevel(w);
- save_as_w = file_selection_new("Wireshark: Save Graph As ...",
- GTK_WINDOW(parent),
- FILE_SELECTION_SAVE);
-
- /* Container for each row of widgets */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- file_selection_set_extra_widget(save_as_w, main_vb);
- gtk_widget_show(main_vb);
-
- save_as_type_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(main_vb), save_as_type_hb, FALSE, FALSE, 0);
- gtk_widget_show(save_as_type_hb);
-
- type_lb = gtk_label_new("File type: ");
- gtk_box_pack_start(GTK_BOX(save_as_type_hb), type_lb, FALSE, FALSE, 0);
- gtk_widget_show(type_lb);
-
- type_cm = gtk_combo_box_text_new();
- gtk_box_pack_start(GTK_BOX(save_as_type_hb), type_cm, FALSE, FALSE, 0);
-
- /* List all of the file formats the gdk-pixbuf library supports */
- file_formats = gdk_pixbuf_get_formats();
- ffp = file_formats;
- while(ffp) {
- pixbuf_format = (GdkPixbufFormat *)ffp->data;
- if (gdk_pixbuf_format_is_writable(pixbuf_format)) {
- format_name = gdk_pixbuf_format_get_name(pixbuf_format);
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(type_cm),
- format_name);
- if (!(g_ascii_strcasecmp(format_name, "png")))
- default_index = format_index;
- format_index++;
- }
- ffp = g_slist_next(ffp);
- }
- g_slist_free(file_formats);
-
- gtk_combo_box_set_active(GTK_COMBO_BOX(type_cm), default_index);
- gtk_widget_show(type_cm);
-
- gtk_widget_show(save_as_w);
- window_present(save_as_w);
-
- /*
- * Loop until the user either selects a file or gives up.
- */
- for (;;) {
- if (gtk_dialog_run(GTK_DIALOG(save_as_w)) != GTK_RESPONSE_ACCEPT) {
- /* They clicked "Cancel" or closed the dialog or.... */
- window_destroy(save_as_w);
- return;
- }
-
- filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(save_as_w));
-
- /* Perhaps the user specified a directory instead of a file.
- Check whether they did. */
- if (test_for_directory(filename) == EISDIR) {
- /* It's a directory - set the file selection box to display that
- directory, and leave the selection box displayed. */
- set_last_open_dir(filename);
- g_free(filename);
- file_selection_set_current_folder(save_as_w,
- get_last_open_dir());
- gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(save_as_w), "");
- continue;
- }
-
- file_type = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(type_cm));
- ret = gdk_pixbuf_save(pixbuf, filename, file_type, &error, NULL);
- g_free(filename);
- g_free(file_type);
-
- if (!ret) {
- msg_dialog = gtk_message_dialog_new(GTK_WINDOW(save_as_w),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_OK,
- "%s", error->message);
- gtk_dialog_run(GTK_DIALOG(msg_dialog));
- gtk_widget_destroy(msg_dialog);
- continue;
- }
-
- window_destroy(save_as_w);
- return;
- }
-}
-
-/*
- * Editor modelines - http://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/gtk/pixmap_save.h b/ui/gtk/pixmap_save.h
deleted file mode 100644
index d1cb7ba214..0000000000
--- a/ui/gtk/pixmap_save.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* pixmap_save.h
- * Routines for saving pixmaps using the Gdk-Pixmap library
- * Copyright 2007, Stephen Fisher (see AUTHORS file)
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __PIXMAP_SAVE_H__
-#define __PIXMAP_SAVE_H__
-
-/* Callback to be tied to a save button. This function will pop-up a dialog
- * asking for options to save the graph with (such as file type). */
-void pixmap_save_cb(GtkWidget *w, gpointer pixmap_ptr);
-
-typedef struct _surface_info_t {
- cairo_surface_t *surface;
- gint width;
- gint height;
-} surface_info_t;
-#endif /* __PIXMAP_SAVE_H__ */
diff --git a/ui/gtk/plugins_dlg.c b/ui/gtk/plugins_dlg.c
deleted file mode 100644
index 06498228ce..0000000000
--- a/ui/gtk/plugins_dlg.c
+++ /dev/null
@@ -1,136 +0,0 @@
-/* plugins_dlg.c
- * Dialog boxes for plugins
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <gtk/gtk.h>
-
-#ifdef HAVE_LUA
-#include <epan/wslua/init_wslua.h>
-#endif
-
-#include <wsutil/plugins.h>
-
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/plugins_dlg.h"
-
-#include "webbrowser.h"
-
-#if defined(HAVE_PLUGINS) || defined(HAVE_LUA)
-
-static gboolean
-about_plugins_callback(GtkWidget *widget, GdkEventButton *event, gint id _U_)
-{
- GtkTreeSelection *tree_selection;
- GtkTreeModel *model;
- GtkTreeIter iter;
- gchar *type;
- gchar *file;
-
- tree_selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(widget));
-
- if (gtk_tree_selection_count_selected_rows (tree_selection) == 0)
- return FALSE;
-
- if (event->type != GDK_2BUTTON_PRESS)
- /* not a double click */
- return FALSE;
-
- if (gtk_tree_selection_get_selected (tree_selection, &model, &iter)) {
- gtk_tree_model_get (model, &iter, 2, &type, -1);
- if (strcmp (type, "lua script") == 0) {
- gtk_tree_model_get (model, &iter, 3, &file, -1);
- browser_open_data_file (file);
- g_free (file);
- }
- g_free (type);
- }
-
- return TRUE;
-}
-
-/*
- * Fill the list widget with a list of the plugin modules.
- * XXX - We might want to combine this with plugins_dump_all().
- */
-static void
-plugins_add_description(const char *name, const char *version,
- const char *types, const char *filename,
- void *user_data)
-{
- GtkWidget *list = (GtkWidget *)user_data;
-
- simple_list_append(list, 0, name, 1, version,
- 2, types, 3, filename, -1);
-}
-static void
-plugins_scan(GtkWidget *list)
-{
-#ifdef HAVE_PLUGINS
- plugins_get_descriptions(plugins_add_description, list);
-#endif
-
-#ifdef HAVE_LUA
- wslua_plugins_get_descriptions(plugins_add_description, list);
-#endif
-}
-
-
-GtkWidget *
-about_plugins_page_new(void)
-{
- GtkWidget *scrolledwindow;
- GtkWidget *plugins_list;
- static const gchar *titles[] = {"Name", "Version", "Type", "Path"};
-
-
- scrolledwindow = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow),
- GTK_SHADOW_IN);
-
- plugins_list = simple_list_new(4, titles);
- plugins_scan(plugins_list);
-
- /* connect a callback so we can spot a double-click */
- g_signal_connect(plugins_list, "button_press_event",
- G_CALLBACK(about_plugins_callback), NULL);
-
- gtk_container_add(GTK_CONTAINER(scrolledwindow), plugins_list);
-
- return scrolledwindow;
-}
-
-#endif /* HAVE_PLUGINS || HAVE_LUA */
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/plugins_dlg.h b/ui/gtk/plugins_dlg.h
deleted file mode 100644
index d6ea5ff12e..0000000000
--- a/ui/gtk/plugins_dlg.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* plugins_dlg.h
- * Plugins definitions
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __PLUGINS_DLG_H__
-#define __PLUGINS_DLG_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-GtkWidget * about_plugins_page_new(void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __PLUGINS_DLG_H__ */
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/prefs_capture.c b/ui/gtk/prefs_capture.c
deleted file mode 100644
index 812f4ca8e9..0000000000
--- a/ui/gtk/prefs_capture.c
+++ /dev/null
@@ -1,2210 +0,0 @@
-/* prefs_capture.c
- * Dialog box for capture preferences
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#ifdef HAVE_LIBPCAP
-
-#include <string.h>
-#include <gtk/gtk.h>
-
-#include <epan/prefs.h>
-
-#include "capture_opts.h"
-#include "caputils/capture_ifinfo.h"
-#include "ui/capture_ui_utils.h"
-#include "ui/capture_globals.h"
-#include "ui/iface_lists.h"
-#include "ui/simple_dialog.h"
-#include "ui/ws_ui_util.h"
-
-#include "ui/gtk/prefs_capture.h"
-#include "ui/gtk/prefs_dlg.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/main_welcome.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/old-gtk-compat.h"
-#include <epan/strutil.h>
-
-#include <wiretap/wtap.h>
-
-#define DEVICE_KEY "device"
-#define PROM_MODE_KEY "prom_mode"
-#define PCAP_NG_KEY "pcap_ng"
-#define CAPTURE_REAL_TIME_KEY "capture_real_time"
-#define AUTO_SCROLL_KEY "auto_scroll"
-#define SHOW_INFO_KEY "show_info"
-
-#define IFOPTS_CALLER_PTR_KEY "ifopts_caller_ptr"
-#define IFOPTS_DIALOG_PTR_KEY "ifopts_dialog_ptr"
-#define IFOPTS_LIST_TEXT_COLS 4
-#define IFOPTS_MAX_DESCR_LEN 128
-#define IFOPTS_IF_NOSEL -1
-#define COLOPTS_CALLER_PTR_KEY "colopts_caller_ptr"
-#define COLOPTS_DIALOG_PTR_KEY "colopts_dialog_ptr"
-
-static GtkWidget *capture_window;
-
-/* interface options dialog */
-static GtkWidget *cur_list, *if_dev_lb, *if_name_lb, *if_linktype_lb, *if_linktype_cb, *if_descr_te, *if_hide_cb, *if_default_if_lb;
-#ifdef HAVE_PCAP_CREATE
-static GtkWidget *if_monitor_lb, *if_monitor_cb;
-#endif
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
-static GtkWidget *if_buffersize_lb, *if_buffersize_cb;
-#endif
-static GtkWidget *if_snaplen_lb, *if_snaplen_cb, *if_snaplen_tg, *if_pmode_lb, *if_pmode_cb;
-static GtkTreeSelection *if_selection; /* current interface row selected */
-static int num_linktypes;
-static gboolean interfaces_info_nochange; /* TRUE to ignore Interface Options Properties */
- /* widgets "changed" callbacks. */
-
-static void ifopts_edit_cb(GtkWidget *w, gpointer data);
-static void ifopts_edit_ok_cb(GtkWidget *w, gpointer parent_w);
-static void ifopts_edit_destroy_cb(GtkWidget *win, gpointer data);
-static void ifopts_edit_ifsel_cb(GtkTreeSelection *selection, gpointer data);
-#ifdef HAVE_PCAP_CREATE
-static void ifopts_edit_monitor_changed_cb(GtkToggleButton *tbt, gpointer udata);
-#endif
-static void ifopts_edit_linktype_changed_cb(GtkComboBox *ed, gpointer udata);
-static void ifopts_edit_descr_changed_cb(GtkEditable *ed, gpointer udata);
-static void ifopts_edit_hide_changed_cb(GtkToggleButton *tbt, gpointer udata);
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
-static void ifopts_edit_buffersize_changed_cb(GtkSpinButton *ed, gpointer udata);
-#endif
-static void ifopts_edit_snaplen_changed_cb(GtkSpinButton *ed, gpointer udata);
-static void ifopts_edit_hassnap_changed_cb(GtkToggleButton *tbt, gpointer udata);
-static void ifopts_edit_pmode_changed_cb(GtkToggleButton *tbt, gpointer udata);
-static void ifopts_options_add(GtkListStore *list_store, if_info_t *if_info);
-static void ifopts_options_free(gchar *text[]);
-static void ifopts_if_liststore_add(void);
-#ifdef HAVE_PCAP_CREATE
-static void ifopts_write_new_monitor_mode(void);
-#endif
-static void ifopts_write_new_linklayer(void);
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
-static void ifopts_write_new_buffersize(void);
-#endif
-static void ifopts_write_new_snaplen(void);
-static void ifopts_write_new_descr(void);
-static void ifopts_write_new_hide(void);
-static void ifopts_write_new_pmode(void);
-static void prom_mode_cb(GtkToggleButton *tbt, gpointer udata);
-
-/* Columns options dialog */
-#ifdef HAVE_PCAP_CREATE
-static GtkWidget *col_monitor_cb;
-#endif
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
-static GtkWidget *col_buf_cb;
-#endif
-static GtkWidget *col_snap_cb;
-static GtkWidget *col_link_cb, *col_filter_cb, *col_pmode_cb;
-static void colopts_edit_destroy_cb(GtkWidget *win, gpointer data);
-static void colopts_edit_cb(GtkWidget *w, gpointer data);
-static void colopts_edit_ok_cb(GtkWidget *w, gpointer parent_w);
-
-GtkWidget*
-capture_prefs_show(void)
-{
- GtkWidget *main_grid;
- GtkWidget *if_cbxe, *if_lb, *promisc_cb, *pcap_ng_cb, *sync_cb, *auto_scroll_cb, *show_info_cb;
- GtkWidget *ifopts_lb, *ifopts_bt, *colopts_lb, *colopts_bt;
- GList *if_list, *combo_list;
- int err;
- int row = 0;
- const gchar *tooltips_text;
-
- /* Main vertical box */
- capture_window = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 7, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(capture_window), 5);
-
- /* Main grid */
- main_grid = ws_gtk_grid_new();
- gtk_box_pack_start(GTK_BOX(capture_window), main_grid, FALSE, FALSE, 0);
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_set_vexpand(GTK_WIDGET(main_grid), FALSE); /* Ignore VEXPAND requests from children */
-#endif
- ws_gtk_grid_set_row_spacing(GTK_GRID(main_grid), 10);
- ws_gtk_grid_set_column_spacing(GTK_GRID(main_grid), 15);
- gtk_widget_show(main_grid);
-
- /* Default device */
- if_lb = gtk_label_new("Default interface:");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_lb, 0, row, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(if_lb), 1.0f, 0.5f);
- gtk_widget_show(if_lb);
-
- if_cbxe = gtk_combo_box_text_new_with_entry();
- /*
- * XXX - what if we can't get the list?
- */
- if_list = capture_interface_list(&err, NULL, main_window_update);
- combo_list = build_capture_combo_list(if_list, FALSE);
- free_interface_list(if_list);
- if (combo_list != NULL) {
- GList *combo_entry;
- for (combo_entry = combo_list; combo_entry != NULL; combo_entry = g_list_next(combo_entry)) {
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(if_cbxe), (const gchar *)combo_entry->data);
- }
- }
- if (prefs.capture_device) {
- gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(if_cbxe))),
- prefs.capture_device);
- }
- else if (combo_list != NULL) {
- gtk_combo_box_set_active(GTK_COMBO_BOX(if_cbxe), 0);
- }
- free_capture_combo_list(combo_list);
-
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_cbxe, 1, row, 1, 1);
- tooltips_text = "The default interface to be captured from.";
- gtk_widget_set_tooltip_text(if_lb, tooltips_text);
- gtk_widget_set_tooltip_text(gtk_bin_get_child(GTK_BIN(if_cbxe)), tooltips_text);
- gtk_widget_show(if_cbxe);
- g_object_set_data(G_OBJECT(capture_window), DEVICE_KEY, if_cbxe);
- row++;
-
- /* Interface properties */
- ifopts_lb = gtk_label_new("Interfaces:");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), ifopts_lb, 0, row, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(ifopts_lb), 1.0f, 0.5f);
- gtk_widget_show(ifopts_lb);
-
- ifopts_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_EDIT);
- tooltips_text = "Open a dialog box to set various interface options.";
- gtk_widget_set_tooltip_text(ifopts_lb, tooltips_text);
- gtk_widget_set_tooltip_text(ifopts_bt, tooltips_text);
- g_signal_connect(ifopts_bt, "clicked", G_CALLBACK(ifopts_edit_cb), NULL);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), ifopts_bt, 1, row, 1, 1);
- row++;
-
- /* Promiscuous mode */
- promisc_cb = create_preference_check_button(main_grid, row++,
- "Capture packets in promiscuous mode on all network cards:",
- "To set this mode on a per interface basis, select the interface first."
- "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 \"see\", mark this option. "
- "See the FAQ for some more details of capturing packets from a switched network. ",
- prefs.capture_prom_mode);
- g_signal_connect(promisc_cb, "toggled", G_CALLBACK(prom_mode_cb), NULL);
- g_object_set_data(G_OBJECT(capture_window), PROM_MODE_KEY, promisc_cb);
-
- /* Pcapng format */
- pcap_ng_cb = create_preference_check_button(main_grid, row++,
- "Capture packets in pcapng format:",
- "Capture packets in the next-generation capture file format.",
- prefs.capture_pcap_ng);
- g_object_set_data(G_OBJECT(capture_window), PCAP_NG_KEY, pcap_ng_cb);
-
- /* Real-time capture */
- sync_cb = create_preference_check_button(main_grid, row++,
- "Update list of packets in real time:",
- "Update the list of packets while capture is in progress. "
- "This can result in dropped packets on high-speed networks.",
- prefs.capture_real_time);
- g_object_set_data(G_OBJECT(capture_window), CAPTURE_REAL_TIME_KEY, sync_cb);
-
- /* Auto-scroll real-time capture */
- auto_scroll_cb = create_preference_check_button(main_grid, row++,
- "Automatic scrolling in live capture:",
- "Keep the packet list scrolled to the bottom while capturing.",
- prefs.capture_auto_scroll);
- g_object_set_data(G_OBJECT(capture_window), AUTO_SCROLL_KEY, auto_scroll_cb);
-
- /* Show capture info dialog */
- show_info_cb = create_preference_check_button(main_grid, row++,
- "Hide capture info dialog:",
- "Hide the capture info dialog while capturing. ",
- !prefs.capture_show_info);
- g_object_set_data(G_OBJECT(capture_window), SHOW_INFO_KEY, show_info_cb);
-
- /* Column properties */
- colopts_lb = gtk_label_new("Columns:");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), colopts_lb, 0, row, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(colopts_lb), 1.0f, 0.5f);
- gtk_widget_show(colopts_lb);
-
- colopts_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_EDIT);
- tooltips_text = "Open a dialog box to change the visible columns.";
- gtk_widget_set_tooltip_text(colopts_lb, tooltips_text);
- gtk_widget_set_tooltip_text(colopts_bt, tooltips_text);
- g_signal_connect(colopts_bt, "clicked", G_CALLBACK(colopts_edit_cb), NULL);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), colopts_bt, 1, row, 1, 1);
- row++;
-
- /* Show 'em what we got */
- gtk_widget_show_all(capture_window);
-
- return(capture_window);
-}
-
-void
-capture_prefs_fetch(GtkWidget *w)
-{
- GtkWidget *if_cbxe, *promisc_cb, *pcap_ng_cb, *sync_cb, *auto_scroll_cb, *show_info_cb;
- gchar *if_text;
-
- if_cbxe = (GtkWidget *)g_object_get_data(G_OBJECT(w), DEVICE_KEY);
- promisc_cb = (GtkWidget *)g_object_get_data(G_OBJECT(w), PROM_MODE_KEY);
- pcap_ng_cb = (GtkWidget *)g_object_get_data(G_OBJECT(w), PCAP_NG_KEY);
- sync_cb = (GtkWidget *)g_object_get_data(G_OBJECT(w), CAPTURE_REAL_TIME_KEY);
- auto_scroll_cb = (GtkWidget *)g_object_get_data(G_OBJECT(w), AUTO_SCROLL_KEY);
- show_info_cb = (GtkWidget *)g_object_get_data(G_OBJECT(w), SHOW_INFO_KEY);
-
- if_text = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(if_cbxe)))));
- /* Strip out white space */
- g_strstrip(if_text);
- /* If there was nothing but white space, treat that as an
- indication that the user doesn't want to wire in a default
- device, and just wants the first device in the list chosen. */
- if (*if_text == '\0') {
- g_free(if_text);
- if_text = NULL;
- }
-
- /* Ensure capture device is not NULL */
- if (if_text == NULL)
- if_text = g_strdup("");
-
- g_free(prefs.capture_device);
- prefs.capture_device = if_text;
-
- prefs.capture_prom_mode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(promisc_cb));
-
- prefs.capture_pcap_ng = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pcap_ng_cb));
-
- prefs.capture_real_time = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sync_cb));
-
- prefs.capture_auto_scroll = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(auto_scroll_cb));
-
- prefs.capture_show_info = !(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(show_info_cb)));
-}
-
-void
-capture_prefs_apply(GtkWidget *w _U_)
-{
-}
-
-void
-capture_prefs_destroy(GtkWidget *w)
-{
- GtkWidget *caller = gtk_widget_get_toplevel(w);
- GtkWidget *dlg;
-
- /* Is there an interface descriptions dialog associated with this
- Preferences dialog? */
- dlg = (GtkWidget *)g_object_get_data(G_OBJECT(caller), IFOPTS_DIALOG_PTR_KEY);
-
- if (dlg != NULL) {
- /* Yes. Destroy it. */
- window_destroy(dlg);
- }
-
- /* Is there an column descriptions dialog associated with this
- Preferences dialog? */
- dlg = (GtkWidget *)g_object_get_data(G_OBJECT(caller), COLOPTS_DIALOG_PTR_KEY);
-
- if (dlg != NULL) {
- /* Yes. Destroy it. */
- window_destroy(dlg);
- }
-}
-
-/*
- * Create an edit interface options dialog.
- */
-enum
-{
- DEVICE_COLUMN,
- DESC_COLUMN,
-#ifdef HAVE_PCAP_CREATE
- DEF_MONITOR_MODE_COLUMN,
-#endif
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- BUF_COLUMN,
-#endif
- HASSNAP_COLUMN,
- SNAPLEN_COLUMN,
- PMODE_COLUMN,
- DEF_LINK_LAYER_COLUMN,
- COMMENT_COLUMN,
- HIDE_COLUMN,
- DLT_COLUMN,
- N_COLUMN /* The number of columns */
-};
-
-
-static void
-colopts_edit_cb(GtkWidget *w, gpointer data _U_)
-{
- GtkWidget *colopts_edit_dlg, *main_hb, *main_grid,
- *ed_opts_fr, *main_vb,
- *bbox, *ok_bt, *cancel_bt, *help_bt, *column_lb,
- *col_link_lb,
-#ifdef HAVE_PCAP_CREATE
- *col_monitor_lb,
-#endif
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- *col_buf_lb,
-#endif
- *col_filter_lb, *col_pmode_lb,
- *col_snap_lb;
-
- int row = 0;
-
- GtkWidget *caller = gtk_widget_get_toplevel(w);
-
- /* Has an edit dialog box already been opened for that top-level
- widget? */
- colopts_edit_dlg = (GtkWidget *)g_object_get_data(G_OBJECT(caller), COLOPTS_DIALOG_PTR_KEY);
- if (colopts_edit_dlg != NULL) {
- /* Yes. Just re-activate that dialog box. */
- reactivate_window(colopts_edit_dlg);
- return;
- }
-
- /* create a new dialog */
- colopts_edit_dlg = dlg_conf_window_new("Wireshark: Preferences: Capture Options Columns");
- gtk_window_set_default_size(GTK_WINDOW(colopts_edit_dlg), 300, 200);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 1, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_container_add(GTK_CONTAINER(colopts_edit_dlg), main_vb);
- gtk_widget_show(main_vb);
-
- /* create edit options frame */
- ed_opts_fr = gtk_frame_new("Columns");
- gtk_box_pack_start(GTK_BOX(main_vb), ed_opts_fr, FALSE, FALSE, 0);
- gtk_widget_show(ed_opts_fr);
-
- main_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5, TRUE);
- gtk_container_set_border_width(GTK_CONTAINER(main_hb), 3);
- gtk_container_add(GTK_CONTAINER(ed_opts_fr), main_hb);
- gtk_widget_show(main_hb);
-
- /* grid to hold description text entry and hide button */
- main_grid = ws_gtk_grid_new();
- gtk_box_pack_start(GTK_BOX(main_hb), main_grid, TRUE, FALSE, 10);
- ws_gtk_grid_set_row_spacing(GTK_GRID(main_grid), 10);
- ws_gtk_grid_set_column_spacing(GTK_GRID(main_grid), 10);
- gtk_widget_show(main_grid);
-
- column_lb = gtk_label_new("Select the columns to be displayed");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), column_lb, 0, row, 2, 1);
- gtk_misc_set_alignment(GTK_MISC(column_lb), 0, 0.5f);
- gtk_widget_show(column_lb);
- row++;
-
- /* create "Link Layer" label and button */
- col_link_cb = gtk_check_button_new();
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), col_link_cb, 0, row, 1, 1);
- if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("LINK"))
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(col_link_cb), TRUE);
- else
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(col_link_cb), FALSE);
- gtk_widget_show(col_link_cb);
-
- col_link_lb = gtk_label_new("Link layer header");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), col_link_lb, 1, row, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(col_link_lb), 0, 0.5f);
- gtk_widget_show(col_link_lb);
- row++;
-
- /* create "Promiscuous Mode" label and button */
- col_pmode_cb = gtk_check_button_new();
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), col_pmode_cb, 0, row, 1, 1);
- if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("PMODE"))
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(col_pmode_cb), TRUE);
- else
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(col_pmode_cb), FALSE);
- gtk_widget_show(col_pmode_cb);
-
- col_pmode_lb = gtk_label_new("Promiscuous Mode");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), col_pmode_lb, 1, row, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(col_pmode_lb), 0, 0.5f);
- gtk_widget_show(col_pmode_lb);
- row++;
-
- /* create "Snap length in Bytes" label and button */
- col_snap_cb = gtk_check_button_new();
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), col_snap_cb, 0, row, 1, 1);
- if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("SNAPLEN"))
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(col_snap_cb), TRUE);
- else
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(col_snap_cb), FALSE);
- gtk_widget_show(col_snap_cb);
-
- col_snap_lb = gtk_label_new("Snap length in Bytes");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), col_snap_lb, 1, row, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(col_snap_lb), 0, 0.5f);
- gtk_widget_show(col_snap_lb);
- row++;
-
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- /* create "Buffer in Megabytes" label and button */
- col_buf_cb = gtk_check_button_new();
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), col_buf_cb, 0, row, 1, 1);
- if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("BUFFER"))
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(col_buf_cb), TRUE);
- else
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(col_buf_cb), FALSE);
- gtk_widget_show(col_buf_cb);
-
- col_buf_lb = gtk_label_new("Buffer in Megabytes");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), col_buf_lb, 1, row, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(col_buf_lb), 0, 0.5f);
- gtk_widget_show(col_buf_lb);
- row++;
-#endif
-
-#ifdef HAVE_PCAP_CREATE
- /* create "monitor mode" label and button */
- col_monitor_lb = gtk_label_new("Monitor mode");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), col_monitor_lb, 1, row, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(col_monitor_lb), 0, 0.5f);
- gtk_widget_show(col_monitor_lb);
-
- col_monitor_cb = gtk_check_button_new();
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), col_monitor_cb, 0, row, 1, 1);
- if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("MONITOR"))
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(col_monitor_cb), TRUE);
- else
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(col_monitor_cb), FALSE);
- gtk_widget_show(col_monitor_cb);
-
- row++;
-#endif
-
- /* create "Capture Filter" label and button */
- col_filter_lb = gtk_label_new("Capture filter");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), col_filter_lb, 1, row, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(col_filter_lb), 0, 0.5f);
- gtk_widget_show(col_filter_lb);
-
- col_filter_cb = gtk_check_button_new();
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), col_filter_cb, 0, row, 1, 1);
- if (!prefs.capture_columns || prefs_capture_options_dialog_column_is_visible("FILTER"))
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(col_filter_cb), TRUE);
- else
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(col_filter_cb), FALSE);
- gtk_widget_show(col_filter_cb);
-
- row++;
-
- /* button row: OK and Cancel buttons */
- bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CANCEL, GTK_STOCK_HELP, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 0);
- gtk_widget_show(bbox);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- gtk_widget_set_tooltip_text(ok_bt, "Save changes and exit dialog");
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(colopts_edit_ok_cb), colopts_edit_dlg);
-
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- gtk_widget_set_tooltip_text(cancel_bt, "Cancel and exit dialog");
- window_set_cancel_button(colopts_edit_dlg, cancel_bt, window_cancel_button_cb);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb),
- (gpointer)HELP_CAPTURE_INTERFACE_OPTIONS_DIALOG);
- gtk_widget_set_tooltip_text (help_bt, "Show topic specific help");
-
- gtk_widget_grab_default(ok_bt);
-
- g_signal_connect(colopts_edit_dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- /* Call a handler when we're destroyed, so we can inform
- our caller, if any, that we've been destroyed. */
- g_signal_connect(colopts_edit_dlg, "destroy", G_CALLBACK(colopts_edit_destroy_cb), NULL);
-
- /* Set the key for the new dialog to point to our caller. */
- g_object_set_data(G_OBJECT(colopts_edit_dlg), COLOPTS_CALLER_PTR_KEY, caller);
- /* Set the key for the caller to point to us */
- g_object_set_data(G_OBJECT(caller), COLOPTS_DIALOG_PTR_KEY, colopts_edit_dlg);
-
- gtk_widget_show(colopts_edit_dlg); /* triggers ifopts_edit_ifsel_cb() with the */
- /* "interfaces" TreeView first row selected */
- window_present(colopts_edit_dlg);
-}
-
-
-static void
-ifopts_edit_cb(GtkWidget *w, gpointer data _U_)
-{
- GtkWidget *ifopts_edit_dlg, *cur_scr_win, *main_hb, *main_grid,
- *cur_opts_fr, *ed_opts_fr, *main_vb,
- *if_descr_lb,
- *if_hide_lb,
- *bbox, *ok_bt, *cancel_bt, *help_bt;
-
- GtkListStore *list_store;
- GtkWidget *list;
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
- GtkTreeView *list_view;
- GtkTreeSelection *selection;
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- GtkAdjustment *buffer_size_adj;
-#endif
- GtkAdjustment *snaplen_adj;
- int row = 0;
-
- GtkWidget *caller = gtk_widget_get_toplevel(w);
-
- /* Has an edit dialog box already been opened for that top-level
- widget? */
- ifopts_edit_dlg = (GtkWidget *)g_object_get_data(G_OBJECT(caller), IFOPTS_DIALOG_PTR_KEY);
- if (ifopts_edit_dlg != NULL) {
- /* Yes. Just re-activate that dialog box. */
- reactivate_window(ifopts_edit_dlg);
- return;
- }
-
- /* create a new dialog */
- ifopts_edit_dlg = dlg_conf_window_new("Wireshark: Preferences: Interface Options");
- gtk_window_set_default_size(GTK_WINDOW(ifopts_edit_dlg), 1000, 500);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 1, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_container_add(GTK_CONTAINER(ifopts_edit_dlg), main_vb);
- gtk_widget_show(main_vb);
-
- /* create current options frame */
- cur_opts_fr = gtk_frame_new("Interfaces");
- gtk_box_pack_start(GTK_BOX(main_vb), cur_opts_fr, TRUE, TRUE, 0);
- gtk_widget_show(cur_opts_fr);
-
- /* create a scrolled window to pack the current options TreeView widget into */
- cur_scr_win = scrolled_window_new(NULL, NULL);
- gtk_container_set_border_width(GTK_CONTAINER(cur_scr_win), 3);
- gtk_container_add(GTK_CONTAINER(cur_opts_fr), cur_scr_win);
- gtk_widget_show(cur_scr_win);
-
- /*
- * Create current options TreeView.
- */
- list_store = gtk_list_store_new(N_COLUMN, /* Total number of columns XXX */
- G_TYPE_STRING, /* Device */
- G_TYPE_STRING, /* Description */
-#ifdef HAVE_PCAP_CREATE
- G_TYPE_BOOLEAN, /* Monitor mode */
-#endif
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- G_TYPE_INT, /* Buffer size */
-#endif
- G_TYPE_BOOLEAN, /* Has snap length */
- G_TYPE_INT, /* Snap length */
- G_TYPE_BOOLEAN, /* Promiscuous mode */
- G_TYPE_STRING, /* Default link-layer */
- G_TYPE_STRING, /* Comment */
- G_TYPE_BOOLEAN, /* Hide? */
- G_TYPE_INT); /* Dlt */
-
- list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
-
- list_view = GTK_TREE_VIEW(list);
-
- /* The view now holds a reference. We can get rid of our own reference */
- g_object_unref (G_OBJECT (list_store));
-
- /*
- * Create the first column packet, associating the "text" attribute of the
- * cell_renderer to the first column of the model
- */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Device", renderer,
- "text", DEVICE_COLUMN,
- NULL);
-
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
-#ifdef _WIN32
- gtk_tree_view_column_set_min_width(column, 230);
-#else
- gtk_tree_view_column_set_min_width(column, 70);
-#endif
- /* Add the column to the view. */
- gtk_tree_view_append_column (list_view, column);
-
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Description", renderer,
- "text", DESC_COLUMN,
- NULL);
-
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 260);
- /* Add the column to the view. */
- gtk_tree_view_append_column (list_view, column);
-
-#ifdef HAVE_PCAP_CREATE
- /*
- * XXX - for some reason, this doesn't show up.
- */
- renderer = gtk_cell_renderer_toggle_new ();
- column = gtk_tree_view_column_new_with_attributes ("Default to monitor mode", renderer,
- "active", DEF_MONITOR_MODE_COLUMN,
- NULL);
-
- gtk_tree_view_column_set_resizable(column, FALSE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- /* Add the column to the view. */
- gtk_tree_view_append_column (list_view, column);
-#endif
-
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- renderer = gtk_cell_renderer_spin_new ();
- buffer_size_adj = (GtkAdjustment *) gtk_adjustment_new(DEFAULT_CAPTURE_BUFFER_SIZE, 1, WTAP_MAX_PACKET_SIZE_STANDARD, 1.0, 10.0, 0.0);
- g_object_set(G_OBJECT(renderer), "adjustment", buffer_size_adj, NULL);
- column = gtk_tree_view_column_new_with_attributes ("Default buffer size (MiB)", renderer,
- "text", BUF_COLUMN,
- NULL);
-
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- /* Add the column to the view. */
- gtk_tree_view_append_column (list_view, column);
-#endif
- renderer = gtk_cell_renderer_toggle_new ();
- column = gtk_tree_view_column_new_with_attributes ("Has snap length mode", renderer,
- "active", HASSNAP_COLUMN,
- NULL);
- gtk_tree_view_column_set_resizable(column, FALSE);
- /*gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);*/
- renderer = gtk_cell_renderer_spin_new ();
- snaplen_adj = (GtkAdjustment *) gtk_adjustment_new(WTAP_MAX_PACKET_SIZE_STANDARD, 1, WTAP_MAX_PACKET_SIZE_STANDARD, 1.0, 10.0, 0.0);
- g_object_set(G_OBJECT(renderer), "adjustment", snaplen_adj, NULL);
- column = gtk_tree_view_column_new_with_attributes ("Default snap length", renderer,
- "text", SNAPLEN_COLUMN,
- NULL);
- gtk_tree_view_column_set_resizable(column, FALSE);
-
- renderer = gtk_cell_renderer_toggle_new ();
- column = gtk_tree_view_column_new_with_attributes ("Default to promiscuous mode", renderer,
- "active", PMODE_COLUMN,
- NULL);
-
- gtk_tree_view_column_set_resizable(column, FALSE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- /* Add the column to the view. */
- gtk_tree_view_append_column (list_view, column);
-
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Default link-layer", renderer,
- "text", DEF_LINK_LAYER_COLUMN,
- NULL);
-
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 230);
- /* Add the column to the view. */
- gtk_tree_view_append_column (list_view, column);
-
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Comment", renderer,
- "text", COMMENT_COLUMN,
- NULL);
-
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 100);
- /* Add the column to the view. */
- gtk_tree_view_append_column (list_view, column);
-
- renderer = gtk_cell_renderer_toggle_new ();
- column = gtk_tree_view_column_new_with_attributes ("Hide?", renderer,
- "active", HIDE_COLUMN,
- NULL);
-
- gtk_tree_view_column_set_resizable(column, FALSE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- /* Add the column to the view. */
- gtk_tree_view_append_column (list_view, column);
-
-#if 0
- /* Don't show the DLT column */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("DLT", renderer,
- "text", DLT_COLUMN,
- NULL);
-
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 40);
- /* Add the column to the view. */
- gtk_tree_view_append_column (list_view, column);
-#endif
- /* Setup the selection handler */
- selection = gtk_tree_view_get_selection(list_view);
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
-
- cur_list = list;
- gtk_container_add(GTK_CONTAINER(cur_scr_win), cur_list);
-
- if_selection = selection;
-
- g_signal_connect (G_OBJECT (selection), "changed", /* select_row */
- G_CALLBACK (ifopts_edit_ifsel_cb),
- NULL);
-
- gtk_widget_show(cur_list);
-
- /* add interface names to cell */
- ifopts_if_liststore_add();
-
- /* create edit options frame */
- ed_opts_fr = gtk_frame_new("Properties");
- gtk_box_pack_start(GTK_BOX(main_vb), ed_opts_fr, FALSE, FALSE, 0);
- gtk_widget_show(ed_opts_fr);
-
- main_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5, TRUE);
- gtk_container_set_border_width(GTK_CONTAINER(main_hb), 3);
- gtk_container_add(GTK_CONTAINER(ed_opts_fr), main_hb);
- gtk_widget_show(main_hb);
-
- /* grid to hold description text entry and hide button */
- main_grid = ws_gtk_grid_new();
- gtk_box_pack_start(GTK_BOX(main_hb), main_grid, TRUE, FALSE, 10);
- ws_gtk_grid_set_row_spacing(GTK_GRID(main_grid), 10);
- ws_gtk_grid_set_column_spacing(GTK_GRID(main_grid), 10);
- gtk_widget_show(main_grid);
-
- if_dev_lb = gtk_label_new("Device:");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_dev_lb, 0, row, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(if_dev_lb), 1.0f, 0.5f);
- gtk_widget_show(if_dev_lb);
-
- if_dev_lb = gtk_label_new("");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_dev_lb, 1, row, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(if_dev_lb), 0.0f, 0.5f);
- gtk_widget_show(if_dev_lb);
- row++;
-
- if_name_lb = gtk_label_new("Description:");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_name_lb, 0, row, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(if_name_lb), 1.0f, 0.5f);
- gtk_widget_show(if_name_lb);
-
- if_name_lb = gtk_label_new("");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_name_lb, 1, row, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(if_name_lb), 0.0f, 0.5f);
- gtk_widget_show(if_name_lb);
- row++;
-
-#ifdef HAVE_PCAP_CREATE
- /* create "monitor mode" label and button */
- if_monitor_lb = gtk_label_new("Monitor mode:");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_monitor_lb, 0, row, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(if_monitor_lb), 1.0f, 0.5f);
- gtk_widget_show(if_monitor_lb);
-
- if_monitor_cb = gtk_check_button_new();
- g_signal_connect(if_monitor_cb, "toggled", G_CALLBACK(ifopts_edit_monitor_changed_cb),
- cur_list);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_monitor_cb, 1, row, 1, 1);
- gtk_widget_show(if_monitor_cb);
- row++;
-#endif
-
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- if_buffersize_lb = gtk_label_new("Default buffer size (MiB):");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_buffersize_lb, 0, row, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(if_buffersize_lb), 1.0f, 0.5f);
- gtk_widget_show(if_buffersize_lb);
- buffer_size_adj = (GtkAdjustment *) gtk_adjustment_new(DEFAULT_CAPTURE_BUFFER_SIZE, 1, WTAP_MAX_PACKET_SIZE_STANDARD, 1.0, 10.0, 0.0);
- if_buffersize_cb = gtk_spin_button_new (buffer_size_adj, 0, 0);
- g_signal_connect(if_buffersize_cb, "value-changed", G_CALLBACK(ifopts_edit_buffersize_changed_cb),
- cur_list);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_buffersize_cb, 1, row, 1, 1);
- gtk_widget_show(if_buffersize_cb);
- row++;
-#endif
-
- if_snaplen_lb = gtk_label_new("Limit each packet to:");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_snaplen_lb, 0, row, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(if_snaplen_lb), 1.0f, 0.5f);
- gtk_widget_show(if_snaplen_lb);
- if_snaplen_tg = gtk_check_button_new();
- g_signal_connect(if_snaplen_tg, "toggled", G_CALLBACK(ifopts_edit_hassnap_changed_cb),
- cur_list);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_snaplen_tg, 2, row, 1, 1);
- gtk_widget_show(if_snaplen_tg);
- snaplen_adj = (GtkAdjustment *) gtk_adjustment_new(WTAP_MAX_PACKET_SIZE_STANDARD, 1, WTAP_MAX_PACKET_SIZE_STANDARD, 1.0, 10.0, 0.0);
- if_snaplen_cb = gtk_spin_button_new (snaplen_adj, 0, 0);
- g_signal_connect(if_snaplen_cb, "value-changed", G_CALLBACK(ifopts_edit_snaplen_changed_cb),
- cur_list);
- gtk_spin_button_set_numeric(GTK_SPIN_BUTTON (if_snaplen_cb), TRUE);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_snaplen_cb, 1, row, 1, 1);
- gtk_widget_show(if_snaplen_cb);
- row++;
-
- /* create "promiscuous mode" label and button */
- if_pmode_lb = gtk_label_new("Promiscuous mode:");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_pmode_lb, 0, row, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(if_pmode_lb), 1.0f, 0.5f);
- gtk_widget_show(if_pmode_lb);
-
- if_pmode_cb = gtk_check_button_new();
- g_signal_connect(if_pmode_cb, "toggled", G_CALLBACK(ifopts_edit_pmode_changed_cb),
- cur_list);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_pmode_cb, 1, row, 1, 1);
- gtk_widget_show(if_pmode_cb);
- row++;
-
- if_linktype_lb = gtk_label_new("Default link-layer header type:");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_linktype_lb, 0, row, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(if_linktype_lb), 1.0f, 0.5f);
- gtk_widget_show(if_linktype_lb);
-
- if_linktype_cb = gtk_combo_box_text_new();
- num_linktypes = 0;
- interfaces_info_nochange = FALSE;
- g_signal_connect(if_linktype_cb, "changed", G_CALLBACK(ifopts_edit_linktype_changed_cb),
- cur_list);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_linktype_cb, 1, row, 1, 1);
- gtk_widget_show(if_linktype_cb);
- row++;
-
- /* create interface description label and text entry */
- if_descr_lb = gtk_label_new("Comment:");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_descr_lb, 0, row, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(if_descr_lb), 1.0f, 0.5f);
- gtk_widget_show(if_descr_lb);
-
- if_descr_te = gtk_entry_new();
- g_signal_connect(if_descr_te, "changed", G_CALLBACK(ifopts_edit_descr_changed_cb),
- cur_list);
- gtk_entry_set_max_length(GTK_ENTRY(if_descr_te), IFOPTS_MAX_DESCR_LEN);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_descr_te, 1, row, 1, 1);
- gtk_widget_show(if_descr_te);
- row++;
-
- /* create "hide interface" label and button */
- if_hide_lb = gtk_label_new("Hide interface?:");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_hide_lb, 0, row, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(if_hide_lb), 1.0f, 0.5f);
- gtk_widget_show(if_hide_lb);
-
- if_hide_cb = gtk_check_button_new();
- g_signal_connect(if_hide_cb, "toggled", G_CALLBACK(ifopts_edit_hide_changed_cb),
- cur_list);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_hide_cb, 1, row, 1, 1);
- gtk_widget_show(if_hide_cb);
-
- if_default_if_lb = gtk_label_new("(Default interface cannot be hidden)");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_default_if_lb, 1, row, 2, 1);
- gtk_misc_set_alignment(GTK_MISC(if_default_if_lb), 0.15f, 0.5f);
- row++;
-
- /* button row: OK and Cancel buttons */
- bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CANCEL, GTK_STOCK_HELP, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 0);
- gtk_widget_show(bbox);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- gtk_widget_set_tooltip_text(ok_bt, "Save changes and exit dialog");
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(ifopts_edit_ok_cb), ifopts_edit_dlg);
-
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- gtk_widget_set_tooltip_text(cancel_bt, "Cancel and exit dialog");
- window_set_cancel_button(ifopts_edit_dlg, cancel_bt, window_cancel_button_cb);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb),
- (gpointer)HELP_CAPTURE_INTERFACE_OPTIONS_DIALOG);
- gtk_widget_set_tooltip_text (help_bt, "Show topic specific help");
-
- gtk_widget_grab_default(ok_bt);
-
- g_signal_connect(ifopts_edit_dlg, "delete_event", G_CALLBACK(window_delete_event_cb),
- NULL);
- /* Call a handler when we're destroyed, so we can inform
- our caller, if any, that we've been destroyed. */
- g_signal_connect(ifopts_edit_dlg, "destroy", G_CALLBACK(ifopts_edit_destroy_cb), NULL);
-
- /* Set the key for the new dialog to point to our caller. */
- g_object_set_data(G_OBJECT(ifopts_edit_dlg), IFOPTS_CALLER_PTR_KEY, caller);
- /* Set the key for the caller to point to us */
- g_object_set_data(G_OBJECT(caller), IFOPTS_DIALOG_PTR_KEY, ifopts_edit_dlg);
-
- gtk_widget_show(ifopts_edit_dlg); /* triggers ifopts_edit_ifsel_cb() with the */
- /* "interfaces" TreeView first row selected */
- window_present(ifopts_edit_dlg);
-}
-
-/*
- * User selected "OK". Create/write preferences strings.
- */
-static void
-colopts_edit_ok_cb(GtkWidget *w _U_, gpointer parent_w)
-{
- g_list_free(prefs.capture_columns);
- prefs.capture_columns = NULL;
- prefs.capture_columns = g_list_append(prefs.capture_columns, g_strdup("INTERFACE"));
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(col_link_cb))) {
- prefs.capture_columns = g_list_append(prefs.capture_columns, g_strdup("LINK"));
- }
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(col_pmode_cb))) {
- prefs.capture_columns = g_list_append(prefs.capture_columns, g_strdup("PMODE"));
- }
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(col_snap_cb))) {
- prefs.capture_columns = g_list_append(prefs.capture_columns, g_strdup("SNAPLEN"));
- }
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(col_buf_cb))) {
- prefs.capture_columns = g_list_append(prefs.capture_columns, g_strdup("BUFFER"));
- }
-#endif
-#if defined (HAVE_PCAP_CREATE)
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(col_monitor_cb))) {
- prefs.capture_columns = g_list_append(prefs.capture_columns, g_strdup("MONITOR"));
- }
-#endif
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(col_filter_cb))) {
- prefs.capture_columns = g_list_append(prefs.capture_columns, g_strdup("FILTER"));
- }
- /* Now nuke this window. */
- gtk_grab_remove(GTK_WIDGET(parent_w));
- window_destroy(GTK_WIDGET(parent_w));
- if (capture_dlg_window_present()) {
- update_visible_tree_view_columns();
- update_visible_columns_menu ();
- }
-}
-
-/*
- * User selected "OK". Create/write preferences strings.
- */
-static void
-ifopts_edit_ok_cb(GtkWidget *w _U_, gpointer parent_w)
-{
- if (if_selection){ /* XXX: Cannot be NULL ?? */
-#ifdef HAVE_PCAP_CREATE
- /* create/write new monitor-mode interfaces string */
- ifopts_write_new_monitor_mode();
-#endif
-
- /* create/write new interfaces link-layer string */
- ifopts_write_new_linklayer();
-
- /* create/write new interfaces description string */
- ifopts_write_new_descr();
-
- /* create/write new "hidden" interfaces string */
- ifopts_write_new_hide();
-
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- /* create/write new "buffersize" interfaces string */
- ifopts_write_new_buffersize();
-#endif
-
- /* create/write new "snaplen" interfaces string */
- ifopts_write_new_snaplen();
- /* create/write new promiscuous mode interfaces string */
- ifopts_write_new_pmode();
- }
-
- /* Update everything that shows an interface list that includes
- local interfaces, as we may have changed something that
- affects how those lists are displayed. */
- refresh_local_interface_lists();
-
- /* Now nuke this window. */
- gtk_grab_remove(GTK_WIDGET(parent_w));
- window_destroy(GTK_WIDGET(parent_w));
-}
-
-static void
-colopts_edit_destroy_cb(GtkWidget *win, gpointer data _U_)
-{
- GtkWidget *caller;
-
- /* Get the widget that requested that we be popped up, if any.
- (It should arrange to destroy us if it's destroyed, so
- that we don't get a pointer to a non-existent window here.) */
- caller = (GtkWidget *)g_object_get_data(G_OBJECT(win), COLOPTS_CALLER_PTR_KEY);
-
- if (caller != NULL) {
- /* Tell it we no longer exist. */
- g_object_set_data(G_OBJECT(caller), COLOPTS_DIALOG_PTR_KEY, NULL);
- }
-}
-
-static void
-ifopts_edit_destroy_cb(GtkWidget *win, gpointer data _U_)
-{
- GtkWidget *caller;
-
- /* Get the widget that requested that we be popped up, if any.
- (It should arrange to destroy us if it's destroyed, so
- that we don't get a pointer to a non-existent window here.) */
- caller = (GtkWidget *)g_object_get_data(G_OBJECT(win), IFOPTS_CALLER_PTR_KEY);
-
- if (caller != NULL) {
- /* Tell it we no longer exist. */
- g_object_set_data(G_OBJECT(caller), IFOPTS_DIALOG_PTR_KEY, NULL);
- }
-}
-
-static gint
-ifopts_description_to_val (const char *if_name, gboolean monitor_mode, const char *descr)
-{
- if_capabilities_t *caps;
- int dlt = -1;
-
- caps = capture_get_if_capabilities(if_name, monitor_mode, NULL, NULL, main_window_update);
- if (caps != NULL) {
- if (caps->data_link_types != NULL) {
- GList *lt_entry;
- /* XXX: Code skips first entry because that's the default ??? */
- for (lt_entry = g_list_next(caps->data_link_types);
- lt_entry != NULL;
- lt_entry = g_list_next(lt_entry)) {
- data_link_info_t *dli_p = (data_link_info_t *)lt_entry->data;
- if (dli_p->description) {
- if (strcmp(dli_p->description, descr) == 0) {
- dlt = dli_p->dlt;
- break;
- }
- } else {
- if (strcmp(dli_p->name, descr) == 0) {
- dlt = dli_p->dlt;
- break;
- }
- }
- }
- }
- free_if_capabilities(caps);
- }
- return dlt;
-}
-
-/*
- * Interface selected callback; update displayed widgets.
- */
-static void
-ifopts_edit_ifsel_cb(GtkTreeSelection *selection _U_,
- gpointer data _U_)
-{
- GtkTreeIter iter;
- GtkTreeModel *model;
- gchar *desc, *comment, *text;
- gchar *if_name, *linktype;
-#ifdef HAVE_PCAP_CREATE
- gboolean monitor_mode;
-#endif
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- gint buffersize;
-#endif
- gint snaplen;
- gboolean hide, hide_enabled = TRUE, hassnap = FALSE, pmode;
- gboolean pmode_pref;
- if_capabilities_t *caps;
- gint selected = 0;
-
- /* Get list_store data for currently selected interface */
- if (!gtk_tree_selection_get_selected (if_selection, &model, &iter)){
- return;
- }
- gtk_tree_model_get(model, &iter,
- DEVICE_COLUMN, &if_name,
- DESC_COLUMN, &desc,
-#ifdef HAVE_PCAP_CREATE
- DEF_MONITOR_MODE_COLUMN, &monitor_mode,
-#endif
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- BUF_COLUMN, &buffersize,
-#endif
- HASSNAP_COLUMN, &hassnap,
- SNAPLEN_COLUMN, &snaplen,
- PMODE_COLUMN, &pmode,
- DEF_LINK_LAYER_COLUMN, &linktype,
- COMMENT_COLUMN, &comment,
- HIDE_COLUMN, &hide,
- -1);
-
- /* display the interface device from current interfaces selection */
- gtk_label_set_text(GTK_LABEL(if_dev_lb), if_name);
-
- /* display the interface name from current interfaces selection */
- gtk_label_set_text(GTK_LABEL(if_name_lb), desc);
-
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- /* display the buffer size from current interfaces selection */
- gtk_spin_button_set_value(GTK_SPIN_BUTTON (if_buffersize_cb), buffersize);
-#endif
-
- /* display the snap length from current interfaces selection */
- gtk_spin_button_set_value(GTK_SPIN_BUTTON (if_snaplen_cb), snaplen);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(if_snaplen_tg), hassnap);
- gtk_widget_set_sensitive(GTK_WIDGET(if_snaplen_cb), hassnap);
-
- if (prefs.capture_prom_mode) {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(if_pmode_cb), TRUE);
- } else if (capture_dev_user_pmode_find(if_name, &pmode_pref)) {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(if_pmode_cb), pmode_pref);
- } else {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(if_pmode_cb), FALSE);
- }
-
- /* Ignore "changed" callbacks while we update the Properties widgets */
- interfaces_info_nochange = TRUE;
-
- /* display the link-layer header type from current interfaces selection */
- /* -- remove old linktype list (if any) from the ComboBox */
- while (num_linktypes > 0) {
- num_linktypes--;
- gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(if_linktype_cb), num_linktypes);
- }
-
- /*
- * -- set the state and sensitivity of the monitor-mode checkbox,
- * and build and add to the ComboBox a linktype list, corresponding
- * to the interface capabilities of the selected interface
- */
-#ifdef HAVE_PCAP_CREATE
- caps = capture_get_if_capabilities(if_name, monitor_mode, NULL, NULL, main_window_update);
-#else
- caps = capture_get_if_capabilities(if_name, FALSE, NULL, NULL, main_window_update);
-#endif
- if (caps != NULL) {
-#ifdef HAVE_PCAP_CREATE
- gtk_widget_set_sensitive(if_monitor_lb, caps->can_set_rfmon);
- gtk_widget_set_sensitive(if_monitor_cb, caps->can_set_rfmon);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(if_monitor_cb), monitor_mode);
-#endif
- if (caps->data_link_types != NULL) {
- GList *lt_entry;
- for (lt_entry = caps->data_link_types; lt_entry != NULL;
- lt_entry = g_list_next(lt_entry)) {
- data_link_info_t *dli_p = (data_link_info_t *)lt_entry->data;
- text = (dli_p->description != NULL) ? dli_p->description : dli_p->name;
- if (strcmp(linktype, text) == 0) {
- selected = num_linktypes;
- }
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(if_linktype_cb), text);
- num_linktypes++;
- }
- gtk_widget_set_sensitive(if_linktype_lb, num_linktypes >= 2);
- gtk_widget_set_sensitive(if_linktype_cb, num_linktypes >= 2);
- gtk_combo_box_set_active(GTK_COMBO_BOX(if_linktype_cb), selected);
- }
- free_if_capabilities(caps);
- }
-#ifdef HAVE_PCAP_CREATE
- else {
- gtk_widget_set_sensitive(if_monitor_lb, FALSE);
- gtk_widget_set_sensitive(if_monitor_cb, FALSE);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(if_monitor_cb), FALSE);
- }
-#endif
-
- /* display the interface description from current interfaces selection */
- gtk_entry_set_text(GTK_ENTRY(if_descr_te), comment);
-
- /* See if this is the currently selected capturing device */
- if ((prefs.capture_device != NULL) && (*prefs.capture_device != '\0')) {
- 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 ((strcmp(device.display_name, prefs.capture_device) == 0) &&
- (strcmp(device.name, if_name) == 0)) {
- /* Don't allow current interface to be hidden */
- hide_enabled = FALSE;
- break;
- }
- }
- }
-
- /* display the "hide interface" button state from current interfaces selection */
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(if_hide_cb), hide);
- gtk_widget_set_sensitive(if_hide_cb, hide_enabled);
- if (hide_enabled) {
- gtk_widget_hide(if_default_if_lb);
- } else {
- gtk_widget_show(if_default_if_lb);
- }
-
- interfaces_info_nochange = FALSE;
-
- g_free(if_name);
- g_free(desc);
- g_free(linktype);
- g_free(comment);
-}
-
-#ifdef HAVE_PCAP_CREATE
-/*
- * Monitor-mode toggle button changed callback; update displayed widgets
- * (the list of link-layer types might change) and list_store for currently
- * selected interface.
- */
-static void
-ifopts_edit_monitor_changed_cb(GtkToggleButton *tbt, gpointer udata)
-{
- GtkTreeModel *list_model;
- GtkTreeIter list_iter;
- GtkListStore *list_store;
- gchar *if_name, *text;
- gboolean monitor_mode;
- if_capabilities_t *caps;
-
- if (interfaces_info_nochange)
- return;
-
- if (if_selection == NULL) /* XXX: Cannot be NULL ?? */
- return;
-
- if (!gtk_tree_selection_get_selected (if_selection, &list_model, &list_iter)){
- return;
- }
- gtk_tree_model_get(list_model, &list_iter,
- DEVICE_COLUMN, &if_name,
- -1);
-
- /* Ignore "changed" callbacks while we update the Properties widgets */
- interfaces_info_nochange = TRUE;
-
- /* display the link-layer header type from current interfaces selection */
- /* -- remove old linktype list (if any) from the ComboBox */
- while (num_linktypes > 0) {
- num_linktypes--;
- gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(if_linktype_cb), num_linktypes);
- }
-
- list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (udata))); /* Get store */
-
-#ifdef HAVE_PCAP_CREATE
- /* get "monitor mode" button state and set status in list_store for currently selected interface */
- monitor_mode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tbt));
- gtk_list_store_set (list_store, &list_iter,
- DEF_MONITOR_MODE_COLUMN, monitor_mode,
- -1);
- caps = capture_get_if_capabilities(if_name, monitor_mode, NULL, NULL, main_window_update);
-#else
- /* no monitor-mode support */
- caps = capture_get_if_capabilities(if_name, FALSE, NULL, NULL);
-#endif
-
- /*
- * -- set the sensitivity of the monitor-mode checkbox, and
- * build and add to the ComboBox a linktype list for the current
- * interfaces selection, based on the interface capabilities
- */
- if (caps != NULL) {
-#ifdef HAVE_PCAP_CREATE
- gtk_widget_set_sensitive(if_monitor_lb, caps->can_set_rfmon);
- gtk_widget_set_sensitive(if_monitor_cb, caps->can_set_rfmon);
-#endif
- if (caps->data_link_types != NULL) {
- GList *lt_entry;
- for (lt_entry = caps->data_link_types; lt_entry != NULL;
- lt_entry = g_list_next(lt_entry)) {
- data_link_info_t *dli_p = (data_link_info_t *)lt_entry->data;
- text = (dli_p->description != NULL) ? dli_p->description : dli_p->name;
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(if_linktype_cb), text);
- num_linktypes++;
- }
- gtk_widget_set_sensitive(if_linktype_lb, num_linktypes >= 2);
- gtk_widget_set_sensitive(if_linktype_cb, num_linktypes >= 2);
- gtk_combo_box_set_active(GTK_COMBO_BOX(if_linktype_cb), 0);
- }
- free_if_capabilities(caps);
- }
-#ifdef HAVE_PCAP_CREATE
- else {
- gtk_widget_set_sensitive(if_monitor_lb, FALSE);
- gtk_widget_set_sensitive(if_monitor_cb, FALSE);
- }
-#endif
-
- interfaces_info_nochange = FALSE;
- g_signal_emit_by_name(if_linktype_cb, "changed");
-
- g_free(if_name);
-}
-#endif
-
-/*
- * Link-layer entry changed callback; update list_store for currently selected interface.
- */
-static void
-ifopts_edit_linktype_changed_cb(GtkComboBox *cb, gpointer udata)
-{
- gchar *ifnm, *text;
-#ifdef HAVE_PCAP_CREATE
- gboolean monitor_mode;
-#endif
- gint linktype;
- GtkTreeModel *list_model;
- GtkTreeIter list_iter;
- GtkListStore *list_store;
-
- if (interfaces_info_nochange)
- return;
-
- if (if_selection == NULL) /* XXX: Cannot be NULL ?? */
- return;
-
- if (!gtk_tree_selection_get_selected (if_selection, &list_model, &list_iter)){
- return;
- }
-
- gtk_tree_model_get(list_model, &list_iter,
- DEVICE_COLUMN, &ifnm,
-#ifdef HAVE_PCAP_CREATE
- DEF_MONITOR_MODE_COLUMN, &monitor_mode,
-#endif
- -1);
-
- /* get current description text and set value in list_store for currently selected interface */
- text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(cb));
- if (text) {
-#ifdef HAVE_PCAP_CREATE
- linktype = ifopts_description_to_val(ifnm, monitor_mode, text);
-#else
- linktype = ifopts_description_to_val(ifnm, FALSE, text);
-#endif
- list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (udata))); /* Get store */
- gtk_list_store_set (list_store, &list_iter,
- DEF_LINK_LAYER_COLUMN, text,
- DLT_COLUMN, linktype,
- -1);
- g_free(text);
- }
-}
-
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
-/*
- * Buffer size entry changed callback; update list_store for currently selected interface.
- */
-static void
-ifopts_edit_buffersize_changed_cb(GtkSpinButton *sb, gpointer udata)
-{
- gint buffersize;
- GtkTreeModel *list_model;
- GtkTreeIter list_iter;
- GtkListStore *list_store;
-
- if (if_selection == NULL) /* XXX: Cannot be NULL ?? */
- return;
-
- if (!gtk_tree_selection_get_selected (if_selection, &list_model, &list_iter)){
- return;
- }
-
-
- /* get current description text and set value in list_store for currently selected interface */
- buffersize = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(sb));
- list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (udata))); /* Get store */
- gtk_list_store_set (list_store, &list_iter,
- BUF_COLUMN, buffersize,
- -1);
-}
-#endif
-
-/*
- * Snap length entry changed callback; update list_store for currently selected interface.
- */
-static void
-ifopts_edit_snaplen_changed_cb(GtkSpinButton *sb _U_, gpointer udata _U_)
-{
- gint snaplen;
- gboolean hassnap;
- GtkTreeModel *list_model;
- GtkTreeIter list_iter;
- GtkListStore *list_store;
-
- if (if_selection == NULL) /* XXX: Cannot be NULL ?? */
- return;
-
- if (!gtk_tree_selection_get_selected (if_selection, &list_model, &list_iter)){
- return;
- }
-
-
- /* get current description text and set value in list_store for currently selected interface */
- snaplen = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(sb));
- if (snaplen != WTAP_MAX_PACKET_SIZE_STANDARD) {
- hassnap = TRUE;
- } else {
- hassnap = FALSE;
- }
- list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (udata)));
- gtk_list_store_set (list_store, &list_iter,
- SNAPLEN_COLUMN, snaplen,
- HASSNAP_COLUMN, hassnap,
- -1);
-}
-
-/*
- * Checkbutton for the Snap length changed callback; update list_store for currently selected interface.
- */
-static void
-ifopts_edit_hassnap_changed_cb(GtkToggleButton *tbt, gpointer udata)
-{
- gboolean hassnap;
- GtkTreeModel *list_model;
- GtkTreeIter list_iter;
- GtkListStore *list_store;
-
- if (if_selection == NULL) /* XXX: Cannot be NULL ?? */
- return;
-
- if (!gtk_tree_selection_get_selected (if_selection, &list_model, &list_iter)){
- return;
- }
- hassnap = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tbt));
-
- list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (udata)));
- gtk_list_store_set (list_store, &list_iter,
- HASSNAP_COLUMN, hassnap,
- -1);
- gtk_widget_set_sensitive(GTK_WIDGET(if_snaplen_cb), hassnap);
-}
-
-/*
- * Checkbutton for the promiscuous mode changed callback; update list_store for currently selected interface.
- */
-static void
-ifopts_edit_pmode_changed_cb(GtkToggleButton *tbt, gpointer udata)
-{
- gboolean pmode;
- GtkTreeModel *list_model;
- GtkTreeIter list_iter;
- GtkListStore *list_store;
-
- if (if_selection == NULL) /* XXX: Cannot be NULL ?? */
- return;
-
- if (!gtk_tree_selection_get_selected (if_selection, &list_model, &list_iter)){
- return;
- }
- pmode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tbt));
-
- list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (udata)));
- gtk_list_store_set (list_store, &list_iter,
- PMODE_COLUMN, pmode,
- -1);
-}
-
-
-/*
- * Comment text entry changed callback; update list_store for currently selected interface.
- */
-static void
-ifopts_edit_descr_changed_cb(GtkEditable *ed, gpointer udata)
-{
- gchar *text;
- GtkTreeModel *list_model;
- GtkTreeIter list_iter;
- GtkListStore *list_store;
-
- if (interfaces_info_nochange)
- return;
-
- if (if_selection == NULL) /* XXX: Cannot be NULL ?? */
- return;
-
- if (!gtk_tree_selection_get_selected (if_selection, &list_model, &list_iter)){
- return;
- }
-
- /* get current description text and set value in list_store for currently selected interface */
- text = gtk_editable_get_chars(GTK_EDITABLE(ed), 0, -1);
- /* replace any reserved formatting characters "()," with spaces */
- g_strdelimit(text, "(),", ' ');
-
- list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (udata))); /* Get store */
- gtk_list_store_set (list_store, &list_iter,
- COMMENT_COLUMN, text,
- -1);
-
- g_free(text);
-}
-
-/*
- * Hide toggle button changed callback; update list_store for currently selected interface .
- */
-static void
-ifopts_edit_hide_changed_cb(GtkToggleButton *tbt, gpointer udata)
-{
- GtkTreeModel *list_model;
- GtkTreeIter list_iter;
- GtkListStore *list_store;
-
- if (interfaces_info_nochange)
- return;
-
- if (if_selection == NULL) /* XXX: Cannot be NULL ?? */
- return;
-
- if (!gtk_tree_selection_get_selected (if_selection, &list_model, &list_iter)){
- return;
- }
-
- list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (udata))); /* Get store */
- /* get "hide" button state and set status in list_store for currently selected interface */
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tbt)) == TRUE)
- gtk_list_store_set (list_store, &list_iter,
- HIDE_COLUMN, TRUE,
- -1);
- else
- gtk_list_store_set (list_store, &list_iter,
- HIDE_COLUMN, FALSE,
- -1);
-}
-
-/*
- * Add any saved interface options that apply to interfaces ListStore.
- *
- * NOTE:
- * Interfaces that have been removed from the machine or disabled and
- * no longer apply are ignored. Therefore, if the user subsequently
- * selects "OK", the options for these interfaces are lost (they're
- * lost permanently if "Save" is selected).
- */
-static void
-ifopts_options_add(GtkListStore *list_store, if_info_t *if_info)
-{
- gchar *p;
- gchar *ifnm;
- gchar *desc;
- gchar *pr_descr;
- gchar *text[] = { NULL, NULL, NULL, NULL };
- if_capabilities_t *caps;
-#ifdef HAVE_PCAP_CREATE
- gboolean monitor_mode;
-#endif
- gint linktype;
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- gint buffersize;
-#endif
- gint snaplen;
- gboolean hide, hassnap = TRUE, pmode;
- GtkTreeIter iter;
-
- /* set device name text */
- text[0] = g_strdup(if_info->name);
-
- /* set vendor description */
- if (if_info->vendor_description != NULL)
- text[1] = g_strdup(if_info->vendor_description);
- else
- text[1] = g_strdup("");
-
-#ifdef HAVE_PCAP_CREATE
- /* get default monitor mode setting */
- monitor_mode = prefs_capture_device_monitor_mode(if_info->name);
- caps = capture_get_if_capabilities(if_info->name, monitor_mode, NULL, NULL, main_window_update);
-#else
- /* no monitor-mode support */
- caps = capture_get_if_capabilities(if_info->name, FALSE, NULL, NULL, main_window_update);
-#endif
-
- /* set default link-layer header type */
- linktype = capture_dev_user_linktype_find(if_info->name);
- if (caps != NULL) {
- if (caps->data_link_types != NULL) {
- GList *lt_entry;
- for (lt_entry = caps->data_link_types; lt_entry != NULL;
- lt_entry = g_list_next(lt_entry)) {
- data_link_info_t *dli_p = (data_link_info_t *)lt_entry->data;
- /* If we have no previous link-layer header type we use the first one */
- if (linktype == -1 || linktype == dli_p->dlt) {
- if (dli_p->description) {
- text[2] = g_strdup(dli_p->description);
- } else {
- text[2] = g_strdup(dli_p->name);
- }
- break;
- }
- }
- }
- free_if_capabilities(caps);
- }
-
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- buffersize = capture_dev_user_buffersize_find(if_info->name);
- if (buffersize == -1) {
- buffersize = DEFAULT_CAPTURE_BUFFER_SIZE;
- }
-#endif
-
- if (!capture_dev_user_snaplen_find(if_info->name, &hassnap, &snaplen)) {
- snaplen = WTAP_MAX_PACKET_SIZE_STANDARD;
- hassnap = FALSE;
- }
-
- if (prefs.capture_prom_mode) {
- pmode = TRUE;
- } else {
- if (!capture_dev_user_pmode_find(if_info->name, &pmode)) {
- pmode = FALSE;
- }
- }
-
- /* if we have no link-layer */
- if (text[2] == NULL)
- text[2] = g_strdup("");
-
- /* add interface descriptions */
- if ((prefs.capture_devices_descr != NULL) &&
- (*prefs.capture_devices_descr != '\0')) {
- /* create working copy of device descriptions */
- pr_descr = g_strdup(prefs.capture_devices_descr);
-
- /* if we find a description for this interface */
- if ((ifnm = strstr(pr_descr, if_info->name)) != NULL) {
- p = ifnm;
- while (*p != '\0') {
- /* found left parenthesis, start of description */
- if (*p == '(') {
- p++;
- /* if syntax error */
- if ((*p == '\0') || (*p == ',') || (*p == '(') || (*p == ')'))
- break;
-
- /* save pointer to beginning of description */
- desc = p;
- p++;
- /* skip to end of description */
- while (*p != '\0') {
- /* if syntax error */
- if ((*p == ',') || (*p == '('))
- break;
-
- /* end of description */
- else if (*p == ')') {
- /* terminate and set description text */
- *p = '\0';
- text[3] = g_strdup(desc);
- break;
- }
- p++;
- }
- /* get out */
- break;
- } else
- p++;
- }
- }
-
- g_free(pr_descr);
- }
-
- /* if we have no description */
- if (text[3] == NULL)
- text[3] = g_strdup("");
-
- /* check if interface is "hidden" */
- hide = prefs_is_capture_device_hidden(if_info->name);
-
- /* add row to ListStore */
-
- gtk_list_store_insert_with_values( list_store , &iter, G_MAXINT,
- DEVICE_COLUMN, text[0],
- DESC_COLUMN, text[1],
-#ifdef HAVE_PCAP_CREATE
- DEF_MONITOR_MODE_COLUMN, monitor_mode,
-#endif
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
- BUF_COLUMN, buffersize,
-#endif
- HASSNAP_COLUMN, hassnap,
- SNAPLEN_COLUMN, snaplen,
- PMODE_COLUMN, pmode,
- DEF_LINK_LAYER_COLUMN, text[2],
- COMMENT_COLUMN, text[3],
- HIDE_COLUMN, hide,
- DLT_COLUMN, linktype,
- -1);
-
- ifopts_options_free(text);
-}
-
-static void
-ifopts_options_free(gchar *text[])
-{
- gint i;
-
- for (i=0; i < IFOPTS_LIST_TEXT_COLS; i++) {
- if (text[i] != NULL) {
- g_free(text[i]);
- text[i] = NULL;
- }
- }
-}
-
-/*
- * Add all interfaces to interfaces ListStore.
- */
-static void
-ifopts_if_liststore_add(void)
-{
- GList *if_list, *ifl_p;
- int err;
- gchar *err_str;
-
- if_list = capture_interface_list(&err, &err_str, main_window_update); /* if_list = ptr to first element of list (or NULL) */
- if (if_list == NULL) {
- if (err != 0) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_str);
- }
- g_free(err_str);
- return;
- }
-
- /* We have an interface list. */
- /* add OS description + interface name text to ListStore */
- for (ifl_p = if_list; ifl_p != NULL; ifl_p = g_list_next(ifl_p)) {
- /* should never happen, but just in case */
- if ((ifl_p->data) == NULL)
- continue;
- /* fill current options ListStore with current preference values */
- ifopts_options_add(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (cur_list))),
- (if_info_t *)ifl_p->data);
- }
- free_interface_list(if_list);
-}
-
-#ifdef HAVE_PCAP_CREATE
-/*
- * Create/write new "monitor mode" interfaces string based on current CList.
- * Put it into the preferences value.
- */
-static void
-ifopts_write_new_monitor_mode(void)
-{
- GtkListStore *store;
- GtkTreeIter iter;
- GtkTreeModel *model;
- gboolean more_items = TRUE;
- gint first_if = TRUE; /* flag to check if first in list */
- gchar *ifnm;
- gboolean monitor_mode;
-
- /* get "monitor mode" flag text for each row (interface) */
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(cur_list));
- store = GTK_LIST_STORE(model);
- if( gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter) ) {
- /* new preferences "monitor mode" interfaces string */
- gchar *new_monitor_mode = (gchar*)g_malloc0(MAX_VAL_LEN);
-
- while (more_items) {
- gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
- DEVICE_COLUMN, &ifnm,
- DEF_MONITOR_MODE_COLUMN, &monitor_mode,
- -1);
-
- /* if flag text is "No", skip this interface */
- if (!monitor_mode){
- more_items = gtk_tree_model_iter_next (model,&iter);
- continue;
- }
-
- /*
- * create/cat interface to new string
- */
- if (first_if != TRUE)
- g_strlcat (new_monitor_mode, ",", MAX_VAL_LEN);
- g_strlcat (new_monitor_mode, ifnm, MAX_VAL_LEN);
-
- /* set first-in-list flag to false */
- first_if = FALSE;
- more_items = gtk_tree_model_iter_next (model,&iter);
- }
-
- /* write new "hidden" string to preferences */
- g_free(prefs.capture_devices_monitor_mode);
- prefs.capture_devices_monitor_mode = new_monitor_mode;
- }
-}
-#endif
-
-/*
- * Create/write new interfaces link-layer string based on current CList.
- * Put it into the preferences value.
- */
-static void
-ifopts_write_new_linklayer(void)
-{
- GtkListStore *store;
- GtkTreeIter iter;
- GtkTreeModel *model;
-
- gboolean more_items = TRUE, first_if = TRUE; /* flag to check if first in list */
- gchar *ifnm;
- gint linktype;
- gchar *tmp_linklayer;
-
- /* get link-layer for each row (interface) */
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(cur_list));
- store = GTK_LIST_STORE(model);
- if( gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter) ) {
- /* new preferences interfaces link-layer string */
- gchar *new_linklayer = (gchar *)g_malloc0(MAX_VAL_LEN);
-
- while (more_items) {
- gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
- DEVICE_COLUMN, &ifnm,
- DLT_COLUMN, &linktype,
- -1);
-
- if (linktype == -1){
- more_items = gtk_tree_model_iter_next (model,&iter);
- continue;
- }
-
- if (first_if != TRUE) {
- g_strlcat (new_linklayer, ",", MAX_VAL_LEN);
- }
- /*
- * create/cat interface link-layer to new string
- * (leave space for parens, comma and terminator)
- */
- tmp_linklayer = g_strdup_printf("%s(%d)", ifnm, linktype);
- g_strlcat(new_linklayer, tmp_linklayer, MAX_VAL_LEN);
- g_free(tmp_linklayer);
- g_free(ifnm);
- /* set first-in-list flag to false */
- first_if = FALSE;
- more_items = gtk_tree_model_iter_next (model,&iter);
- }
-
- /* write new link-layer string to preferences */
- g_free(prefs.capture_devices_linktypes);
- prefs.capture_devices_linktypes = new_linklayer;
- }
-}
-
-#ifdef CAN_SET_CAPTURE_BUFFER_SIZE
-/*
- * Create/write new interfaces buffer size string based on current CList.
- * Put it into the preferences value.
- */
-static void
-ifopts_write_new_buffersize(void)
-{
- GtkListStore *store;
- GtkTreeIter iter;
- GtkTreeModel *model;
-
- gboolean more_items = TRUE, first_if = TRUE; /* flag to check if first in list */
- gchar *ifnm;
- gint buffersize;
- gchar *tmp_buffersize;
-
- /* get buffer size for each row (interface) */
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(cur_list));
- store = GTK_LIST_STORE(model);
- if( gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter) ) {
- /* new preferences interfaces buffer size string */
- gchar *new_buffersize = (gchar *)g_malloc0(MAX_VAL_LEN);
-
- while (more_items) {
- gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
- DEVICE_COLUMN, &ifnm,
- BUF_COLUMN, &buffersize,
- -1);
- if (buffersize == -1){
- more_items = gtk_tree_model_iter_next (model,&iter);
- continue;
- }
-
- if (first_if != TRUE) {
- g_strlcat (new_buffersize, ",", MAX_VAL_LEN);
- }
- /*
- * create/cat interface buffersize to new string
- * (leave space for parens, comma and terminator)
- */
- tmp_buffersize = g_strdup_printf("%s(%d)", ifnm, buffersize);
- g_strlcat(new_buffersize, tmp_buffersize, MAX_VAL_LEN);
- g_free(tmp_buffersize);
- g_free(ifnm);
- /* set first-in-list flag to false */
- first_if = FALSE;
- more_items = gtk_tree_model_iter_next (model,&iter);
- }
-
- /* write new buffersize string to preferences */
- g_free(prefs.capture_devices_buffersize);
- prefs.capture_devices_buffersize = new_buffersize;
- }
-}
-#endif
-
-/*
- * Create/write new interfaces snap length string based on current CList.
- * Put it into the preferences value.
- */
-static void
-ifopts_write_new_snaplen(void)
-{
- GtkListStore *store;
- GtkTreeIter iter;
- GtkTreeModel *model;
-
- gboolean more_items = TRUE, first_if = TRUE; /* flag to check if first in list */
- gchar *ifnm;
- gint snaplen;
- gboolean hassnap;
- gchar *tmp_snaplen;
-
- /* get snap length for each row (interface) */
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(cur_list));
- store = GTK_LIST_STORE(model);
- if( gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter) ) {
- /* new preferences interfaces snap length string */
- gchar *new_snaplen = (gchar *)g_malloc0(MAX_VAL_LEN);
-
- while (more_items) {
- gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
- DEVICE_COLUMN, &ifnm,
- SNAPLEN_COLUMN, &snaplen,
- HASSNAP_COLUMN, &hassnap,
- -1);
- if (snaplen == -1){
- more_items = gtk_tree_model_iter_next (model,&iter);
- continue;
- }
- if (first_if != TRUE) {
- g_strlcat (new_snaplen, ",", MAX_VAL_LEN);
- }
- /*
- * create/cat interface snap length to new string
- * (leave space for parens, comma and terminator)
- */
- tmp_snaplen = g_strdup_printf("%s:%d(%d)", ifnm, hassnap, (hassnap?snaplen:WTAP_MAX_PACKET_SIZE_STANDARD));
- g_strlcat(new_snaplen, tmp_snaplen, MAX_VAL_LEN);
- g_free(tmp_snaplen);
- g_free(ifnm);
- /* set first-in-list flag to false */
- first_if = FALSE;
- more_items = gtk_tree_model_iter_next (model,&iter);
- }
-
- /* write new snap length string to preferences */
- g_free(prefs.capture_devices_snaplen);
- prefs.capture_devices_snaplen = new_snaplen;
- }
-}
-
-/*
- * Create/write new promiscuous mode string based on current CList.
- * Put it into the preferences value.
- */
-static void
-ifopts_write_new_pmode(void)
-{
- GtkListStore *store;
- GtkTreeIter iter;
- GtkTreeModel *model;
- GtkWidget *promisc_cb;
-
- gboolean more_items = TRUE, first_if = TRUE; /* flag to check if first in list */
- gchar *ifnm;
- gboolean pmode, off = FALSE;
- gchar *tmp_pmode;
-
- /* get promiscuous mode for each row (interface) */
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(cur_list));
- store = GTK_LIST_STORE(model);
- if( gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter) ) {
- /* new preferences interfaces promiscuous mode string */
- gchar *new_pmode = (gchar *)g_malloc0(MAX_VAL_LEN);
-
- while (more_items) {
- gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
- DEVICE_COLUMN, &ifnm,
- PMODE_COLUMN, &pmode,
- -1);
- if (pmode == -1){
- more_items = gtk_tree_model_iter_next (model,&iter);
- continue;
- }
-
- if (first_if != TRUE) {
- g_strlcat (new_pmode, ",", MAX_VAL_LEN);
- }
- /*
- * create/cat interface promiscuous mode to new string
- * (leave space for parens, comma and terminator)
- */
- if (!pmode) {
- off = TRUE;
- }
- tmp_pmode = g_strdup_printf("%s(%d)", ifnm, pmode);
- g_strlcat(new_pmode, tmp_pmode, MAX_VAL_LEN);
- g_free(tmp_pmode);
- g_free(ifnm);
- /* set first-in-list flag to false */
- first_if = FALSE;
- more_items = gtk_tree_model_iter_next (model,&iter);
- }
-
- /* write new promiscuous mode string to preferences */
- g_free(prefs.capture_devices_pmode);
- prefs.capture_devices_pmode = new_pmode;
- if (off) {
- prefs.capture_prom_mode = FALSE;
- } else {
- prefs.capture_prom_mode = TRUE;
- }
- promisc_cb = (GtkWidget *)g_object_get_data(G_OBJECT(capture_window), PROM_MODE_KEY);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_cb), prefs.capture_prom_mode);
- }
-}
-
-/*
- * Create/write new interfaces description string based on current CList.
- * Put it into the preferences value.
- */
-static void
-ifopts_write_new_descr(void)
-{
- GtkListStore *store;
- GtkTreeIter iter;
- GtkTreeModel *model;
- gboolean more_items = TRUE;
- gboolean first_if = TRUE; /* flag to check if first in list */
- gchar *ifnm;
- gchar *desc;
- gchar *tmp_descr;
-
- /* get description for each row (interface) */
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(cur_list));
- store = GTK_LIST_STORE(model);
- if( gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter) ) {
- /* new preferences interfaces description string */
- gchar *new_descr = (gchar *)g_malloc0(MAX_VAL_LEN);
-
- while (more_items) {
- gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
- DEVICE_COLUMN, &ifnm,
- COMMENT_COLUMN, &desc,
- -1);
-
- /* if no description, skip this interface */
- if (strlen(desc) == 0){
- more_items = gtk_tree_model_iter_next (model,&iter);
- continue;
- }
- /*
- * create/cat interface description to new string
- * (leave space for parens, comma and terminator)
- */
- if (first_if != TRUE) {
- g_strlcat (new_descr, ",", MAX_VAL_LEN);
- }
-
- tmp_descr = g_strdup_printf("%s(%s)", ifnm, desc);
- g_strlcat(new_descr, tmp_descr, MAX_VAL_LEN);
- g_free(tmp_descr);
-
- /* set first-in-list flag to false */
- first_if = FALSE;
- more_items = gtk_tree_model_iter_next (model,&iter);
- }
-
- /* write new description string to preferences */
- g_free(prefs.capture_devices_descr);
- prefs.capture_devices_descr = new_descr;
- }
-}
-
-/*
- * Create/write new "hidden" interfaces string based on current CList.
- * Put it into the preferences value.
- */
-static void
-ifopts_write_new_hide(void)
-{
- GtkListStore *store;
- GtkTreeIter iter;
- GtkTreeModel *model;
- gboolean more_items = TRUE;
- gint first_if = TRUE; /* flag to check if first in list */
- gchar *ifnm;
- gboolean hide;
-
- /* get "hide" flag text for each row (interface) */
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(cur_list));
- store = GTK_LIST_STORE(model);
- if( gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter) ) {
- /* new preferences "hidden" interfaces string */
- gchar *new_hide = (gchar *)g_malloc0(MAX_VAL_LEN);
-
- while (more_items) {
- gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
- DEVICE_COLUMN, &ifnm,
- HIDE_COLUMN, &hide,
- -1);
-
- /* if flag text is "No", skip this interface */
- if (!hide){
- more_items = gtk_tree_model_iter_next (model,&iter);
- continue;
- }
-
- /*
- * create/cat interface to new string
- */
- if (first_if != TRUE)
- g_strlcat (new_hide, ",", MAX_VAL_LEN);
- g_strlcat (new_hide, ifnm, MAX_VAL_LEN);
-
- /* set first-in-list flag to false */
- first_if = FALSE;
- more_items = gtk_tree_model_iter_next (model,&iter);
- }
-
- /* write new "hidden" string to preferences */
- g_free(prefs.capture_devices_hide);
- prefs.capture_devices_hide = new_hide;
- hide_interface(g_strdup(new_hide));
- }
-}
-
-static void
-prom_mode_cb(GtkToggleButton *tbt, gpointer udata _U_) {
- prefs.capture_prom_mode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tbt));
-}
-
-#endif /* HAVE_LIBPCAP */
-
-/*
- * Editor modelines - http://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/gtk/prefs_capture.h b/ui/gtk/prefs_capture.h
deleted file mode 100644
index 5c85ef8a22..0000000000
--- a/ui/gtk/prefs_capture.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* capture_prefs.h
- * Definitions for capture preferences window
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __CAPTURE_PREFS_H__
-#define __CAPTURE_PREFS_H__
-
-/** @file
- * "Capture" preferences page.
- * @ingroup prefs_group
- */
-
-/** Build a capture preferences page.
- *
- * @return the new capture preferences page
- */
-GtkWidget *capture_prefs_show(void);
-
-/** Fetch preference values from page.
- *
- * @param widget widget from capture_prefs_show()
- */
-void capture_prefs_fetch(GtkWidget *widget);
-
-/** Apply preference values from page.
- *
- * @param widget widget from capture_prefs_show()
- */
-void capture_prefs_apply(GtkWidget *widget);
-
-/** Destroy preference values from page.
- *
- * @param widget widget from capture_prefs_show()
- */
-void capture_prefs_destroy(GtkWidget *widget);
-
-#endif
diff --git a/ui/gtk/prefs_column.c b/ui/gtk/prefs_column.c
deleted file mode 100644
index 8858eeeb4e..0000000000
--- a/ui/gtk/prefs_column.c
+++ /dev/null
@@ -1,772 +0,0 @@
-/* column_prefs.c
- * Dialog box for column preferences
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/prefs.h>
-#include <epan/column.h>
-
-#include "globals.h"
-
-#include "ui/preference_utils.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-#include "ui/gtk/prefs_column.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/packet_list.h"
-#include "ui/gtk/filter_dlg.h"
-#include "ui/gtk/filter_autocomplete.h"
-#include "ui/gtk/stock_icons.h"
-
-static GtkWidget *remove_bt, *field_te, *field_lb, *occurrence_te, *occurrence_lb, *fmt_cmb;
-static gulong column_menu_changed_handler_id;
-static gulong column_field_changed_handler_id;
-static gulong column_occurrence_changed_handler_id;
-static gulong column_row_deleted_handler_id;
-
-static void column_list_new_cb(GtkWidget *, gpointer);
-static void column_list_delete_cb(GtkWidget *, gpointer);
-static void column_list_select_cb(GtkTreeSelection *, gpointer);
-static void column_menu_changed_cb(GtkWidget *, gpointer);
-static void column_field_changed_cb(GtkEditable *, gpointer);
-static void column_occurrence_changed_cb(GtkEditable *, gpointer);
-static void column_dnd_row_deleted_cb(GtkTreeModel *, GtkTreePath *, gpointer);
-static gboolean column_title_changed_cb(GtkCellRendererText *, const gchar *, const gchar *, gpointer);
-
-static char custom_occurrence_str[8] = "";
-
-enum {
- VISIBLE_COLUMN,
- TITLE_COLUMN,
- FORMAT_COLUMN,
- DATA_COLUMN,
- N_COLUMN /* The number of columns */
-};
-
-/* Visible toggled */
-static void
-visible_toggled(GtkCellRendererToggle *cell _U_, gchar *path_str, gpointer data)
-{
- GtkTreeModel *model = (GtkTreeModel *)data;
- GtkTreeIter iter;
- GtkTreePath *path = gtk_tree_path_new_from_string(path_str);
- GList *clp;
- fmt_data *cfmt;
-
- gtk_tree_model_get_iter(model, &iter, path);
- gtk_tree_model_get(model, &iter, DATA_COLUMN, &clp, -1);
-
- cfmt = (fmt_data *) clp->data;
- if (cfmt->visible)
- cfmt->visible = FALSE;
- else
- cfmt->visible = TRUE;
-
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, VISIBLE_COLUMN, cfmt->visible, -1);
- cfile.columns_changed = TRUE;
-
- gtk_tree_path_free(path);
-} /* visible_toggled */
-
-/*
- * Create and display the column selection widgets.
- * Called as part of the creation of the Preferences notebook ( Edit ! Preferences )
- */
-GtkWidget *
-column_prefs_show(GtkWidget *prefs_window) {
- GtkWidget *main_vb, *bottom_hb, *column_l, *add_bt, *grid, *lb;
- GtkWidget *list_vb, *list_lb, *list_sc;
- GtkWidget *add_remove_vb;
- GtkWidget *props_fr, *props_hb;
- GList *clp;
- fmt_data *cfmt;
- gint i;
- gchar *fmt;
- static const gchar *column_titles[] = {"Displayed", "Title", "Field type"};
- GtkListStore *store;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
- GtkTreeSelection *sel;
- GtkTreeIter iter;
- GtkTreeIter first_iter;
- gint first_row = TRUE;
-
- /* Container for each row of widgets */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 5, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_widget_show(main_vb);
-
- list_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width (GTK_CONTAINER (list_vb), 5);
- gtk_widget_show (list_vb);
- gtk_box_pack_start (GTK_BOX (main_vb), list_vb, TRUE, TRUE, 0);
-
- list_lb = gtk_label_new (
- "[The first list entry will be displayed as the leftmost column"
- " - Drag and drop entries to change column order]");
- gtk_widget_show (list_lb);
- gtk_box_pack_start (GTK_BOX (list_vb), list_lb, FALSE, FALSE, 0);
-
- list_sc = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(list_sc), GTK_SHADOW_IN);
- gtk_box_pack_start(GTK_BOX(list_vb), list_sc, TRUE, TRUE, 0);
- gtk_widget_show(list_sc);
-
- store = gtk_list_store_new(N_COLUMN,
- G_TYPE_BOOLEAN,
- G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER);
- column_row_deleted_handler_id =
- g_signal_connect(GTK_TREE_MODEL(store), "row-deleted", G_CALLBACK(column_dnd_row_deleted_cb), NULL);
-
- column_l = tree_view_new(GTK_TREE_MODEL(store));
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(column_l), TRUE);
- gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(column_l), FALSE);
- gtk_tree_view_set_reorderable(GTK_TREE_VIEW(column_l), TRUE);
- gtk_widget_set_tooltip_text(column_l, "Click on a title to change its name.\nDrag an item to change its order.");
-
- renderer = gtk_cell_renderer_toggle_new();
- g_signal_connect(renderer, "toggled", G_CALLBACK(visible_toggled), store);
- column = gtk_tree_view_column_new_with_attributes(column_titles[VISIBLE_COLUMN], renderer, "active", VISIBLE_COLUMN, NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_append_column(GTK_TREE_VIEW(column_l), column);
-
- renderer = gtk_cell_renderer_text_new();
- g_object_set(G_OBJECT(renderer), "editable", TRUE, NULL);
- g_signal_connect (renderer, "edited", G_CALLBACK(column_title_changed_cb), GTK_TREE_MODEL(store));
- column = gtk_tree_view_column_new_with_attributes(column_titles[TITLE_COLUMN], renderer, "text", TITLE_COLUMN, NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_append_column(GTK_TREE_VIEW(column_l), column);
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes(column_titles[FORMAT_COLUMN], renderer, "text", FORMAT_COLUMN, NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_append_column(GTK_TREE_VIEW(column_l), column);
-
- /* XXX - make this match the packet list prefs? */
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(column_l));
- gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
- g_signal_connect(sel, "changed", G_CALLBACK(column_list_select_cb), NULL);
-
- gtk_container_add(GTK_CONTAINER(list_sc), column_l);
- gtk_widget_show(column_l);
-
- clp = g_list_first(prefs.col_list);
- while (clp) {
- cfmt = (fmt_data *) clp->data;
- if (cfmt->fmt == COL_CUSTOM) {
- if (cfmt->custom_occurrence) {
- fmt = g_strdup_printf("%s (%s#%d)", col_format_desc(cfmt->fmt), cfmt->custom_fields, cfmt->custom_occurrence);
- } else {
- fmt = g_strdup_printf("%s (%s)", col_format_desc(cfmt->fmt), cfmt->custom_fields);
- }
- } else {
- if (cfmt->custom_fields) {
- /* Delete custom_fields from previous changes */
- g_free (cfmt->custom_fields);
- cfmt->custom_fields = NULL;
- cfmt->custom_occurrence = 0;
- }
- fmt = g_strdup(col_format_desc(cfmt->fmt));
- }
- gtk_list_store_insert_with_values(store, &iter, G_MAXINT,
- VISIBLE_COLUMN, cfmt->visible,
- TITLE_COLUMN, cfmt->title, FORMAT_COLUMN, fmt, DATA_COLUMN, clp, -1);
-
- if (first_row) {
- first_iter = iter;
- first_row = FALSE;
- }
- clp = clp->next;
- g_free (fmt);
- }
- g_object_unref(G_OBJECT(store));
-
- /* Bottom row: Add/remove buttons and properties */
- bottom_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5, FALSE);
- gtk_box_pack_start (GTK_BOX (main_vb), bottom_hb, FALSE, FALSE, 0);
- gtk_widget_show(bottom_hb);
-
- /* Add / remove buttons */
- add_remove_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, TRUE);
- gtk_container_set_border_width (GTK_CONTAINER (add_remove_vb), 5);
- gtk_box_pack_start (GTK_BOX (bottom_hb), add_remove_vb, FALSE, FALSE, 0);
- gtk_widget_show(add_remove_vb);
-
- add_bt = ws_gtk_button_new_from_stock(GTK_STOCK_ADD);
- g_signal_connect(add_bt, "clicked", G_CALLBACK(column_list_new_cb), column_l);
- gtk_box_pack_start (GTK_BOX (add_remove_vb), add_bt, FALSE, FALSE, 0);
- gtk_widget_set_tooltip_text(add_bt, "Add a new column at the end of the list.");
- gtk_widget_show(add_bt);
-
- remove_bt = ws_gtk_button_new_from_stock(GTK_STOCK_REMOVE);
- gtk_widget_set_sensitive(remove_bt, FALSE);
- g_signal_connect(remove_bt, "clicked", G_CALLBACK(column_list_delete_cb), column_l);
- gtk_box_pack_start (GTK_BOX (add_remove_vb), remove_bt, FALSE, FALSE, 0);
- gtk_widget_set_tooltip_text(remove_bt, "Remove the selected column.");
- gtk_widget_show(remove_bt);
-
- /* properties frame */
- props_fr = gtk_frame_new("Properties");
- gtk_box_pack_start (GTK_BOX (bottom_hb), props_fr, TRUE, TRUE, 0);
- gtk_widget_show(props_fr);
-
- /* Column name entry and format selection */
- /* XXX: IMO, the grid should have a fixed width instead of
- * expanding to the horizontal window width when the window
- * is resized horizontally. However, I couldn't quite make
- * things work properly when I tried to change the grid
- * behavior.
- */
- grid = ws_gtk_grid_new();
- gtk_container_set_border_width(GTK_CONTAINER(grid), 5);
- gtk_container_add(GTK_CONTAINER(props_fr), grid);
- ws_gtk_grid_set_row_spacing(GTK_GRID(grid), 10);
- ws_gtk_grid_set_column_spacing(GTK_GRID(grid), 15);
- gtk_widget_show(grid);
-
- lb = gtk_label_new("Field type:");
- gtk_misc_set_alignment(GTK_MISC(lb), 0.0f, 0.5f);
- ws_gtk_grid_attach_extended(GTK_GRID(grid), lb, 0, 0, 1, 1, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
- gtk_widget_set_tooltip_text(lb, "Select which packet information to present in the column.");
- gtk_widget_show(lb);
-
- props_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5, FALSE);
- ws_gtk_grid_attach_extended(GTK_GRID(grid), props_hb, 1, 0, 1, 1, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
- gtk_widget_set_tooltip_text(props_hb, "Select which packet information to present in the column.");
- gtk_widget_show(props_hb);
-
- field_lb = gtk_label_new("Field name:");
- gtk_misc_set_alignment(GTK_MISC(field_lb), 0.0f, 0.5f);
- ws_gtk_grid_attach_extended(GTK_GRID(grid), field_lb, 0, 1, 1, 1, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
- gtk_widget_set_sensitive(field_lb, FALSE);
- gtk_widget_set_tooltip_text(field_lb,
- "Display filter field name to show when the field type is \"Custom\".");
- gtk_widget_show(field_lb);
-
- field_te = gtk_entry_new();
- g_object_set_data (G_OBJECT(field_te), E_FILT_MULTI_FIELD_NAME_ONLY_KEY, (gpointer)"");
- g_signal_connect(field_te, "changed", G_CALLBACK(filter_te_syntax_check_cb), NULL);
-
- /* XXX: column_field_changed_cb will be called for every character entered in the entry box. */
- /* Consider Changing logic so that the field is "accepted" only when a return is entered ?? */
- /* Also: entry shouldn't be accepted if it's not a valid filter ? */
- column_field_changed_handler_id =
- g_signal_connect(field_te, "changed", G_CALLBACK(column_field_changed_cb), column_l);
-
- g_object_set_data(G_OBJECT(main_vb), E_FILT_AUTOCOMP_PTR_KEY, NULL);
- g_signal_connect(field_te, "key-press-event", G_CALLBACK (filter_string_te_key_pressed_cb), NULL);
- g_signal_connect(prefs_window, "key-press-event", G_CALLBACK (filter_parent_dlg_key_pressed_cb), NULL);
- colorize_filter_te_as_empty(field_te);
- ws_gtk_grid_attach_extended(GTK_GRID(grid), field_te, 1, 1, 1, 1, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
- gtk_widget_set_sensitive(field_te, FALSE);
- gtk_widget_set_tooltip_text(field_te,
- "Display filter field name to show when the field type is \"Custom\".");
- gtk_widget_show(field_te);
-
- occurrence_lb = gtk_label_new("Field occurrence:");
- gtk_misc_set_alignment(GTK_MISC(occurrence_lb), 0.0f, 0.5f);
- ws_gtk_grid_attach_extended(GTK_GRID(grid), occurrence_lb, 2, 1, 1, 1, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
- gtk_widget_set_sensitive(occurrence_lb, FALSE);
- gtk_widget_set_tooltip_text(occurrence_lb,
- "Field occurrence to use. "
- "0=all (default), 1=first, 2=second, ..., -1=last.");
- gtk_widget_show(occurrence_lb);
-
- occurrence_te = gtk_entry_new();
- gtk_entry_set_max_length (GTK_ENTRY(occurrence_te),4);
- g_object_set_data (G_OBJECT(occurrence_te), "occurrence", (gpointer)"");
-
- /* XXX: column_occurrence_changed_cb will be called for every character entered in the entry box. */
- /* Consider Changing logic so that the field is "accepted" only when a return is entered ?? */
- column_occurrence_changed_handler_id =
- g_signal_connect(occurrence_te, "changed", G_CALLBACK(column_occurrence_changed_cb), column_l);
-
- ws_gtk_grid_attach_extended(GTK_GRID(grid), occurrence_te, 3, 1, 1, 1, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
- gtk_widget_set_sensitive(occurrence_te, FALSE);
- gtk_widget_set_tooltip_text(occurrence_te,
- "Field occurrence to use. "
- "0=all (default), 1=first, 2=second, ..., -1=last.");
- gtk_widget_show(occurrence_te);
-
- fmt_cmb = gtk_combo_box_text_new();
-
- for (i = 0; i < NUM_COL_FMTS; i++)
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(fmt_cmb), col_format_desc(i));
-
- column_menu_changed_handler_id = g_signal_connect(fmt_cmb, "changed", G_CALLBACK(column_menu_changed_cb), column_l);
-
- gtk_widget_set_sensitive(fmt_cmb, FALSE);
- gtk_box_pack_start(GTK_BOX(props_hb), fmt_cmb, FALSE, FALSE, 0);
- gtk_widget_show(fmt_cmb);
-
- /* select the first menu list row. */
- /* Triggers call to column_list_select_cb(). */
- gtk_tree_selection_select_iter(sel, &first_iter);
-
- return(main_vb);
-}
-
-/* To do: add input checking to each of these callbacks */
-
-static void
-column_list_new_cb(GtkWidget *w _U_, gpointer data) {
- gint cur_fmt;
- const gchar *title = "New Column";
- GtkTreeView *column_l = GTK_TREE_VIEW(data);
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkTreePath *path;
- GtkTreeViewColumn *title_column;
-
- cur_fmt = COL_NUMBER; /* Set the default new column type */
- column_prefs_add_custom (cur_fmt, title, NULL, 0);
-
- model = gtk_tree_view_get_model(column_l);
- gtk_list_store_insert_with_values(GTK_LIST_STORE(model), &iter, G_MAXINT,
- VISIBLE_COLUMN, TRUE,
- TITLE_COLUMN, title,
- FORMAT_COLUMN, col_format_desc(cur_fmt),
- DATA_COLUMN, g_list_last(prefs.col_list),
- -1);
-
- /* Triggers call to column_list_select_cb() */
- gtk_tree_selection_select_iter(gtk_tree_view_get_selection(column_l), &iter);
-
- /* Set the cursor to the 'Title' column of the newly added row and enable editing */
- /* XXX: If displaying the new title ["New column"] widens the title column of the */
- /* treeview, then the set_cursor below doesn't properly generate an entry */
- /* box around the title text. The width of the box appears to be the column */
- /* width before the treeview title column was widened. Seems like a bug... */
- /* I haven't found a work-around. */
- path = gtk_tree_model_get_path(model, &iter);
- title_column = gtk_tree_view_get_column(column_l, 0);
- gtk_tree_view_set_cursor(column_l, path, title_column, TRUE);
- gtk_tree_path_free(path);
-
- cfile.columns_changed = TRUE;
-}
-
-
-static void
-column_list_delete_cb(GtkWidget *w _U_, gpointer data) {
- GtkTreeView *column_l = GTK_TREE_VIEW(data);
- GList *clp;
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkTreeIter new_iter;
-
- sel = gtk_tree_view_get_selection(column_l);
- if (gtk_tree_selection_get_selected(sel, &model, &iter))
- {
- gtk_tree_model_get(model, &iter, DATA_COLUMN, &clp, -1);
- column_prefs_remove_link(clp);
-
- /* Change the row selection to the next row (if available) or */
- /* the previous row (if available). If there's only one row */
- /* in the store (no previous and no next), then the selection */
- /* will not be changed. */
-
- /* Note that gtk_tree_selection_select_iter() will trigger a */
- /* call to column_list_select_cb(). */
-
- new_iter = iter;
- if ( gtk_tree_model_iter_next(model, &new_iter)) {
- gtk_tree_selection_select_iter(sel, &new_iter);
- } else { /* "gtk_tree_model_iter_prev" */
- GtkTreePath *path = gtk_tree_model_get_path(model, &iter);
- if (gtk_tree_path_prev(path)) {
- gtk_tree_model_get_iter(model, &new_iter, path);
- gtk_tree_selection_select_iter(sel, &new_iter);
- }
- gtk_tree_path_free(path);
- }
-
- /* Remove the row from the list store. */
- /* We prevent triggering call to column_row_deleted_cb() since */
- /* the entry has already been removed from prefs.col_list and */
- /* since rebuilding the list is not needed because the order */
- /* of the list hasn't changed. */
-
- g_signal_handler_block(model, column_row_deleted_handler_id);
-
- /* list_store_remove below will trigger a call to */
- /* column_list_select_cb() only when deleting the last entry in */
- /* the column list. */
- /* (This is because the selection in this case changes to */
- /* "nothing selected" when the last row is removed. */
-
- gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
-
- g_signal_handler_unblock (model, column_row_deleted_handler_id);
-
- cfile.columns_changed = TRUE;
- }
-}
-
-
-static gboolean
-column_title_changed_cb(GtkCellRendererText *cell _U_, const gchar *str_path, const gchar *new_title, gpointer data) {
- fmt_data *cfmt;
- GList *clp;
- GtkTreeModel *model = (GtkTreeModel *)data;
- GtkTreePath *path = gtk_tree_path_new_from_string (str_path);
- GtkTreeIter iter;
-
- gtk_tree_model_get_iter(model, &iter, path);
-
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, TITLE_COLUMN, new_title, -1);
-
- gtk_tree_model_get(model, &iter, DATA_COLUMN, &clp, -1);
- if (clp) {
- cfmt = (fmt_data *) clp->data;
- g_free(cfmt->title);
- cfmt->title = g_strdup(new_title);
- }
-
- gtk_tree_path_free (path);
- cfile.columns_changed = TRUE;
- return TRUE;
-}
-
-/*
- * column list row selection changed.
- * Set the "Properties" widgets to match the currently selected column row item.
- */
-
-static void
-column_list_select_cb(GtkTreeSelection *sel, gpointer data _U_)
-{
- fmt_data *cfmt;
- GList *clp;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- /* if something was selected */
- if (gtk_tree_selection_get_selected(sel, &model, &iter))
- {
- gtk_tree_model_get(model, &iter, DATA_COLUMN, &clp, -1);
- g_assert(clp != NULL);
- cfmt = (fmt_data *) clp->data;
-
- g_signal_handler_block (fmt_cmb, column_menu_changed_handler_id);
- gtk_combo_box_set_active(GTK_COMBO_BOX(fmt_cmb), cfmt->fmt);
- g_signal_handler_unblock(fmt_cmb, column_menu_changed_handler_id);
-
- g_signal_handler_block (field_te, column_field_changed_handler_id);
- g_signal_handler_block (occurrence_te, column_occurrence_changed_handler_id);
- if (cfmt->fmt == COL_CUSTOM) {
- gtk_entry_set_text(GTK_ENTRY(field_te), cfmt->custom_fields);
- gtk_widget_set_sensitive(field_lb, TRUE);
- gtk_widget_set_sensitive(field_te, TRUE);
- g_snprintf(custom_occurrence_str, sizeof(custom_occurrence_str), "%d", cfmt->custom_occurrence);
- gtk_entry_set_text(GTK_ENTRY(occurrence_te), custom_occurrence_str);
- gtk_widget_set_sensitive(occurrence_lb, TRUE);
- gtk_widget_set_sensitive(occurrence_te, TRUE);
- } else {
- gtk_editable_delete_text(GTK_EDITABLE(field_te), 0, -1);
- gtk_widget_set_sensitive(field_lb, FALSE);
- gtk_widget_set_sensitive(field_te, FALSE);
- gtk_editable_delete_text(GTK_EDITABLE(occurrence_te), 0, -1);
- gtk_widget_set_sensitive(occurrence_lb, FALSE);
- gtk_widget_set_sensitive(occurrence_te, FALSE);
- }
- g_signal_handler_unblock(occurrence_te, column_occurrence_changed_handler_id);
- g_signal_handler_unblock(field_te, column_field_changed_handler_id);
-
- gtk_widget_set_sensitive(remove_bt, TRUE);
- gtk_widget_set_sensitive(fmt_cmb, TRUE);
- }
- else
- {
- gtk_editable_delete_text(GTK_EDITABLE(field_te), 0, -1);
- gtk_editable_delete_text(GTK_EDITABLE(occurrence_te), 0, -1);
-
- gtk_widget_set_sensitive(remove_bt, FALSE);
- gtk_widget_set_sensitive(field_te, FALSE);
- gtk_widget_set_sensitive(occurrence_te, FALSE);
- gtk_widget_set_sensitive(fmt_cmb, FALSE);
- }
-}
-
-
-/*
- * The user selected a new entry in the format combo-box;
- * Note: column_menu_changed_cb is expected to be called only
- * when the user changes the format combo-box.
- * Action:
- * If no selection active in the column list:
- * Hide 'field"; desensitize buttons.
- * XXX: Can this happen ?
- * If a column list selection is active:
- * 1. Update the display of "field" as req'd (depending upon
- * whether the active combo-box entry is the "custom"
- * format type).
- * 2. Update the column_list and prefs.col_formats.
- * Set columns_changed = TRUE.
- */
-
-static void
-column_menu_changed_cb(GtkWidget *w, gpointer data) {
- GtkTreeView *column_l = GTK_TREE_VIEW(data);
- fmt_data *cfmt;
- gint cur_cb_fmt;
- GList *clp;
- gchar *fmt;
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- sel = gtk_tree_view_get_selection(column_l);
- if (! (gtk_tree_selection_get_selected(sel, &model, &iter)))
- return; /* no column list selection [Can this happen ?]: ignore callback */
-
- cur_cb_fmt = gtk_combo_box_get_active(GTK_COMBO_BOX(w));
- gtk_tree_model_get(model, &iter, DATA_COLUMN, &clp, -1);
- cfmt = (fmt_data *) clp->data;
-
- g_assert(cur_cb_fmt != cfmt->fmt);
-
- /* The User has selected a new format in the combo-box */
- /* (IE: combo-box format != current selected row format) */
- /* Update field widgets, list_store, column format array */
- /* entry as appropriate. */
- g_signal_handler_block (field_te, column_field_changed_handler_id);
- g_signal_handler_block (occurrence_te, column_occurrence_changed_handler_id);
- if (cfmt->fmt == COL_CUSTOM) {
- /* Changing from custom to non-custom */
- gtk_editable_delete_text(GTK_EDITABLE(field_te), 0, -1);
- gtk_editable_delete_text(GTK_EDITABLE(occurrence_te), 0, -1);
- fmt = g_strdup(col_format_desc(cur_cb_fmt));
- gtk_widget_set_sensitive(field_lb, FALSE);
- gtk_widget_set_sensitive(field_te, FALSE);
- gtk_widget_set_sensitive(occurrence_lb, FALSE);
- gtk_widget_set_sensitive(occurrence_te, FALSE);
-
- } else if (cur_cb_fmt == COL_CUSTOM) {
- /* Changing from non-custom to custom */
- if (cfmt->custom_fields == NULL)
- cfmt->custom_fields = g_strdup("");
- /* The following doesn't trigger a call to menu_field_changed_cb() */
- gtk_entry_set_text(GTK_ENTRY(field_te), cfmt->custom_fields);
- g_snprintf(custom_occurrence_str, sizeof(custom_occurrence_str), "%d", cfmt->custom_occurrence);
- gtk_entry_set_text(GTK_ENTRY(occurrence_te), custom_occurrence_str);
-
- if (cfmt->custom_occurrence) {
- fmt = g_strdup_printf("%s (%s#%d)", col_format_desc(cur_cb_fmt), cfmt->custom_fields, cfmt->custom_occurrence);
- } else {
- fmt = g_strdup_printf("%s (%s)", col_format_desc(cur_cb_fmt), cfmt->custom_fields);
- }
- gtk_widget_set_sensitive(field_lb, TRUE);
- gtk_widget_set_sensitive(field_te, TRUE);
- gtk_widget_set_sensitive(occurrence_lb, TRUE);
- gtk_widget_set_sensitive(occurrence_te, TRUE);
-
- } else {
- /* Changing from non-custom to non-custom */
- fmt = g_strdup(col_format_desc(cur_cb_fmt));
- }
- g_signal_handler_unblock(occurrence_te, column_occurrence_changed_handler_id);
- g_signal_handler_unblock(field_te, column_field_changed_handler_id);
-
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, FORMAT_COLUMN, fmt, -1);
- g_free(fmt);
- cfmt->fmt = cur_cb_fmt;
- cfile.columns_changed = TRUE;
-}
-
-
-/*
- * The user changed the custom field entry box or
- * the field entry box has been updated because a new
- * column row with custom format has been selected.
- * If the current field entry matches that of the current
- * column row, this is just an update because a new
- * column row has been selected. Do nothing.
- * If the two are different, then update the column row & etc.
- */
-static void
-column_field_changed_cb(GtkEditable *te, gpointer data) {
- fmt_data *cfmt;
- GList *clp;
- gchar *field, *fmt;
- GtkTreeView *tree = (GtkTreeView *)data;
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- sel = gtk_tree_view_get_selection(tree);
- if ( ! (gtk_tree_selection_get_selected(sel, &model, &iter))) {
- return;
- }
-
- field = gtk_editable_get_chars(te, 0, -1);
- gtk_tree_model_get(model, &iter, DATA_COLUMN, &clp, -1);
- cfmt = (fmt_data *) clp->data;
- if (strcmp(cfmt->custom_fields, field) == 0) {
- return; /* no action req'd */
- }
-
- /* The user has entered a new value in the field entry box: make the req'd changes */
- if (cfmt->custom_occurrence) {
- fmt = g_strdup_printf("%s (%s#%d)", col_format_desc(cfmt->fmt), field, cfmt->custom_occurrence);
- } else {
- fmt = g_strdup_printf("%s (%s)", col_format_desc(cfmt->fmt), field);
- }
-
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, FORMAT_COLUMN, fmt, -1);
- g_free(fmt);
- g_free(cfmt->custom_fields);
- cfmt->custom_fields = field;
- cfile.columns_changed = TRUE;
-}
-
-
-/*
- * The user changed the custom field occurrence entry box or
- * the field occurrece entry box has been updated because a new
- * column row with custom format has been selected.
- * If the current field entry matches that of the current
- * column row, this is just an update because a new
- * column row has been selected. Do nothing.
- * If the two are different, then update the column row & etc.
- */
-static void
-column_occurrence_changed_cb(GtkEditable *te, gpointer data) {
- fmt_data *cfmt;
- gint occurrence;
- GList *clp;
- gchar *fmt;
- GtkTreeView *tree = (GtkTreeView *)data;
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- sel = gtk_tree_view_get_selection(tree);
- if ( ! (gtk_tree_selection_get_selected(sel, &model, &iter))) {
- return;
- }
-
- occurrence = (gint)strtol(gtk_editable_get_chars(te, 0, -1), NULL, 10);
- gtk_tree_model_get(model, &iter, DATA_COLUMN, &clp, -1);
- cfmt = (fmt_data *) clp->data;
- if (cfmt->custom_occurrence == occurrence) {
- return; /* no action req'd */
- }
-
- /* The user has entered a new value in the field occurrence entry box: make the req'd changes */
- if (occurrence) {
- fmt = g_strdup_printf("%s (%s#%d)", col_format_desc(cfmt->fmt), cfmt->custom_fields, occurrence);
- } else {
- fmt = g_strdup_printf("%s (%s)", col_format_desc(cfmt->fmt), cfmt->custom_fields);
- }
-
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, FORMAT_COLUMN, fmt, -1);
- g_free(fmt);
- cfmt->custom_occurrence = occurrence;
- cfile.columns_changed = TRUE;
-}
-
-
-/*
- * Callback for the "row-deleted" signal emitted when a list item is dragged.
- * http://library.gnome.org/devel/gtk/stable/GtkTreeModel.html#GtkTreeModel-rows-reordered
- * says that DND deletes, THEN inserts the row.
- *
- * XXX: For the record: For Gtk+ 2.16.0 testing shows the actual sequence for drag-and-drop to be as follows:
- * 1. Insert a new, empty row at the destination;
- * 2. Emit a "row-inserted" signal on the model; invoke any row-inserted callbacks & etc;
- * 3. Copy the source row data to the new (empty) destination row;
- * 4. Delete the source row;
- * 5. Emit a "row-deleted" signal; invoke any row-deleted callbacks & etc.
- *
- * The code below (invoked as a consequence of a "row-deleted" signal) rebuilds
- * prefs.col_list by iterating over the (re-ordered) tree model.
- */
-static void
-column_dnd_row_deleted_cb(GtkTreeModel *model, GtkTreePath *path _U_, gpointer data _U_) {
- GtkTreeIter iter;
- GList *clp, *new_col_list = NULL;
- gboolean items_left;
-
- /*
- * XXX - This rebuilds prefs.col_list based on the current model. We
- * might just want to do this when the prefs are applied
- */
- for (items_left = gtk_tree_model_get_iter_first (model, &iter);
- items_left;
- items_left = gtk_tree_model_iter_next (model, &iter)) {
-
- gtk_tree_model_get(model, &iter, DATA_COLUMN, &clp, -1);
- if (clp) {
- prefs.col_list = g_list_remove_link(prefs.col_list, clp);
- new_col_list = g_list_concat(new_col_list, clp);
- }
- }
- if (prefs.col_list) {
- g_warning("column_dnd_row_deleted_cb: prefs.col_list has %d leftover data",
- g_list_length(prefs.col_list));
- g_list_free(prefs.col_list);
- }
-
- prefs.col_list = new_col_list;
- cfile.columns_changed = TRUE;
-}
-
-
-void
-column_prefs_fetch(GtkWidget *w _U_) {
-}
-
-
-void
-column_prefs_apply(GtkWidget *w _U_)
-{
- /* Redraw the packet list if the columns were changed */
- if(cfile.columns_changed) {
- packet_list_recreate();
- cfile.columns_changed = FALSE; /* Reset value */
- }
-}
-
-
-void
-column_prefs_destroy(GtkWidget *w _U_) {
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/prefs_column.h b/ui/gtk/prefs_column.h
deleted file mode 100644
index 2358408774..0000000000
--- a/ui/gtk/prefs_column.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* prefs_column.h
- * Definitions for column preferences window
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __COLUMN_PREFS_H__
-#define __COLUMN_PREFS_H__
-
-/** @file
- * "User Interface: Columns" preferences page.
- * @ingroup prefs_group
- */
-
-/** Build a column preferences page.
- *
- * @return the new column preferences page
- */
-GtkWidget *column_prefs_show(GtkWidget *prefs_window);
-
-/** Fetch preference values from page.
- *
- * @param widget widget from column_prefs_show()
- */
-void column_prefs_fetch(GtkWidget *widget);
-
-/** Apply preference values from page.
- *
- * @param widget widget from column_prefs_show()
- */
-void column_prefs_apply(GtkWidget *widget);
-
-/** Destroy preference values from page.
- *
- * @param widget widget from column_prefs_show()
- */
-void column_prefs_destroy(GtkWidget *widget);
-
-#endif
diff --git a/ui/gtk/prefs_dlg.c b/ui/gtk/prefs_dlg.c
deleted file mode 100644
index dc91dc1d7c..0000000000
--- a/ui/gtk/prefs_dlg.c
+++ /dev/null
@@ -1,1838 +0,0 @@
-/* prefs_dlg.c
- * Routines for handling preferences
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <gtk/gtk.h>
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <epan/packet.h>
-#include <epan/prefs.h>
-#include <epan/prefs-int.h>
-#include <epan/epan_dissect.h>
-#include <epan/decode_as.h>
-
-#include "ui/preference_utils.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/prefs_column.h"
-#include "ui/gtk/prefs_dlg.h"
-#include "ui/gtk/prefs_filter_expressions.h"
-#include "ui/gtk/filter_expression_save_dlg.h"
-#include "ui/gtk/prefs_font_color.h"
-#include "ui/gtk/prefs_gui.h"
-#include "ui/gtk/prefs_layout.h"
-#include "ui/gtk/prefs_capture.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/keys.h"
-#include "ui/gtk/uat_gui.h"
-#include "ui/gtk/file_dlg.h"
-#include "ui/gtk/packet_win.h"
-#include "simple_dialog.h"
-
-#ifdef HAVE_LIBPCAP
-#ifdef _WIN32
-#include <caputils/capture-wpcap.h>
-#endif /* _WIN32 */
-#ifdef HAVE_AIRPCAP
-#include <caputils/airpcap.h>
-#include <caputils/airpcap_loader.h>
-#include "airpcap_gui_utils.h"
-#endif
-#endif
-
-#include "globals.h"
-
-static void prefs_main_ok_cb(GtkWidget *, gpointer);
-static void prefs_main_apply_cb(GtkWidget *, gpointer);
-static void prefs_main_save_cb(GtkWidget *, gpointer);
-static void prefs_main_cancel_cb(GtkWidget *, gpointer);
-static gboolean prefs_main_delete_event_cb(GtkWidget *, GdkEvent *, gpointer);
-static void prefs_main_destroy_cb(GtkWidget *, gpointer);
-static void prefs_tree_select_cb(GtkTreeSelection *, gpointer);
-
-static GtkWidget *create_preference_path_entry(GtkWidget *, int,
- const gchar *, const gchar *, char *, gboolean);
-
-#define E_PREFSW_SCROLLW_KEY "prefsw_scrollw"
-#define E_PREFSW_TREE_KEY "prefsw_tree"
-#define E_PREFSW_NOTEBOOK_KEY "prefsw_notebook"
-#define E_PREFSW_SAVE_BT_KEY "prefsw_save_bt"
-#define E_PAGE_ITER_KEY "page_iter"
-#define E_PAGE_MODULE_KEY "page_module"
-#define E_PAGESW_FRAME_KEY "pagesw_frame"
-
-#define E_GUI_PAGE_KEY "gui_options_page"
-#define E_GUI_LAYOUT_PAGE_KEY "gui_layout_page"
-#define E_GUI_COLUMN_PAGE_KEY "gui_column_options_page"
-#define E_GUI_FONT_PAGE_KEY "gui_font_options_page"
-#define E_GUI_FONT_COLORS_PAGE_KEY "gui_font_colors_options_page"
-#define E_CAPTURE_PAGE_KEY "capture_options_page"
-#define E_NAMERES_PAGE_KEY "nameres_options_page"
-#define E_FILTER_EXPRESSIONS_PAGE_KEY "filter_expressions_page"
-#define E_GRID_MODULE_KEY "grid_module"
-
-/*
- * Keep a static pointer to the current "Preferences" window, if any, so that
- * if somebody tries to do "Edit:Preferences" while there's already a
- * "Preferences" window up, we just pop up the existing one, rather than
- * creating a new one.
- */
-static GtkWidget *prefs_w;
-
-struct ct_struct {
- GtkWidget *main_vb;
- GtkWidget *notebook;
- GtkWidget *tree;
- GtkTreeIter iter;
- gint page;
- GtkTreeStore *store;
-};
-
-static guint
-pref_exists(pref_t *pref _U_, gpointer user_data _U_)
-{
- return 1;
-}
-
-/* show a single preference on the GtkGrid of a preference page */
-static guint
-pref_show(pref_t *pref, gpointer user_data)
-{
- GtkWidget *main_grid = (GtkWidget *)user_data;
- module_t *module = (module_t *)g_object_get_data(G_OBJECT(main_grid), E_GRID_MODULE_KEY);
- const char *title;
- const char *type_name = prefs_pref_type_name(pref);
- char *label_string;
- size_t label_len;
- char *uint_str;
- char *tooltip_txt;
-
- /* Give this preference a label which is its title, followed by a colon,
- and left-align it. */
- title = prefs_get_title(pref);
- label_len = strlen(title) + 2;
- label_string = (char *)g_malloc(label_len);
- g_strlcpy(label_string, title, label_len);
-
- tooltip_txt = prefs_get_description(pref) ? g_strdup_printf("%s\n\nName: %s.%s\nType: %s",
- prefs_get_description(pref),
- module->name,
- prefs_get_name(pref),
- type_name ? type_name : "Unknown"
- ): NULL;
-
- /*
- * Sometimes we don't want to append a ':' after a static text string...
- * If it is needed, we will specify it in the string itself.
- */
- if (prefs_get_type(pref) != PREF_STATIC_TEXT)
- g_strlcat(label_string, ":", label_len);
-
- pref_stash(pref, NULL);
-
- /* Save the current value of the preference, so that we can revert it if
- the user does "Apply" and then "Cancel", and create the control for
- editing the preference. */
- switch (prefs_get_type(pref)) {
-
- case PREF_UINT:
- case PREF_DECODE_AS_UINT:
- /* XXX - there are no uint spinbuttons, so we can't use a spinbutton.
- Even more annoyingly, even if there were, GLib doesn't define
- G_MAXUINT - but I think ANSI C may define UINT_MAX, so we could
- use that. */
- uint_str = prefs_pref_to_str(pref, pref_stashed);
- prefs_set_control(pref, create_preference_entry(main_grid, prefs_get_ordinal(pref),
- label_string, tooltip_txt,
- uint_str));
- g_free(uint_str);
- break;
-
- case PREF_BOOL:
- prefs_set_control(pref, create_preference_check_button(main_grid, prefs_get_ordinal(pref),
- label_string, tooltip_txt,
- prefs_get_bool_value(pref, pref_stashed)));
- break;
-
- case PREF_ENUM:
- if (prefs_get_enum_radiobuttons(pref)) {
- /* Show it as radio buttons. */
- prefs_set_control(pref, create_preference_radio_buttons(main_grid, prefs_get_ordinal(pref),
- label_string, tooltip_txt,
- prefs_get_enumvals(pref),
- prefs_get_enum_value(pref, pref_stashed)));
- } else {
- /* Show it as an option menu. */
- prefs_set_control(pref, create_preference_option_menu(main_grid, prefs_get_ordinal(pref),
- label_string, tooltip_txt,
- prefs_get_enumvals(pref),
- prefs_get_enum_value(pref, pref_stashed)));
- }
- break;
-
- case PREF_STRING:
- prefs_set_control(pref, create_preference_entry(main_grid, prefs_get_ordinal(pref),
- label_string, tooltip_txt,
- prefs_get_string_value(pref, pref_stashed)));
- break;
-
- case PREF_SAVE_FILENAME:
- case PREF_OPEN_FILENAME:
- prefs_set_control(pref, create_preference_path_entry(main_grid, prefs_get_ordinal(pref),
- label_string,
- tooltip_txt,
- prefs_get_string_value(pref, pref_stashed), FALSE));
- break;
-
- case PREF_DIRNAME:
- prefs_set_control(pref, create_preference_path_entry(main_grid, prefs_get_ordinal(pref),
- label_string,
- tooltip_txt,
- prefs_get_string_value(pref, pref_stashed), TRUE));
- break;
-
- case PREF_RANGE:
- case PREF_DECODE_AS_RANGE:
- {
- char *range_str_p;
-
- range_str_p = range_convert_range(NULL, prefs_get_range_value_real(pref, pref_current));
- prefs_set_control(pref, create_preference_entry(main_grid, prefs_get_ordinal(pref),
- label_string, tooltip_txt,
- range_str_p));
- wmem_free(NULL, range_str_p);
- break;
- }
-
- case PREF_STATIC_TEXT:
- {
- prefs_set_control(pref, create_preference_static_text(main_grid, prefs_get_ordinal(pref),
- label_string, tooltip_txt));
- break;
- }
-
- case PREF_UAT:
- {
- if (prefs_get_gui_type(pref) == GUI_ALL || prefs_get_gui_type(pref) == GUI_GTK)
- prefs_set_control(pref, create_preference_uat(main_grid, prefs_get_ordinal(pref),
- label_string, tooltip_txt,
- prefs_get_uat_value(pref)));
- break;
- }
-
- case PREF_COLOR:
- case PREF_CUSTOM:
- /* currently not supported */
-
- case PREF_OBSOLETE:
- g_assert_not_reached();
- break;
- }
- g_free(tooltip_txt);
- g_free(label_string);
-
- return 0;
-}
-
-#define prefs_tree_iter GtkTreeIter
-
-/* add a page to the tree */
-static prefs_tree_iter
-prefs_tree_page_add(const gchar *title, gint page_nr,
- gpointer store, prefs_tree_iter *parent_iter)
-{
- prefs_tree_iter iter;
-
- gtk_tree_store_append((GtkTreeStore *)store, &iter, parent_iter);
- gtk_tree_store_set((GtkTreeStore *)store, &iter, 0, title, 1, page_nr, -1);
- return iter;
-}
-
-/* add a page to the notebook */
-static GtkWidget *
-prefs_nb_page_add(GtkWidget *notebook, const gchar *title _U_, GtkWidget *page, const char *page_key)
-{
- GtkWidget *sw;
- GtkWidget *frame;
-
- sw = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- gtk_widget_show(sw);
-
- frame = gtk_frame_new(NULL);
- gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_NONE);
- gtk_container_set_border_width(GTK_CONTAINER(frame), DLG_OUTER_MARGIN);
-#if ! GTK_CHECK_VERSION(3,8,0)
- gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw), frame);
-#else
- gtk_container_add(GTK_CONTAINER(sw), frame);
-#endif
- gtk_widget_show(frame);
-
- if (page) {
- gtk_container_add(GTK_CONTAINER(frame), page);
- g_object_set_data(G_OBJECT(prefs_w), page_key, page);
- }
-
- gtk_notebook_append_page (GTK_NOTEBOOK(notebook), sw, NULL);
-
- return sw;
-}
-
-#define MAX_TREE_NODE_NAME_LEN 64
-
-/* show prefs page for each registered module (protocol) */
-static guint
-module_prefs_show(module_t *module, gpointer user_data)
-{
- struct ct_struct *cts = (struct ct_struct *)user_data;
- struct ct_struct child_cts;
- GtkWidget *main_vb, *main_grid, *frame, *main_sw;
- gchar label_str[MAX_TREE_NODE_NAME_LEN];
- GtkTreeStore *model;
- GtkTreeIter iter;
-
- if (!module->use_gui) {
- /* This module uses its own GUI interface to modify its
- * preferences, so ignore it
- */
- return 0;
- }
-
- /*
- * Is this module an interior node, with modules underneath it?
- */
- if (!prefs_module_has_submodules(module)) {
- /*
- * No.
- * Does it have any preferences (other than possibly obsolete ones)?
- */
- if (prefs_pref_foreach(module, pref_exists, NULL) == 0) {
- /*
- * No. Don't put the module into the preferences window,
- * as there's nothing to show.
- *
- * XXX - we should do the same for interior ndes; if the module
- * has no non-obsolete preferences *and* nothing under it has
- * non-obsolete preferences, don't put it into the window.
- */
- return 0;
- }
- }
-
- /*
- * Add this module to the tree.
- */
- g_strlcpy(label_str, module->title, MAX_TREE_NODE_NAME_LEN);
- model = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(cts->tree)));
-
- if (module->parent == NULL)
- gtk_tree_store_append(model, &iter, NULL);
- else
- gtk_tree_store_append(model, &iter, &cts->iter);
-
- /*
- * Is this an interior node?
- */
- if (prefs_module_has_submodules(module)) {
- /*
- * Yes.
- */
- gtk_tree_store_set(model, &iter, 0, label_str, 1, -1, -1);
-
- /*
- * Walk the subtree and attach stuff to it.
- */
- child_cts = *cts;
- child_cts.iter = iter;
- prefs_modules_foreach_submodules(module, module_prefs_show, &child_cts);
-
- /* keep the page count right */
- cts->page = child_cts.page;
- }
-
- /*
- * We create pages for interior nodes even if they don't have
- * preferences, so that we at least have something to show
- * if the user clicks on them, even if it's empty.
- */
-
- /* Scrolled window */
- main_sw = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(main_sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
-
- /* Frame */
- frame = gtk_frame_new(NULL);
- gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_NONE);
- gtk_container_set_border_width(GTK_CONTAINER(frame), DLG_OUTER_MARGIN);
-#if ! GTK_CHECK_VERSION(3,8,0)
- gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(main_sw), frame);
-#else
- gtk_container_add(GTK_CONTAINER(main_sw), frame);
-#endif
- g_object_set_data(G_OBJECT(main_sw), E_PAGESW_FRAME_KEY, frame);
-
- /* Main vertical box */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 5, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_container_add(GTK_CONTAINER(frame), main_vb);
-
- /* Main grid */
- main_grid = ws_gtk_grid_new();
- gtk_box_pack_start(GTK_BOX(main_vb), main_grid, FALSE, FALSE, 0);
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_set_vexpand(GTK_WIDGET(main_grid), FALSE); /* Ignore VEXPAND requests from children */
-#endif
- ws_gtk_grid_set_row_spacing(GTK_GRID(main_grid), 10);
- ws_gtk_grid_set_column_spacing(GTK_GRID(main_grid), 15);
-
- /* Add items for each of the preferences */
- g_object_set_data(G_OBJECT(main_grid), E_GRID_MODULE_KEY, module);
- prefs_pref_foreach(module, pref_show, main_grid);
- g_object_set_data(G_OBJECT(main_grid), E_GRID_MODULE_KEY, NULL);
-
- /* Associate this module with the page's frame. */
- g_object_set_data(G_OBJECT(frame), E_PAGE_MODULE_KEY, module);
-
- /* Add the page to the notebook */
- gtk_notebook_append_page(GTK_NOTEBOOK(cts->notebook), main_sw, NULL);
-
- /* Attach the page to the tree item */
- gtk_tree_store_set(model, &iter, 0, label_str, 1, cts->page, -1);
- g_object_set_data(G_OBJECT(frame), E_PAGE_ITER_KEY, gtk_tree_iter_copy(&iter));
-
- cts->page++;
-
- /* Show 'em what we got */
- gtk_widget_show_all(main_sw);
-
- return 0;
-}
-
-
-/* show the dialog */
-void
-prefs_cb(GtkWidget *w, gpointer dummy)
-{
- prefs_page_cb (w, dummy, PREFS_PAGE_USER_INTERFACE);
-}
-
-void
-prefs_page_cb(GtkWidget *w _U_, gpointer dummy _U_, PREFS_PAGE_E prefs_page)
-{
- GtkWidget *top_hb, *bbox, *prefs_nb, *ct_sb,
- *ok_bt, *apply_bt, *save_bt, *cancel_bt, *help_bt;
- gchar label_str[MAX_TREE_NODE_NAME_LEN];
- struct ct_struct cts;
- GtkTreeStore *store;
- GtkTreeSelection *selection;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
- gint col_offset;
- prefs_tree_iter gui_iter, layout_iter, columns_iter, capture_iter;
- gint layout_page, columns_page;
- gint capture_page = 0;
-
-
- if (prefs_w != NULL) {
- /* There's already a "Preferences" dialog box; reactivate it. */
- reactivate_window(prefs_w);
- return;
- }
-
- prefs_w = dlg_conf_window_new("Wireshark: Preferences");
- gtk_window_set_default_size(GTK_WINDOW(prefs_w), 400, 650);
-
- /*
- * Unfortunately, we can't arrange that a GtkGrid widget wrap an event box
- * around a grid row, so the spacing between the preference item's label
- * and its control widgets is inactive and the tooltip doesn't pop up when
- * the mouse is over it.
- */
-
- /* Container for each row of widgets */
- cts.main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 5, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(cts.main_vb), 5);
- gtk_container_add(GTK_CONTAINER(prefs_w), cts.main_vb);
- gtk_widget_show(cts.main_vb);
-
- /* Top row: Preferences tree and notebook */
- top_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10, FALSE);
- gtk_box_pack_start(GTK_BOX(cts.main_vb), top_hb, TRUE, TRUE, 0);
- gtk_widget_show(top_hb);
-
- /* scrolled window on the left for the categories tree */
- ct_sb = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(ct_sb),
- GTK_SHADOW_IN);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ct_sb),
- GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- gtk_box_pack_start(GTK_BOX(top_hb), ct_sb, TRUE, TRUE, 0);
- gtk_widget_show(ct_sb);
- g_object_set_data(G_OBJECT(prefs_w), E_PREFSW_SCROLLW_KEY, ct_sb);
-
- /* categories tree */
- store = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_INT);
- cts.tree = tree_view_new(GTK_TREE_MODEL(store));
- cts.iter.stamp = 0; /* mark this as the toplevel */
- g_object_set_data(G_OBJECT(prefs_w), E_PREFSW_TREE_KEY, cts.tree);
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(cts.tree), FALSE);
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(cts.tree));
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
- renderer = gtk_cell_renderer_text_new();
- col_offset = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(cts.tree),
- -1, "Name", renderer,
- "text", 0, NULL);
- column = gtk_tree_view_get_column(GTK_TREE_VIEW(cts.tree),
- col_offset - 1);
- gtk_tree_view_column_set_sizing(GTK_TREE_VIEW_COLUMN(column),
- GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- g_signal_connect(selection, "changed", G_CALLBACK(prefs_tree_select_cb), NULL);
- gtk_container_add(GTK_CONTAINER(ct_sb), cts.tree);
- gtk_widget_show(cts.tree);
-
- /* A notebook widget without tabs is used to flip between prefs */
- prefs_nb = gtk_notebook_new();
- g_object_set_data(G_OBJECT(prefs_w), E_PREFSW_NOTEBOOK_KEY, prefs_nb);
- gtk_notebook_set_show_tabs(GTK_NOTEBOOK(prefs_nb), FALSE);
- gtk_notebook_set_show_border(GTK_NOTEBOOK(prefs_nb), FALSE);
- gtk_box_pack_start(GTK_BOX(top_hb), prefs_nb, TRUE, TRUE, 0);
- gtk_widget_show(prefs_nb);
-
- cts.page = 0;
-
- /* GUI prefs */
- g_strlcpy(label_str, "User Interface", MAX_TREE_NODE_NAME_LEN);
- prefs_nb_page_add(prefs_nb, label_str, gui_prefs_show(), E_GUI_PAGE_KEY);
- gui_iter = prefs_tree_page_add(label_str, cts.page, store, NULL);
- cts.page++;
-
- /* GUI layout prefs */
- g_strlcpy(label_str, "Layout", MAX_TREE_NODE_NAME_LEN);
- prefs_nb_page_add(prefs_nb, label_str, layout_prefs_show(), E_GUI_LAYOUT_PAGE_KEY);
- layout_iter = prefs_tree_page_add(label_str, cts.page, store, &gui_iter);
- layout_page = cts.page++;
-
- /* GUI Column prefs */
- g_strlcpy(label_str, "Columns", MAX_TREE_NODE_NAME_LEN);
- prefs_nb_page_add(prefs_nb, label_str, column_prefs_show(prefs_w), E_GUI_COLUMN_PAGE_KEY);
- columns_iter = prefs_tree_page_add(label_str, cts.page, store, &gui_iter);
- columns_page = cts.page++;
-
- /* GUI Colors prefs */
- g_strlcpy(label_str, "Font and Colors", MAX_TREE_NODE_NAME_LEN);
- prefs_nb_page_add(prefs_nb, label_str, font_color_prefs_show(), E_GUI_FONT_COLORS_PAGE_KEY);
- prefs_tree_page_add(label_str, cts.page, store, &gui_iter);
- cts.page++;
-
- /* select the main GUI page as the default page and expand its children */
- gtk_tree_selection_select_iter(selection, &gui_iter);
- /* (expand will only take effect, when at least one child exists) */
- gtk_tree_view_expand_all(GTK_TREE_VIEW(cts.tree));
-
-#ifdef HAVE_LIBPCAP
-#ifdef _WIN32
- /* Is WPcap loaded? */
- if (has_wpcap) {
-#endif /* _WIN32 */
- /* capture prefs */
- g_strlcpy(label_str, "Capture", MAX_TREE_NODE_NAME_LEN);
- prefs_nb_page_add(prefs_nb, label_str, capture_prefs_show(), E_CAPTURE_PAGE_KEY);
- capture_iter = prefs_tree_page_add(label_str, cts.page, store, NULL);
- capture_page = cts.page++;
-#ifdef _WIN32
- }
-#endif /* _WIN32 */
-#endif /* HAVE_LIBPCAP */
-
- /* Saved filter prefs */
- g_strlcpy(label_str, "Filter Expressions", MAX_TREE_NODE_NAME_LEN);
- prefs_nb_page_add(prefs_nb, label_str, filter_expressions_prefs_show(),
- E_FILTER_EXPRESSIONS_PAGE_KEY);
- prefs_tree_page_add(label_str, cts.page, store, NULL);
- cts.page++;
-
- /* Registered prefs */
- cts.notebook = prefs_nb;
- cts.store = store;
- prefs_modules_foreach_submodules(NULL, module_prefs_show, &cts);
-
- /* Button row: OK and alike buttons */
- bbox = dlg_button_row_new(GTK_STOCK_HELP, GTK_STOCK_OK, GTK_STOCK_APPLY, GTK_STOCK_SAVE, GTK_STOCK_CANCEL, NULL);
- gtk_box_pack_start(GTK_BOX(cts.main_vb), bbox, FALSE, FALSE, 0);
- gtk_widget_show(bbox);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(prefs_main_ok_cb), prefs_w);
-
- apply_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_APPLY);
- g_signal_connect(apply_bt, "clicked", G_CALLBACK(prefs_main_apply_cb), prefs_w);
-
- save_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_SAVE);
- g_signal_connect(save_bt, "clicked", G_CALLBACK(prefs_main_save_cb), prefs_w);
- g_object_set_data(G_OBJECT(prefs_w), E_PREFSW_SAVE_BT_KEY, save_bt);
-
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- g_signal_connect(cancel_bt, "clicked", G_CALLBACK(prefs_main_cancel_cb), prefs_w);
- window_set_cancel_button(prefs_w, cancel_bt, NULL);
-
- gtk_widget_grab_default(ok_bt);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_PREFERENCES_DIALOG);
-
- g_signal_connect(prefs_w, "delete_event", G_CALLBACK(prefs_main_delete_event_cb), NULL);
- g_signal_connect(prefs_w, "destroy", G_CALLBACK(prefs_main_destroy_cb), prefs_w);
-
- gtk_widget_show(prefs_w);
-
- /* hide the Save button if the user uses implicit save */
- if (!prefs.gui_use_pref_save) {
- gtk_widget_hide(save_bt);
- }
-
- window_present(prefs_w);
-
- switch (prefs_page) {
- case PREFS_PAGE_LAYOUT:
- gtk_tree_selection_select_iter(selection, &layout_iter);
- gtk_notebook_set_current_page((GtkNotebook *)g_object_get_data(G_OBJECT(prefs_w), E_PREFSW_NOTEBOOK_KEY), layout_page);
- break;
- case PREFS_PAGE_COLUMNS:
- gtk_tree_selection_select_iter(selection, &columns_iter);
- gtk_notebook_set_current_page((GtkNotebook *)g_object_get_data(G_OBJECT(prefs_w), E_PREFSW_NOTEBOOK_KEY), columns_page);
- break;
- case PREFS_PAGE_CAPTURE:
- if (capture_page) {
- gtk_tree_selection_select_iter(selection, &capture_iter);
- gtk_notebook_set_current_page((GtkNotebook *)g_object_get_data(G_OBJECT(prefs_w), E_PREFSW_NOTEBOOK_KEY), capture_page);
- }
- break;
- default:
- /* Not implemented yet */
- break;
- }
-
- g_object_unref(G_OBJECT(store));
-}
-
-static void
-set_option_label(GtkWidget *main_grid, int grid_position,
- const gchar *label_text, const gchar *tooltip_text)
-{
- GtkWidget *label;
- GtkWidget *event_box;
-
- label = gtk_label_new(label_text);
- gtk_misc_set_alignment(GTK_MISC(label), 1.0f, 0.5f);
- gtk_widget_show(label);
-
- event_box = gtk_event_box_new();
- gtk_event_box_set_visible_window (GTK_EVENT_BOX(event_box), FALSE);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), event_box, 0, grid_position, 1, 1);
- if (tooltip_text != NULL)
- gtk_widget_set_tooltip_text(event_box, tooltip_text);
- gtk_container_add(GTK_CONTAINER(event_box), label);
- gtk_widget_show(event_box);
-}
-
-GtkWidget *
-create_preference_check_button(GtkWidget *main_grid, int grid_position,
- const gchar *label_text, const gchar *tooltip_text, gboolean active)
-{
- GtkWidget *check_box;
-
- set_option_label(main_grid, grid_position, label_text, tooltip_text);
-
- check_box = gtk_check_button_new();
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_box), active);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), check_box, 1, grid_position, 1, 1);
- if (tooltip_text != NULL)
- gtk_widget_set_tooltip_text(check_box, tooltip_text);
-
- return check_box;
-}
-
-GtkWidget *
-create_preference_radio_buttons(GtkWidget *main_grid, int grid_position,
- const gchar *label_text, const gchar *tooltip_text,
- const enum_val_t *enumvals, gint current_val)
-{
- GtkWidget *radio_button_hbox, *button = NULL;
- GSList *rb_group;
- int idx;
- const enum_val_t *enum_valp;
- GtkWidget *event_box;
-
- set_option_label(main_grid, grid_position, label_text, tooltip_text);
-
- radio_button_hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- rb_group = NULL;
- for (enum_valp = enumvals, idx = 0; enum_valp->name != NULL;
- enum_valp++, idx++) {
- button = gtk_radio_button_new_with_label(rb_group,
- enum_valp->description);
- gtk_widget_show(button);
- rb_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
- gtk_box_pack_start(GTK_BOX(radio_button_hbox), button, FALSE,
- FALSE, 10);
- if (enum_valp->value == current_val) {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),
- TRUE);
- }
- }
- gtk_widget_show(radio_button_hbox);
-
- event_box = gtk_event_box_new();
- gtk_event_box_set_visible_window (GTK_EVENT_BOX(event_box), FALSE);
- gtk_container_add(GTK_CONTAINER(event_box), radio_button_hbox);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), event_box, 1, grid_position, 1, 1);
- if (tooltip_text != NULL)
- gtk_widget_set_tooltip_text(event_box, tooltip_text);
- gtk_widget_show(event_box);
-
- /*
- * It doesn't matter which of the buttons we return - we fetch
- * the value by looking at the entire radio button group to
- * which it belongs, and we can get that from any button.
- */
- return button;
-}
-
-static gint
-label_to_enum_val(GtkWidget *label, const enum_val_t *enumvals)
-{
- const gchar *label_string;
- int i;
-
- /* Get the label's text, and translate it to a value.
- We match only the descriptions, as those are what appear in
- the option menu items or as labels for radio buttons.
- We fail if we don't find a match, as that "can't happen". */
- label_string = gtk_label_get_text(GTK_LABEL(label));
-
- for (i = 0; enumvals[i].name != NULL; i++) {
- if (g_ascii_strcasecmp(label_string, enumvals[i].description) == 0) {
- return enumvals[i].value;
- }
- }
- g_assert_not_reached();
- return -1;
-}
-
-gint
-fetch_preference_radio_buttons_val(GtkWidget *button,
- const enum_val_t *enumvals)
-{
- GSList *rb_group;
- GSList *rb_entry;
-
- /*
- * Go through the list of of radio buttons in the button's group,
- * and find the first one that's active.
- */
- rb_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
- button = NULL;
- for (rb_entry = rb_group; rb_entry != NULL;
- rb_entry = g_slist_next(rb_entry)) {
- button = (GtkWidget *)rb_entry->data;
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)))
- break;
- }
-
- /* OK, now return the value corresponding to that button's label. */
- return label_to_enum_val(gtk_bin_get_child(GTK_BIN(button)), enumvals);
-}
-
-GtkWidget *
-create_preference_option_menu(GtkWidget *main_grid, int grid_position,
- const gchar *label_text, const gchar *tooltip_text,
- const enum_val_t *enumvals, gint current_val)
-{
- GtkWidget *menu_box, *combo_box;
- int menu_idx, idx;
- const enum_val_t *enum_valp;
- GtkWidget *event_box;
-
- set_option_label(main_grid, grid_position, label_text, tooltip_text);
-
- /* Create a menu from the enumvals */
- combo_box = gtk_combo_box_text_new();
- if (tooltip_text != NULL)
- gtk_widget_set_tooltip_text(combo_box, tooltip_text);
- menu_idx = 0;
- for (enum_valp = enumvals, idx = 0; enum_valp->name != NULL;
- enum_valp++, idx++) {
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), enum_valp->description);
- if (enum_valp->value == current_val)
- menu_idx = idx;
- }
- /* Set the current value active */
- gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), menu_idx);
-
- /*
- * Put the combo box in an hbox, so that it's only as wide
- * as the widest entry, rather than being as wide as the grid
- * space.
- */
- menu_box = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(menu_box), combo_box, FALSE, FALSE, 0);
-
- event_box = gtk_event_box_new();
- gtk_event_box_set_visible_window (GTK_EVENT_BOX(event_box), FALSE);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), event_box, 1, grid_position, 1, 1);
- if (tooltip_text != NULL)
- gtk_widget_set_tooltip_text(event_box, tooltip_text);
- gtk_container_add(GTK_CONTAINER(event_box), menu_box);
-
- return combo_box;
-}
-
-gint
-fetch_preference_option_menu_val(GtkWidget *combo_box, const enum_val_t *enumvals)
-{
- /*
- * OK, now return the value corresponding to the label for the
- * currently active entry in the combo box.
- */
- int i;
-
- i = gtk_combo_box_get_active (GTK_COMBO_BOX(combo_box));
-
- return enumvals[i].value;
-}
-
-GtkWidget *
-create_preference_entry(GtkWidget *main_grid, int grid_position,
- const gchar *label_text, const gchar *tooltip_text, char *value)
-{
- GtkWidget *entry;
-
- set_option_label(main_grid, grid_position, label_text, tooltip_text);
-
- entry = gtk_entry_new();
- if (value != NULL)
- gtk_entry_set_text(GTK_ENTRY(entry), value);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), entry, 1, grid_position, 1, 1);
- if (tooltip_text != NULL)
- gtk_widget_set_tooltip_text(entry, tooltip_text);
- gtk_widget_show(entry);
-
- return entry;
-}
-
-static void
-preference_filename_entry_cb(GtkWidget *button, GtkWidget *filename_te)
-{
- /* XXX - use a better browser dialog title */
- file_selection_browse(button, filename_te, "Wireshark: File preference",
- FILE_SELECTION_READ_BROWSE);
-}
-
-static void
-preference_dirname_entry_cb(GtkWidget *button, GtkWidget *filename_te)
-{
- /* XXX - use a better browser dialog title */
- file_selection_browse(button, filename_te, "Wireshark: Directory preference",
- FILE_SELECTION_CREATE_FOLDER);
-}
-
-static GtkWidget *
-create_preference_path_entry(GtkWidget *main_grid, int grid_position,
- const gchar *label_text, const gchar *tooltip_text, char *value, gboolean dir_only)
-{
- GtkWidget *entry;
- GtkWidget *button, *file_bt_hb;
-
- set_option_label(main_grid, grid_position, label_text, tooltip_text);
- file_bt_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), file_bt_hb, 1, grid_position, 1, 1);
- gtk_widget_show(file_bt_hb);
-
- button = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_BROWSE);
- gtk_box_pack_end(GTK_BOX(file_bt_hb), button, FALSE, FALSE, 0);
- gtk_widget_show(button);
-
- entry = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(file_bt_hb), entry, TRUE, TRUE, 0);
- if (value != NULL)
- gtk_entry_set_text(GTK_ENTRY(entry), value);
- if (tooltip_text != NULL)
- gtk_widget_set_tooltip_text(entry, tooltip_text);
- gtk_widget_show(entry);
-
- if (dir_only) {
- g_signal_connect(button, "clicked", G_CALLBACK(preference_dirname_entry_cb), entry);
- } else {
- g_signal_connect(button, "clicked", G_CALLBACK(preference_filename_entry_cb), entry);
- }
-
- return entry;
-}
-
-GtkWidget *
-create_preference_static_text(GtkWidget *main_grid, int grid_position,
- const gchar *label_text, const gchar *tooltip_text)
-{
- GtkWidget *label;
-
- if (label_text != NULL) {
- label = gtk_label_new(label_text);
- gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
- gtk_label_set_width_chars (GTK_LABEL (label), 80);
- } else {
- label = gtk_label_new("");
- }
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), label, 0, grid_position, 2, 1);
- if (tooltip_text != NULL)
- gtk_widget_set_tooltip_text(label, tooltip_text);
- gtk_widget_show(label);
-
- return label;
-}
-
-GtkWidget *
-create_preference_uat(GtkWidget *main_grid, int grid_position,
- const gchar *label_text, const gchar *tooltip_text, void* uat)
-{
- GtkWidget *button;
-
- set_option_label(main_grid, grid_position, label_text, tooltip_text);
-
- button = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_EDIT);
-
- g_signal_connect(button, "clicked", G_CALLBACK(uat_window_cb), uat);
-
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), button, 1, grid_position, 1, 1);
- if (tooltip_text != NULL)
- gtk_widget_set_tooltip_text(button, tooltip_text);
- gtk_widget_show(button);
-
- return button;
-}
-
-
-static guint
-pref_check(pref_t *pref, gpointer user_data)
-{
- const char *str_val;
- char *p;
- pref_t **badpref = (pref_t **)user_data;
-
- /* Fetch the value of the preference, and check whether it's valid. */
- switch (prefs_get_type(pref)) {
-
- case PREF_UINT:
- case PREF_DECODE_AS_UINT:
- str_val = gtk_entry_get_text(GTK_ENTRY(prefs_get_control(pref)));
- errno = 0;
-
- /* XXX: The following ugly hack prevents a gcc warning
- "ignoring return value of 'strtoul', declared with attribute warn_unused_result"
- which can occur when using certain gcc configurations (see -D_FORTIFY_SOURCE).
- A dummy variable is not used because when using gcc 4.6 with -Wextra a
- "set but not used [-Wunused-but-set-variable]" warning will occur.
- (Coverity & CLang apparently do not object to this hack).
-
- [Guy Harris comment:
- "... perhaps either using spin buttons for numeric preferences, or otherwise making
- it impossible to type something that's not a number into the GUI for those preferences,
- and thus avoiding the need to check whether it's a valid number, would also be a good idea."
- ]
- */
- if (strtoul(str_val, &p, prefs_get_uint_base(pref))){}
- if (p == str_val || *p != '\0' || errno != 0) {
- *badpref = pref;
- return PREFS_SET_SYNTAX_ERR; /* number was bad */
- }
- break;
-
- case PREF_BOOL:
- /* Value can't be bad. */
- break;
-
- case PREF_ENUM:
- /* Value can't be bad. */
- break;
-
- case PREF_STRING:
- case PREF_SAVE_FILENAME:
- case PREF_OPEN_FILENAME:
- case PREF_DIRNAME:
- /* Value can't be bad. */
- break;
-
- case PREF_RANGE:
- case PREF_DECODE_AS_RANGE:
- str_val = gtk_entry_get_text(GTK_ENTRY(prefs_get_control(pref)));
-
- if (strlen(str_val) != 0) {
- range_t *newrange;
-
- if (range_convert_str(NULL, &newrange, str_val, prefs_get_max_value(pref)) != CVT_NO_ERROR) {
- *badpref = pref;
- wmem_free(NULL, newrange);
- return PREFS_SET_SYNTAX_ERR; /* range was bad */
- }
- wmem_free(NULL, newrange);
- }
- break;
-
- case PREF_STATIC_TEXT:
- case PREF_UAT:
- /* Value can't be bad. */
- break;
-
- case PREF_COLOR:
- case PREF_CUSTOM:
- /* currently not supported */
-
- case PREF_OBSOLETE:
- g_assert_not_reached();
- break;
- }
- return 0;
-}
-
-static guint
-module_prefs_check(module_t *module, gpointer user_data)
-{
- /* Ignore any preferences with their own interface */
- if (!module->use_gui) {
- return 0;
- }
-
- /* For all preferences in this module, fetch its value from this
- module's notebook page and check whether it's valid. */
- return prefs_pref_foreach(module, pref_check, user_data);
-}
-
-static guint
-pref_fetch(pref_t *pref, gpointer user_data)
-{
- const char *str_val;
- char *p;
- guint uval, uval_stashed;
- gboolean bval;
- gint enumval;
- module_t *module = (module_t *)user_data;
- pref_unstash_data_t unstash_data;
-
- /* Fetch the value of the preference, and set the appropriate variable
- to it. */
- switch (prefs_get_type(pref)) {
-
- case PREF_DECODE_AS_UINT:
- str_val = gtk_entry_get_text(GTK_ENTRY(prefs_get_control(pref)));
- uval = (guint)strtoul(str_val, &p, prefs_get_uint_base(pref));
-#if 0
- if (p == value || *p != '\0')
- return PREFS_SET_SYNTAX_ERR; /* number was bad */
-#endif
- /* Save stashed value to use pref_unstash and restore it later */
- uval_stashed = prefs_get_uint_value_real(pref, pref_stashed);
- prefs_set_uint_value(pref, uval, pref_stashed);
-
- unstash_data.module = module;
- unstash_data.handle_decode_as = TRUE;
- pref_unstash(pref, (gpointer)&unstash_data);
-
- /* Restore stashed value */
- prefs_set_uint_value(pref, uval_stashed, pref_stashed);
- break;
-
- case PREF_UINT:
- str_val = gtk_entry_get_text(GTK_ENTRY(prefs_get_control(pref)));
- uval = (guint)strtoul(str_val, &p, prefs_get_uint_base(pref));
-#if 0
- if (p == value || *p != '\0')
- return PREFS_SET_SYNTAX_ERR; /* number was bad */
-#endif
- module->prefs_changed_flags |= prefs_set_uint_value(pref, uval, pref_current);
- break;
-
- case PREF_BOOL:
- bval = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prefs_get_control(pref)));
- module->prefs_changed_flags |= prefs_set_bool_value(pref, bval, pref_current);
- break;
-
- case PREF_ENUM:
- if (prefs_get_enum_radiobuttons(pref)) {
- enumval = fetch_preference_radio_buttons_val((GtkWidget *)prefs_get_control(pref),
- prefs_get_enumvals(pref));
- } else {
- enumval = fetch_preference_option_menu_val((GtkWidget *)prefs_get_control(pref),
- prefs_get_enumvals(pref));
- }
-
- module->prefs_changed_flags |= prefs_set_enum_value(pref, enumval, pref_current);
- break;
-
- case PREF_STRING:
- case PREF_SAVE_FILENAME:
- case PREF_OPEN_FILENAME:
- case PREF_DIRNAME:
- str_val = gtk_entry_get_text(GTK_ENTRY(prefs_get_control(pref)));
- module->prefs_changed_flags |= prefs_set_string_value(pref, str_val, pref_current);
- break;
-
- case PREF_DECODE_AS_RANGE:
- {
- str_val = gtk_entry_get_text(GTK_ENTRY(prefs_get_control(pref)));
-
- module->prefs_changed_flags |= prefs_set_stashed_range_value(pref, str_val);
-
- unstash_data.module = module;
- unstash_data.handle_decode_as = TRUE;
- pref_unstash(pref, (gpointer)&unstash_data);
- break;
- }
- case PREF_RANGE:
- str_val = gtk_entry_get_text(GTK_ENTRY(prefs_get_control(pref)));
- if (!prefs_set_range_value_work(pref, str_val, TRUE, &module->prefs_changed_flags))
-#if 0
- return PREFS_SET_SYNTAX_ERR; /* range was bad */
-#else
- return 0; /* XXX - should fail */
-#endif
-
- break;
-
- case PREF_STATIC_TEXT:
- case PREF_UAT:
- break;
-
- case PREF_COLOR:
- case PREF_CUSTOM:
- /* currently not supported */
-
- case PREF_OBSOLETE:
- g_assert_not_reached();
- break;
- }
- return 0;
-}
-
-static guint
-module_prefs_fetch(module_t *module, gpointer user_data)
-{
- unsigned int *must_redissect_p = (unsigned int*)user_data;
-
- /* Ignore any preferences with their own interface */
- if (!module->use_gui) {
- return 0;
- }
-
- /* For all preferences in this module, fetch its value from this
- module's notebook page. Find out whether any of them changed. */
- module->prefs_changed_flags = 0; /* assume none of them changed */
- prefs_pref_foreach(module, pref_fetch, module);
-
- /* If any of them changed, indicate that we must redissect and refilter
- the current capture (if we have one), as the preference change
- could cause packets to be dissected differently. */
- *must_redissect_p |= module->prefs_changed_flags;
-
- return 0; /* keep fetching module preferences */
-}
-
-#ifdef HAVE_AIRPCAP
-/*
- * This function is used to apply changes and update the Wireless Toolbar
- * whenever we apply some changes to the WEP preferences
- */
-static void
-prefs_airpcap_update(void)
-{
- GtkWidget *decryption_cm;
- gint cur_active;
- gboolean wireshark_decryption_was_enabled = FALSE;
- gboolean airpcap_decryption_was_enabled = FALSE;
- gboolean wireshark_decryption_is_now_enabled = FALSE;
-
- decryption_cm = GTK_WIDGET(g_object_get_data(G_OBJECT(wireless_tb),AIRPCAP_TOOLBAR_DECRYPTION_KEY));
-
- if (decryption_cm == NULL) {
- return;
- }
-
- cur_active = gtk_combo_box_get_active(GTK_COMBO_BOX(decryption_cm));
-
- if (cur_active < 0) {
- return;
- }
-
- switch(cur_active) {
- /* XXX - Don't use magic numbers here. cf airpcap_dlg.c:on_decryption_mode_cb_changed() */
- case 1: /* Wireshark */
- wireshark_decryption_was_enabled = TRUE;
- airpcap_decryption_was_enabled = FALSE;
- break;
- case 2: /* Driver */
- wireshark_decryption_was_enabled = FALSE;
- airpcap_decryption_was_enabled = TRUE;
- break;
- default:
- wireshark_decryption_was_enabled = FALSE;
- airpcap_decryption_was_enabled = FALSE;
- break;
- }
-
- wireshark_decryption_is_now_enabled = wireshark_decryption_on();
-
- if (wireshark_decryption_is_now_enabled && airpcap_decryption_was_enabled)
- {
- set_airpcap_decryption(FALSE);
- gtk_combo_box_set_active(GTK_COMBO_BOX(decryption_cm), 1);
- }
- if (wireshark_decryption_is_now_enabled && !airpcap_decryption_was_enabled)
- {
- set_airpcap_decryption(FALSE);
- gtk_combo_box_set_active(GTK_COMBO_BOX(decryption_cm), 1);
- }
- else if (!wireshark_decryption_is_now_enabled && wireshark_decryption_was_enabled)
- {
- if (airpcap_decryption_was_enabled)
- {
- set_airpcap_decryption(TRUE);
- gtk_combo_box_set_active(GTK_COMBO_BOX(decryption_cm), 2);
- }
- else
- {
- set_airpcap_decryption(FALSE);
- gtk_combo_box_set_active(GTK_COMBO_BOX(decryption_cm), 0);
- }
- }
-}
-#endif
-
-static guint
-module_prefs_clean_stash(module_t *module, gpointer user_data _U_)
-{
- /* Ignore any preferences with their own interface */
- if (!module->use_gui) {
- return 0;
- }
-
- /* For all preferences in this module, clean up any cruft allocated for
- use by the GUI code. */
- prefs_pref_foreach(module, pref_clean_stash, NULL);
- return 0; /* keep cleaning modules */
-}
-
-/* fetch all pref values from all pages */
-static gboolean
-prefs_main_fetch_all(GtkWidget *dlg, unsigned int *must_redissect)
-{
- pref_t *badpref;
-
- /* First, check that the values are all valid. */
- /* XXX - check the non-registered preferences too */
- switch (prefs_modules_foreach(module_prefs_check, (gpointer)&badpref)) {
-
- case PREFS_SET_SYNTAX_ERR:
- switch (prefs_get_type(badpref)) {
-
- case PREF_UINT:
- case PREF_DECODE_AS_UINT:
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "The value for \"%s\" isn't a valid number.",
- prefs_get_title(badpref));
- return FALSE;
-
- case PREF_RANGE:
- case PREF_DECODE_AS_RANGE:
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "The value for \"%s\" isn't a valid range.",
- prefs_get_title(badpref));
- return FALSE;
-
- default:
- g_assert_not_reached();
- break;
- }
- }
-
- /* Fetch the preferences (i.e., make sure all the values set in all of
- the preferences panes have been copied to "prefs" and the registered
- preferences). */
- gui_prefs_fetch((GtkWidget *)g_object_get_data(G_OBJECT(dlg), E_GUI_PAGE_KEY));
- layout_prefs_fetch((GtkWidget *)g_object_get_data(G_OBJECT(dlg), E_GUI_LAYOUT_PAGE_KEY));
- column_prefs_fetch((GtkWidget *)g_object_get_data(G_OBJECT(dlg), E_GUI_COLUMN_PAGE_KEY));
- font_color_prefs_fetch((GtkWidget *)g_object_get_data(G_OBJECT(dlg), E_GUI_FONT_COLORS_PAGE_KEY));
-
-#ifdef HAVE_LIBPCAP
-#ifdef _WIN32
- /* Is WPcap loaded? */
- if (has_wpcap) {
-#endif /* _WIN32 */
- capture_prefs_fetch((GtkWidget *)g_object_get_data(G_OBJECT(dlg), E_CAPTURE_PAGE_KEY));
-#ifdef _WIN32
- }
-#endif /* _WIN32 */
-#endif /* HAVE_LIBPCAP */
-
- /* Handle (re)creation of filter buttons */
- filter_expression_reinit(FILTER_EXPRESSION_REINIT_DESTROY | FILTER_EXPRESSION_REINIT_CREATE);
- prefs_modules_foreach(module_prefs_fetch, must_redissect);
-
- return TRUE;
-}
-
-/* apply all pref values to the real world */
-static void
-prefs_main_apply_all(GtkWidget *dlg, unsigned int redissect)
-{
- GtkWidget *save_bt;
-
- /*
- * Apply the protocol preferences first - "gui_prefs_apply()" could
- * cause redissection, and we have to make sure the protocol
- * preference changes have been fully applied.
- */
- prefs_apply_all();
-
- gui_prefs_apply((GtkWidget *)g_object_get_data(G_OBJECT(dlg), E_GUI_PAGE_KEY));
- layout_prefs_apply((GtkWidget *)g_object_get_data(G_OBJECT(dlg), E_GUI_LAYOUT_PAGE_KEY));
- column_prefs_apply((GtkWidget *)g_object_get_data(G_OBJECT(dlg), E_GUI_COLUMN_PAGE_KEY));
- font_color_prefs_apply((GtkWidget *)g_object_get_data(G_OBJECT(dlg), E_GUI_FONT_COLORS_PAGE_KEY), redissect);
-
-#ifdef HAVE_LIBPCAP
-#ifdef _WIN32
- /* Is WPcap loaded? */
- if (has_wpcap) {
-#endif /* _WIN32 */
- capture_prefs_apply((GtkWidget *)g_object_get_data(G_OBJECT(dlg), E_CAPTURE_PAGE_KEY));
-#ifdef _WIN32
- }
-#endif /* _WIN32 */
-#endif /* HAVE_LIBPCAP */
-
- /* show/hide the Save button - depending on setting */
- save_bt = (GtkWidget *)g_object_get_data(G_OBJECT(prefs_w), E_PREFSW_SAVE_BT_KEY);
- if (prefs.gui_use_pref_save) {
- gtk_widget_show(save_bt);
- } else {
- gtk_widget_hide(save_bt);
- }
-}
-
-
-/* destroy all preferences ressources from all pages */
-static void
-prefs_main_destroy_all(GtkWidget *dlg)
-{
- int page_num;
- GtkWidget *frame;
-
- for (page_num = 0;
- (frame = gtk_notebook_get_nth_page((GtkNotebook *)g_object_get_data(G_OBJECT(prefs_w), E_PREFSW_NOTEBOOK_KEY), page_num)) != NULL;
- page_num++) {
- if (g_object_get_data(G_OBJECT(frame), E_PAGE_ITER_KEY))
- gtk_tree_iter_free((GtkTreeIter *)g_object_get_data(G_OBJECT(frame), E_PAGE_ITER_KEY));
- }
-
- gui_prefs_destroy((GtkWidget *)g_object_get_data(G_OBJECT(dlg), E_GUI_PAGE_KEY));
- layout_prefs_destroy((GtkWidget *)g_object_get_data(G_OBJECT(dlg), E_GUI_LAYOUT_PAGE_KEY));
- column_prefs_destroy((GtkWidget *)g_object_get_data(G_OBJECT(dlg), E_GUI_COLUMN_PAGE_KEY));
- font_color_prefs_destroy((GtkWidget *)g_object_get_data(G_OBJECT(dlg), E_GUI_FONT_COLORS_PAGE_KEY));
-
-#ifdef HAVE_LIBPCAP
-#ifdef _WIN32
- /* Is WPcap loaded? */
- if (has_wpcap) {
-#endif /* _WIN32 */
- capture_prefs_destroy((GtkWidget *)g_object_get_data(G_OBJECT(dlg), E_CAPTURE_PAGE_KEY));
-#ifdef _WIN32
- }
-#endif /* _WIN32 */
-#endif /* HAVE_LIBPCAP */
-
- /* Free up the saved preferences (both for "prefs" and for registered
- preferences). */
- prefs_modules_foreach(module_prefs_clean_stash, NULL);
-}
-
-static guint
-module_prefs_copy(module_t *module, gpointer user_data _U_)
-{
- /* Ignore any preferences with their own interface */
- if (!module->use_gui) {
- return 0;
- }
-
- /* For all preferences in this module, (re)save current value */
- prefs_pref_foreach(module, pref_stash, NULL);
- return 0; /* continue making copies */
-}
-
-/* Copy prefs to saved values so we can revert to these values */
-/* if the user selects Cancel. */
-static void prefs_copy(void) {
- prefs_modules_foreach(module_prefs_copy, NULL);
-}
-
-static void
-overwrite_existing_prefs_cb(gpointer dialog _U_, gint btn, gpointer parent_w _U_)
-{
- gchar* err = NULL;
-
- switch (btn) {
- case(ESD_BTN_SAVE):
- prefs_main_write();
- prefs.unknown_prefs = FALSE;
-
- if (save_decode_as_entries(&err) < 0)
- {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err);
- g_free(err);
- }
- break;
- case(ESD_BTN_DONT_SAVE):
- break;
- default:
- g_assert_not_reached();
- }
-}
-static void
-prefs_main_save(gpointer parent_w)
-{
- gchar* err = NULL;
-
- if (prefs.unknown_prefs) {
- gpointer dialog;
- const gchar *msg =
- "Obsolete or unrecognized preferences have been detected and will be "
- "discarded when saving this profile. If you would like to preserve "
- "these preferences for a different Wireshark version, click "
- "'Continue without Saving' and save this profile under a different name.";
-
- if (prefs.saved_at_version) {
- dialog = simple_dialog(ESD_TYPE_CONFIRMATION, ESD_BTNS_SAVE_DONTSAVE,
- "These preferences were last saved at version \"%s\".\n%s",
- prefs.saved_at_version, msg);
- } else {
- dialog = simple_dialog(ESD_TYPE_CONFIRMATION, ESD_BTNS_SAVE_DONTSAVE,
- "%s", msg);
- }
-
- simple_dialog_set_cb(dialog, overwrite_existing_prefs_cb, parent_w);
- } else {
- prefs_main_write();
-
- if (save_decode_as_entries(&err) < 0)
- {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err);
- g_free(err);
- }
- }
-}
-
-static void
-prefs_main_ok_cb(GtkWidget *ok_bt _U_, gpointer parent_w)
-{
- unsigned int must_redissect = 0;
-
- if (!prefs_main_fetch_all((GtkWidget *)parent_w, &must_redissect))
- return; /* Errors in some preference setting - already reported */
-
- /* if we don't have a Save button, just save the settings now */
- if (!prefs.gui_use_pref_save) {
- prefs_main_save(parent_w);
- }
-
-#ifdef HAVE_AIRPCAP
- /*
- * Load the Wireshark decryption keys (just set) and save
- * the changes to the adapters' registry
- */
- airpcap_load_decryption_keys(g_airpcap_if_list);
-#endif
-
- prefs_main_apply_all((GtkWidget *)parent_w, must_redissect);
-
- /* Fill in capture options with values from the preferences */
- prefs_to_capture_opts();
-
-#ifdef HAVE_AIRPCAP
- prefs_airpcap_update();
-#endif
-
- /* Now destroy the "Preferences" dialog. */
- window_destroy(GTK_WIDGET(parent_w));
-
- if (must_redissect) {
- /* Redissect all the packets, and re-evaluate the display filter. */
- redissect_packets();
- redissect_all_packet_windows();
- }
-
-}
-
-static void
-prefs_main_apply_cb(GtkWidget *apply_bt _U_, gpointer parent_w)
-{
- unsigned int must_redissect = 0;
-
- if (!prefs_main_fetch_all((GtkWidget *)parent_w, &must_redissect))
- return; /* Errors in some preference setting - already reported */
-
- /* if we don't have a Save button, just save the settings now */
- if (!prefs.gui_use_pref_save) {
- prefs_main_save(parent_w);
- prefs_copy(); /* save prefs for reverting if Cancel */
- }
-
- prefs_main_apply_all((GtkWidget *)parent_w, must_redissect);
-
- /* Fill in capture options with values from the preferences */
- prefs_to_capture_opts();
-
-#ifdef HAVE_AIRPCAP
- prefs_airpcap_update();
-#endif
-
- if (must_redissect) {
- /* Redissect all the packets, and re-evaluate the display filter. */
- redissect_packets();
- redissect_all_packet_windows();
- }
-}
-
-static void
-prefs_main_save_cb(GtkWidget *save_bt _U_, gpointer parent_w)
-{
- unsigned int must_redissect = 0;
-
- if (!prefs_main_fetch_all((GtkWidget *)parent_w, &must_redissect))
- return; /* Errors in some preference setting - already reported */
-
- prefs_main_save(parent_w);
- prefs_copy(); /* save prefs for reverting if Cancel */
-
- /* Now apply those preferences.
- XXX - should we do this? The user didn't click "OK" or "Apply".
- However:
-
- 1) by saving the preferences they presumably indicate that they
- like them;
-
- 2) the next time they fire Wireshark up, those preferences will
- apply;
-
- 3) we'd have to buffer "must_redissect" so that if they do
- "Apply" after this, we know we have to redissect;
-
- 4) we did apply the protocol preferences, at least, in the past. */
- prefs_main_apply_all((GtkWidget *)parent_w, must_redissect);
-
- /* Fill in capture options with values from the preferences */
- prefs_to_capture_opts();
-
- if (must_redissect) {
- /* Redissect all the packets, and re-evaluate the display filter. */
- redissect_packets();
- redissect_all_packet_windows();
- }
-}
-
-static guint
-module_prefs_revert(module_t *module, gpointer user_data)
-{
- unsigned int *must_redissect_p = (unsigned int*)user_data;
- pref_unstash_data_t unstashed_data;
-
- /* Ignore any preferences with their own interface */
- if (!module->use_gui) {
- return 0;
- }
-
- /* For all preferences in this module, revert its value to the value
- it had when we popped up the Preferences dialog. Find out whether
- this changes any of them. */
- module->prefs_changed_flags = 0; /* assume none of them changed */
- unstashed_data.module = module;
- unstashed_data.handle_decode_as = FALSE;
- prefs_pref_foreach(module, pref_unstash, &unstashed_data);
-
- /* If any of them changed, indicate that we must redissect and refilter
- the current capture (if we have one), as the preference change
- could cause packets to be dissected differently. */
- *must_redissect_p |= module->prefs_changed_flags;
-
- return 0; /* keep processing modules */
-}
-
-/* cancel button pressed, revert prefs to saved and exit dialog */
-static void
-prefs_main_cancel_cb(GtkWidget *cancel_bt _U_, gpointer parent_w)
-{
- unsigned int must_redissect = 0;
-
- /* Free up the current preferences and copy the saved preferences to the
- current preferences. */
- cfile.columns_changed = FALSE; /* [XXX: "columns_changed" should treally be stored in prefs struct ??] */
-
- /* Now revert the registered preferences. */
- prefs_modules_foreach(module_prefs_revert, &must_redissect);
-
- /* Now apply the reverted-to preferences. */
- prefs_main_apply_all((GtkWidget *)parent_w, must_redissect);
-
- window_destroy(GTK_WIDGET(parent_w));
-
- if (must_redissect) {
- /* Redissect all the packets, and re-evaluate the display filter. */
- redissect_packets();
- redissect_all_packet_windows();
- }
-}
-
-/* Treat this as a cancel, by calling "prefs_main_cancel_cb()" */
-static gboolean
-prefs_main_delete_event_cb(GtkWidget *prefs_w_lcl, GdkEvent *event _U_,
- gpointer user_data _U_)
-{
- prefs_main_cancel_cb(NULL, prefs_w_lcl);
- return FALSE;
-}
-
-
-/* dialog *is* already destroyed, clean up memory and such */
-static void
-prefs_main_destroy_cb(GtkWidget *win _U_, gpointer parent_w)
-{
- prefs_main_destroy_all((GtkWidget *)parent_w);
-
- /* Note that we no longer have a "Preferences" dialog box. */
- prefs_w = NULL;
-}
-
-struct properties_data {
- const char *title;
- module_t *module;
-};
-
-static guint
-module_search_properties(module_t *module, gpointer user_data)
-{
- struct properties_data *p = (struct properties_data *)user_data;
-
- if (!module->use_gui) {
- /* This module uses its own GUI interface, so its not a part
- * of this search
- */
- return 0;
- }
-
- /* If this module has the specified title, remember it. */
- if (strcmp(module->title, p->title) == 0) {
- p->module = module;
- return 1; /* stops the search */
- }
-
- if (prefs_module_has_submodules(module))
- return prefs_modules_foreach_submodules(module, module_search_properties, p);
-
- return 0;
-}
-
-static void
-tree_expand_row(GtkTreeModel *model, GtkTreeView *tree_view, GtkTreeIter *iter)
-{
- GtkTreeIter parent;
- GtkTreePath *path;
-
- /* expand the parent first */
- if (gtk_tree_model_iter_parent(model, &parent, iter))
- tree_expand_row(model, tree_view, &parent);
-
- path = gtk_tree_model_get_path(model, iter);
- gtk_tree_view_expand_row(tree_view, path, FALSE);
- /*expand_tree(tree_view, &parent, NULL, NULL);*/
-
- gtk_tree_path_free(path);
-}
-
-/* select a node in the tree view */
-/* XXX - this is almost 100% copied from byte_view_select() in proto_draw.c,
- * find a way to combine both to have a generic function for this */
-static void
-tree_select_node(GtkWidget *tree, prefs_tree_iter *iter)
-{
- GtkTreeIter local_iter = *iter;
- GtkTreeView *tree_view = GTK_TREE_VIEW(tree);
- GtkTreeModel *model;
- GtkTreePath *first_path;
-
- model = gtk_tree_view_get_model(tree_view);
-
- /* Expand our field's row */
- first_path = gtk_tree_model_get_path(model, &local_iter);
-
- /* expand from the top down */
- tree_expand_row(model, tree_view, &local_iter);
-
- /* select our field's row */
- gtk_tree_selection_select_path(gtk_tree_view_get_selection(tree_view),
- first_path);
-
- /* And position the window so the selection is visible.
- * Position the selection in the middle of the viewable
- * pane. */
- gtk_tree_view_scroll_to_cell(tree_view, first_path, NULL, TRUE, 0.5f, 0.0f);
-
- gtk_tree_path_free(first_path);
-}
-
-
-/* search the corresponding protocol page of the currently selected field */
-void
-properties_cb(GtkWidget *w, gpointer dummy)
-{
- header_field_info *hfinfo;
- const gchar *title = NULL;
- struct properties_data p;
- int page_num;
- GtkWidget *sw;
- GtkWidget *frame;
- module_t *page_module;
-
- if (cfile.finfo_selected == NULL) {
- const gchar *abbrev;
-
- /* There is no field selected, try use on top protocol */
- if (cfile.edt && cfile.edt->tree) {
- GPtrArray *ga;
- field_info *v;
- guint i;
-
- ga = proto_all_finfos(cfile.edt->tree);
-
- for (i = ga->len - 1; i > 0 ; i -= 1) {
-
- v = (field_info *)g_ptr_array_index (ga, i);
- hfinfo = v->hfinfo;
-
- if (!g_str_has_prefix(hfinfo->abbrev, "text") &&
- !g_str_has_prefix(hfinfo->abbrev, "_ws.expert") &&
- !g_str_has_prefix(hfinfo->abbrev, "_ws.malformed")) {
- if (hfinfo->parent == -1) {
- abbrev = hfinfo->abbrev;
- } else {
- abbrev = proto_registrar_get_abbrev(hfinfo->parent);
- }
- title = prefs_get_title_by_name(abbrev);
- break;
- }
- }
- }
- } else {
- /* Find the title for the protocol for the selected field. */
- hfinfo = cfile.finfo_selected->hfinfo;
- if (hfinfo->parent == -1)
- title = prefs_get_title_by_name(hfinfo->abbrev);
- else
- title = prefs_get_title_by_name(proto_registrar_get_abbrev(hfinfo->parent));
- }
-
- if (!title)
- return; /* Couldn't find it. XXX - just crash? "Can't happen"? */
-
- /* Find the module for that protocol by searching for one with that title.
- XXX - should we just associate protocols with modules directly? */
- p.title = title;
- p.module = NULL;
- prefs_modules_foreach_submodules(protocols_module, module_search_properties,
- &p);
- if (p.module == NULL) {
- /* We didn't find it - that protocol probably has no preferences. */
- return;
- }
-
- /* Create a preferences window, or pop up an existing one. */
- if (prefs_w != NULL) {
- reactivate_window(prefs_w);
- } else {
- prefs_cb(w, dummy);
- }
-
- /* Search all the pages in that window for the one with the specified
- module. */
- for (page_num = 0;
- (sw = gtk_notebook_get_nth_page((GtkNotebook *)g_object_get_data(G_OBJECT(prefs_w), E_PREFSW_NOTEBOOK_KEY), page_num)) != NULL;
- page_num++) {
- /* Get the frame from the scrollable window */
- frame = (GtkWidget *)g_object_get_data(G_OBJECT(sw), E_PAGESW_FRAME_KEY);
- /* Get the module for this page (non-protocol prefs don't have one). */
- if (frame) {
- page_module = (module_t *)g_object_get_data(G_OBJECT(frame), E_PAGE_MODULE_KEY);
- if (page_module != NULL) {
- if (page_module == p.module) {
- tree_select_node(
- (GtkWidget *)g_object_get_data(G_OBJECT(prefs_w), E_PREFSW_TREE_KEY),
- (GtkTreeIter *)g_object_get_data(G_OBJECT(frame), E_PAGE_ITER_KEY));
- return;
- }
- }
- }
- }
-}
-
-/* Prefs tree selection callback. The node data has been loaded with
- the proper notebook page to load. */
-static void
-prefs_tree_select_cb(GtkTreeSelection *sel, gpointer dummy _U_)
-{
- gint page;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- if (gtk_tree_selection_get_selected(sel, &model, &iter))
- {
- gtk_tree_model_get(model, &iter, 1, &page, -1);
- if (page >= 0)
- gtk_notebook_set_current_page((GtkNotebook *)g_object_get_data(G_OBJECT(prefs_w), E_PREFSW_NOTEBOOK_KEY), page);
- }
-}
-
-
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/prefs_dlg.h b/ui/gtk/prefs_dlg.h
deleted file mode 100644
index a7fe7cb574..0000000000
--- a/ui/gtk/prefs_dlg.h
+++ /dev/null
@@ -1,184 +0,0 @@
-/* prefs_dlg.h
- * Definitions for preference handling routines
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __PREFS_DLG_H__
-#define __PREFS_DLG_H__
-
-/** @defgroup prefs_group Preferences
- *
- * All GUI related preferences things. Please note, that some GUI related things
- * are saved in the recent file, which is processed in recent.h.
- *
- * The Preference dialog has the following page submodules:
- @dot
- digraph prefs_pages {
- node [shape=record, fontname=Helvetica, fontsize=10];
- dialog [ label="Preferences dialog" URL="\ref prefs_dlg.h"];
- ui [ label="User Interface" URL="\ref prefs_gui.h"];
- layout [ label="UI: Layout" URL="\ref prefs_layout.h"];
- columns [ label="UI: Columns" URL="\ref prefs_column.h"];
- font [ label="UI: Font" URL="\ref prefs_font_colors.h"];
- colors [ label="UI: Colors" URL="\ref prefs_font_colors.h"];
- capture [ label="Capture" URL="\ref prefs_capture.h"];
- print [ label="Printing" URL="\ref prefs_print.h"];
- nameres [ label="Name resolution" URL="\ref prefs_nameres.h"];
- protocols [ label="Protocols" URL="\ref prefs_dlg.h"];
- dialog -> ui [ arrowhead="open", style="solid" ];
- dialog -> layout [ arrowhead="open", style="solid" ];
- dialog -> columns [ arrowhead="open", style="solid" ];
- dialog -> font [ arrowhead="open", style="solid" ];
- dialog -> colors [ arrowhead="open", style="solid" ];
- dialog -> capture [ arrowhead="open", style="solid" ];
- dialog -> print [ arrowhead="open", style="solid" ];
- dialog -> nameres [ arrowhead="open", style="solid" ];
- dialog -> protocols [ arrowhead="open", style="solid" ];
- }
- @enddot
- */
-
-/** @file
- * "Preferences" and "Protocol properties" dialog boxes.
- * @ingroup dialog_group
- * @ingroup prefs_group
- */
-
-typedef enum {
- PREFS_PAGE_USER_INTERFACE,
- PREFS_PAGE_LAYOUT,
- PREFS_PAGE_COLUMNS,
- PREFS_PAGE_CAPTURE
-} PREFS_PAGE_E;
-
-/** Show the preferences dialog.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-extern void prefs_cb(GtkWidget *widget, gpointer data);
-
-/** Show the preferences dialog in given page.
- *
- * @param widget parent widget (unused)
- * @param data unused
- * @param prefs_page page to show
- */
-extern void prefs_page_cb(GtkWidget *widget, gpointer data, PREFS_PAGE_E prefs_page);
-
-/** Show the protocol properties dialog.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-extern void properties_cb(GtkWidget *widget, gpointer data);
-
-/** Create a check button for a preferences page.
- *
- * @param main_grid the grid to put this button into
- * @param grid_row row in the grid
- * @param label_text the label text for the left side
- * @param tooltip_text the tooltip for this check button
- * @param active the check button is initially active
- * @return the new check button
- */
-extern GtkWidget *create_preference_check_button(GtkWidget *main_grid, int grid_row,
- const gchar *label_text, const gchar *tooltip_text, gboolean active);
-
-/** Create a radio button for a preferences page.
- *
- * @param main_grid the grid to put this button into
- * @param grid_row row in the grid
- * @param label_text the label text for the left side
- * @param tooltip_text the tooltip for this radio button
- * @param enumvals the values
- * @param current_val the initially selected value
- * @return the new radio button
- */
-extern GtkWidget *create_preference_radio_buttons(GtkWidget *main_grid, int grid_row,
- const gchar *label_text, const gchar *tooltip_text,
- const enum_val_t *enumvals, gint current_val);
-
-/** Get the currently selected value from a radio button.
- *
- * @param button the button from create_preference_radio_buttons()
- * @param enumvals the same enum vals as in create_preference_radio_buttons()
- * @return the index of the currently selected item
- */
-extern gint fetch_preference_radio_buttons_val(GtkWidget *button, const enum_val_t *enumvals);
-
-/** Create an option menu for a preferences page.
- *
- * @param main_grid the grid to put this menu into
- * @param grid_row row in the grid
- * @param label_text the label text for the left side
- * @param tooltip_text the tooltip for this option menu
- * @param enumvals the values
- * @param current_val the initially selected value
- * @return the new option menu
- */
-extern GtkWidget *create_preference_option_menu(GtkWidget *main_grid, int grid_row,
- const gchar *label_text, const gchar *tooltip_text,
- const enum_val_t *enumvals, gint current_val);
-
-/** Get the currently selected value from an option menu.
- *
- * @param optmenu the option menu from create_preference_option_menu()
- * @param enumvals the same enum vals as in create_preference_option_menu()
- * @return the index of the currently selected item
- */
-extern gint fetch_preference_option_menu_val(GtkWidget *optmenu, const enum_val_t *enumvals);
-
-/** Create a text entry for a preferences page.
- *
- * @param main_grid the grid to put this entry into
- * @param grid_row row in the grid
- * @param label_text the label text for the left side
- * @param tooltip_text the tooltip for this text entry
- * @param value the initially value
- * @return the new text entry
- */
-extern GtkWidget *create_preference_entry(GtkWidget *main_grid, int grid_row,
- const gchar *label_text, const gchar *tooltip_text, char *value);
-
-/** Create a static text for a preferences page.
- *
- * @param main_grid the grid to put this entry into
- * @param grid_position row in the grid
- * @param label_text the label text
- * @param tooltip_text the tooltip for this text (not needed at all...)
- * @return the new static text label
- */
-extern GtkWidget *create_preference_static_text(GtkWidget *main_grid, int grid_position,
- const gchar *label_text, const gchar *tooltip_text);
-
-/** Create a UAT button for a preferences page.
- *
- * @param main_grid the grid to put this entry into
- * @param grid_position row in the grid
- * @param label_text the label text
- * @param tooltip_text the tooltip for this text
- * @param uat pointer to the UAT
- * @return the new UAT button
- */
-extern GtkWidget *create_preference_uat(GtkWidget *main_grid, int grid_position,
- const gchar *label_text, const gchar *tooltip_text, void *uat);
-
-#endif
diff --git a/ui/gtk/prefs_filter_expressions.c b/ui/gtk/prefs_filter_expressions.c
deleted file mode 100644
index 06fc979ea8..0000000000
--- a/ui/gtk/prefs_filter_expressions.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/* prefs_filter_expressions.c
- * Submitted by Edwin Groothuis <wireshark@mavetju.org>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-#include <epan/uat.h>
-
-
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/uat_gui.h"
-#include "ui/gtk/prefs_filter_expressions.h"
-#include "ui/gtk/stock_icons.h"
-
-/*
- * Create and display the expression filter UAT
- * Called as part of the creation of the Preferences notebook ( Edit ! Preferences )
- */
-GtkWidget *
-filter_expressions_prefs_show(void) {
-
- GtkWidget *filter_window, *main_grid, *expression_lb, *expression_bt;
- int row = 0;
- const gchar *tooltips_text;
-
- /* Main vertical box */
- filter_window = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 7, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(filter_window), 5);
-
- /* Main grid */
- main_grid = ws_gtk_grid_new();
- gtk_box_pack_start(GTK_BOX(filter_window), main_grid, FALSE, FALSE, 0);
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_set_vexpand(GTK_WIDGET(main_grid), FALSE); /* Ignore VEXPAND requests from children */
-#endif
- ws_gtk_grid_set_row_spacing(GTK_GRID(main_grid), 10);
- ws_gtk_grid_set_column_spacing(GTK_GRID(main_grid), 15);
- gtk_widget_show(main_grid);
-
-
- /* Interface properties */
- expression_lb = gtk_label_new("Display filter expressions:");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), expression_lb, 0, row, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(expression_lb), 1.0f, 0.5f);
- gtk_widget_show(expression_lb);
-
- expression_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_EDIT);
- tooltips_text = "Open a dialog box to configure display filter expression buttons.";
- gtk_widget_set_tooltip_text(expression_lb, tooltips_text);
- gtk_widget_set_tooltip_text(expression_bt, tooltips_text);
- g_signal_connect(expression_bt, "clicked", G_CALLBACK(uat_window_cb), uat_get_table_by_name("Display expressions"));
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), expression_bt, 1, row, 1, 1);
-
- /* Show 'em what we got */
- gtk_widget_show_all(filter_window);
-
- return(filter_window);
-}
-
-/*
- * Editor modelines - http://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/gtk/prefs_filter_expressions.h b/ui/gtk/prefs_filter_expressions.h
deleted file mode 100644
index b0ea53ee65..0000000000
--- a/ui/gtk/prefs_filter_expressions.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/* prefs_filter_expressions.h
- * Submitted by Edwin Groothuis <wireshark@mavetju.org>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __PREFS_FILTER_EXPRESSIONS_H__
-#define __PREFS_FILTER_EXPRESSIONS_H__
-
-/** @file
- * "Name resolution" preferences page.
- * @ingroup prefs_group
- */
-
-/** Build a Filter Save preferences page.
- *
- * @return the new preferences page
- */
-GtkWidget *filter_expressions_prefs_show(void);
-
-#endif
diff --git a/ui/gtk/prefs_font_color.c b/ui/gtk/prefs_font_color.c
deleted file mode 100644
index a6b6f16528..0000000000
--- a/ui/gtk/prefs_font_color.c
+++ /dev/null
@@ -1,557 +0,0 @@
-/* prefs_font_color.c
- * Font and Color preferences widget
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/proto.h>
-#include <epan/prefs.h>
-
-
-#include <ui/recent.h>
-#include <ui/simple_dialog.h>
-
-#include "ui/gtk/old-gtk-compat.h"
-#include "color_utils.h"
-#include "follow_stream.h"
-#include "font_utils.h"
-#include "packet_panes.h"
-#include "prefs_font_color.h"
-
-
-/* Hack to use GtkColorSelection [GdkColor) or GtkColorChooser [GdkRGBA] */
-/* (The code to use GtkColorSelection or GtkColorChooser is almost 1 for 1) */
-#if GTK_CHECK_VERSION(3,4,0)
- typedef GdkRGBA GdkXxx;
- #define color_t_to_gdkxxx color_t_to_gdkRGBAcolor
- #define gdkxxx_to_color_t gdkRGBAcolor_to_color_t
- #define TAG_PROP_FG_COLOR "foreground-rgba"
- #define TAG_PROP_BG_COLOR "background-rgba"
- #define GTK_COLOR_XXX GTK_COLOR_CHOOSER
- #define gtk_color_xxx_new gtk_color_chooser_widget_new
- #define gtk_color_xxx_get_yyy gtk_color_chooser_get_rgba
- #define gtk_color_xxx_set_yyy gtk_color_chooser_set_rgba
- #define COLOR_CHANGED_SIGNAL "notify::rgba"
-#else
- typedef GdkColor GdkXxx;
- #define color_t_to_gdkxxx color_t_to_gdkcolor
- #define gdkxxx_to_color_t gdkcolor_to_color_t
- #define TAG_PROP_FG_COLOR "foreground-gdk"
- #define TAG_PROP_BG_COLOR "background-gdk"
- #define gtk_color_xxx_new gtk_color_selection_new
- #define gtk_color_xxx_get_yyy gtk_color_selection_get_current_color
- #define gtk_color_xxx_set_yyy gtk_color_selection_set_current_color
- #define GTK_COLOR_XXX GTK_COLOR_SELECTION
- #define COLOR_CHANGED_SIGNAL "notify::current-color"
-#endif
-
-
-#define SAMPLE_MARKED_TEXT "Sample marked packet text\n"
-#define SAMPLE_IGNORED_TEXT "Sample ignored packet text\n"
-#define SAMPLE_CLIENT_TEXT "Sample 'Follow Stream' client text\n"
-#define SAMPLE_SERVER_TEXT "Sample 'Follow Stream' server text\n"
-#define SAMPLE_TEXT_VALID_TEXT "Sample valid filter text\n"
-#define SAMPLE_TEXT_INVALID_TEXT "Sample invalid filter text\n"
-#define SAMPLE_TEXT_DEPRECATED_TEXT "Sample warning filter text\n"
-
-#define MFG_IDX 0
-#define MBG_IDX 1
-#define IFG_IDX 2
-#define IBG_IDX 3
-#define CFG_IDX 4
-#define CBG_IDX 5
-#define SFG_IDX 6
-#define SBG_IDX 7
-#define FTV_IDX 8
-#define FTI_IDX 9
-#define FTD_IDX 10
-#define MAX_IDX 11 /* set this to the number of IDX values */
-
-#define COLOR_SAMPLE_KEY "text_color_sample"
-#define FONT_SAMPLE_KEY "font_sample"
-#define STREAM_CS_KEY "stream_colorselection"
-
-static void select_font(GtkWidget *, gpointer);
-static void update_font(PangoFontDescription *, GtkWidget *, GtkWidget *);
-static void update_text_color(GObject *obj, GParamSpec *pspec, gpointer data);
-static void update_current_color(GtkWidget *, gpointer);
-
-static const color_t filter_text_fg_color = {0, 0, 0}; /* black */
-static GdkXxx tcolors[MAX_IDX], filter_text_fg, *curcolor = NULL;
-
-#if ! GTK_CHECK_VERSION(3,4,0)
-static GdkXxx tcolors_orig[MAX_IDX];
-#endif
-
-/* Set to FALSE initially; set to TRUE if the user ever hits "OK" on
- the "Font..." dialog, so that we know that they (probably) changed
- the font, and therefore that the "apply" function needs to take care
- of that */
-static gboolean font_changed;
-
-/* Font name from the font dialog box; if "font_changed" is TRUE, this
- has been set to the name of the font the user selected. */
-static gchar *new_font_name;
-
-static GtkWidget *font_button;
-
-static const char *font_pangrams[] = {
- "Example GIF query packets have jumbo window sizes",
- "Lazy badgers move unique waxy jellyfish packets"
-};
-#define NUM_FONT_PANGRAMS (sizeof font_pangrams / sizeof font_pangrams[0])
-
-
-GtkWidget *
-font_color_prefs_show(void)
-{
- GtkWidget *main_vb, *main_grid, *label, *combo_box;
- GtkWidget *font_sample, *color_sample, *colorsel;
- static const gchar *mt[] = {
- "Marked packet foreground", /* MFG_IDX 0*/
- "Marked packet background", /* MBG_IDX 1*/
- "Ignored packet foreground", /* IFG_IDX 2*/
- "Ignored packet background", /* IBG_IDX 3*/
- "'Follow Stream' client foreground", /* CFG_IDX 4*/
- "'Follow Stream' client background", /* CBG_IDX 5*/
- "'Follow Stream' server foreground", /* SFG_IDX 6*/
- "'Follow Stream' server background", /* SBG_IDX 7*/
- "Valid filter text entry", /* FTV_IDX 8*/
- "Invalid filter text entry", /* FTI_IDX 9*/
- "Deprecated filter text entry" /* FTD_IDX 10*/
- };
- int mcount = sizeof(mt) / sizeof (gchar *);
- GtkTextBuffer *buf;
- GtkTextIter iter;
- GRand *rand_state = g_rand_new();
- GString *preview_string = g_string_new("");
- int i;
-
-#define GRID_FONT_ROW 0
-#define GRID_COLOR_ROW 1
-#define GRID_COLOR_SEL_ROW 3
-
- /* The font hasn't been changed yet. */
- font_changed = FALSE;
-
- color_t_to_gdkxxx(&tcolors[MFG_IDX], &prefs.gui_marked_fg);
- color_t_to_gdkxxx(&tcolors[MBG_IDX], &prefs.gui_marked_bg);
- color_t_to_gdkxxx(&tcolors[IFG_IDX], &prefs.gui_ignored_fg);
- color_t_to_gdkxxx(&tcolors[IBG_IDX], &prefs.gui_ignored_bg);
- color_t_to_gdkxxx(&tcolors[CFG_IDX], &prefs.st_client_fg);
- color_t_to_gdkxxx(&tcolors[CBG_IDX], &prefs.st_client_bg);
- color_t_to_gdkxxx(&tcolors[SFG_IDX], &prefs.st_server_fg);
- color_t_to_gdkxxx(&tcolors[SBG_IDX], &prefs.st_server_bg);
- color_t_to_gdkxxx(&tcolors[FTV_IDX], &prefs.gui_text_valid);
- color_t_to_gdkxxx(&tcolors[FTI_IDX], &prefs.gui_text_invalid);
- color_t_to_gdkxxx(&tcolors[FTD_IDX], &prefs.gui_text_deprecated);
- color_t_to_gdkxxx(&filter_text_fg, &filter_text_fg_color);
-
-#if ! GTK_CHECK_VERSION(3,4,0)
- for (i=0; i<MAX_IDX; i++) {
- tcolors_orig[i] = tcolors[i];
- }
-#endif
-
- curcolor = &tcolors[CFG_IDX];
-
- /* Enclosing containers for each row of widgets */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 5, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
-
- main_grid = ws_gtk_grid_new();
- gtk_box_pack_start(GTK_BOX(main_vb), main_grid, FALSE, FALSE, 0);
- ws_gtk_grid_set_row_spacing(GTK_GRID(main_grid), 40);
- ws_gtk_grid_set_column_spacing(GTK_GRID(main_grid), 15);
- gtk_widget_show(main_grid);
-
- label = gtk_label_new("Main window font:");
- gtk_misc_set_alignment(GTK_MISC(label), 1.0f, 0.5f);
- ws_gtk_grid_attach_extended(GTK_GRID(main_grid), label,
- 0, GRID_FONT_ROW, 1, 1,
- (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
- gtk_widget_show(label);
-
- font_button = gtk_font_button_new_with_font(prefs.gui_gtk2_font_name);
- gtk_font_button_set_title(GTK_FONT_BUTTON(font_button), "Wireshark: Font");
- ws_gtk_grid_attach(GTK_GRID(main_grid), font_button,
- 1, GRID_FONT_ROW, 1, 1);
- gtk_widget_show(font_button);
-
- g_string_printf(preview_string, " %s 0123456789",
- font_pangrams[g_rand_int_range(rand_state, 0, NUM_FONT_PANGRAMS)]);
-
- font_sample = gtk_text_view_new();
- gtk_text_view_set_editable(GTK_TEXT_VIEW(font_sample), FALSE);
- buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(font_sample));
- gtk_text_buffer_get_start_iter(buf, &iter);
- srand((unsigned int) time(NULL));
- gtk_text_buffer_insert(buf, &iter, preview_string->str, -1);
- ws_gtk_grid_attach_extended(GTK_GRID(main_grid), font_sample,
- 2, GRID_FONT_ROW, 1, 1,
- (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
- g_signal_connect(font_button, "font-set", G_CALLBACK(select_font), NULL);
- gtk_widget_show(font_sample);
-
- g_string_free(preview_string, TRUE);
- g_object_set_data(G_OBJECT(font_button), FONT_SAMPLE_KEY, font_sample);
-
- label = gtk_label_new("Colors:");
- gtk_misc_set_alignment(GTK_MISC(label), 1.0f, 0.5f);
- ws_gtk_grid_attach_extended(GTK_GRID(main_grid), label,
- 0, GRID_COLOR_ROW, 1, 1,
- (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0,0);
- gtk_widget_show(label);
-
- /* We have to create this now, and configure it below. */
-
-#if GTK_CHECK_VERSION(3,4,0)
- /* XXX: There appears to be a bug in the GTK3 GtkColorChooserWidget such that
- * when in the GtkColorChooserWidget "customize" mode (aka "color-edit" mode)
- * selecting a color doesn't trigger a "motify::rgba" callback.
- * The effect is that the sample text FG/BG colors don't update for the GTK3
- * GtkColorChooserWidget in "custon color edit node").
- * I expect use of the "customize mode" will be minimal and that the bug will
- * not be very noticeable.
- * (A GTK3 bug report has beem submitted.
- */
-#endif
- colorsel = gtk_color_xxx_new();
-
- combo_box = gtk_combo_box_text_new();
- for (i = 0; i < mcount; i++){
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), mt[i]);
- }
- gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), CFG_IDX);
- g_signal_connect(combo_box, "changed", G_CALLBACK(update_current_color), colorsel);
- ws_gtk_grid_attach(GTK_GRID(main_grid), combo_box,
- 1, GRID_COLOR_ROW, 1, 1);
-
- gtk_widget_show(combo_box);
-
- color_sample = gtk_text_view_new();
- update_font(user_font_get_regular(), font_sample, color_sample);
- gtk_text_view_set_editable(GTK_TEXT_VIEW(color_sample), FALSE);
- buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(color_sample));
- gtk_text_buffer_get_start_iter(buf, &iter);
-
- gtk_text_buffer_create_tag(buf, "marked",
- TAG_PROP_FG_COLOR, &tcolors[MFG_IDX],
- TAG_PROP_BG_COLOR, &tcolors[MBG_IDX],
- NULL);
- gtk_text_buffer_create_tag(buf, "ignored",
- TAG_PROP_FG_COLOR, &tcolors[IFG_IDX],
- TAG_PROP_BG_COLOR, &tcolors[IBG_IDX],
- NULL);
- gtk_text_buffer_create_tag(buf, "client",
- TAG_PROP_FG_COLOR, &tcolors[CFG_IDX],
- TAG_PROP_BG_COLOR, &tcolors[CBG_IDX],
- NULL);
- gtk_text_buffer_create_tag(buf, "server",
- TAG_PROP_FG_COLOR, &tcolors[SFG_IDX],
- TAG_PROP_BG_COLOR, &tcolors[SBG_IDX],
- NULL);
- gtk_text_buffer_create_tag(buf, "text_valid",
- TAG_PROP_FG_COLOR, &filter_text_fg,
- TAG_PROP_BG_COLOR, &tcolors[FTV_IDX],
- NULL);
- gtk_text_buffer_create_tag(buf, "text_invalid",
- TAG_PROP_FG_COLOR, &filter_text_fg,
- TAG_PROP_BG_COLOR, &tcolors[FTI_IDX],
- NULL);
- gtk_text_buffer_create_tag(buf, "text_deprecated",
- TAG_PROP_FG_COLOR, &filter_text_fg,
- TAG_PROP_BG_COLOR, &tcolors[FTD_IDX],
- NULL);
-
- gtk_text_buffer_insert_with_tags_by_name(buf, &iter, SAMPLE_MARKED_TEXT, -1,
- "marked", NULL);
- gtk_text_buffer_insert_with_tags_by_name(buf, &iter, SAMPLE_IGNORED_TEXT, -1,
- "ignored", NULL);
- gtk_text_buffer_insert_with_tags_by_name(buf, &iter, SAMPLE_CLIENT_TEXT, -1,
- "client", NULL);
- gtk_text_buffer_insert_with_tags_by_name(buf, &iter, SAMPLE_SERVER_TEXT, -1,
- "server", NULL);
- gtk_text_buffer_insert_with_tags_by_name(buf, &iter, SAMPLE_TEXT_VALID_TEXT, -1,
- "text_valid", NULL);
- gtk_text_buffer_insert_with_tags_by_name(buf, &iter, SAMPLE_TEXT_INVALID_TEXT, -1,
- "text_invalid", NULL);
- gtk_text_buffer_insert_with_tags_by_name(buf, &iter, SAMPLE_TEXT_DEPRECATED_TEXT, -1,
- "text_deprecated", NULL);
-
- ws_gtk_grid_attach_extended(GTK_GRID(main_grid), color_sample,
- 2, GRID_COLOR_ROW, 1, 2,
- (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
- gtk_widget_show(color_sample);
-
- gtk_color_xxx_set_yyy(GTK_COLOR_XXX(colorsel), curcolor);
- ws_gtk_grid_attach_extended(GTK_GRID(main_grid), colorsel,
- 1, GRID_COLOR_SEL_ROW, 2, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 0, 0);
-
- g_object_set_data(G_OBJECT(combo_box), COLOR_SAMPLE_KEY, color_sample);
- g_object_set_data(G_OBJECT(colorsel), COLOR_SAMPLE_KEY, color_sample);
- g_signal_connect(colorsel, COLOR_CHANGED_SIGNAL, G_CALLBACK(update_text_color), NULL);
- gtk_widget_show(colorsel);
-
- g_rand_free(rand_state);
- gtk_widget_show(main_vb);
- return main_vb;
-}
-
-
-static void
-update_font(PangoFontDescription *font, GtkWidget *font_sample _U_, GtkWidget *color_sample _U_) {
-
- if (!font_sample || !color_sample)
- return;
-
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_override_font(font_sample, font);
- gtk_widget_override_font(color_sample, font);
-#else
- gtk_widget_modify_font(font_sample, font);
- gtk_widget_modify_font(color_sample, font);
-#endif
-
-}
-
-
-static gboolean
-font_fetch(void)
-{
- gchar *font_name;
-
- if (!font_button)
- return FALSE;
-
- font_name = g_strdup(gtk_font_button_get_font_name(
- GTK_FONT_BUTTON(font_button)));
- if (font_name == NULL) {
- /* No font was selected; let the user know, but don't
- tear down the font selection dialog, so they can
- try again. */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "You have not selected a font.");
- return FALSE;
- }
-
- if (!user_font_test(font_name)) {
- /* The font isn't usable; "user_font_test()" has already
- told the user why. Don't tear down the font selection
- dialog. */
- g_free(font_name);
- return FALSE;
- }
- new_font_name = font_name;
- return TRUE;
-}
-
-
-static void
-select_font(GtkWidget *w, gpointer data _U_)
-{
- GtkWidget *font_sample = (GtkWidget *)g_object_get_data(G_OBJECT(w), FONT_SAMPLE_KEY);
- GtkWidget *color_sample = (GtkWidget *)g_object_get_data(G_OBJECT(w), COLOR_SAMPLE_KEY);
- const gchar *font_name;
-
- if (!font_sample || !color_sample)
- return;
-
- font_name = gtk_font_button_get_font_name(GTK_FONT_BUTTON(w));
- if (font_name) {
- PangoFontDescription *font = pango_font_description_from_string(font_name);
- update_font(font, font_sample, color_sample);
- }
-}
-
-
-static void
-update_text_color(GObject *obj, GParamSpec *pspec _U_, gpointer data _U_) {
- GtkTextView *sample = (GtkTextView *)g_object_get_data(G_OBJECT(obj), COLOR_SAMPLE_KEY);
- GtkTextBuffer *buf;
- GtkTextTag *tag;
-
- gtk_color_xxx_get_yyy(GTK_COLOR_XXX(obj), curcolor); /* updates tcolors[xx] */
-
- buf = gtk_text_view_get_buffer(sample);
-
- tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(buf), "marked");
- g_object_set(tag,
- TAG_PROP_FG_COLOR, &tcolors[MFG_IDX],
- TAG_PROP_BG_COLOR, &tcolors[MBG_IDX],
- NULL);
-
- tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(buf), "ignored");
- g_object_set(tag,
- TAG_PROP_FG_COLOR, &tcolors[IFG_IDX],
- TAG_PROP_BG_COLOR, &tcolors[IBG_IDX],
- NULL);
-
- tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(buf), "client");
- g_object_set(tag,
- TAG_PROP_FG_COLOR, &tcolors[CFG_IDX],
- TAG_PROP_BG_COLOR, &tcolors[CBG_IDX],
- NULL);
-
- tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(buf), "server");
- g_object_set(tag,
- TAG_PROP_FG_COLOR, &tcolors[SFG_IDX],
- TAG_PROP_BG_COLOR, &tcolors[SBG_IDX],
- NULL);
-
- tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(buf), "text_valid");
- g_object_set(tag,
- TAG_PROP_FG_COLOR, &filter_text_fg,
- TAG_PROP_BG_COLOR, &tcolors[FTV_IDX],
- NULL);
-
- tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(buf), "text_invalid");
- g_object_set(tag,
- TAG_PROP_FG_COLOR, &filter_text_fg,
- TAG_PROP_BG_COLOR, &tcolors[FTI_IDX],
- NULL);
-
- tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(buf), "text_deprecated");
- g_object_set(tag,
- TAG_PROP_FG_COLOR, &filter_text_fg,
- TAG_PROP_BG_COLOR, &tcolors[FTD_IDX],
- NULL);
-
-}
-
-
-/* ComboBox selection changed (marked/ignored/... forground/background) */
-static void
-update_current_color(GtkWidget *combo_box, gpointer data)
-{
- GtkWidget *colorsel = (GtkWidget *)data;
- GtkTextView *color_sample = (GtkTextView *)g_object_get_data(G_OBJECT(combo_box), COLOR_SAMPLE_KEY);
- int i;
- GtkTextIter iter;
-
- i = gtk_combo_box_get_active(GTK_COMBO_BOX(combo_box));
- curcolor = &tcolors[i];
-
-#if ! GTK_CHECK_VERSION(3,4,0)
- gtk_color_selection_set_previous_color(GTK_COLOR_SELECTION(colorsel), &tcolors_orig[i]);
-#endif
- gtk_color_xxx_set_yyy(GTK_COLOR_XXX(colorsel), curcolor); /* triggers update_text_color() callback */
-
- gtk_text_buffer_get_start_iter(gtk_text_view_get_buffer(color_sample), &iter);
- gtk_text_iter_set_line(&iter, i/2);
- gtk_text_view_scroll_to_iter(color_sample, &iter, 0.0, FALSE, 0, 0);
-}
-
-
-void
-font_color_prefs_fetch(GtkWidget *w _U_)
-{
- gdkxxx_to_color_t(&prefs.gui_marked_fg, &tcolors[MFG_IDX]);
- gdkxxx_to_color_t(&prefs.gui_marked_bg, &tcolors[MBG_IDX]);
- gdkxxx_to_color_t(&prefs.gui_ignored_fg, &tcolors[IFG_IDX]);
- gdkxxx_to_color_t(&prefs.gui_ignored_bg, &tcolors[IBG_IDX]);
- gdkxxx_to_color_t(&prefs.st_client_fg, &tcolors[CFG_IDX]);
- gdkxxx_to_color_t(&prefs.st_client_bg, &tcolors[CBG_IDX]);
- gdkxxx_to_color_t(&prefs.st_server_fg, &tcolors[SFG_IDX]);
- gdkxxx_to_color_t(&prefs.st_server_bg, &tcolors[SBG_IDX]);
- gdkxxx_to_color_t(&prefs.gui_text_valid, &tcolors[FTV_IDX]);
- gdkxxx_to_color_t(&prefs.gui_text_invalid, &tcolors[FTI_IDX]);
- gdkxxx_to_color_t(&prefs.gui_text_deprecated, &tcolors[FTD_IDX]);
-
- /*
- * XXX - we need to have a way to fetch the preferences into
- * local storage and only set the permanent preferences if there
- * weren't any errors in those fetches, as there are several
- * places where there *can* be a bad preference value.
- */
- if (font_fetch()) {
- if (strcmp(new_font_name, prefs.gui_gtk2_font_name) != 0) {
- font_changed = TRUE;
- g_free(prefs.gui_gtk2_font_name);
- prefs.gui_gtk2_font_name = g_strdup(new_font_name);
- }
- }
-}
-
-
-void
-font_color_prefs_apply(GtkWidget *w _U_, unsigned int redissect)
-{
- if (font_changed) {
- /* This redraws the packet bytes windows. */
- switch (user_font_apply()) {
-
- case FA_SUCCESS:
- break;
-
- case FA_ZOOMED_TOO_FAR:
- /* zoomed too far - turn off zooming */
- recent.gui_zoom_level = 0;
- break;
-
- case FA_FONT_NOT_AVAILABLE:
- /* We assume this means that the specified size
- isn't available. */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "That font isn't available at the specified zoom level;\n"
- "turning zooming off.");
- recent.gui_zoom_level = 0;
- break;
- }
- } else if (!redissect) {
- /* Redraw the packet bytes windows, in case the
- highlight style changed, only if we aren't redissecting the whole file.
- XXX - do it only if the highlight style *did* change. */
- redraw_packet_bytes_all();
- }
-
- follow_stream_redraw_all();
-}
-
-
-void
-font_color_prefs_destroy(GtkWidget *w _U_)
-{
- /* Free up any saved font name. */
- if (new_font_name != NULL) {
- g_free(new_font_name);
- new_font_name = NULL;
- }
- font_button = NULL;
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/prefs_font_color.h b/ui/gtk/prefs_font_color.h
deleted file mode 100644
index cfa249a2ba..0000000000
--- a/ui/gtk/prefs_font_color.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* prefs_font_color.h
- * Definitions for stream preferences window
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1999 Gerald Combs
- *
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __PREFS_FONT_COLOR_H__
-#define __PREFS_FONT_COLOR_H__
-
-/** @file
- * "User Interface: Colors" preferences page.
- * @todo rename functions and files from stream to colors
- * @ingroup prefs_group
- */
-
-/** Build a Font and Colors preferences page.
- *
- * @return the new preferences page
- */
-GtkWidget *font_color_prefs_show(void);
-
-/** Fetch preference values from page.
- *
- * @param widget widget from font_color_prefs_show()
- */
-void font_color_prefs_fetch(GtkWidget *widget);
-
-/** Apply preference values from page.
- *
- * @param widget widget from font_color_prefs_show()
- */
-void font_color_prefs_apply(GtkWidget *widget, unsigned int);
-
-/** Destroy preference values from page.
- *
- * @param widget widget from font_color_prefs_show()
- */
-void font_color_prefs_destroy(GtkWidget *widget);
-
-#endif /* __PREFS_FONT_COLOR__ */
diff --git a/ui/gtk/prefs_gui.c b/ui/gtk/prefs_gui.c
deleted file mode 100644
index 72ae5ec5c2..0000000000
--- a/ui/gtk/prefs_gui.c
+++ /dev/null
@@ -1,583 +0,0 @@
-/* gui_prefs.c
- * Dialog box for GUI preferences
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/prefs.h>
-
-#include "cfile.h"
-
-
-#include "ui/gtk/prefs_gui.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/supported_protos_dlg.h"
-#include "ui/gtk/prefs_dlg.h"
-#include "ui/gtk/main_titlebar.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/main_toolbar.h"
-#include "ui/gtk/webbrowser.h"
-#include "ui/gtk/main_welcome.h"
-
-#include "globals.h"
-
-static gint fetch_enum_value(gpointer control, const enum_val_t *enumvals);
-static gboolean fileopen_dir_changed_cb(GtkWidget *myentry, GdkEvent *event _U_, gpointer parent_w _U_);
-static gboolean fileopen_preview_changed_cb(GtkWidget *myentry _U_, GdkEvent *event, gpointer parent_w);
-static void fileopen_selected_cb(GtkWidget *mybutton_rb _U_, gpointer parent_w);
-static gboolean recent_files_count_changed_cb(GtkWidget *recent_files_entry _U_,
- GdkEvent *event _U_, gpointer parent_w);
-static gboolean recent_df_entries_changed_cb(GtkWidget *recent_df_entry _U_,
- GdkEvent *event _U_, gpointer parent_w);
-static gint scroll_percent_changed_cb(GtkWidget *recent_df_entry _U_,
- GdkEvent *event _U_, gpointer parent_w);
-#define GEOMETRY_POSITION_KEY "geometry_position"
-#define GEOMETRY_SIZE_KEY "geometry_size"
-#define GEOMETRY_MAXIMIZED_KEY "geometry_maximized"
-
-#ifdef _WIN32
-#define GUI_CONSOLE_OPEN_KEY "console_open"
-#define ENABLE_UPDATE_KEY "enable_update"
-#endif
-
-#define GUI_FILEOPEN_KEY "fileopen_behavior"
-#define GUI_FILEOPEN_PREVIEW_KEY "fileopen_preview_timeout"
-#define GUI_RECENT_FILES_COUNT_KEY "recent_files_count"
-#define GUI_RECENT_DF_ENTRIES_KEY "recent_display_filter_entries"
-#define GUI_FILEOPEN_DIR_KEY "fileopen_directory"
-#define GUI_ASK_UNSAVED_KEY "ask_unsaved"
-#define GUI_WEBBROWSER_KEY "webbrowser"
-#define GUI_FIND_WRAP_KEY "find_wrap"
-#define GUI_USE_PREF_SAVE_KEY "use_pref_save"
-#define GUI_SHOW_VERSION_KEY "show_version"
-#define GUI_EXPERT_EYECANDY_KEY "expert_eyecandy"
-#define GUI_AUTO_SCROLL_KEY "auto_scroll_on_expand"
-#define GUI_SCROLL_PERCENT_KEY "scroll_percent_on_expand"
-#define GUI_PACKET_EDITOR "packet_editor"
-
-static const enum_val_t filter_toolbar_placement_vals[] _U_ = {
- { "FALSE", "Below the main toolbar", FALSE },
- { "TRUE", "Insert into statusbar", TRUE },
- { NULL, NULL, 0 }
-};
-
-static const enum_val_t highlight_style_vals[] _U_ = {
- { "FALSE", "Bold", FALSE },
- { "TRUE", "Inverse", TRUE },
- { NULL, NULL, 0 }
-};
-
-
-static const enum_val_t toolbar_style_vals[] _U_ = {
- { "ICONS", "Icons only", TB_STYLE_ICONS },
- { "TEXT", "Text only", TB_STYLE_TEXT },
- { "BOTH", "Icons & Text", TB_STYLE_BOTH },
- { NULL, NULL, 0 }
-};
-
-#ifdef _WIN32
-static const enum_val_t gui_console_open_vals[] = {
- { "NEVER", "Never", console_open_never },
- { "AUTOMATIC", "Automatic (advanced user)", console_open_auto },
- { "ALWAYS", "Always (debugging)", console_open_always },
- { NULL, NULL, 0 }
-};
-#endif
-
-static const enum_val_t gui_version_placement_vals[] = {
- { "WELCOME", "Welcome only", version_welcome_only },
- { "TITLE", "Title only", version_title_only },
- { "BOTH", "Both", version_both },
- { "NEITHER", "Neither", version_neither },
- { NULL, NULL, 0 }
-};
-
-static const enum_val_t gui_fileopen_vals[] = {
- { "LAST_OPENED", "Remember last directory", FO_STYLE_LAST_OPENED },
- { "SPECIFIED", "Always start in:", FO_STYLE_SPECIFIED },
- { NULL, NULL, 0 }
-};
-
-/* Used to contain the string from the Recent Files Count Max pref item */
-static char recent_files_count_max_str[128] = "";
-
-/* Used to contain the string from the Recent Display Filter Max Entries pref item */
-static char recent_df_entries_max_str[128] = "";
-
-/* Used to contain the string from the Open File preview timeout pref item */
-static char open_file_preview_str[128] = "";
-
-/* Used to contain the string from the Auto Scroll Percentage pref item */
-static char scroll_percent_preview_str[128] = "";
-
-GtkWidget*
-gui_prefs_show(void)
-{
- GtkWidget *main_grid, *main_vb;
-#ifdef _WIN32
- GtkWidget *console_open_om, *enable_update_cb;
-#endif
- GtkWidget *fileopen_rb, *fileopen_dir_te, *fileopen_preview_te;
- GtkWidget *recent_files_count_max_te, *recent_df_entries_max_te, *ask_unsaved_cb, *find_wrap_cb;
- GtkWidget *use_pref_save_cb;
- GtkWidget *show_version_om;
- GtkWidget *auto_scroll_cb, *scroll_percent_te;
- GtkWidget *webbrowser_te;
- GtkWidget *save_position_cb, *save_size_cb, *save_maximized_cb;
- GtkWidget *expert_info_eyecandy_cb;
- GtkWidget *packet_editor_cb;
-
- int pos = 0;
- char current_val_str[128];
-
- /* The columns haven't been changed yet */
- cfile.columns_changed = FALSE;
-
- /* Main vertical box */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 7, FALSE);
- gtk_container_set_border_width( GTK_CONTAINER(main_vb), 5 );
-
- /* Main grid */
- main_grid = ws_gtk_grid_new();
- gtk_box_pack_start(GTK_BOX(main_vb), main_grid, FALSE, FALSE, 0);
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_set_vexpand(GTK_WIDGET(main_grid), FALSE); /* Ignore VEXPAND requests from children */
-#endif
- ws_gtk_grid_set_row_spacing(GTK_GRID(main_grid), 10);
- ws_gtk_grid_set_column_spacing(GTK_GRID(main_grid), 15);
-
- /* Geometry prefs */
- save_position_cb = create_preference_check_button(main_grid, pos++,
- "Save window position:",
- "Save the position of the main window.",
- prefs.gui_geometry_save_position);
- g_object_set_data(G_OBJECT(main_vb), GEOMETRY_POSITION_KEY, save_position_cb);
-
- save_size_cb = create_preference_check_button(main_grid, pos++,
- "Save window size:",
- "Save the size of the main window.",
- prefs.gui_geometry_save_size);
- g_object_set_data(G_OBJECT(main_vb), GEOMETRY_SIZE_KEY, save_size_cb);
-
- save_maximized_cb = create_preference_check_button(main_grid, pos++,
- "Save maximized state:",
- "Save the maximized state of the main window.",
- prefs.gui_geometry_save_maximized);
- g_object_set_data(G_OBJECT(main_vb), GEOMETRY_MAXIMIZED_KEY, save_maximized_cb);
-
-#ifdef _WIN32
- enable_update_cb = create_preference_check_button(main_grid, pos++,
- "Check for updates:",
- "Periodically check for new versions of Wireshark.",
- prefs.gui_update_enabled);
- g_object_set_data(G_OBJECT(main_vb), ENABLE_UPDATE_KEY, enable_update_cb);
-#endif
-
-#ifdef _WIN32
- /* How the console window should be opened */
- console_open_om = create_preference_option_menu(main_grid, pos++,
- "Open a console window",
- "Whether to open a console window "
- "(Automatic will open a console if messages appear).",
- gui_console_open_vals, prefs.gui_console_open);
- g_object_set_data(G_OBJECT(main_vb), GUI_CONSOLE_OPEN_KEY, console_open_om);
-#endif
-
- /* Allow user to select where they want the File Open dialog to open to
- * by default */
- fileopen_rb = create_preference_radio_buttons(main_grid, pos++,
- "\"File Open\" dialog behavior:",
- "Which directory the \"File Open\" dialog should start with.",
- gui_fileopen_vals, prefs.gui_fileopen_style);
-
- /* Directory to default File Open dialog to */
- fileopen_dir_te = create_preference_entry(main_grid, pos++,
- "Directory:",
- "The \"File Open\" dialog defaults always to this directory.",
- prefs.gui_fileopen_dir);
- g_object_set_data(G_OBJECT(main_vb), GUI_FILEOPEN_KEY, fileopen_rb);
- g_object_set_data(G_OBJECT(main_vb), GUI_FILEOPEN_DIR_KEY, fileopen_dir_te);
- g_signal_connect(fileopen_rb, "clicked", G_CALLBACK(fileopen_selected_cb), main_vb);
- g_signal_connect(fileopen_dir_te, "focus-out-event",
- G_CALLBACK(fileopen_dir_changed_cb), main_vb);
-
- /* File Open dialog preview timeout */
- fileopen_preview_te = create_preference_entry(main_grid, pos++,
- "\"File Open\" preview timeout:",
- "Reading preview data in the \"File Open\" dialog will be stopped after given seconds.",
- open_file_preview_str);
- g_snprintf(current_val_str, sizeof(current_val_str), "%d", prefs.gui_fileopen_preview);
- gtk_entry_set_text(GTK_ENTRY(fileopen_preview_te), current_val_str);
- g_object_set_data(G_OBJECT(main_vb), GUI_FILEOPEN_PREVIEW_KEY, fileopen_preview_te);
- g_signal_connect(fileopen_preview_te, "focus_out_event", G_CALLBACK(fileopen_preview_changed_cb), main_vb);
-
- /* Number of recent entries in the display filter list ... */
- recent_df_entries_max_te = create_preference_entry(main_grid, pos++,
- "Maximum recent filters:",
- "Maximum number of recent entries in filter display list.",
- recent_df_entries_max_str);
- g_snprintf(current_val_str, sizeof(current_val_str), "%d", prefs.gui_recent_df_entries_max);
- gtk_entry_set_text(GTK_ENTRY(recent_df_entries_max_te), current_val_str);
- g_object_set_data(G_OBJECT(main_vb), GUI_RECENT_DF_ENTRIES_KEY, recent_df_entries_max_te);
- g_signal_connect(recent_df_entries_max_te, "focus_out_event", G_CALLBACK(recent_df_entries_changed_cb), main_vb);
-
- /* Number of entries in the recent_files list ... */
- recent_files_count_max_te = create_preference_entry(main_grid, pos++,
- "Maximum recent files:",
- "Maximum number of entries in the \"File/Open Recent\" list.",
- recent_files_count_max_str);
- g_snprintf(current_val_str, sizeof(current_val_str), "%d", prefs.gui_recent_files_count_max);
- gtk_entry_set_text(GTK_ENTRY(recent_files_count_max_te), current_val_str);
- g_object_set_data(G_OBJECT(main_vb), GUI_RECENT_FILES_COUNT_KEY, recent_files_count_max_te);
- g_signal_connect(recent_files_count_max_te, "focus_out_event", G_CALLBACK(recent_files_count_changed_cb), main_vb);
-
- fileopen_selected_cb(NULL, main_vb);
-
- /* ask for unsaved capture files? */
- ask_unsaved_cb = create_preference_check_button(main_grid, pos++,
- "Confirm unsaved capture files:",
- "Whether a dialog should pop up in case of an unsaved capture file.",
- prefs.gui_ask_unsaved);
- g_object_set_data(G_OBJECT(main_vb), GUI_ASK_UNSAVED_KEY, ask_unsaved_cb);
-
- /* do we want to wrap when searching for data? */
- find_wrap_cb = create_preference_check_button(main_grid, pos++,
- "Wrap to end/beginning of file during a find:",
- "Whether a search should wrap in a capture file.",
- prefs.gui_find_wrap);
- g_object_set_data(G_OBJECT(main_vb), GUI_FIND_WRAP_KEY, find_wrap_cb);
-
- /* show an explicit Save button for settings dialogs (preferences and alike)? */
- use_pref_save_cb = create_preference_check_button(main_grid, pos++,
- "Settings dialogs show a save button:",
- "Whether the various settings dialogs (e.g. Preferences) should "
- "use an explicit save button - for advanced users.",
- prefs.gui_use_pref_save);
- g_object_set_data(G_OBJECT(main_vb), GUI_USE_PREF_SAVE_KEY, use_pref_save_cb);
-
- /* Show version in welcome and/or title screen */
- show_version_om = create_preference_option_menu(main_grid, pos++,
- "Welcome screen and title bar shows version",
- "Whether version should be shown in the start page and/or main screen's title bar.",
- gui_version_placement_vals, prefs.gui_version_placement);
- g_object_set_data(G_OBJECT(main_vb), GUI_SHOW_VERSION_KEY, show_version_om);
-
- /* Whether to auto scroll when expanding items */
- auto_scroll_cb = create_preference_check_button(main_grid, pos++,
- "Auto scroll on expansion:",
- "Whether the details view should be automatically scrolled up when expanding an item.",
- prefs.gui_auto_scroll_on_expand );
- g_object_set_data(G_OBJECT(main_vb), GUI_AUTO_SCROLL_KEY, auto_scroll_cb);
-
- /* Where to auto scroll to when expanding items */
- scroll_percent_te = create_preference_entry(main_grid, pos++,
- "Auto scroll percentage:",
- "Where to scroll the expanded item to within the view e.g. 0% = top of view, 50% = center of view.",
- scroll_percent_preview_str);
- g_snprintf(current_val_str, sizeof(current_val_str), "%d", prefs.gui_auto_scroll_percentage);
- gtk_entry_set_text(GTK_ENTRY(scroll_percent_te), current_val_str);
- g_object_set_data(G_OBJECT(main_vb), GUI_SCROLL_PERCENT_KEY, scroll_percent_te);
- g_signal_connect(scroll_percent_te, "focus_out_event", G_CALLBACK(scroll_percent_changed_cb), main_vb);
-
- /* Webbrowser */
- if (browser_needs_pref()) {
- webbrowser_te = create_preference_entry(main_grid, pos++,
- "Web browser command:",
- "Command line to desired browser.",
- prefs.gui_webbrowser);
- gtk_entry_set_text(GTK_ENTRY(webbrowser_te), prefs.gui_webbrowser);
- g_object_set_data(G_OBJECT(main_vb), GUI_WEBBROWSER_KEY, webbrowser_te);
- }
-
- /* Enable Expert Infos Dialog Tab Label "eye-candy" */
- expert_info_eyecandy_cb = create_preference_check_button(main_grid, pos++,
- "Display icons in the Expert Infos dialog tab labels:",
- "Whether icon images should be displayed in the Expert Infos dialog tab labels.",
- prefs.gui_expert_composite_eyecandy );
- g_object_set_data(G_OBJECT(main_vb), GUI_EXPERT_EYECANDY_KEY, expert_info_eyecandy_cb);
-
- /* Enable Experimental Packet Editor */
- packet_editor_cb = create_preference_check_button(main_grid, pos++,
- "Enable Packet Editor (Experimental):",
- "Activate Packet Editor (Experimental)",
- prefs.gui_packet_editor);
- g_object_set_data(G_OBJECT(main_vb), GUI_PACKET_EDITOR, packet_editor_cb);
-
- /* Show 'em what we got */
- gtk_widget_show_all(main_vb);
-
- return(main_vb);
-}
-
-
-static gint
-fetch_enum_value(gpointer control, const enum_val_t *enumvals)
-{
- return fetch_preference_option_menu_val(GTK_WIDGET(control), enumvals);
-}
-
-void
-gui_prefs_fetch(GtkWidget *w)
-{
- prefs.gui_geometry_save_position =
- gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), GEOMETRY_POSITION_KEY));
- prefs.gui_geometry_save_size =
- gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), GEOMETRY_SIZE_KEY));
- prefs.gui_geometry_save_maximized =
- gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), GEOMETRY_MAXIMIZED_KEY));
-
-#ifdef _WIN32
- prefs.gui_update_enabled =
- gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), ENABLE_UPDATE_KEY));
-#endif
-
-#ifdef _WIN32
- prefs.gui_console_open = fetch_enum_value(
- g_object_get_data(G_OBJECT(w), GUI_CONSOLE_OPEN_KEY), gui_console_open_vals);
-#endif
- prefs.gui_fileopen_style = fetch_preference_radio_buttons_val(
- (GtkWidget *)g_object_get_data(G_OBJECT(w), GUI_FILEOPEN_KEY), gui_fileopen_vals);
-
- g_free(prefs.gui_fileopen_dir);
- prefs.gui_fileopen_dir = g_strdup(gtk_entry_get_text(
- GTK_ENTRY(g_object_get_data(G_OBJECT(w), GUI_FILEOPEN_DIR_KEY))));
-
- prefs.gui_ask_unsaved =
- gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), GUI_ASK_UNSAVED_KEY));
-
- prefs.gui_find_wrap =
- gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), GUI_FIND_WRAP_KEY));
-
- prefs.gui_use_pref_save =
- gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), GUI_USE_PREF_SAVE_KEY));
-
- prefs.gui_version_placement = (version_info_e)
- fetch_enum_value(g_object_get_data(G_OBJECT(w), GUI_SHOW_VERSION_KEY), gui_version_placement_vals);
-
- prefs.gui_auto_scroll_on_expand =
- gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), GUI_AUTO_SCROLL_KEY));
-
- if (browser_needs_pref()) {
- g_free(prefs.gui_webbrowser);
- prefs.gui_webbrowser = g_strdup(gtk_entry_get_text(
- GTK_ENTRY(g_object_get_data(G_OBJECT(w), GUI_WEBBROWSER_KEY))));
- }
-
- prefs.gui_expert_composite_eyecandy =
- gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), GUI_EXPERT_EYECANDY_KEY));
-
- prefs.gui_packet_editor =
- gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), GUI_PACKET_EDITOR));
-}
-
-
-
-void
-gui_prefs_apply(GtkWidget *w _U_)
-{
-
-#ifdef _WIN32
- /* user immediately wants to see a console */
- if (prefs.gui_console_open == console_open_always) {
- create_console();
- }
-#endif
-
- /* Redisplay the main window's title */
- main_titlebar_update();
-
- /* Redisplay the default welcome header message in case the "show
- * version" option was changed. */
- welcome_header_set_message(NULL);
-
- /* Redraw the help window(s). */
- supported_redraw();
- help_redraw();
-
- /* XXX: redraw the toolbar only, if style changed */
- toolbar_redraw_all();
-
- set_tree_styles_all();
- main_widgets_rearrange();
-}
-
-void
-gui_prefs_destroy(GtkWidget *w _U_)
-{
-}
-
-static gboolean
-recent_df_entries_changed_cb(GtkWidget *recent_df_entry _U_,
- GdkEvent *event _U_, gpointer parent_w)
-{
- GtkWidget *recent_df_entries_count_te;
- guint newval;
-
- recent_df_entries_count_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_RECENT_DF_ENTRIES_KEY);
-
- /*
- * Now, just convert the string to a number and store it in the prefs
- * filed ...
- */
-
- newval = (guint)strtol(gtk_entry_get_text (GTK_ENTRY(recent_df_entries_count_te)), NULL, 10);
-
- if (newval > 0) {
- prefs.gui_recent_df_entries_max = newval;
- }
-
- /* We really should pop up a nasty dialog box if newval <= 0 */
-
- return FALSE;
-}
-
-static gboolean
-recent_files_count_changed_cb(GtkWidget *recent_files_entry _U_,
- GdkEvent *event _U_, gpointer parent_w)
-{
- GtkWidget *recent_files_count_te;
- guint newval;
-
- recent_files_count_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_RECENT_FILES_COUNT_KEY);
-
- /*
- * Now, just convert the string to a number and store it in the prefs
- * filed ...
- */
-
- newval = (guint)strtol(gtk_entry_get_text (GTK_ENTRY(recent_files_count_te)), NULL, 10);
-
- if (newval > 0) {
- prefs.gui_recent_files_count_max = newval;
- }
-
- /* We really should pop up a nasty dialog box if newval <= 0 */
-
- return FALSE;
-}
-
-static gboolean
-fileopen_preview_changed_cb(GtkWidget *recent_files_entry _U_,
- GdkEvent *event _U_, gpointer parent_w)
-{
- GtkWidget *fileopen_preview_te;
- guint newval;
-
- fileopen_preview_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_FILEOPEN_PREVIEW_KEY);
-
- /*
- * Now, just convert the string to a number and store it in the prefs
- * filed ...
- */
-
- newval = (guint)strtol(gtk_entry_get_text (GTK_ENTRY(fileopen_preview_te)), NULL, 10);
-
- if (newval > 0) {
- prefs.gui_fileopen_preview = newval;
- }
-
- /* We really should pop up a nasty dialog box if newval <= 0 */
-
- return FALSE;
-}
-
-static gboolean
-fileopen_dir_changed_cb(GtkWidget *fileopen_dir_te, GdkEvent *event _U_, gpointer parent_w _U_)
-{
- char *lastchar;
- gint fileopen_dir_te_length;
-
- fileopen_dir_te_length = (gint) strlen(gtk_entry_get_text (GTK_ENTRY(fileopen_dir_te)));
- if (fileopen_dir_te_length == 0)
- return FALSE;
- lastchar = gtk_editable_get_chars(GTK_EDITABLE(fileopen_dir_te), fileopen_dir_te_length-1, -1);
- if (strcmp(lastchar, G_DIR_SEPARATOR_S) != 0){
- gtk_editable_insert_text(GTK_EDITABLE(fileopen_dir_te), G_DIR_SEPARATOR_S,
- 1, /* new_text_length */
- &fileopen_dir_te_length); /* *position */
- }
- return FALSE;
-}
-
-static void
-fileopen_selected_cb(GtkWidget *mybutton_rb _U_, gpointer parent_w)
-{
- GtkWidget *fileopen_rb, *fileopen_dir_te;
-
- fileopen_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_FILEOPEN_KEY);
- fileopen_dir_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_FILEOPEN_DIR_KEY);
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(fileopen_rb)))
- {
- gtk_widget_set_sensitive(GTK_WIDGET(fileopen_dir_te), TRUE);
- }
- else
- {
- gtk_widget_set_sensitive(GTK_WIDGET(fileopen_dir_te), FALSE);
- }
- return;
-}
-
-static gboolean
-scroll_percent_changed_cb(GtkWidget *recent_files_entry _U_,
- GdkEvent *event _U_, gpointer parent_w)
-{
- GtkWidget *scroll_percent_te;
- guint newval;
-
- scroll_percent_te = (GtkWidget*)g_object_get_data(G_OBJECT(parent_w), GUI_SCROLL_PERCENT_KEY);
-
- /*
- * Now, just convert the string to a number and store it in the prefs field ...
- */
-
- newval = (guint)strtol(gtk_entry_get_text(GTK_ENTRY(scroll_percent_te)), NULL, 10);
-
- if (newval <= 100) {
- prefs.gui_auto_scroll_percentage = newval;
- }
-
- if (newval <= 100) {
- prefs.gui_auto_scroll_percentage = newval;
- }
-
- /* We really should pop up a dialog box is newval < 0 or > 100 */
- return FALSE;
-}
-
-/*
- * Editor modelines - http://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/gtk/prefs_gui.h b/ui/gtk/prefs_gui.h
deleted file mode 100644
index 4396de84c8..0000000000
--- a/ui/gtk/prefs_gui.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* prefs_gui.h
- * Definitions for GUI preferences window
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __GUI_PREFS_H__
-#define __GUI_PREFS_H__
-
-/** @file
- * "User Interface" and "User Interface: Font" preferences pages.
- * @ingroup prefs_group
- */
-
-/** Build a User interface preferences page.
- *
- * @return the new preferences page
- */
-extern GtkWidget *gui_prefs_show(void);
-
-/** Fetch preference values from page.
- *
- * @param widget widget from gui_prefs_show()
- */
-extern void gui_prefs_fetch(GtkWidget *widget);
-
-/** Apply preference values from page.
- *
- * @param widget widget from gui_prefs_show()
- */
-extern void gui_prefs_apply(GtkWidget *widget);
-
-/** Destroy preference values from page.
- *
- * @param widget widget from gui_prefs_show()
- */
-void gui_prefs_destroy(GtkWidget *widget);
-
-#endif
diff --git a/ui/gtk/prefs_layout.c b/ui/gtk/prefs_layout.c
deleted file mode 100644
index 1c4bb7aa1c..0000000000
--- a/ui/gtk/prefs_layout.c
+++ /dev/null
@@ -1,531 +0,0 @@
-/* layout_prefs.c
- * Dialog box for layout preferences
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <gtk/gtk.h>
-
-#include <epan/prefs.h>
-
-#include "cfile.h"
-
-
-#include "ui/gtk/prefs_layout.h"
-#include "ui/gtk/prefs_dlg.h"
-#include "ui/gtk/main_titlebar.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/main.h"
-#ifndef HAVE_GDK_GRESOURCE
-#include "ui/gtk/pixbuf-csource.h"
-#endif
-
-#define LAYOUT_QTY (layout_type_max - 1)
-
-
-static void layout_validate_cb(GtkWidget *rb, gpointer data);
-static gint fetch_enum_value(gpointer control, const enum_val_t *enumvals);
-
-
-typedef struct {
- layout_type_e type;
- layout_pane_content_e content[3];
-} layout_t;
-
-
-#define LAYOUT_TYPE_BUTTONS_KEY "layout_type_buttons"
-
-#define LAYOUT_NONE_RB_KEY "layout_none_radio_button"
-#define LAYOUT_PLIST_RB_KEY "layout_plist_radio_button"
-#define LAYOUT_PDETAILS_RB_KEY "layout_pdetails_radio_button"
-#define LAYOUT_PBYTES_RB_KEY "layout_pbytes_radio_button"
-
-#define LAYOUT_CONTENT1_VB_KEY "layout_content1_vbox"
-#define LAYOUT_CONTENT2_VB_KEY "layout_content2_vbox"
-#define LAYOUT_CONTENT3_VB_KEY "layout_content3_vbox"
-
-#define LAYOUT_PANE_KEY "layout_pane"
-
-
-static GtkWidget *layout_content_radio_vbox(GtkWidget *main_vb, int i, layout_pane_content_e content) {
- GtkWidget *radio_vb, *radio_lb;
- GtkWidget *radio_none_rb, *radio_plist_rb, *radio_pdetails_rb, *radio_pbytes_rb;
- char buf[64];
-
-
- /* radio vbox */
- radio_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(radio_vb), 6);
-
- g_snprintf (buf, sizeof(buf), "Pane %d:", i);
- radio_lb = gtk_label_new(buf);
- gtk_misc_set_alignment(GTK_MISC(radio_lb), 0.0f, 0.5f);
- gtk_container_add(GTK_CONTAINER(radio_vb), radio_lb);
-
- radio_plist_rb = gtk_radio_button_new_with_mnemonic_from_widget(NULL, "Packet List");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_plist_rb), content == layout_pane_content_plist);
- gtk_widget_set_tooltip_text (radio_plist_rb, "Put the packet list in this pane.");
- gtk_container_add(GTK_CONTAINER(radio_vb), radio_plist_rb);
-
- radio_pdetails_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(radio_plist_rb), "Packet Details");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_pdetails_rb), content == layout_pane_content_pdetails);
- gtk_widget_set_tooltip_text (radio_pdetails_rb, "Put the packet details tree in this pane.");
- gtk_container_add(GTK_CONTAINER(radio_vb), radio_pdetails_rb);
-
- radio_pbytes_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(radio_plist_rb), "Packet Bytes");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_pbytes_rb), content == layout_pane_content_pbytes);
- gtk_widget_set_tooltip_text (radio_pbytes_rb, "Put the packet bytes dump in this pane.");
- gtk_container_add(GTK_CONTAINER(radio_vb), radio_pbytes_rb);
-
- radio_none_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(radio_plist_rb), "None");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_none_rb), content == layout_pane_content_none);
- gtk_widget_set_tooltip_text (radio_none_rb, "Put nothing in this pane.");
- gtk_container_add(GTK_CONTAINER(radio_vb), radio_none_rb);
-
- g_object_set_data(G_OBJECT(radio_vb), LAYOUT_PLIST_RB_KEY, radio_plist_rb);
- g_object_set_data(G_OBJECT(radio_vb), LAYOUT_PDETAILS_RB_KEY, radio_pdetails_rb);
- g_object_set_data(G_OBJECT(radio_vb), LAYOUT_PBYTES_RB_KEY, radio_pbytes_rb);
- g_object_set_data(G_OBJECT(radio_vb), LAYOUT_NONE_RB_KEY, radio_none_rb);
-
- g_object_set_data(G_OBJECT(radio_plist_rb), LAYOUT_PANE_KEY, GINT_TO_POINTER(i));
- g_object_set_data(G_OBJECT(radio_pdetails_rb), LAYOUT_PANE_KEY, GINT_TO_POINTER(i));
- g_object_set_data(G_OBJECT(radio_pbytes_rb), LAYOUT_PANE_KEY, GINT_TO_POINTER(i));
- g_object_set_data(G_OBJECT(radio_none_rb), LAYOUT_PANE_KEY, GINT_TO_POINTER(-1));
-
- g_signal_connect(radio_plist_rb, "toggled", G_CALLBACK(layout_validate_cb), main_vb);
- g_signal_connect(radio_pdetails_rb, "toggled", G_CALLBACK(layout_validate_cb), main_vb);
- g_signal_connect(radio_pbytes_rb, "toggled", G_CALLBACK(layout_validate_cb), main_vb);
- g_signal_connect(radio_none_rb, "toggled", G_CALLBACK(layout_validate_cb), main_vb);
-
- return radio_vb;
-}
-
-static void
-layout_type_changed_cb (GtkToggleButton * togglebutton, gpointer user_data)
-{
- GtkWidget ** layout_type_buttons = (GtkWidget**) user_data;
- static gboolean dampen_feedback_loop = FALSE;
-
- if (!dampen_feedback_loop) {
- int i;
- dampen_feedback_loop = TRUE;
- for (i=0; i<LAYOUT_QTY; ++i) {
- GtkToggleButton * tb = GTK_TOGGLE_BUTTON(layout_type_buttons[i]);
- gboolean active = togglebutton==tb;
- if (gtk_toggle_button_get_active(tb) != active)
- gtk_toggle_button_set_active (tb, active);
- }
- dampen_feedback_loop = FALSE;
- }
-}
-
-
-static layout_pane_content_e layout_pane_get_content(GtkWidget * radio_vb) {
-
- if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(radio_vb), LAYOUT_NONE_RB_KEY))))
- return layout_pane_content_none;
- if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(radio_vb), LAYOUT_PLIST_RB_KEY))))
- return layout_pane_content_plist;
- if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(radio_vb), LAYOUT_PDETAILS_RB_KEY))))
- return layout_pane_content_pdetails;
- if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(radio_vb), LAYOUT_PBYTES_RB_KEY))))
- return layout_pane_content_pbytes;
-
- g_assert_not_reached();
- return (layout_pane_content_e)-1;
-}
-
-static void layout_pane_set_content(GtkWidget * radio_vb, layout_pane_content_e pane_content) {
-
-
- switch(pane_content) {
- case(layout_pane_content_none):
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(radio_vb), LAYOUT_NONE_RB_KEY)), TRUE);
- break;
- case(layout_pane_content_plist):
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(radio_vb), LAYOUT_PLIST_RB_KEY)), TRUE);
- break;
- case(layout_pane_content_pdetails):
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(radio_vb), LAYOUT_PDETAILS_RB_KEY)), TRUE);
- break;
- case(layout_pane_content_pbytes):
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(radio_vb), LAYOUT_PBYTES_RB_KEY)), TRUE);
- break;
- default:
- g_assert_not_reached();
- }
-}
-
-
-
-static void layout_set(GtkWidget * main_vb, layout_t *layout) {
- GtkWidget *radio_vb;
- GtkWidget ** layout_type_buttons = (GtkWidget **)g_object_get_data(G_OBJECT(main_vb), LAYOUT_TYPE_BUTTONS_KEY);
-
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(layout_type_buttons[layout->type - 1]), TRUE);
-
- radio_vb = (GtkWidget *)g_object_get_data(G_OBJECT(main_vb), LAYOUT_CONTENT1_VB_KEY);
- layout_pane_set_content(radio_vb, layout->content[0]);
- radio_vb = (GtkWidget *)g_object_get_data(G_OBJECT(main_vb), LAYOUT_CONTENT2_VB_KEY);
- layout_pane_set_content(radio_vb, layout->content[1]);
- radio_vb = (GtkWidget *)g_object_get_data(G_OBJECT(main_vb), LAYOUT_CONTENT3_VB_KEY);
- layout_pane_set_content(radio_vb, layout->content[2]);
-}
-
-static void layout_get(GtkWidget * main_vb, layout_t *layout_out) {
- GtkWidget *radio_vb;
- GtkWidget ** layout_type_buttons = (GtkWidget **)g_object_get_data(G_OBJECT(main_vb), LAYOUT_TYPE_BUTTONS_KEY);
- int i;
-
- for (i=0; i<LAYOUT_QTY; ++i) {
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(layout_type_buttons[i]))) {
- layout_out->type = (layout_type_e)(i + 1);
- break;
- }
- }
-
- radio_vb = (GtkWidget *)g_object_get_data(G_OBJECT(main_vb), LAYOUT_CONTENT1_VB_KEY);
- layout_out->content[0] = layout_pane_get_content(radio_vb);
- radio_vb = (GtkWidget *)g_object_get_data(G_OBJECT(main_vb), LAYOUT_CONTENT2_VB_KEY);
- layout_out->content[1] = layout_pane_get_content(radio_vb);
- radio_vb = (GtkWidget *)g_object_get_data(G_OBJECT(main_vb), LAYOUT_CONTENT3_VB_KEY);
- layout_out->content[2] = layout_pane_get_content(radio_vb);
-}
-
-static void layout_validate(layout_t *layout, int pane) {
-
- switch (pane) {
- case 1:
- if(layout->content[1] == layout->content[0]) {
- layout->content[1] = layout_pane_content_none;
- }
- if(layout->content[2] == layout->content[0]) {
- layout->content[2] = layout_pane_content_none;
- }
- break;
- case 2:
- if(layout->content[0] == layout->content[1]) {
- layout->content[0] = layout_pane_content_none;
- }
- if(layout->content[2] == layout->content[1]) {
- layout->content[2] = layout_pane_content_none;
- }
- break;
- case 3:
- if(layout->content[0] == layout->content[2]) {
- layout->content[0] = layout_pane_content_none;
- }
- if(layout->content[1] == layout->content[2]) {
- layout->content[1] = layout_pane_content_none;
- }
- break;
- default:
- /* If the user selects "None" we're not going to intervene. */
- break;
- }
-
-}
-
-
-static void layout_validate_cb(GtkWidget *rb, gpointer data) {
- int pane = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(rb), LAYOUT_PANE_KEY));
- layout_t layout;
-
- layout_get((GtkWidget *)data, &layout);
- layout_validate(&layout, pane);
- layout_set((GtkWidget *)data, &layout);
-}
-
-static void
-layout_defaults_cb (GtkWidget * w _U_, gpointer data)
-{
- layout_t default_layout = {
- layout_type_5,
- {
- layout_pane_content_plist,
- layout_pane_content_pdetails,
- layout_pane_content_pbytes
- }
- };
-
- layout_set((GtkWidget *)data, &default_layout);
-}
-
-#define ALTERN_COLORS_KEY "altern_colors"
-#define HEX_DUMP_HIGHLIGHT_STYLE_KEY "hex_dump_highlight_style"
-#define FILTER_TOOLBAR_PLACEMENT_KEY "filter_toolbar_show_in_statusbar"
-#define GUI_TOOLBAR_STYLE_KEY "toolbar_style"
-#define GUI_FILTER_TOOLBAR_STYLE_KEY "filter_toolbar_style"
-#define GUI_WINDOW_TITLE_KEY "window_title"
-
-static const enum_val_t altern_colors_vals[] = {
- { "FALSE", "No", FALSE },
- { "TRUE", "Yes", TRUE },
- { NULL, NULL, 0 }
-};
-static const enum_val_t highlight_style_vals[] = {
- { "FALSE", "Bold", FALSE },
- { "TRUE", "Inverse", TRUE },
- { NULL, NULL, 0 }
-};
-static const enum_val_t filter_toolbar_placement_vals[] = {
- { "FALSE", "Below the main toolbar", FALSE },
- { "TRUE", "Insert into statusbar", TRUE },
- { NULL, NULL, 0 }
-};
-static const enum_val_t toolbar_style_vals[] = {
- { "ICONS", "Icons only", TB_STYLE_ICONS },
- { "TEXT", "Text only", TB_STYLE_TEXT },
- { "BOTH", "Icons & Text", TB_STYLE_BOTH },
- { NULL, NULL, 0 }
-};
-
-GtkWidget*
-layout_prefs_show(void)
-{
- GtkWidget *main_vb, *button_hb, *type_tb;
- GtkWidget *pane_fr, *pane_vb;
- GtkWidget *radio_hb, *radio_vb;
- GtkWidget *default_vb, *default_bt;
- GtkWidget *main_grid, *hbox;
- GtkWidget *altern_colors_om;
- GtkWidget *highlight_style_om;
- GtkWidget *toolbar_style_om;
- GtkWidget *filter_toolbar_style_om;
- GtkWidget *filter_toolbar_placement_om;
- GtkWidget *window_title_te;
- GdkPixbuf *pixbuf[6];
-
- GtkWidget ** layout_type_buttons = (GtkWidget **)g_malloc (sizeof(GtkWidget*) * LAYOUT_QTY);
- GtkWidget *layout_pixbufs[LAYOUT_QTY];
-
- int pos = 0;
- int i;
-
-
- /* main vertical box */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 7, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
-
- /* pane frame */
- pane_fr = gtk_frame_new("Panes");
- gtk_box_pack_start(GTK_BOX(main_vb), pane_fr, FALSE, FALSE, 0);
- gtk_widget_show(pane_fr);
-
- /* pane vertical box */
- pane_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 7, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(pane_vb), 5);
- gtk_container_add(GTK_CONTAINER(pane_fr), pane_vb);
- gtk_widget_show(pane_vb);
-
- /* button hbox */
- button_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(button_hb), 6);
- gtk_box_pack_start (GTK_BOX(pane_vb), button_hb, FALSE, FALSE, 0);
-
- /* pane layout */
-#ifdef HAVE_GDK_GRESOURCE
- pixbuf[0] = ws_gdk_pixbuf_new_from_resource("/org/wireshark/image/layout_5.png");
- pixbuf[1] = ws_gdk_pixbuf_new_from_resource("/org/wireshark/image/layout_2.png");
- pixbuf[2] = ws_gdk_pixbuf_new_from_resource("/org/wireshark/image/layout_1.png");
- pixbuf[3] = ws_gdk_pixbuf_new_from_resource("/org/wireshark/image/layout_4.png");
- pixbuf[4] = ws_gdk_pixbuf_new_from_resource("/org/wireshark/image/layout_3.png");
- pixbuf[5] = ws_gdk_pixbuf_new_from_resource("/org/wireshark/image/layout_6.png");
-#else
- pixbuf[0] = gdk_pixbuf_new_from_inline(-1, layout_5_pb_data, FALSE, NULL);
- pixbuf[1] = gdk_pixbuf_new_from_inline(-1, layout_2_pb_data, FALSE, NULL);
- pixbuf[2] = gdk_pixbuf_new_from_inline(-1, layout_1_pb_data, FALSE, NULL);
- pixbuf[3] = gdk_pixbuf_new_from_inline(-1, layout_4_pb_data, FALSE, NULL);
- pixbuf[4] = gdk_pixbuf_new_from_inline(-1, layout_3_pb_data, FALSE, NULL);
- pixbuf[5] = gdk_pixbuf_new_from_inline(-1, layout_6_pb_data, FALSE, NULL);
-#endif
-
- layout_pixbufs[0] = gtk_image_new_from_pixbuf(pixbuf[0]);
- layout_pixbufs[1] = gtk_image_new_from_pixbuf(pixbuf[1]);
- layout_pixbufs[2] = gtk_image_new_from_pixbuf(pixbuf[2]);
- layout_pixbufs[3] = gtk_image_new_from_pixbuf(pixbuf[3]);
- layout_pixbufs[4] = gtk_image_new_from_pixbuf(pixbuf[4]);
- layout_pixbufs[5] = gtk_image_new_from_pixbuf(pixbuf[5]);
-
- for (i=0; i<LAYOUT_QTY; ++i)
- {
- type_tb = gtk_toggle_button_new ();
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(type_tb),
- (layout_type_e)(i + 1) == prefs.gui_layout_type);
-
- gtk_container_add (GTK_CONTAINER(type_tb), layout_pixbufs[i]);
-
- g_signal_connect(type_tb, "toggled", G_CALLBACK(layout_type_changed_cb), layout_type_buttons);
- layout_type_buttons[i] = type_tb;
- gtk_box_pack_start (GTK_BOX(button_hb), type_tb, TRUE, FALSE, 0);
- }
-
- g_object_set_data(G_OBJECT(main_vb), LAYOUT_TYPE_BUTTONS_KEY, layout_type_buttons);
-
- /* radio hbox */
- radio_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(radio_hb), 6);
- gtk_box_pack_start (GTK_BOX(pane_vb), radio_hb, FALSE, FALSE, 0);
-
- radio_vb = layout_content_radio_vbox(main_vb, 1, prefs.gui_layout_content_1);
- gtk_container_set_border_width(GTK_CONTAINER(radio_vb), 6);
- gtk_box_pack_start (GTK_BOX(radio_hb), radio_vb, FALSE, FALSE, 0);
- g_object_set_data(G_OBJECT(main_vb), LAYOUT_CONTENT1_VB_KEY, radio_vb);
-
- radio_vb = layout_content_radio_vbox(main_vb, 2, prefs.gui_layout_content_2);
- gtk_container_set_border_width(GTK_CONTAINER(radio_vb), 6);
- gtk_box_pack_start (GTK_BOX(radio_hb), radio_vb, FALSE, FALSE, 0);
- g_object_set_data(G_OBJECT(main_vb), LAYOUT_CONTENT2_VB_KEY, radio_vb);
-
- radio_vb = layout_content_radio_vbox(main_vb, 3, prefs.gui_layout_content_3);
- gtk_container_set_border_width(GTK_CONTAINER(radio_vb), 6);
- gtk_box_pack_start (GTK_BOX(radio_hb), radio_vb, FALSE, FALSE, 0);
- g_object_set_data(G_OBJECT(main_vb), LAYOUT_CONTENT3_VB_KEY, radio_vb);
-
- default_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- default_bt = gtk_button_new_with_label("Default panes");
- gtk_widget_set_tooltip_text (default_bt, "Reset the pane layout settings to default values.");
- g_signal_connect(default_bt, "clicked", G_CALLBACK(layout_defaults_cb), main_vb);
- gtk_box_pack_end(GTK_BOX(default_vb), default_bt, FALSE, FALSE, 0);
- gtk_box_pack_end(GTK_BOX(radio_hb), default_vb, FALSE, FALSE, 0);
-
- /* Main horizontal box */
- /* XXX - Is there a better way to center the grid ? */
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 7, FALSE);
- gtk_box_pack_start (GTK_BOX(main_vb), hbox, TRUE, FALSE, 0);
-
- /* Main grid */
- main_grid = ws_gtk_grid_new();
- gtk_box_pack_start( GTK_BOX(hbox), main_grid, FALSE, FALSE, 0 );
- ws_gtk_grid_set_row_spacing( GTK_GRID(main_grid), 10 );
- ws_gtk_grid_set_column_spacing( GTK_GRID(main_grid), 15 );
-
- /* Alternating row colors in list and tree views */
- altern_colors_om = create_preference_option_menu(main_grid, pos++,
- "Alternating row colors in lists and trees:",
- "Select whether or not the rows of lists and trees have alternating color.",
- altern_colors_vals, prefs.gui_altern_colors);
- g_object_set_data(G_OBJECT(main_vb), ALTERN_COLORS_KEY, altern_colors_om);
-
- /* Packet Bytes Dump highlight style */
- highlight_style_om = create_preference_option_menu(main_grid, pos++,
- "Packet bytes highlight style:",
- "Select the style in which the packet bytes dump will be displayed.",
- highlight_style_vals, prefs.gui_hex_dump_highlight_style);
- g_object_set_data(G_OBJECT(main_vb), HEX_DUMP_HIGHLIGHT_STYLE_KEY, highlight_style_om);
-
- /* Toolbar prefs */
- toolbar_style_om = create_preference_option_menu(main_grid, pos++,
- "Toolbar style:",
- "Select the style in which the toolbar will be displayed.",
- toolbar_style_vals, prefs.gui_toolbar_main_style);
- g_object_set_data(G_OBJECT(main_vb), GUI_TOOLBAR_STYLE_KEY, toolbar_style_om);
-
- /* Filter toolbar prefs */
- filter_toolbar_style_om = create_preference_option_menu(main_grid, pos++,
- "Filter toolbar style:",
- "Select the style in which the filter toolbar will be displayed.",
- toolbar_style_vals, prefs.gui_toolbar_filter_style);
- g_object_set_data(G_OBJECT(main_vb), GUI_FILTER_TOOLBAR_STYLE_KEY, filter_toolbar_style_om);
-
- /* Placement of Filter toolbar */
- filter_toolbar_placement_om = create_preference_option_menu(main_grid, pos++,
- "Filter toolbar placement:",
- "Select where the filter toolbar will be displayed.",
- filter_toolbar_placement_vals, prefs.filter_toolbar_show_in_statusbar);
- g_object_set_data(G_OBJECT(main_vb), FILTER_TOOLBAR_PLACEMENT_KEY, filter_toolbar_placement_om);
-
- /* Window title */
- window_title_te = create_preference_entry(main_grid, pos++,
- "Custom window title (appended to existing titles):",
- "Enter the text to be appended to the window title.",
- prefs.gui_window_title);
- gtk_entry_set_text(GTK_ENTRY(window_title_te), prefs.gui_window_title);
- g_object_set_data(G_OBJECT(main_vb), GUI_WINDOW_TITLE_KEY, window_title_te);
-
- /* Show 'em what we got */
- gtk_widget_show_all(main_vb);
-
- return(main_vb);
-}
-
-static gint
-fetch_enum_value(gpointer control, const enum_val_t *enumvals)
-{
- return fetch_preference_option_menu_val(GTK_WIDGET(control), enumvals);
-}
-
-void
-layout_prefs_fetch(GtkWidget *w)
-{
- layout_t layout_fetched;
-
- layout_get(w, &layout_fetched);
-
- prefs.gui_layout_type = layout_fetched.type;
- prefs.gui_layout_content_1 = layout_fetched.content[0];
- prefs.gui_layout_content_2 = layout_fetched.content[1];
- prefs.gui_layout_content_3 = layout_fetched.content[2];
-
- prefs.gui_altern_colors = fetch_enum_value(
- g_object_get_data(G_OBJECT(w), ALTERN_COLORS_KEY), altern_colors_vals);
- prefs.filter_toolbar_show_in_statusbar = fetch_enum_value(
- g_object_get_data(G_OBJECT(w), FILTER_TOOLBAR_PLACEMENT_KEY), filter_toolbar_placement_vals);
- prefs.gui_hex_dump_highlight_style = fetch_enum_value(
- g_object_get_data(G_OBJECT(w), HEX_DUMP_HIGHLIGHT_STYLE_KEY), highlight_style_vals);
- prefs.gui_toolbar_main_style = fetch_enum_value(
- g_object_get_data(G_OBJECT(w), GUI_TOOLBAR_STYLE_KEY), toolbar_style_vals);
- prefs.gui_toolbar_filter_style = fetch_enum_value(
- g_object_get_data(G_OBJECT(w), GUI_FILTER_TOOLBAR_STYLE_KEY), toolbar_style_vals);
-
- g_free(prefs.gui_window_title);
- prefs.gui_window_title = g_strdup(gtk_entry_get_text(
- GTK_ENTRY(g_object_get_data(G_OBJECT(w), GUI_WINDOW_TITLE_KEY))));
-}
-
-void
-layout_prefs_apply(GtkWidget *w _U_)
-{
- main_titlebar_update();
- main_widgets_rearrange();
-}
-
-void
-layout_prefs_destroy(GtkWidget *main_vb)
-{
- GtkWidget ** layout_type_buttons = (GtkWidget **)g_object_get_data(G_OBJECT(main_vb), LAYOUT_TYPE_BUTTONS_KEY);
-
- g_free(layout_type_buttons);
-}
-
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/prefs_layout.h b/ui/gtk/prefs_layout.h
deleted file mode 100644
index 56e80a7557..0000000000
--- a/ui/gtk/prefs_layout.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* prefs_layout.h
- * Definitions for layout preferences window
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __LAYOUT_PREFS_H__
-#define __LAYOUT_PREFS_H__
-
-/** @file
- * "User Interface: Layout" preferences page.
- * @ingroup prefs_group
- */
-
-/** Build a User interface layout preferences page.
- *
- * @return the new preferences page
- */
-extern GtkWidget *layout_prefs_show(void);
-
-/** Fetch preference values from page.
- *
- * @param widget widget from layout_prefs_show()
- */
-extern void layout_prefs_fetch(GtkWidget *widget);
-
-/** Apply preference values from page.
- *
- * @param widget widget from layout_prefs_show()
- */
-extern void layout_prefs_apply(GtkWidget *widget);
-
-/** Destroy preference values from page.
- *
- * @param widget widget from layout_prefs_show()
- */
-extern void layout_prefs_destroy(GtkWidget *widget);
-
-#endif
diff --git a/ui/gtk/print_dlg.c b/ui/gtk/print_dlg.c
deleted file mode 100644
index ed88fea9e5..0000000000
--- a/ui/gtk/print_dlg.c
+++ /dev/null
@@ -1,1253 +0,0 @@
-/* print_dlg.c
- * Dialog boxes for printing and exporting to text files
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/prefs.h>
-#include "ui/gtk/old-gtk-compat.h"
-#include <wsutil/filesystem.h>
-
-#include "ui/alert_box.h"
-#include "ui/simple_dialog.h"
-#include "ui/util.h"
-#include <wsutil/file_util.h>
-
-#include "globals.h"
-
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/keys.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/file_dlg.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/range_utils.h"
-#include "ui/gtk/help_dlg.h"
-
-#ifdef _WIN32
-#include <gdk/gdkwin32.h>
-#include <windows.h>
-#include "ui/win32/file_dlg_win32.h"
-#include "ui/win32/print_win32.h"
-#include "wsutil/tempfile.h"
-#endif
-
-/* dialog output action */
-typedef enum {
- output_action_print, /* print text to printer */
- output_action_export_text, /* export to plain text */
- output_action_export_ps, /* export to postscript */
- output_action_export_psml, /* export to packet summary markup language */
- output_action_export_pdml, /* export to packet data markup language */
- output_action_export_csv, /* export to csv file */
- output_action_export_carrays, /* export to C array file */
- output_action_export_json /* export to json */
-} output_action_e;
-
-
-/* On Win32, a GUI application apparently can't use "popen()" (it
- "returns an invalid file handle, if used in a Windows program,
- that will cause the program to hang indefinitely"), so we can't
- use a pipe to a print command to print to a printer.
-
- Eventually, we should try to use the native Win32 printing API
- for this (and also use various UNIX printing APIs, when present?).
-*/
-
-static GtkWidget *
-open_print_dialog(const char *title, output_action_e action, print_args_t *args);
-static void print_cmd_toggle_dest(GtkWidget *widget, gpointer data);
-static void print_cmd_toggle_detail(GtkWidget *widget, gpointer data);
-static void print_ok_cb(GtkWidget *ok_bt, gpointer parent_w);
-static void print_destroy_cb(GtkWidget *win, gpointer user_data);
-
-
-
-#define PRINT_ARGS_KEY "printer_args"
-
-#define PRINT_PS_RB_KEY "printer_ps_radio_button"
-#define PRINT_PDML_RB_KEY "printer_pdml_radio_button"
-#define PRINT_PSML_RB_KEY "printer_psml_radio_button"
-#define PRINT_CSV_RB_KEY "printer_csv_radio_button"
-#define PRINT_CARRAYS_RB_KEY "printer_carrays_radio_button"
-#define PRINT_JSON_RB_KEY "printer_json_radio_button"
-#define PRINT_DEST_CB_KEY "printer_destination_check_button"
-
-#define PRINT_SUMMARY_CB_KEY "printer_summary_check_button"
-#define PRINT_COL_HEADINGS_CB_KEY "printer_include_column_headings_button"
-#define PRINT_DETAILS_CB_KEY "printer_details_check_button"
-#define PRINT_COLLAPSE_ALL_RB_KEY "printer_collapse_all_radio_button"
-#define PRINT_AS_DISPLAYED_RB_KEY "printer_as_displayed_radio_button"
-#define PRINT_EXPAND_ALL_RB_KEY "printer_expand_all_radio_button"
-#define PRINT_HEX_CB_KEY "printer_hex_check_button"
-#define PRINT_FORMFEED_CB_KEY "printer_formfeed_check_button"
-
-#define PRINT_BT_KEY "printer_button"
-
-#define PRINT_TE_PTR_KEY "printer_file_te_ptr"
-
-
-/*
- * Keep a static pointer to the current "Print" window, if any, so that if
- * somebody tries to do "File:Print" while there's already a "Print" window
- * up, we just pop up the existing one, rather than creating a new one.
- */
-static GtkWidget *print_win = NULL;
-
-static print_args_t print_args;
-
-static gboolean print_prefs_init = FALSE;
-
-
-static void
-file_print_cmd(gboolean print_selected)
-{
- print_args_t *args = &print_args;
-
- if (print_win != NULL) {
- /* There's already a "Print" dialog box; reactivate it. */
- reactivate_window(print_win);
- return;
- }
-
- /* get settings from preferences (and other initial values) only once */
- if(print_prefs_init == FALSE) {
- print_prefs_init = TRUE;
- args->format = (print_format_e)prefs.pr_format;
- args->to_file = prefs.pr_dest;
- args->file = g_strdup(prefs.pr_file);
- args->cmd = g_strdup(prefs.pr_cmd);
- args->print_summary = TRUE;
- args->print_col_headings = TRUE;
- args->print_dissections = print_dissections_as_displayed;
- args->print_hex = FALSE;
- args->print_formfeed = FALSE;
- }
-
- /* init the printing range */
- packet_range_init(&args->range, &cfile);
- args->range.process_filtered = TRUE;
-
- if(print_selected) {
- args->range.process = range_process_selected;
- }
-
- print_win = open_print_dialog("Wireshark: Print", output_action_print, args);
- g_signal_connect(print_win, "destroy", G_CALLBACK(print_destroy_cb), &print_win);
-}
-
-void
-file_print_cmd_cb(GtkWidget *widget _U_, gpointer data _U_)
-{
- file_print_cmd(FALSE);
-}
-
-void
-file_print_selected_cmd_cb(GtkWidget *widget _U_, gpointer data _U_)
-{
- file_print_cmd(TRUE);
-}
-
-/*
- * Keep a static pointer to the current "Export text" window, if any, so that if
- * somebody tries to do "File:Export to text" while there's already a "Export text" window
- * up, we just pop up the existing one, rather than creating a new one.
- */
-static GtkWidget *export_text_win = NULL;
-
-static print_args_t export_text_args;
-
-static gboolean export_text_prefs_init = FALSE;
-
-
-#ifdef _WIN32
-void
-export_text_cmd_cb(GtkWidget *widget _U_, gpointer data _U_)
-{
- win32_export_file(GDK_WINDOW_HWND(gtk_widget_get_window(top_level)), &cfile, export_type_text);
- return;
-}
-#else
-void
-export_text_cmd_cb(GtkWidget *widget _U_, gpointer data _U_)
-{
- print_args_t *args = &export_text_args;
-
- if (export_text_win != NULL) {
- /* There's already a "Export text" dialog box; reactivate it. */
- reactivate_window(export_text_win);
- return;
- }
-
- /* get settings from preferences (and other initial values) only once */
- if(export_text_prefs_init == FALSE) {
- export_text_prefs_init = TRUE;
- args->format = PR_FMT_TEXT;
- args->to_file = TRUE;
- args->file = g_strdup("");
- args->cmd = g_strdup("");
- args->print_summary = TRUE;
- args->print_col_headings = TRUE;
- args->print_dissections = print_dissections_as_displayed;
- args->print_hex = FALSE;
- args->print_formfeed = FALSE;
- }
-
- /* init the printing range */
- packet_range_init(&args->range, &cfile);
- args->range.process_filtered = TRUE;
-
- export_text_win = open_print_dialog("Wireshark: Export as \"Plain Text\" File", output_action_export_text, args);
- g_signal_connect(export_text_win, "destroy", G_CALLBACK(print_destroy_cb), &export_text_win);
-}
-#endif
-
-
-/*
- * Keep a static pointer to the current "Export ps" window, if any, so that if
- * somebody tries to do "File:Export to ps" while there's already a "Export ps" window
- * up, we just pop up the existing one, rather than creating a new one.
- */
-static GtkWidget *export_ps_win = NULL;
-
-static print_args_t export_ps_args;
-
-static gboolean export_ps_prefs_init = FALSE;
-
-
-#ifdef _WIN32
-void
-export_ps_cmd_cb(GtkWidget *widget _U_, gpointer data _U_)
-{
- win32_export_file(GDK_WINDOW_HWND(gtk_widget_get_window(top_level)), &cfile, export_type_ps);
- return;
-}
-#else
-void
-export_ps_cmd_cb(GtkWidget *widget _U_, gpointer data _U_)
-{
- print_args_t *args = &export_ps_args;
-
- if (export_ps_win != NULL) {
- /* There's already a "Export ps" dialog box; reactivate it. */
- reactivate_window(export_ps_win);
- return;
- }
-
- /* get settings from preferences (and other initial values) only once */
- if(export_ps_prefs_init == FALSE) {
- export_ps_prefs_init = TRUE;
- args->format = PR_FMT_PS;
- args->to_file = TRUE;
- args->file = g_strdup("");
- args->cmd = g_strdup("");
- args->print_summary = TRUE;
- args->print_col_headings = TRUE;
- args->print_dissections = print_dissections_as_displayed;
- args->print_hex = FALSE;
- args->print_formfeed = FALSE;
- }
-
- /* init the printing range */
- packet_range_init(&args->range, &cfile);
- args->range.process_filtered = TRUE;
-
- export_ps_win = open_print_dialog("Wireshark: Export as \"PostScript\" file", output_action_export_ps, args);
- g_signal_connect(export_ps_win, "destroy", G_CALLBACK(print_destroy_cb), &export_ps_win);
-}
-#endif
-
-
-/*
- * Keep a static pointer to the current "Export psml" window, if any, so that if
- * somebody tries to do "File:Export to psml" while there's already a "Export psml" window
- * up, we just pop up the existing one, rather than creating a new one.
- */
-static GtkWidget *export_psml_win = NULL;
-
-static print_args_t export_psml_args;
-
-static gboolean export_psml_prefs_init = FALSE;
-
-
-#ifdef _WIN32
-void
-export_psml_cmd_cb(GtkWidget *widget _U_, gpointer data _U_)
-{
- win32_export_file(GDK_WINDOW_HWND(gtk_widget_get_window(top_level)), &cfile, export_type_psml);
- return;
-}
-#else
-void
-export_psml_cmd_cb(GtkWidget *widget _U_, gpointer data _U_)
-{
- print_args_t *args = &export_psml_args;
-
- if (export_psml_win != NULL) {
- /* There's already a "Export psml" dialog box; reactivate it. */
- reactivate_window(export_psml_win);
- return;
- }
-
- /* get settings from preferences (and other initial values) only once */
- if(export_psml_prefs_init == FALSE) {
- export_psml_prefs_init = TRUE;
- args->format = PR_FMT_TEXT; /* XXX */
- args->to_file = TRUE;
- args->file = g_strdup("");
- args->cmd = g_strdup("");
- args->print_summary = TRUE;
- args->print_col_headings = TRUE;
- args->print_dissections = print_dissections_as_displayed;
- args->print_hex = FALSE;
- args->print_formfeed = FALSE;
- }
-
- /* init the printing range */
- packet_range_init(&args->range, &cfile);
- args->range.process_filtered = TRUE;
-
- export_psml_win = open_print_dialog("Wireshark: Export as \"PSML\" file", output_action_export_psml, args);
- g_signal_connect(export_psml_win, "destroy", G_CALLBACK(print_destroy_cb), &export_psml_win);
-}
-#endif
-
-/*
- * Keep a static pointer to the current "Export pdml" window, if any, so that if
- * somebody tries to do "File:Export to pdml" while there's already a "Export pdml" window
- * up, we just pop up the existing one, rather than creating a new one.
- */
-static GtkWidget *export_pdml_win = NULL;
-
-static print_args_t export_pdml_args;
-
-static gboolean export_pdml_prefs_init = FALSE;
-
-
-#ifdef _WIN32
-void
-export_pdml_cmd_cb(GtkWidget *widget _U_, gpointer data _U_)
-{
- win32_export_file(GDK_WINDOW_HWND(gtk_widget_get_window(top_level)), &cfile, export_type_pdml);
- return;
-}
-#else
-void
-export_pdml_cmd_cb(GtkWidget *widget _U_, gpointer data _U_)
-{
- print_args_t *args = &export_pdml_args;
-
- if (export_pdml_win != NULL) {
- /* There's already a "Export pdml" dialog box; reactivate it. */
- reactivate_window(export_pdml_win);
- return;
- }
-
- /* get settings from preferences (and other initial values) only once */
- if(export_pdml_prefs_init == FALSE) {
- export_pdml_prefs_init = TRUE;
- args->format = PR_FMT_TEXT; /* XXX */
- args->to_file = TRUE;
- args->file = g_strdup("");
- args->cmd = g_strdup("");
- args->print_summary = TRUE;
- args->print_col_headings = TRUE;
- args->print_dissections = print_dissections_as_displayed;
- args->print_hex = FALSE;
- args->print_formfeed = FALSE;
- }
-
- /* init the printing range */
- packet_range_init(&args->range, &cfile);
- args->range.process_filtered = TRUE;
-
- export_pdml_win = open_print_dialog("Wireshark: Export as \"PDML\" file", output_action_export_pdml, args);
- g_signal_connect(export_pdml_win, "destroy", G_CALLBACK(print_destroy_cb), &export_pdml_win);
-}
-#endif
-
-/*
- * Keep a static pointer to the current "Export csv" window, if any, so that if
- * somebody tries to do "File:Export to CSV" while there's already a "Export csv" window
- * up, we just pop up the existing one, rather than creating a new one.
- */
-static GtkWidget *export_csv_win = NULL;
-
-static print_args_t export_csv_args;
-
-static gboolean export_csv_prefs_init = FALSE;
-
-#ifdef _WIN32
-void
-export_csv_cmd_cb(GtkWidget *widget _U_, gpointer data _U_)
-{
- win32_export_file(GDK_WINDOW_HWND(gtk_widget_get_window(top_level)), &cfile, export_type_csv);
- return;
-}
-#else
-void
-export_csv_cmd_cb(GtkWidget *widget _U_, gpointer data _U_)
-{
- print_args_t *args = &export_csv_args;
-
- if (export_csv_win != NULL) {
- /* There's already a "Export csv" dialog box; reactivate it. */
- reactivate_window(export_csv_win);
- return;
- }
-
- /* get settings from preferences (and other initial values) only once */
- if(export_csv_prefs_init == FALSE) {
- export_csv_prefs_init = TRUE;
- args->format = PR_FMT_TEXT; /* XXX */
- args->to_file = TRUE;
- args->file = g_strdup("");
- args->cmd = g_strdup("");
- args->print_summary = FALSE;
- args->print_col_headings = FALSE;
- args->print_dissections = print_dissections_none;
- args->print_hex = FALSE;
- args->print_formfeed = FALSE;
- }
-
- /* init the printing range */
- packet_range_init(&args->range, &cfile);
- args->range.process_filtered = TRUE;
-
- export_csv_win = open_print_dialog("Wireshark: Export as \"Comma Separated Values\" File", output_action_export_csv, args);
- g_signal_connect(export_csv_win, "destroy", G_CALLBACK(print_destroy_cb), &export_csv_win);
-}
-#endif
-
-/*
- * Keep a static pointer to the current "Export carrays" window, if any, so that if
- * somebody tries to do "File:Export to carrays" while there's already a "Export carrays" window
- * up, we just pop up the existing one, rather than creating a new one.
- */
-static GtkWidget *export_carrays_win = NULL;
-
-static print_args_t export_carrays_args;
-
-static gboolean export_carrays_prefs_init = FALSE;
-
-#ifdef _WIN32
-void
-export_carrays_cmd_cb(GtkWidget *widget _U_, gpointer data _U_)
-{
- win32_export_file(GDK_WINDOW_HWND(gtk_widget_get_window(top_level)), &cfile, export_type_carrays);
- return;
-}
-#else
-void
-export_carrays_cmd_cb(GtkWidget *widget _U_, gpointer data _U_)
-{
- print_args_t *args = &export_carrays_args;
-
- if (export_carrays_win != NULL) {
- /* There's already a "Export carrays" dialog box; reactivate it. */
- reactivate_window(export_carrays_win);
- return;
- }
-
- /* get settings from preferences (and other initial values) only once */
- if(export_carrays_prefs_init == FALSE) {
- export_carrays_prefs_init = TRUE;
- args->format = PR_FMT_TEXT;
- args->to_file = TRUE;
- args->file = g_strdup("");
- args->cmd = g_strdup("");
- args->print_summary = FALSE;
- args->print_col_headings = FALSE;
- args->print_dissections = print_dissections_none;
- args->print_hex = FALSE;
- args->print_formfeed = FALSE;
- }
-
- /* init the printing range */
- packet_range_init(&args->range, &cfile);
- args->range.process_filtered = TRUE;
-
- export_carrays_win = open_print_dialog("Wireshark: Export as \"C Arrays\" File",
- output_action_export_carrays, args);
- g_signal_connect(export_carrays_win, "destroy", G_CALLBACK(print_destroy_cb), &export_carrays_win);
-}
-#endif
-
-/*
- * Keep a static pointer to the current "Export JSON" window, if any, so that if
- * somebody tries to do "File:Export to JSON" while there's already a "Export JSON" window
- * up, we just pop up the existing one, rather than creating a new one.
- */
-static GtkWidget *export_json_win = NULL;
-
-static print_args_t export_json_args;
-
-static gboolean export_json_prefs_init = FALSE;
-
-
-#ifdef _WIN32
-void
-export_json_cmd_cb(GtkWidget *widget _U_, gpointer data _U_)
-{
- win32_export_file(GDK_WINDOW_HWND(gtk_widget_get_window(top_level)), &cfile, export_type_json);
- return;
-}
-#else
-void
-export_json_cmd_cb(GtkWidget *widget _U_, gpointer data _U_)
-{
- print_args_t *args = &export_json_args;
-
- if (export_json_win != NULL) {
- /* There's already a "Export JSON" dialog box; reactivate it. */
- reactivate_window(export_json_win);
- return;
- }
-
- /* get settings from preferences (and other initial values) only once */
- if(export_json_prefs_init == FALSE) {
- export_json_prefs_init = TRUE;
- args->format = PR_FMT_TEXT; /* XXX */
- args->to_file = TRUE;
- args->file = g_strdup("");
- args->cmd = g_strdup("");
- args->print_summary = TRUE;
- args->print_col_headings = TRUE;
- args->print_dissections = print_dissections_as_displayed;
- args->print_hex = FALSE;
- args->print_formfeed = FALSE;
- }
-
- /* init the printing range */
- packet_range_init(&args->range, &cfile);
- args->range.process_filtered = TRUE;
-
- export_json_win = open_print_dialog("Wireshark: Export as \"JSON\" file", output_action_export_json, args);
- g_signal_connect(export_json_win, "destroy", G_CALLBACK(print_destroy_cb), &export_json_win);
-}
-#endif
-
-static void
-print_browse_file_cb(GtkWidget *file_bt, GtkWidget *file_te)
-{
- file_selection_browse(file_bt, file_te, "Wireshark: Print to File",
- FILE_SELECTION_WRITE_BROWSE);
-}
-
-
-
-/* Open the print dialog */
-static GtkWidget *
-open_print_dialog(const char *title, output_action_e action, print_args_t *args)
-{
- GtkWidget *main_win;
- GtkWidget *main_vb;
-
- GtkWidget *printer_fr, *printer_vb, *export_format_lb;
- GtkWidget *text_rb, *ps_rb, *pdml_rb, *psml_rb, *csv_rb, *carrays_rb, *json_rb;
- GtkWidget *printer_grid, *dest_cb;
-#ifndef _WIN32
- GtkWidget *cmd_lb, *cmd_te;
-#endif
- GtkWidget *file_bt, *file_te;
-
- GtkWidget *range_fr, *range_grid;
-
- GtkWidget *packet_hb;
-
- GtkWidget *format_fr, *format_vb;
- GtkWidget *summary_cb;
- GtkWidget *col_headings_cb;
-
- GtkWidget *details_cb;
- GtkWidget *details_hb, *details_vb;
- GtkWidget *collapse_all_rb, *as_displayed_rb, *expand_all_rb;
- GtkWidget *hex_cb;
- GtkWidget *sep, *formfeed_cb;
-
- GtkWidget *bbox, *ok_bt, *cancel_bt, *help_bt;
-
- /* dialog window */
- main_win = dlg_window_new(title);
-
- /* Vertical enclosing container for each row of widgets */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 5, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_container_add(GTK_CONTAINER(main_win), main_vb);
- gtk_widget_show(main_vb);
-
-/*****************************************************/
-
- /*** printer frame ***/
- printer_fr = gtk_frame_new(action == output_action_print ? "Printer" : "Export to file:");
- gtk_box_pack_start(GTK_BOX(main_vb), printer_fr, TRUE, TRUE, 0);
- gtk_widget_show(printer_fr);
-
- printer_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 5, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(printer_vb), 5);
- gtk_container_add(GTK_CONTAINER(printer_fr), printer_vb);
- gtk_widget_show(printer_vb);
-
- /* "Plain text" / "Postscript" / "PDML", ... radio buttons */
- text_rb = gtk_radio_button_new_with_mnemonic_from_widget(NULL, "Plain _text");
- if (args->format == PR_FMT_TEXT)
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(text_rb), TRUE);
- gtk_widget_set_tooltip_text(text_rb, "Print output in ascii \"plain text\" format. If you're unsure, use this format.");
- gtk_box_pack_start(GTK_BOX(printer_vb), text_rb, FALSE, FALSE, 0);
- if(action == output_action_print)
- gtk_widget_show(text_rb);
-
- ps_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(text_rb), "_PostScript");
- if (args->format == PR_FMT_PS)
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ps_rb), TRUE);
- gtk_widget_set_tooltip_text(ps_rb, "Print output in \"postscript\" format, for postscript capable printers or print servers.");
- gtk_box_pack_start(GTK_BOX(printer_vb), ps_rb, FALSE, FALSE, 0);
- if(action == output_action_print)
- gtk_widget_show(ps_rb);
-
- pdml_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(text_rb), "PDM_L (XML: Packet Details Markup Language)");
- if (action == output_action_export_pdml)
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pdml_rb), TRUE);
- gtk_widget_set_tooltip_text(pdml_rb,
- "Print output in \"PDML\" (Packet Details Markup Language), "
- "an XML based packet data interchange format. "
- "Usually used in combination with the \"Output to file\" option to export packet data into an XML file.");
- gtk_box_pack_start(GTK_BOX(printer_vb), pdml_rb, FALSE, FALSE, 0);
- /* gtk_widget_show(pdml_rb); */
-
- psml_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(text_rb), "PSML (XML: Packet Summary Markup Language)");
- if (action == output_action_export_psml)
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(psml_rb), TRUE);
- gtk_widget_set_tooltip_text(psml_rb,
- "Print output in \"PSML\" (Packet Summary Markup Language), "
- "an XML based packet summary interchange format. "
- "Usually used in combination with the \"Output to file\" option to export packet data into an XML file.");
- gtk_box_pack_start(GTK_BOX(printer_vb), psml_rb, FALSE, FALSE, 0);
- /* gtk_widget_show(psml_rb); */
-
- csv_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(text_rb), "_CSV");
- if (action == output_action_export_csv)
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(csv_rb), TRUE);
- gtk_widget_set_tooltip_text(csv_rb,
- "Print output in \"Comma Separated Values\" (CSV) format, "
- "a text format compatible with OpenOffice and Excel. "
- "One row for each packet, with its timestamp and size.");
- gtk_box_pack_start(GTK_BOX(printer_vb), csv_rb, FALSE, FALSE, 0);
- /* gtk_widget_show(csv_rb); */
-
- carrays_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(text_rb), "C Arrays");
- if (action == output_action_export_carrays)
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(carrays_rb), TRUE);
- gtk_widget_set_tooltip_text(carrays_rb,
- "Print output in C Arrays format, "
- "a text file suitable for use in C/C++ programs. "
- "One char[] for each packet.");
- gtk_box_pack_start(GTK_BOX(printer_vb), carrays_rb, FALSE, FALSE, 0);
- /* gtk_widget_show(carrays_rb); */
-
- json_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(text_rb), "JSON");
- if (action == output_action_export_json)
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(json_rb), TRUE);
- gtk_widget_set_tooltip_text(json_rb,
- "Print output \"JavaScript Object Notation\" (JSON).");
- gtk_box_pack_start(GTK_BOX(printer_vb), json_rb, FALSE, FALSE, 0);
- /* gtk_widget_show(carrays_rb); */
-
- /* printer grid */
- printer_grid = ws_gtk_grid_new();
- gtk_box_pack_start(GTK_BOX(printer_vb), printer_grid, FALSE, FALSE, 0);
-
- ws_gtk_grid_set_row_spacing(GTK_GRID(printer_grid), 5);
- ws_gtk_grid_set_column_spacing(GTK_GRID(printer_grid), 5);
- gtk_widget_show(printer_grid);
-
-
- /* Output to file button */
- dest_cb = gtk_check_button_new_with_mnemonic("Output to _file:");
- if (args->to_file)
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dest_cb), TRUE);
- gtk_widget_set_tooltip_text(dest_cb, "Output to file instead of printer");
- ws_gtk_grid_attach(GTK_GRID(printer_grid), dest_cb, 0, 0, 1, 1);
- if(action == output_action_print)
- gtk_widget_show(dest_cb);
-
- /* File text entry */
- file_te = gtk_entry_new();
- g_object_set_data(G_OBJECT(dest_cb), PRINT_FILE_TE_KEY, file_te);
- gtk_widget_set_tooltip_text(file_te, "Enter Output filename");
- gtk_entry_set_text(GTK_ENTRY(file_te), args->file);
- ws_gtk_grid_attach_extended(GTK_GRID(printer_grid), file_te, 1, 0, 1, 1, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)0, 0, 0);
- gtk_widget_set_sensitive(file_te, args->to_file);
- gtk_widget_show(file_te);
- if (args->to_file)
- gtk_widget_grab_focus(file_te);
-
- /* "Browse" button */
- file_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_BROWSE);
- g_object_set_data(G_OBJECT(dest_cb), PRINT_FILE_BT_KEY, file_bt);
- g_object_set_data(G_OBJECT(file_bt), PRINT_TE_PTR_KEY, file_te);
- gtk_widget_set_tooltip_text(file_bt, "Browse output filename in filesystem");
- ws_gtk_grid_attach(GTK_GRID(printer_grid), file_bt, 2, 0, 1, 1);
- gtk_widget_set_sensitive(file_bt, args->to_file);
- gtk_widget_show(file_bt);
-
- /* Command label and text entry */
-#ifndef _WIN32
- cmd_lb = gtk_label_new("Print command:");
- g_object_set_data(G_OBJECT(dest_cb), PRINT_CMD_LB_KEY, cmd_lb);
- gtk_misc_set_alignment(GTK_MISC(cmd_lb), 1.0f, 0.5f);
- ws_gtk_grid_attach(GTK_GRID(printer_grid), cmd_lb, 0, 1, 1, 1);
- gtk_widget_set_sensitive(cmd_lb, !args->to_file);
- if(action == output_action_print)
- gtk_widget_show(cmd_lb);
-
- cmd_te = gtk_entry_new();
- g_object_set_data(G_OBJECT(dest_cb), PRINT_CMD_TE_KEY, cmd_te);
- gtk_widget_set_tooltip_text(cmd_te, "Enter print command");
- gtk_entry_set_text(GTK_ENTRY(cmd_te), args->cmd);
- ws_gtk_grid_attach(GTK_GRID(printer_grid), cmd_te, 1, 1, 1, 1);
- gtk_widget_set_sensitive(cmd_te, !args->to_file);
- if(action == output_action_print)
- gtk_widget_show(cmd_te);
-#endif
-
- g_signal_connect(dest_cb, "toggled", G_CALLBACK(print_cmd_toggle_dest), NULL);
- g_signal_connect(file_bt, "clicked", G_CALLBACK(print_browse_file_cb), file_te);
-
- if(action == output_action_export_ps) {
- export_format_lb = gtk_label_new("(PostScript files can be easily converted to PDF files using ghostscript's ps2pdf)");
- gtk_box_pack_start(GTK_BOX(printer_vb), export_format_lb, FALSE, FALSE, 0);
- gtk_widget_show(export_format_lb);
- }
-
-/*****************************************************/
-
- /*** hor box for range and format frames ***/
- packet_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5, FALSE);
- gtk_box_pack_start(GTK_BOX(main_vb), packet_hb, TRUE, TRUE, 0);
- gtk_widget_show(packet_hb);
-
- /*** packet range frame ***/
- range_fr = gtk_frame_new("Packet Range");
- gtk_box_pack_start(GTK_BOX(packet_hb), range_fr, FALSE, FALSE, 0);
- gtk_widget_show(range_fr);
-
- range_grid = range_new(&args->range, FALSE);
- gtk_container_add(GTK_CONTAINER(range_fr), range_grid);
- gtk_widget_show(range_grid);
-
-/*****************************************************/
-
- /*** packet format frame ***/
- format_fr = gtk_frame_new("Packet Format");
- gtk_box_pack_start(GTK_BOX(packet_hb), format_fr, TRUE, TRUE, 0);
- if( action == output_action_print ||
- action == output_action_export_text ||
- action == output_action_export_ps)
- gtk_widget_show(format_fr);
- format_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 5, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(format_vb), 5);
- gtk_container_add(GTK_CONTAINER(format_fr), format_vb);
- gtk_widget_show(format_vb);
-
- /* "Print summary line" check button */
- summary_cb = gtk_check_button_new_with_mnemonic("Packet summary line");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(summary_cb), args->print_summary);
- g_signal_connect(summary_cb, "clicked", G_CALLBACK(print_cmd_toggle_detail), main_win);
- gtk_widget_set_tooltip_text(summary_cb, "Output of a packet summary line, like in the packet list");
- gtk_box_pack_start(GTK_BOX(format_vb), summary_cb, TRUE, TRUE, 0);
- gtk_widget_show(summary_cb);
-
- /* "Include column headings" check button */
- col_headings_cb = gtk_check_button_new_with_mnemonic("Include column headings");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(col_headings_cb), args->print_col_headings);
- gtk_widget_set_sensitive(col_headings_cb, args->print_summary);
- g_signal_connect(col_headings_cb, "clicked", G_CALLBACK(print_cmd_toggle_detail), main_win);
- gtk_widget_set_tooltip_text(col_headings_cb, "Include column headings when printing the packet summary line");
- gtk_box_pack_start(GTK_BOX(format_vb), col_headings_cb, TRUE, TRUE, 0);
- gtk_widget_show(col_headings_cb);
-
- /* "Details" check button */
- details_cb = gtk_check_button_new_with_mnemonic("Packet details:");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(details_cb), args->print_dissections != print_dissections_none);
- g_signal_connect(details_cb, "clicked", G_CALLBACK(print_cmd_toggle_detail), main_win);
- gtk_widget_set_tooltip_text(details_cb, "Output format of the selected packet details (protocol tree).");
- gtk_box_pack_start(GTK_BOX(format_vb), details_cb, TRUE, TRUE, 0);
- gtk_widget_show(details_cb);
-
- /*** packet details ***/
- details_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(details_hb), 0);
- gtk_box_pack_start(GTK_BOX(format_vb), details_hb, TRUE, TRUE, 0);
- gtk_widget_show(details_hb);
-
- details_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(details_vb), 0);
- gtk_box_pack_start(GTK_BOX(details_hb), details_vb, FALSE, FALSE, 10);
- gtk_widget_show(details_vb);
-
- details_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(details_vb), 0);
- gtk_box_pack_start(GTK_BOX(details_hb), details_vb, FALSE, FALSE, 0);
- gtk_widget_show(details_vb);
-
- /* "All collapsed"/"As displayed"/"All Expanded" radio buttons */
- collapse_all_rb = gtk_radio_button_new_with_mnemonic_from_widget(NULL, "All co_llapsed");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(collapse_all_rb), args->print_dissections == print_dissections_collapsed);
- gtk_widget_set_sensitive(collapse_all_rb, args->print_dissections != print_dissections_none);
- gtk_widget_set_tooltip_text(collapse_all_rb, "Output of the packet details tree \"collapsed\"");
- gtk_box_pack_start(GTK_BOX(details_vb), collapse_all_rb, TRUE, TRUE, 0);
- gtk_widget_show(collapse_all_rb);
-
- as_displayed_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(collapse_all_rb), "As displa_yed");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(as_displayed_rb), args->print_dissections == print_dissections_as_displayed);
- gtk_widget_set_sensitive(as_displayed_rb, args->print_dissections != print_dissections_none);
- gtk_widget_set_tooltip_text(as_displayed_rb, "Output of the packet details tree \"as displayed\"");
- gtk_box_pack_start(GTK_BOX(details_vb), as_displayed_rb, TRUE, TRUE, 0);
- gtk_widget_show(as_displayed_rb);
-
- expand_all_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(collapse_all_rb), "All e_xpanded");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(expand_all_rb), args->print_dissections == print_dissections_expanded);
- gtk_widget_set_sensitive(expand_all_rb, args->print_dissections != print_dissections_none);
- gtk_widget_set_tooltip_text(expand_all_rb, "Output of the packet details tree \"expanded\"");
- gtk_box_pack_start(GTK_BOX(details_vb), expand_all_rb, TRUE, TRUE, 0);
- gtk_widget_show(expand_all_rb);
-
- /* "Print hex" check button. */
- hex_cb = gtk_check_button_new_with_mnemonic("Packet bytes");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(hex_cb), args->print_hex);
- g_signal_connect(hex_cb, "clicked", G_CALLBACK(print_cmd_toggle_detail), main_win);
- gtk_widget_set_tooltip_text(hex_cb, "Add a hexdump of the packet data");
- gtk_box_pack_start(GTK_BOX(format_vb), hex_cb, TRUE, TRUE, 0);
- gtk_widget_show(hex_cb);
-
- /* separator */
- sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_start(GTK_BOX(format_vb), sep, TRUE, TRUE, 0);
- gtk_widget_show(sep);
-
- /* "Each packet on a new page" check button. */
- formfeed_cb = gtk_check_button_new_with_mnemonic("Each packet on a new page");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(formfeed_cb), args->print_formfeed);
- gtk_widget_set_tooltip_text (formfeed_cb, "When checked, a new page will be used for each packet. "
- "This is done by adding a formfeed (or similar) between the packet outputs.");
- gtk_box_pack_start(GTK_BOX(format_vb), formfeed_cb, TRUE, TRUE, 0);
- gtk_widget_show(formfeed_cb);
-
-
- g_object_set_data(G_OBJECT(main_win), PRINT_ARGS_KEY, args);
- g_object_set_data(G_OBJECT(main_win), PRINT_SUMMARY_CB_KEY, summary_cb);
- g_object_set_data(G_OBJECT(main_win), PRINT_COL_HEADINGS_CB_KEY, col_headings_cb);
- g_object_set_data(G_OBJECT(main_win), PRINT_DETAILS_CB_KEY, details_cb);
- g_object_set_data(G_OBJECT(main_win), PRINT_COLLAPSE_ALL_RB_KEY, collapse_all_rb);
- g_object_set_data(G_OBJECT(main_win), PRINT_AS_DISPLAYED_RB_KEY, as_displayed_rb);
- g_object_set_data(G_OBJECT(main_win), PRINT_EXPAND_ALL_RB_KEY, expand_all_rb);
- g_object_set_data(G_OBJECT(main_win), PRINT_HEX_CB_KEY, hex_cb);
-
-/*****************************************************/
-
-
- /* Button row */
- bbox = dlg_button_row_new(action == output_action_print ? GTK_STOCK_PRINT : GTK_STOCK_OK, GTK_STOCK_CANCEL, GTK_STOCK_HELP, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 0);
- gtk_widget_show(bbox);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), action == output_action_print ? GTK_STOCK_PRINT : GTK_STOCK_OK);
-
- g_object_set_data(G_OBJECT(main_win), PRINT_BT_KEY, ok_bt);
-
- g_object_set_data(G_OBJECT(ok_bt), PRINT_PS_RB_KEY, ps_rb);
- g_object_set_data(G_OBJECT(ok_bt), PRINT_PDML_RB_KEY, pdml_rb);
- g_object_set_data(G_OBJECT(ok_bt), PRINT_PSML_RB_KEY, psml_rb);
- g_object_set_data(G_OBJECT(ok_bt), PRINT_CSV_RB_KEY, csv_rb);
- g_object_set_data(G_OBJECT(ok_bt), PRINT_CARRAYS_RB_KEY, carrays_rb);
- g_object_set_data(G_OBJECT(ok_bt), PRINT_JSON_RB_KEY, json_rb);
- g_object_set_data(G_OBJECT(ok_bt), PRINT_DEST_CB_KEY, dest_cb);
-#ifndef _WIN32
- g_object_set_data(G_OBJECT(ok_bt), PRINT_CMD_TE_KEY, cmd_te);
-#endif
-
- g_object_set_data(G_OBJECT(ok_bt), PRINT_ARGS_KEY, args);
- g_object_set_data(G_OBJECT(ok_bt), PRINT_FILE_TE_KEY, file_te);
- g_object_set_data(G_OBJECT(ok_bt), PRINT_SUMMARY_CB_KEY, summary_cb);
- g_object_set_data(G_OBJECT(ok_bt), PRINT_COL_HEADINGS_CB_KEY, col_headings_cb);
- g_object_set_data(G_OBJECT(ok_bt), PRINT_DETAILS_CB_KEY, details_cb);
- g_object_set_data(G_OBJECT(ok_bt), PRINT_COLLAPSE_ALL_RB_KEY, collapse_all_rb);
- g_object_set_data(G_OBJECT(ok_bt), PRINT_AS_DISPLAYED_RB_KEY, as_displayed_rb);
- g_object_set_data(G_OBJECT(ok_bt), PRINT_EXPAND_ALL_RB_KEY, expand_all_rb);
- g_object_set_data(G_OBJECT(ok_bt), PRINT_HEX_CB_KEY, hex_cb);
- g_object_set_data(G_OBJECT(ok_bt), PRINT_FORMFEED_CB_KEY, formfeed_cb);
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(print_ok_cb), main_win);
- gtk_widget_set_tooltip_text (ok_bt, "Start output");
-
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- window_set_cancel_button(main_win, cancel_bt, window_cancel_button_cb);
- gtk_widget_set_tooltip_text (cancel_bt, "Cancel and exit dialog");
-
- if(action == output_action_print) {
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_PRINT_DIALOG);
- } else {
-#ifdef _WIN32
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_EXPORT_FILE_WIN32_DIALOG);
-#else
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_EXPORT_FILE_DIALOG);
-#endif
- }
-
- gtk_widget_grab_default(ok_bt);
-
- /* Catch the "activate" signal on the "Command" and "File" text entries,
- so that if the user types Return there, we act as if the "OK" button
- had been selected, as happens if Return is typed if some widget
- that *doesn't* handle the Return key has the input focus. */
-#ifndef _WIN32
- dlg_set_activate(cmd_te, ok_bt);
-#endif
- if(action != output_action_print)
- dlg_set_activate(file_te, ok_bt);
-
- g_signal_connect(main_win, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
-
- gtk_widget_show(main_win);
- window_present(main_win);
-
- return main_win;
-}
-
-
-/* user changed "print to" destination */
-static void
-print_cmd_toggle_dest(GtkWidget *widget, gpointer data _U_)
-{
-#ifndef _WIN32
- GtkWidget *cmd_lb, *cmd_te;
-#endif
- GtkWidget *file_bt, *file_te;
- int to_file;
-
-#ifndef _WIN32
- cmd_lb = GTK_WIDGET(g_object_get_data(G_OBJECT(widget), PRINT_CMD_LB_KEY));
- cmd_te = GTK_WIDGET(g_object_get_data(G_OBJECT(widget), PRINT_CMD_TE_KEY));
-#endif
- file_bt = GTK_WIDGET(g_object_get_data(G_OBJECT(widget), PRINT_FILE_BT_KEY));
- file_te = GTK_WIDGET(g_object_get_data(G_OBJECT(widget), PRINT_FILE_TE_KEY));
-
- to_file = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget));
-#ifndef _WIN32
- gtk_widget_set_sensitive(cmd_lb, !to_file);
- gtk_widget_set_sensitive(cmd_te, !to_file);
-#endif
- gtk_widget_set_sensitive(file_bt, to_file);
- gtk_widget_set_sensitive(file_te, to_file);
-}
-
-
-/* user changed "packet details" */
-static void
-print_cmd_toggle_detail(GtkWidget *widget _U_, gpointer data)
-{
- GtkWidget *print_bt, *summary_cb, *col_headings_cb, *details_cb;
- GtkWidget *collapse_all_rb, *expand_all_rb, *as_displayed_rb, *hex_cb;
- gboolean print_detail, print_summary;
-
- print_bt = GTK_WIDGET(g_object_get_data(G_OBJECT(data), PRINT_BT_KEY));
- summary_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(data), PRINT_SUMMARY_CB_KEY));
- col_headings_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(data), PRINT_COL_HEADINGS_CB_KEY));
- details_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(data), PRINT_DETAILS_CB_KEY));
- collapse_all_rb = GTK_WIDGET(g_object_get_data(G_OBJECT(data), PRINT_COLLAPSE_ALL_RB_KEY));
- as_displayed_rb = GTK_WIDGET(g_object_get_data(G_OBJECT(data), PRINT_AS_DISPLAYED_RB_KEY));
- expand_all_rb = GTK_WIDGET(g_object_get_data(G_OBJECT(data), PRINT_EXPAND_ALL_RB_KEY));
- hex_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(data), PRINT_HEX_CB_KEY));
-
- /* If user disabled summary, disable the column headings checkbox too. */
- print_summary = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (summary_cb));
- gtk_widget_set_sensitive(col_headings_cb, print_summary);
-
- /* If user disabled details, disable the corresponding buttons */
- print_detail = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (details_cb));
- gtk_widget_set_sensitive(collapse_all_rb, print_detail);
- gtk_widget_set_sensitive(as_displayed_rb, print_detail);
- gtk_widget_set_sensitive(expand_all_rb, print_detail);
-
- /* if user selected nothing to print at all, disable the "ok" button */
- gtk_widget_set_sensitive(print_bt,
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (summary_cb)) ||
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (details_cb)) ||
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (hex_cb)));
-}
-
-
-static void
-print_ok_cb(GtkWidget *ok_bt, gpointer parent_w)
-{
- GtkWidget *button;
- print_args_t *args;
- const gchar *g_dest;
- gchar *f_name;
- gchar *dirname;
- gboolean export_as_pdml = FALSE, export_as_psml = FALSE;
- gboolean export_as_csv = FALSE, export_as_json = FALSE;
- gboolean export_as_carrays = FALSE;
-#ifdef _WIN32
- gboolean win_printer = FALSE;
- int tmp_fd;
- char *tmp_namebuf;
- char *tmp_oldfile = NULL;
-#endif
- cf_print_status_t status;
-
- args = (print_args_t *)g_object_get_data(G_OBJECT(ok_bt), PRINT_ARGS_KEY);
-
- /* Check whether the range is valid. */
- if (!range_check_validity(&args->range)) {
- /* The range isn't valid; don't dismiss the print/export dialog box,
- just leave it around so that the user can, after they
- dismiss the alert box popped up for the error, try again. */
- return;
- }
-
- button = (GtkWidget *)g_object_get_data(G_OBJECT(ok_bt), PRINT_DEST_CB_KEY);
- args->to_file = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (button));
-
- if (args->to_file) {
- g_dest = gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(ok_bt),
- PRINT_FILE_TE_KEY)));
- if (!g_dest[0]) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Output to file, but no file specified.");
- return;
- }
- g_free(args->file);
- args->file = g_strdup(g_dest);
- /* Save the directory name for future file dialogs. */
- f_name = g_strdup(g_dest);
- dirname = get_dirname(f_name); /* Overwrites f_name */
- set_last_open_dir(dirname);
- g_free(f_name);
- } else {
-#ifdef _WIN32
- win_printer = TRUE;
- /* We currently don't have a function in util.h to create just a tempfile */
- /* name, so simply create a tempfile using the "official" function, */
- /* then delete this file again. After this, the name MUST be available. */
- /* */
- /* Don't use tmpnam() or such, as this will fail under some ACL */
- /* circumstances: http://bugs.wireshark.org/bugzilla/show_bug.cgi?id=358 */
- /* Also: tmpnam is "insecure" and should not be used. */
- tmp_fd = create_tempfile(&tmp_namebuf, "wshprint", NULL);
- if(tmp_fd == -1) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Couldn't create a temporary file for printing:\n%s", tmp_namebuf);
- return;
- }
- /* remember to restore these values later! */
- tmp_oldfile = args->file;
- args->file = g_strdup(tmp_namebuf);
- ws_unlink(args->file);
- args->to_file = TRUE;
-#else
- g_free(args->cmd);
- args->cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(ok_bt),
- PRINT_CMD_TE_KEY))));
-#endif
- }
-
- args->format = PR_FMT_TEXT;
- button = (GtkWidget *)g_object_get_data(G_OBJECT(ok_bt), PRINT_PS_RB_KEY);
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (button)))
- args->format = PR_FMT_PS;
- button = (GtkWidget *)g_object_get_data(G_OBJECT(ok_bt), PRINT_PDML_RB_KEY);
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (button)))
- export_as_pdml = TRUE;
- button = (GtkWidget *)g_object_get_data(G_OBJECT(ok_bt), PRINT_PSML_RB_KEY);
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (button)))
- export_as_psml = TRUE;
- button = (GtkWidget *)g_object_get_data(G_OBJECT(ok_bt), PRINT_CSV_RB_KEY);
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (button)))
- export_as_csv = TRUE;
- button = (GtkWidget *)g_object_get_data(G_OBJECT(ok_bt), PRINT_CARRAYS_RB_KEY);
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (button)))
- export_as_carrays = TRUE;
- button = (GtkWidget *)g_object_get_data(G_OBJECT(ok_bt), PRINT_JSON_RB_KEY);
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (button)))
- export_as_json = TRUE;
-
- button = (GtkWidget *)g_object_get_data(G_OBJECT(ok_bt), PRINT_SUMMARY_CB_KEY);
- args->print_summary = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (button));
-
- button = (GtkWidget *)g_object_get_data(G_OBJECT(ok_bt), PRINT_COL_HEADINGS_CB_KEY);
- args->print_col_headings = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (button));
-
- button = (GtkWidget *)g_object_get_data(G_OBJECT(ok_bt), PRINT_COLLAPSE_ALL_RB_KEY);
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (button))) {
- args->print_dissections = print_dissections_collapsed;
- }
- button = (GtkWidget *)g_object_get_data(G_OBJECT(ok_bt), PRINT_AS_DISPLAYED_RB_KEY);
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (button))) {
- args->print_dissections = print_dissections_as_displayed;
- }
- button = (GtkWidget *)g_object_get_data(G_OBJECT(ok_bt), PRINT_EXPAND_ALL_RB_KEY);
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (button))) {
- args->print_dissections = print_dissections_expanded;
- }
-
- /* the details setting has priority over the radio buttons */
- button = (GtkWidget *)g_object_get_data(G_OBJECT(ok_bt), PRINT_DETAILS_CB_KEY);
- if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (button))) {
- args->print_dissections = print_dissections_none;
- }
-
- button = (GtkWidget *)g_object_get_data(G_OBJECT(ok_bt), PRINT_HEX_CB_KEY);
- args->print_hex = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (button));
-
- button = (GtkWidget *)g_object_get_data(G_OBJECT(ok_bt), PRINT_FORMFEED_CB_KEY);
- args->print_formfeed = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (button));
-
-
- window_destroy(GTK_WIDGET(parent_w));
-
- /* Now print/export the packets */
- if (export_as_pdml)
- status = cf_write_pdml_packets(&cfile, args);
- else if (export_as_psml)
- status = cf_write_psml_packets(&cfile, args);
- else if (export_as_csv)
- status = cf_write_csv_packets(&cfile, args);
- else if (export_as_carrays)
- status = cf_write_carrays_packets(&cfile, args);
- else if (export_as_json)
- status = cf_write_json_packets(&cfile, args);
- else {
- switch (args->format) {
-
- case PR_FMT_TEXT:
- if (args->to_file) {
- args->stream = print_stream_text_new(TRUE, args->file);
- if (args->stream == NULL) {
- open_failure_alert_box(args->file, errno, TRUE);
- return;
- }
- } else {
- args->stream = print_stream_text_new(FALSE, args->cmd);
- if (args->stream == NULL) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Couldn't run print command %s.", args->cmd);
- }
- }
- break;
-
- case PR_FMT_PS:
- if (args->to_file) {
- args->stream = print_stream_ps_new(TRUE, args->file);
- if (args->stream == NULL) {
- open_failure_alert_box(args->file, errno, TRUE);
- return;
- }
- } else {
- args->stream = print_stream_ps_new(FALSE, args->cmd);
- if (args->stream == NULL) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Couldn't run print command %s.", args->cmd);
- }
- }
- break;
-
- default:
- g_assert_not_reached();
- return;
- }
- status = cf_print_packets(&cfile, args, TRUE);
- }
- switch (status) {
-
- case CF_PRINT_OK:
- break;
-
- case CF_PRINT_OPEN_ERROR:
- if (args->to_file)
- open_failure_alert_box(args->file, errno, TRUE);
- else
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Couldn't run print command %s.",
- args->cmd);
- break;
-
- case CF_PRINT_WRITE_ERROR:
- if (args->to_file)
- write_failure_alert_box(args->file, errno);
- else
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Error writing to print command: %s", g_strerror(errno));
- break;
- }
-
-#ifdef _WIN32
- if (win_printer) {
- print_mswin(args->file);
-
- /* trash temp file */
- ws_remove(args->file);
- g_free(args->file);
-
- /* restore old settings */
- args->to_file = FALSE;
- args->file = tmp_oldfile;
- }
-#endif
-}
-
-static void
-print_destroy_cb(GtkWidget *win, gpointer user_data)
-{
- GtkWidget *fs;
-
- /* Is there a file selection dialog associated with this
- Print File dialog? */
- fs = (GtkWidget *)g_object_get_data(G_OBJECT(win), E_FILE_SEL_DIALOG_PTR_KEY);
-
- if (fs != NULL) {
- /* Yes. Destroy it. */
- window_destroy(fs);
- }
-
- /* Note that we no longer have a "Print" dialog box. */
- *((gpointer *) user_data) = NULL;
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local Variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/profile_dlg.c b/ui/gtk/profile_dlg.c
deleted file mode 100644
index b1f4264bf2..0000000000
--- a/ui/gtk/profile_dlg.c
+++ /dev/null
@@ -1,1003 +0,0 @@
-/* profile_dlg.c
- * Dialog box for profiles editing
- * Stig Bjorlykke <stig@bjorlykke.org>, 2008
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <errno.h>
-
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-#if GTK_CHECK_VERSION(3,0,0)
-# include <gdk/gdkkeysyms-compat.h>
-#endif
-
-#include <wsutil/filesystem.h>
-#include <epan/prefs.h>
-
-#include "ui/profile.h"
-#include "ui/recent.h"
-#include "ui/simple_dialog.h"
-
-#include "ui/gtk/main.h"
-#include "ui/gtk/menus.h"
-#include "ui/gtk/profile_dlg.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/old-gtk-compat.h"
-#include "ui/gtk/stock_icons.h"
-
-enum {
- NAME_COLUMN,
- GLOBAL_COLUMN,
- DATA_COLUMN,
- NUM_COLUMNS
-};
-
-#define E_PROF_PROFILE_L_KEY "profile_profile_l"
-#define E_PROF_DEL_BT_KEY "profile_del_bt"
-#define E_PROF_NAME_TE_KEY "profile_name_te"
-
-static GtkWidget *global_profile_w = NULL;
-
-#define PROF_OPERATION_NEW 1
-#define PROF_OPERATION_RENAME 2
-
-
-static GtkTreeIter *
-fill_list(GtkWidget *main_w)
-{
- GList *fl_entry;
- profile_def *profile;
- GtkTreeView *profile_l;
- GtkListStore *store;
- GtkTreeIter iter, *l_select = NULL;
- const gchar *profile_name = get_profile_name();
-
- profile_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(main_w), E_PROF_PROFILE_L_KEY));
- store = GTK_LIST_STORE(gtk_tree_view_get_model(profile_l));
-
- init_profile_list();
- fl_entry = edited_profile_list();
- while (fl_entry && fl_entry->data) {
- profile = (profile_def *)fl_entry->data;
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, NAME_COLUMN, profile->name, GLOBAL_COLUMN, profile->is_global, DATA_COLUMN, fl_entry, -1);
-
- if (profile->name && (strcmp(profile_name, profile->name) == 0)) {
- /*
- * XXX - We're assuming that we can just copy a GtkTreeIter
- * and use it later without any crashes. This may not be a
- * valid assumption.
- */
- g_free(l_select);
- l_select = (GtkTreeIter *)g_memdup(&iter, sizeof(iter));
- }
- fl_entry = g_list_next(fl_entry);
- }
-
- return l_select;
-}
-
-static void
-profile_select(GtkWidget *main_w, GtkTreeView *profile_l, gboolean destroy)
-{
- GList *fl_entry;
- profile_def *profile;
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(profile_l));
-
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- gtk_tree_model_get(model, &iter, DATA_COLUMN, &fl_entry, -1);
- if (fl_entry) {
- profile = (profile_def *)fl_entry->data;
- if (profile_exists(profile->name, FALSE) || profile_exists(profile->name, TRUE)) {
- /* The new profile exists, change */
- change_configuration_profile(profile->name);
- } else if (!profile_exists(get_profile_name(), FALSE)) {
- /* The new profile does not exist, and the previous profile has
- been deleted. Change to the default profile */
- change_configuration_profile(NULL);
- }
- }
- }
-
- if (destroy) {
- /*
- * Destroy the profile dialog box.
- */
- empty_profile_list(TRUE);
- window_destroy(main_w);
- }
-}
-
-static void
-profile_apply(GtkWidget *main_w, GtkTreeView *profile_l, gboolean destroy)
-{
- gchar *err_msg;
-
- if ((err_msg = apply_profile_changes()) != NULL) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg);
- g_free(err_msg);
- return;
- }
-
- profile_select(main_w, profile_l, destroy);
-}
-
-static void
-profile_dlg_ok_cb(GtkWidget *ok_bt, gpointer data _U_)
-{
- GtkWidget *main_w = gtk_widget_get_toplevel(ok_bt);
- GtkTreeView *profile_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(main_w), E_PROF_PROFILE_L_KEY));
-
- /*
- * Apply the profile and destroy the dialog box.
- */
- profile_apply(main_w, profile_l, TRUE);
-}
-
-static void
-profile_dlg_apply_cb(GtkWidget *apply_bt, gpointer data _U_)
-{
- GtkWidget *main_w = gtk_widget_get_toplevel(apply_bt);
- GtkTreeView *profile_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(main_w), E_PROF_PROFILE_L_KEY));
-
- /*
- * Apply the profile, but don't destroy the dialog box.
- */
- profile_apply(main_w, profile_l, FALSE);
-}
-
-/* cancel button pressed, revert changes and exit dialog */
-static void
-profile_dlg_cancel_cb(GtkWidget *cancel_bt, gpointer data _U_)
-{
- GtkWidget *main_w = gtk_widget_get_toplevel(cancel_bt);
-
- empty_profile_list(TRUE);
- window_destroy(GTK_WIDGET(main_w));
-}
-
-/* Treat this as a cancel, by calling "profile_dlg_cancel_cb()" */
-static gboolean
-profile_dlg_delete_event_cb(GtkWidget *main_w, GdkEvent *event _U_,
- gpointer data)
-{
- profile_dlg_cancel_cb(main_w, data);
- return FALSE;
-}
-
-static void
-profile_dlg_destroy_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- global_profile_w = NULL;
-}
-
-
-static gboolean
-profile_button_press_cb(GtkWidget *list, GdkEventButton *event, gpointer data _U_)
-{
- if (event->type == GDK_2BUTTON_PRESS) {
- GtkWidget *main_w = gtk_widget_get_toplevel(list);
-
- profile_apply(main_w, GTK_TREE_VIEW(list), TRUE);
- }
-
- return FALSE;
-}
-
-static gboolean
-profile_key_release_cb(GtkWidget *list, GdkEventKey *event, gpointer data _U_)
-{
- if ((event->keyval == GDK_Return) || (event->keyval == GDK_KP_Enter)) {
- GtkWidget *main_w = gtk_widget_get_toplevel(list);
-
- profile_apply(main_w, GTK_TREE_VIEW(list), TRUE);
- }
-
- return FALSE;
-}
-
-static void
-profile_sel_list_cb(GtkTreeSelection *sel, gpointer data _U_)
-{
- GtkWidget *profile_l = GTK_WIDGET(gtk_tree_selection_get_tree_view(sel));
- GtkWidget *main_w = gtk_widget_get_toplevel(profile_l);
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_PROF_NAME_TE_KEY);
- GtkWidget *del_bt = (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_PROF_DEL_BT_KEY);
- profile_def *profile;
- gchar *name = NULL;
- GList *fl_entry;
- gint sensitivity = FALSE;
-
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- gtk_tree_model_get(model, &iter, DATA_COLUMN, &fl_entry, -1);
- if (fl_entry) {
- profile = (profile_def *)fl_entry->data;
- name = g_strdup(profile->name);
- if ((profile->status != PROF_STAT_DEFAULT) && !profile->is_global) {
- sensitivity = TRUE;
- }
- }
- }
-
- /*
- * Did you know that this function is called when the window is destroyed?
- * Funny, that.
- * This means that we have to:
- *
- * attach to the top-level window data items containing pointers to
- * the widgets we affect here;
- *
- * give each of those widgets their own destroy callbacks;
- *
- * clear that pointer when the widget is destroyed;
- *
- * don't do anything to the widget if the pointer we get back is
- * null;
- *
- * so that if we're called after any of the widgets we'd affect are
- * destroyed, we know that we shouldn't do anything to those widgets.
- */
- if (name_te != NULL) {
- gtk_entry_set_text(GTK_ENTRY(name_te), name ? name : "");
- gtk_widget_set_sensitive(name_te, sensitivity);
- }
- if (del_bt != NULL)
- gtk_widget_set_sensitive(del_bt, sensitivity);
- g_free(name);
-}
-
-static void
-profile_new_bt_clicked_cb(GtkWidget *w, gpointer data _U_)
-{
- GtkWidget *main_w = gtk_widget_get_toplevel(w);
- GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_PROF_NAME_TE_KEY);
- GtkTreeView *profile_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(main_w), E_PROF_PROFILE_L_KEY));
- GtkListStore *store;
- GtkTreeIter iter;
- GList *fl_entry;
- const gchar *name = "New profile";
-
- /* Add a new entry to the profile list. */
- fl_entry = add_to_profile_list(name, "", PROF_STAT_NEW, FALSE, FALSE);
-
- store = GTK_LIST_STORE(gtk_tree_view_get_model(profile_l));
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, NAME_COLUMN, name, GLOBAL_COLUMN, FALSE, DATA_COLUMN, fl_entry, -1);
- /* Select the item. */
- gtk_tree_selection_select_iter(gtk_tree_view_get_selection(profile_l), &iter);
-
- gtk_editable_select_region(GTK_EDITABLE(name_te), 0, -1);
- gtk_widget_grab_focus(name_te);
-}
-
-static void
-profile_copy_bt_clicked_cb(GtkWidget *w, gpointer data _U_)
-{
- GtkWidget *main_w = gtk_widget_get_toplevel(w);
- GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_PROF_NAME_TE_KEY);
- GtkTreeView *profile_l = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(main_w), E_PROF_PROFILE_L_KEY));
- GtkListStore *store;
- GtkTreeIter iter;
- GList *fl_entry;
- const gchar *name = gtk_entry_get_text(GTK_ENTRY(name_te));
- const gchar *parent = NULL;
- gchar *new_name;
-
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- profile_def *profile = NULL;
-
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(profile_l));
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- gtk_tree_model_get(model, &iter, DATA_COLUMN, &fl_entry, -1);
- if (fl_entry) {
- profile = (profile_def *)fl_entry->data;
- }
- }
-
- if (profile && profile->is_global) {
- parent = profile->name;
- } else {
- parent = get_profile_parent(name);
- }
-
- if (profile && profile->is_global && !profile_exists(parent, FALSE)) {
- new_name = g_strdup(name);
- } else {
- new_name = g_strdup_printf("%s (copy)", name);
- }
-
- /* Add a new entry to the profile list. */
- fl_entry = add_to_profile_list(new_name, parent, PROF_STAT_COPY, FALSE, profile ? profile->from_global : FALSE);
-
- store = GTK_LIST_STORE(gtk_tree_view_get_model(profile_l));
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, NAME_COLUMN, new_name, GLOBAL_COLUMN, FALSE, DATA_COLUMN, fl_entry, -1);
- /* Select the item. */
- gtk_tree_selection_select_iter(gtk_tree_view_get_selection(profile_l), &iter);
-
- gtk_editable_select_region(GTK_EDITABLE(name_te), 0, -1);
- gtk_widget_grab_focus(name_te);
-
- g_free(new_name);
-}
-
-static void
-profile_name_te_changed_cb(GtkWidget *w, gpointer data _U_)
-{
- GtkWidget *main_w = gtk_widget_get_toplevel(w);
- GtkWidget *name_te = (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_PROF_NAME_TE_KEY);
- GtkWidget *profile_l = (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_PROF_PROFILE_L_KEY);
- profile_def *profile;
- GList *fl_entry;
- const gchar *name;
-
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(profile_l));
- name = gtk_entry_get_text(GTK_ENTRY(name_te));
-
- /* if something was selected */
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- gtk_tree_model_get(model, &iter, DATA_COLUMN, &fl_entry, -1);
- if (fl_entry != NULL) {
- profile = (profile_def *)fl_entry->data;
-
- if ((strlen(name) > 0) && profile && !profile->is_global) {
- if (profile->status != PROF_STAT_DEFAULT) {
- g_free(profile->name);
- profile->name = g_strdup(name);
- if ((profile->status != PROF_STAT_NEW) &&
- (profile->status != PROF_STAT_COPY)) {
- profile->status = PROF_STAT_CHANGED;
- }
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, NAME_COLUMN, name, -1);
- }
- }
- }
- }
-}
-
-static void
-profile_del_bt_clicked_cb(GtkWidget *w, gpointer data _U_)
-{
- GtkWidget *main_w = gtk_widget_get_toplevel(w);
- GtkWidget *profile_l = (GtkWidget *)g_object_get_data(G_OBJECT(main_w), E_PROF_PROFILE_L_KEY);
- GList *fl_entry;
-
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(profile_l));
- /* If something was selected */
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- gtk_tree_model_get(model, &iter, DATA_COLUMN, &fl_entry, -1);
-
- if (fl_entry != NULL) {
- remove_from_profile_list(fl_entry);
- gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
- }
- }
-
- if (gtk_tree_model_get_iter_first(model, &iter)) {
- gtk_tree_selection_select_iter(sel, &iter);
- }
-}
-
-static GtkWidget *
-profile_dialog_new(void)
-{
- GtkWidget *main_w, /* main window */
- *main_vb, /* main container */
- *bbox, /* button container */
- *ok_bt, /* "OK" button */
- *apply_bt, /* "Apply" button */
- *cancel_bt, /* "Cancel" button */
- *help_bt; /* "Help" button */
- GtkWidget *profile_vb, /* profile settings box */
- *props_vb;
- GtkWidget *top_hb,
- *list_bb,
- *new_bt,
- *copy_bt,
- *del_bt,
- *profile_sc,
- *profile_l,
- *middle_hb,
- *name_lb,
- *name_te,
- *profile_fr,
- *edit_fr,
- *props_fr;
- GtkListStore *store;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
- GtkTreeSelection *sel;
- GtkTreeIter *l_select;
- gboolean has_global = has_global_profiles();
-
- /* Get a pointer to a static variable holding the type of profile on
- which we're working, so we can pass that pointer to callback
- routines. */
-
- main_w = dlg_conf_window_new("Wireshark: Configuration Profiles");
- gtk_window_set_default_size(GTK_WINDOW(main_w), 400, 400);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_container_add(GTK_CONTAINER(main_w), main_vb);
- gtk_widget_show(main_vb);
-
- /* Container for each row of widgets */
- profile_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(profile_vb), 0);
- gtk_box_pack_start(GTK_BOX(main_vb), profile_vb, TRUE, TRUE, 0);
- gtk_widget_show(profile_vb);
-
- /* Top row: Buttons and profile list */
- top_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(profile_vb), top_hb, TRUE, TRUE, 0);
- gtk_widget_show(top_hb);
-
- edit_fr = gtk_frame_new("Edit");
- gtk_box_pack_start(GTK_BOX(top_hb), edit_fr, FALSE, FALSE, 0);
- gtk_widget_show(edit_fr);
-
- list_bb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, TRUE);
- gtk_container_set_border_width(GTK_CONTAINER(list_bb), 5);
- gtk_container_add(GTK_CONTAINER(edit_fr), list_bb);
- gtk_widget_show(list_bb);
-
- new_bt = ws_gtk_button_new_from_stock(GTK_STOCK_NEW);
- g_signal_connect(new_bt, "clicked", G_CALLBACK(profile_new_bt_clicked_cb), NULL);
- gtk_widget_show(new_bt);
- gtk_box_pack_start(GTK_BOX(list_bb), new_bt, FALSE, FALSE, 0);
- gtk_widget_set_tooltip_text(new_bt, "Create a new profile (with default properties)");
-
- copy_bt = ws_gtk_button_new_from_stock(GTK_STOCK_COPY);
- g_signal_connect(copy_bt, "clicked", G_CALLBACK(profile_copy_bt_clicked_cb), NULL);
- gtk_widget_show(copy_bt);
- gtk_box_pack_start(GTK_BOX(list_bb), copy_bt, FALSE, FALSE, 0);
- gtk_widget_set_tooltip_text(copy_bt, "Copy the selected profile");
-
- del_bt = ws_gtk_button_new_from_stock(GTK_STOCK_DELETE);
- gtk_widget_set_sensitive(del_bt, FALSE);
- g_signal_connect(del_bt, "clicked", G_CALLBACK(profile_del_bt_clicked_cb), NULL);
- g_object_set_data(G_OBJECT(main_w), E_PROF_DEL_BT_KEY, del_bt);
- gtk_widget_show(del_bt);
- gtk_box_pack_start(GTK_BOX(list_bb), del_bt, FALSE, FALSE, 0);
- gtk_widget_set_tooltip_text(del_bt, "Delete the selected profile");
-
- profile_fr = gtk_frame_new("Configuration Profiles");
- gtk_box_pack_start(GTK_BOX(top_hb), profile_fr, TRUE, TRUE, 0);
- gtk_widget_show(profile_fr);
-
- profile_sc = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(profile_sc),
- GTK_SHADOW_IN);
-
- gtk_container_set_border_width(GTK_CONTAINER(profile_sc), 5);
- gtk_container_add(GTK_CONTAINER(profile_fr), profile_sc);
- gtk_widget_show(profile_sc);
-
- store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_POINTER);
- profile_l = tree_view_new(GTK_TREE_MODEL(store));
- /* Only show headers if having more than one column */
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(profile_l), has_global);
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Name", renderer, "text", NAME_COLUMN, NULL);
- gtk_tree_view_column_set_expand(column, TRUE);
- gtk_tree_view_column_set_sort_column_id(column, NAME_COLUMN);
- gtk_tree_view_append_column(GTK_TREE_VIEW(profile_l), column);
-
- renderer = gtk_cell_renderer_toggle_new();
- column = gtk_tree_view_column_new_with_attributes("Global", renderer, "active", GLOBAL_COLUMN, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(profile_l), column);
- gtk_widget_set_tooltip_text(gtk_tree_view_column_get_button(column),
- "Global profiles will be copied to users profiles when used");
- gtk_tree_view_column_set_visible(column, has_global);
-
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(profile_l));
- gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
- g_signal_connect(sel, "changed", G_CALLBACK(profile_sel_list_cb), profile_vb);
- g_signal_connect(profile_l, "button_press_event", G_CALLBACK(profile_button_press_cb), NULL);
- g_signal_connect(profile_l, "key_release_event", G_CALLBACK(profile_key_release_cb), NULL);
- g_object_set_data(G_OBJECT(main_w), E_PROF_PROFILE_L_KEY, profile_l);
- gtk_container_add(GTK_CONTAINER(profile_sc), profile_l);
- gtk_widget_show(profile_l);
-
- /* fill in data */
- l_select = fill_list(main_w);
-
- g_object_unref(G_OBJECT(store));
-
- props_fr = gtk_frame_new("Properties");
- gtk_box_pack_start(GTK_BOX(profile_vb), props_fr, FALSE, FALSE, 0);
- gtk_widget_show(props_fr);
-
- props_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(props_vb), 5);
- gtk_container_add(GTK_CONTAINER(props_fr), props_vb);
- gtk_widget_show(props_vb);
-
- /* row: Profile name entry */
- middle_hb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(props_vb), middle_hb, TRUE, TRUE, 0);
- gtk_widget_show(middle_hb);
-
- name_lb = gtk_label_new("Profile name:");
- gtk_box_pack_start(GTK_BOX(middle_hb), name_lb, FALSE, FALSE, 0);
- gtk_widget_show(name_lb);
-
- name_te = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(middle_hb), name_te, TRUE, TRUE, 0);
- g_object_set_data(G_OBJECT(main_w), E_PROF_NAME_TE_KEY, name_te);
- g_signal_connect(name_te, "changed", G_CALLBACK(profile_name_te_changed_cb), NULL);
-#ifdef _WIN32
- gtk_widget_set_tooltip_text(name_te,
- "A profile name cannot start or end with a period (.), and cannot"
- " contain any of the following characters:\n \\ / : * ? \" < > |");
-#else
- gtk_widget_set_tooltip_text(name_te, "A profile name cannot contain the '/' character");
-#endif
- gtk_widget_show(name_te);
-
- /* button row(create all possible buttons and hide the unrequired later - it's a lot easier) */
- bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_APPLY, GTK_STOCK_CANCEL, GTK_STOCK_HELP, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 5);
- gtk_widget_show(bbox);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(profile_dlg_ok_cb), NULL);
- gtk_widget_set_tooltip_text(ok_bt, "Apply the profiles and close this dialog");
-
- /* Catch the "activate" signal on the profile name and profile
- list entries, so that if the user types Return
- there, we act as if the "OK" button had been selected, as
- happens if Return is typed if some widget that *doesn't*
- handle the Return key has the input focus. */
- dlg_set_activate(name_te, ok_bt);
-
- apply_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_APPLY);
- g_signal_connect(apply_bt, "clicked", G_CALLBACK(profile_dlg_apply_cb), NULL);
- gtk_widget_set_tooltip_text(apply_bt, "Apply the profiles and keep this dialog open");
-
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- gtk_widget_set_tooltip_text(cancel_bt, "Cancel the changes");
- g_signal_connect(cancel_bt, "clicked", G_CALLBACK(profile_dlg_cancel_cb), NULL);
- window_set_cancel_button(main_w, cancel_bt, NULL);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_CONFIG_PROFILES_DIALOG);
- gtk_widget_set_tooltip_text(help_bt, "Show topic specific help");
-
- if (ok_bt) {
- gtk_widget_grab_default(ok_bt);
- }
-
-
- /* DO SELECTION THINGS *AFTER* SHOWING THE DIALOG! */
- /* otherwise the updatings can get confused */
- if (l_select) {
- gtk_tree_selection_select_iter(sel, l_select);
- g_free(l_select);
- }
-
- if (profile_l) {
- gtk_widget_grab_focus(profile_l);
- }
-
- g_signal_connect(main_w, "delete_event", G_CALLBACK(profile_dlg_delete_event_cb), NULL);
- g_signal_connect(main_w, "destroy", G_CALLBACK(profile_dlg_destroy_cb), NULL);
-
- gtk_widget_show(main_w);
-
- window_present(main_w);
-
- return main_w;
-}
-
-
-static void
-select_profile_cb(GtkWidget *w _U_, gpointer data)
-{
- const gchar *current_profile = get_profile_name();
- gchar *selected_profile = (gchar *)data;
-
- if (strcmp(selected_profile, current_profile) != 0) {
- change_configuration_profile(selected_profile);
- }
-}
-
-gboolean
-profile_show_popup_cb(GtkWidget *w _U_, GdkEvent *event, gpointer user_data _U_)
-{
- GdkEventButton *bevent = (GdkEventButton *)event;
- const gchar *profile_name = get_profile_name();
- gboolean separator_added = FALSE;
- GList *fl_entry;
- profile_def *profile;
- GtkWidget *menu;
- GtkWidget *menu_item;
-
- menu = gtk_menu_new();
-
- if (bevent->button != 1) {
- GtkWidget *change_menu = menus_get_profiles_change_menu();
-
-#if GTK_CHECK_VERSION(2,16,0)
- GtkWidget *rename_menu = menus_get_profiles_rename_menu();
- GtkWidget *delete_menu = menus_get_profiles_delete_menu();
- if (strcmp(profile_name, DEFAULT_PROFILE) != 0) {
- gchar *label;
- label = g_strdup_printf("Rename \"%s\"...", profile_name);
- gtk_menu_item_set_label(GTK_MENU_ITEM(rename_menu), label);
- g_free(label);
- label = g_strdup_printf("Delete \"%s\"", profile_name);
- gtk_menu_item_set_label(GTK_MENU_ITEM(delete_menu), label);
- g_free(label);
- } else {
- gtk_menu_item_set_label(GTK_MENU_ITEM(rename_menu), "Rename...");
- gtk_menu_item_set_label(GTK_MENU_ITEM(delete_menu), "Delete");
- }
-#endif
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(change_menu), menu);
- }
-
- init_profile_list();
- fl_entry = current_profile_list();
- while (fl_entry && fl_entry->data) {
- profile = (profile_def *)fl_entry->data;
-
- if (!profile->is_global || !profile_exists(profile->name, FALSE)) {
- if (profile->is_global && !separator_added) {
- menu_item = gtk_separator_menu_item_new();
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
- gtk_widget_show(menu_item);
- separator_added = TRUE;
- }
- menu_item = gtk_check_menu_item_new_with_label(profile->name);
- if (strcmp(profile->name, profile_name)==0) {
- /* Check current profile */
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_item), TRUE);
- }
- g_object_set(G_OBJECT(menu_item), "draw-as-radio", TRUE, NULL);
- g_signal_connect(menu_item, "activate", G_CALLBACK(select_profile_cb), g_strdup(profile->name));
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
- gtk_widget_show(menu_item);
- }
- fl_entry = g_list_next(fl_entry);
- }
-
- if (bevent->button != 1) {
- /* Second-click is handled in popup_menu_handler() */
- return FALSE;
- }
-
- gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
- bevent->button, bevent->time);
-
- return TRUE;
-}
-
-static void
-profile_name_edit_ok(GtkWidget *w _U_, gpointer parent_w)
-{
- gint operation = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w), "operation"));
- GtkComboBox *combo_box = (GtkComboBox *)g_object_get_data(G_OBJECT(w), "create_from");
- GtkWidget *entry = (GtkWidget *)g_object_get_data(G_OBJECT(w), "entry");
- GtkTreeStore *store;
- GtkTreeIter iter;
- const gchar *new_name = gtk_entry_get_text(GTK_ENTRY(entry));
- const gchar *profile_name = "";
- gboolean from_global = FALSE;
- char *pf_dir_path, *pf_dir_path2, *pf_filename, *valid_name;
-
- if (strlen(new_name) == 0) {
- return;
- }
- valid_name = profile_name_is_valid(new_name);
- if (valid_name != NULL) {
- g_free(valid_name);
- return;
- }
-
- switch (operation) {
- case PROF_OPERATION_NEW:
- if (gtk_combo_box_get_active_iter(combo_box, &iter)) {
- store = GTK_TREE_STORE(gtk_combo_box_get_model(combo_box));
- gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 0, &profile_name, 1, &from_global, -1);
- }
- break;
- case PROF_OPERATION_RENAME:
- profile_name = get_profile_name();
- if (strcmp(new_name, profile_name) == 0) {
- /* Rename without a change, do nothing */
- window_destroy(GTK_WIDGET(parent_w));
- return;
- }
- break;
- default:
- g_assert_not_reached();
- }
-
- if (profile_exists(new_name, FALSE)) {
- simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK,
- "The profile already exists:\n%s.", new_name);
- return;
- }
-
- /* Write recent file for profile we are leaving */
- write_profile_recent();
-
- switch (operation) {
- case PROF_OPERATION_NEW:
- if (create_persconffile_profile(new_name, &pf_dir_path) == -1) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't create directory\n\"%s\":\n%s.",
- pf_dir_path, g_strerror(errno));
-
- g_free(pf_dir_path);
- } else if (strlen(profile_name) &&
- (copy_persconffile_profile(new_name, profile_name, from_global, &pf_filename,
- &pf_dir_path, &pf_dir_path2) != 0))
- {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't copy file \"%s\" in directory\n\"%s\" to\n\"%s\":\n%s.",
- pf_filename, pf_dir_path2, pf_dir_path, g_strerror(errno));
-
- g_free(pf_filename);
- g_free(pf_dir_path);
- g_free(pf_dir_path2);
- } else {
- change_configuration_profile(new_name);
- }
- break;
- case PROF_OPERATION_RENAME:
- if (rename_persconffile_profile(profile_name, new_name,
- &pf_dir_path, &pf_dir_path2) == -1) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't rename directory\n\"%s\" to\n\"%s\":\n%s.",
- pf_dir_path, pf_dir_path2, g_strerror(errno));
-
- g_free(pf_dir_path);
- g_free(pf_dir_path2);
- } else {
- change_configuration_profile(new_name);
- }
- break;
- default:
- g_assert_not_reached();
- }
-
- window_destroy(GTK_WIDGET(parent_w));
-}
-
-static void
-profile_rename_cancel(GtkWidget *w _U_, gpointer parent_w)
-{
- window_destroy(GTK_WIDGET(parent_w));
-}
-
-static void
-profile_manage_profiles_dlg(gint operation)
-{
- GtkWidget *win, *main_grid, *main_vb, *bbox, *cancel_bt, *ok_bt;
- GtkWidget *entry, *label;
- GtkWidget *combo_box = NULL;
- GtkCellRenderer *cell;
- GtkTreeStore *store;
- GtkTreeIter iter, parent;
- gchar *window_title = NULL;
- GList *fl_entry;
- profile_def *profile;
- const gchar *profile_name;
- gboolean has_global = has_global_profiles();
-
- profile_name = get_profile_name();
-
- switch (operation) {
- case PROF_OPERATION_NEW:
- window_title = g_strdup("Create New Profile");
- break;
- case PROF_OPERATION_RENAME:
- window_title = g_strdup_printf("Rename: %s", profile_name);
- break;
- default:
- g_assert_not_reached();
- }
-
- win = dlg_window_new(window_title);
- g_free(window_title);
-
- gtk_window_set_resizable(GTK_WINDOW(win), FALSE);
- gtk_window_resize(GTK_WINDOW(win), 400, 100);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 5, FALSE);
- gtk_container_add(GTK_CONTAINER(win), main_vb);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 6);
-
- main_grid = ws_gtk_grid_new();
- gtk_box_pack_start(GTK_BOX(main_vb), main_grid, FALSE, FALSE, 0);
- ws_gtk_grid_set_column_spacing(GTK_GRID(main_grid), 10);
- ws_gtk_grid_set_row_spacing(GTK_GRID(main_grid), 5);
-
- if (operation == PROF_OPERATION_NEW) {
- label = gtk_label_new("Create from:");
- gtk_widget_set_tooltip_text(label, "All configuration files will be copied from this profile");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), label, 0, 0, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(label), 1.0f, 0.5f);
-
- store = gtk_tree_store_new(3, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN);
- combo_box = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store));
- gtk_widget_set_tooltip_text(combo_box, "All configuration files will be copied from this profile");
-
- cell = gtk_cell_renderer_text_new();
- gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo_box), cell, TRUE);
- gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo_box), cell,
- "text", 0, "sensitive", 2,
- NULL);
-
- gtk_tree_store_append(store, &iter, NULL);
- gtk_tree_store_set(store, &iter, 0, "", 1, FALSE, 2, TRUE, -1);
-
- if (has_global) {
- gtk_tree_store_append(store, &parent, NULL);
- gtk_tree_store_set(store, &parent, 0, "Personal", 1, FALSE, 2, FALSE, -1);
- }
-
- init_profile_list();
- fl_entry = current_profile_list();
-
- while (fl_entry && fl_entry->data) {
- profile = (profile_def *)fl_entry->data;
- if (!profile->is_global) {
- gtk_tree_store_append(store, &iter, has_global ? &parent : NULL);
- gtk_tree_store_set(store, &iter, 0, profile->name, 1, FALSE, 2, TRUE, -1);
- }
- fl_entry = g_list_next(fl_entry);
- }
-
- if (has_global) {
- gtk_tree_store_append(store, &parent, NULL);
- gtk_tree_store_set(store, &parent, 0, "Global", 1, FALSE, 2, FALSE, -1);
- fl_entry = current_profile_list();
-
- while (fl_entry && fl_entry->data) {
- profile = (profile_def *)fl_entry->data;
- if (profile->is_global) {
- gtk_tree_store_append(store, &iter, &parent);
- gtk_tree_store_set(store, &iter, 0, profile->name, 1, TRUE, 2, TRUE, -1);
- }
- fl_entry = g_list_next(fl_entry);
- }
- }
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), combo_box, 1, 0, 1, 1);
- g_object_unref(store);
- }
-
- label = gtk_label_new("Profile name:");
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), label, 0, 1, 1, 1);
- gtk_misc_set_alignment(GTK_MISC(label), 1.0f, 0.5f);
-
- entry = gtk_entry_new();
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), entry, 1, 1, 1, 1);
- switch (operation) {
- case PROF_OPERATION_NEW:
- gtk_entry_set_text(GTK_ENTRY(entry), "New profile");
- break;
- case PROF_OPERATION_RENAME:
- gtk_entry_set_text(GTK_ENTRY(entry), profile_name);
- break;
- default:
- g_assert_not_reached();
- break;
- }
-#ifdef _WIN32
- gtk_widget_set_tooltip_text(entry,
- "A profile name cannot start or end with a period (.), and cannot"
- " contain any of the following characters:\n \\ / : * ? \" < > |");
-#else
- gtk_widget_set_tooltip_text(entry, "A profile name cannot contain the '/' character");
-#endif
-
- bbox = dlg_button_row_new(GTK_STOCK_CANCEL, GTK_STOCK_OK, NULL);
- gtk_box_pack_end(GTK_BOX(main_vb), bbox, FALSE, FALSE, 0);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- g_object_set_data(G_OBJECT(ok_bt), "entry", entry);
- g_object_set_data(G_OBJECT(ok_bt), "create_from", combo_box);
- g_object_set_data(G_OBJECT(ok_bt), "operation", GINT_TO_POINTER(operation));
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(profile_name_edit_ok), win);
-
- dlg_set_activate(entry, ok_bt);
- gtk_widget_grab_focus(entry);
-
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- g_signal_connect(cancel_bt, "clicked", G_CALLBACK(profile_rename_cancel), win);
- window_set_cancel_button(win, cancel_bt, NULL);
-
- gtk_widget_grab_default(ok_bt);
- gtk_widget_show_all(win);
-}
-
-void
-profile_new_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- profile_manage_profiles_dlg(PROF_OPERATION_NEW);
-}
-
-void
-profile_delete_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- if (delete_current_profile()) {
- /* Change to the default profile (we have to do this ourselves). */
- change_configuration_profile(NULL);
- }
-}
-
-void
-profile_rename_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- profile_manage_profiles_dlg(PROF_OPERATION_RENAME);
-}
-
-/* Create a profile dialog for editing display profiles; this is to be used
- as a callback for menu items, toolbars, etc.. */
-void
-profile_dialog_cb(GtkWidget *w _U_)
-{
- /* Has a profiles dialog box already been opened */
- if (global_profile_w != NULL) {
- /* Yes. Just reactivate it. */
- reactivate_window(global_profile_w);
- } else {
- global_profile_w = profile_dialog_new();
- }
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local Variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/profile_dlg.h b/ui/gtk/profile_dlg.h
deleted file mode 100644
index 2f16a0daa1..0000000000
--- a/ui/gtk/profile_dlg.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/* profile_dlg.h
- * Definitions for dialog box for profiles editing.
- * Stig Bjorlykke <stig@bjorlykke.org>, 2008
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __PROFILE_DLG_H__
-#define __PROFILE_DLG_H__
-
-/** @file
- * "Configuration Profiles" dialog box
- * @ingroup dialog_group
- */
-
-/** User requested the "Configuration Profiles" popup menu.
- *
- * @param w parent widget
- * @param event button event
- * @param user_data pointer to user_data (unused)
- */
-gboolean profile_show_popup_cb(GtkWidget *w _U_, GdkEvent *event, gpointer user_data _U_);
-
-/** User requested to create a new profile.
- *
- * @param w parent widget (unused)
- * @param data pointer to user_data (unused)
- */
-void profile_new_cb (GtkWidget *w _U_, gpointer data _U_);
-
-/** User requested to delete the current profile.
- *
- * @param w parent widget (unused)
- * @param data pointer to user_data (unused)
- */
-void profile_delete_cb (GtkWidget *w _U_, gpointer data _U_);
-
-/** User requested to edit the current profile.
- *
- * @param w parent widget (unused)
- * @param data pointer to user_data (unused)
- */
-void profile_rename_cb (GtkWidget *w _U_, gpointer data _U_);
-
-/** User requested the "Configuration Profiles" dialog box by menu or toolbar.
- *
- * @param widget parent widget
- */
-void profile_dialog_cb(GtkWidget *widget);
-
-#endif /* profile_dlg.h */
diff --git a/ui/gtk/progress_dlg.c b/ui/gtk/progress_dlg.c
deleted file mode 100644
index 3e65547345..0000000000
--- a/ui/gtk/progress_dlg.c
+++ /dev/null
@@ -1,422 +0,0 @@
-/* progress_dlg.c
- * Routines for progress-bar (modal) dialog
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include "ui/progress_dlg.h"
-
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_utils.h"
-
-
-#define PROG_BAR_KEY "progress_bar"
-
-static gboolean delete_event_cb(GtkWidget *w, GdkEvent *event, gpointer data);
-static void stop_cb(GtkWidget *w, gpointer data);
-
-/*
- * Define the structure describing a progress dialog.
- */
-struct progdlg {
- GtkWidget *dlg_w; /* top-level window widget */
- GTimeVal start_time;
- GTimeVal last_time; /* last time it was updated */
-
- GtkLabel *status_lb;
- GtkLabel *elapsed_lb;
- GtkLabel *time_left_lb;
- GtkLabel *percentage_lb;
- gchar *title;
-};
-
-/*
- * Create and pop up the progress dialog; allocate a "progdlg_t"
- * and initialize it to contain all information the implementation
- * needs in order to manipulate the dialog, and return a pointer to
- * it.
- *
- * The first argument is the task to do, e.g. "Loading".
- * The second argument is the item to do, e.g. "capture.cap".
- * The third argument is TRUE if the "terminate this operation" button should
- * be a "Stop" button (meaning that the operation is stopped, but not undone),
- * and FALSE if it should be a "Cancel" button (meaning that it's stopped
- * and anything it's done would be undone)
- * The fourth argument is a pointer to a Boolean variable that will be
- * set to TRUE if the user hits that button.
- *
- * XXX - provide a way to specify the progress in units, with the total
- * number of units specified as an argument when the progress dialog
- * is created; updates would be given in units, with the progress dialog
- * code computing the percentage, and the progress bar would have a
- * label "0" on the left and <total number of units> on the right, with
- * a label in the middle giving the number of units we've processed
- * so far. This could be used when filtering packets, for example; we
- * wouldn't always use it, as we have no idea how many packets are to
- * be read.
- */
-progdlg_t *
-create_progress_dlg(gpointer top_level_window _U_, const gchar *task_title, const gchar *item_title,
- gboolean terminate_is_stop, gboolean *stop_flag)
-{
- progdlg_t *dlg;
- GtkWidget *dlg_w, *main_vb, *title_lb, *status_lb, *elapsed_lb, *time_left_lb, *percentage_lb;
- GtkWidget *prog_bar, *bbox, *cancel_bt;
- GtkWidget *static_vb, *tmp_lb, *main_hb, *dynamic_vb, *percentage_hb;
- gchar *task_title_dup;
- gchar *item_title_dup;
-
- dlg = (progdlg_t *)g_malloc(sizeof (progdlg_t));
-
- /* limit the item_title to some reasonable length */
- item_title_dup = g_strdup(item_title);
- if (strlen(item_title_dup) > 110) {
- g_strlcpy(&item_title_dup[100], "...", 4);
- }
-
- dlg->title = g_strdup_printf("%s: %s", task_title, item_title_dup);
-
- dlg_w = dlg_window_new(dlg->title);
- gtk_window_set_modal(GTK_WINDOW(dlg_w), TRUE);
-
- /*
- * Container for dialog widgets.
- */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 1, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- gtk_container_add(GTK_CONTAINER(dlg_w), main_vb);
-
- /*
- * Static labels (left dialog side, labels aligned to the right)
- */
- static_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 1, FALSE);
- task_title_dup = g_strdup_printf ("%s:", task_title);
- tmp_lb = gtk_label_new(task_title_dup);
- gtk_misc_set_alignment(GTK_MISC(tmp_lb), 1.0f, 0.0f);
- gtk_box_pack_start(GTK_BOX(static_vb), tmp_lb, FALSE, TRUE, 3);
- tmp_lb = gtk_label_new("Status:");
- gtk_misc_set_alignment(GTK_MISC(tmp_lb), 1.0f, 0.0f);
- gtk_box_pack_start(GTK_BOX(static_vb), tmp_lb, FALSE, TRUE, 3);
- tmp_lb = gtk_label_new("Elapsed Time:");
- gtk_misc_set_alignment(GTK_MISC(tmp_lb), 1.0f, 0.0f);
- gtk_box_pack_start(GTK_BOX(static_vb), tmp_lb, FALSE, TRUE, 3);
- tmp_lb = gtk_label_new("Time Left:");
- gtk_misc_set_alignment(GTK_MISC(tmp_lb), 1.0f, 0.0f);
- gtk_box_pack_start(GTK_BOX(static_vb), tmp_lb, FALSE, TRUE, 3);
- tmp_lb = gtk_label_new("Progress:");
- gtk_misc_set_alignment(GTK_MISC(tmp_lb), 1.0f, 0.0f);
- gtk_box_pack_start(GTK_BOX(static_vb), tmp_lb, FALSE, TRUE, 3);
-
-
- /*
- * Dynamic labels (right dialog side, labels aligned to the left)
- */
- dynamic_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 1, FALSE);
-
- /*
- * Put the item_title here as a label indicating what we're
- * doing; set its alignment and padding so it's aligned on the
- * left.
- */
- title_lb = gtk_label_new(item_title_dup);
- gtk_box_pack_start(GTK_BOX(dynamic_vb), title_lb, FALSE, TRUE, 3);
- gtk_misc_set_alignment(GTK_MISC(title_lb), 0.0f, 0.0f);
- gtk_misc_set_padding(GTK_MISC(title_lb), 0, 0);
-
- /* same for "Status" */
- status_lb = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(dynamic_vb), status_lb, FALSE, TRUE, 3);
- gtk_misc_set_alignment(GTK_MISC(status_lb), 0.0f, 0.0f);
- gtk_misc_set_padding(GTK_MISC(status_lb), 0, 0);
- dlg->status_lb = (GtkLabel *) status_lb;
-
- /* same for "Elapsed Time" */
- elapsed_lb = gtk_label_new("00:00");
- gtk_box_pack_start(GTK_BOX(dynamic_vb), elapsed_lb, FALSE, TRUE, 3);
- gtk_misc_set_alignment(GTK_MISC(elapsed_lb), 0.0f, 0.0f);
- gtk_misc_set_padding(GTK_MISC(elapsed_lb), 0, 0);
- dlg->elapsed_lb = (GtkLabel *) elapsed_lb;
-
- /* same for "Time Left" */
- time_left_lb = gtk_label_new("--:--");
- gtk_box_pack_start(GTK_BOX(dynamic_vb), time_left_lb, FALSE, TRUE, 3);
- gtk_misc_set_alignment(GTK_MISC(time_left_lb), 0.0f, 0.0f);
- gtk_misc_set_padding(GTK_MISC(time_left_lb), 0, 0);
- dlg->time_left_lb = (GtkLabel *) time_left_lb;
-
- /*
- * The progress bar (in its own horizontal box, including
- * percentage value)
- */
- percentage_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1, FALSE);
- gtk_box_pack_start(GTK_BOX(dynamic_vb), percentage_hb, FALSE, TRUE, 3);
-
- prog_bar = gtk_progress_bar_new();
- gtk_box_pack_start(GTK_BOX(percentage_hb), prog_bar, FALSE, TRUE, 3);
-
- percentage_lb = gtk_label_new(" 0%");
- gtk_misc_set_alignment(GTK_MISC(percentage_lb), 0.0f, 0.0f);
- gtk_box_pack_start(GTK_BOX(percentage_hb), percentage_lb, FALSE, TRUE, 3);
- dlg->percentage_lb = (GtkLabel *) percentage_lb;
-
- /*
- * Attach a pointer to the progress bar widget to the top-level widget.
- */
- g_object_set_data(G_OBJECT(dlg_w), PROG_BAR_KEY, prog_bar);
-
- /*
- * Static and dynamic boxes are now complete
- */
- main_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1, FALSE);
- gtk_box_pack_start(GTK_BOX(main_hb), static_vb, FALSE, TRUE, 3);
- gtk_box_pack_start(GTK_BOX(main_hb), dynamic_vb, FALSE, TRUE, 3);
- gtk_box_pack_start(GTK_BOX(main_vb), main_hb, FALSE, TRUE, 3);
-
- /* Button row */
- bbox = dlg_button_row_new(terminate_is_stop ? GTK_STOCK_STOP :
- GTK_STOCK_CANCEL, NULL);
- gtk_container_add(GTK_CONTAINER(main_vb), bbox);
- gtk_widget_show(bbox);
-
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), terminate_is_stop ? GTK_STOCK_STOP :
- GTK_STOCK_CANCEL);
- gtk_widget_grab_default(cancel_bt);
-
- /*
- * Allow user to either click the "Cancel"/"Stop" button, or
- * the close button on the window, to stop an operation in
- * progress.
- */
- g_signal_connect(cancel_bt, "clicked", G_CALLBACK(stop_cb), stop_flag);
- g_signal_connect(dlg_w, "delete_event", G_CALLBACK(delete_event_cb), stop_flag);
-
- gtk_widget_show_all(dlg_w);
-
- dlg->dlg_w = dlg_w;
-
- g_get_current_time(&dlg->start_time);
- memset(&dlg->last_time, 0, sizeof(dlg->last_time));
-
- g_free(task_title_dup);
- g_free(item_title_dup);
-
- return dlg;
-}
-
-progdlg_t *
-delayed_create_progress_dlg(gpointer top_level_window, const gchar *task_title,
- const gchar *item_title, gboolean terminate_is_stop,
- gboolean *stop_flag, const GTimeVal *start_time, gfloat progress)
-{
- GTimeVal time_now;
- gdouble delta_time;
- gdouble min_display;
- progdlg_t *dlg;
-
-#define INIT_DELAY 0.1 * 1e6 /* .1 second = 0.1e6 microseconds */
-#define MIN_DISPLAY_DEFAULT 2.0 * 1e6
-
- /* Create a progress dialog, but only if it's not likely to disappear
- * immediately, which can be disconcerting for the user.
- *
- * Arguments are as for create_progress_dlg(), plus:
- *
- * (a) A pointer to a GTimeVal structure which holds the time at which
- * the caller started to process the data.
- * (b) The current progress as a real number between 0 and 1.
- */
-
- g_get_current_time(&time_now);
-
- /* Get the time elapsed since the caller started processing the data */
-
- delta_time = (time_now.tv_sec - start_time->tv_sec) * 1e6 +
- time_now.tv_usec - start_time->tv_usec;
-
- /* Do nothing for the first INIT_DELAY microseconds */
-
- if (delta_time < INIT_DELAY)
- return NULL;
-
- /* If we create the progress dialog we want it to be displayed for a
- * minimum of MIN_DISPLAY_DEFAULT microseconds. However, if we
- * previously estimated that the progress dialog didn't need to be
- * created and the caller's processing is slowing down (perhaps due
- * to the action of the operating system's scheduler on a compute-
- * intensive task), we tail off the minimum display time such that
- * the progress dialog will always be created after
- * 2*MIN_DISPLAY_DEFAULT microseconds.
- */
-
- if (delta_time <= INIT_DELAY + MIN_DISPLAY_DEFAULT)
- min_display = MIN_DISPLAY_DEFAULT;
- else
- min_display = 2 * MIN_DISPLAY_DEFAULT - delta_time;
- /* = MIN_DISPLAY_DEFAULT - (delta_time - MIN_DISPLAY_DEFAULT) */
-
- /* Assuming the progress increases linearly, see if the progress
- * dialog would be displayed for at least min_display microseconds if
- * we created it now.
- */
-
- if (progress >= (delta_time / (delta_time + min_display)))
- return NULL;
-
- dlg = create_progress_dlg(top_level_window, task_title, item_title, terminate_is_stop,
- stop_flag);
-
- /*
- * Flush out the dialog so we don't see an "empty" one until first update.
- */
- while (gtk_events_pending())
- gtk_main_iteration();
-
- /* set dialog start_time to the start of processing, not box creation */
- dlg->start_time = *start_time;
-
- return dlg;
-}
-
-/*
- * Called when the dialog box is to be deleted.
- * Set the "stop" flag to TRUE, and return TRUE - we don't want the dialog
- * box deleted now, our caller will do so when they see that the
- * "stop" flag is TRUE and abort the operation.
- */
-static gboolean
-delete_event_cb(GtkWidget *w _U_, GdkEvent *event _U_, gpointer data)
-{
- gboolean *stop_flag = (gboolean *) data;
-
- *stop_flag = TRUE;
- return TRUE;
-}
-
-/*
- * Called when the "stop this operation" button is clicked.
- * Set the "stop" flag to TRUE; we don't have to destroy the dialog
- * box, as our caller will do so when they see that the "stop" flag is
- * true and abort the operation.
- */
-static void
-stop_cb(GtkWidget *w _U_, gpointer data)
-{
- gboolean *stop_flag = (gboolean *) data;
-
- *stop_flag = TRUE;
-}
-
-/*
- * Update the progress information of the progress dialog box.
- */
-void
-update_progress_dlg(progdlg_t *dlg, gfloat percentage, const gchar *status)
-{
- GtkWidget *dlg_w = dlg->dlg_w;
- GtkWidget *prog_bar;
- GTimeVal time_now;
- gdouble delta_time;
- gulong ul_left;
- gulong ul_elapsed;
- gulong ul_percentage;
- gchar tmp[100];
-
-
- /* calculate some timing values */
- g_get_current_time(&time_now);
-
- delta_time = (time_now.tv_sec - dlg->last_time.tv_sec) * 1e6 +
- time_now.tv_usec - dlg->last_time.tv_usec;
-
- /* after the first time don't update more than every 100ms */
- if (dlg->last_time.tv_sec && delta_time < 100*1000)
- return;
-
- dlg->last_time = time_now;
- delta_time = (time_now.tv_sec - dlg->start_time.tv_sec) * 1e6 +
- time_now.tv_usec - dlg->start_time.tv_usec;
-
- ul_percentage = (gulong) (percentage * 100);
- ul_elapsed = (gulong) (delta_time / 1000 / 1000);
-
- /* update labels */
- g_snprintf(tmp, sizeof(tmp), "%lu%% of %s", ul_percentage, dlg->title);
- gtk_window_set_title(GTK_WINDOW(dlg_w), tmp);
-
- gtk_label_set_text(dlg->status_lb, status);
-
- g_snprintf(tmp, sizeof(tmp), "%lu%%", ul_percentage);
- gtk_label_set_text(dlg->percentage_lb, tmp);
-
- g_snprintf(tmp, sizeof(tmp), "%02lu:%02lu", ul_elapsed / 60,
- ul_elapsed % 60);
- gtk_label_set_text(dlg->elapsed_lb, tmp);
-
- /* show "Time Left" only,
- * if at least 5% and 3 seconds running (to get a useful estimation) */
- if (ul_percentage >= 5 && delta_time >= 3 * 1e6) {
- ul_left = (gulong) ((delta_time / percentage - delta_time) / 1000 / 1000);
-
- g_snprintf(tmp, sizeof(tmp), "%02lu:%02lu", ul_left / 60,
- ul_left % 60);
- gtk_label_set_text(dlg->time_left_lb, tmp);
- }
-
- /* update progress bar */
- prog_bar = (GtkWidget *)g_object_get_data(G_OBJECT(dlg_w), PROG_BAR_KEY);
- gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(prog_bar), percentage);
-
- /*
- * Flush out the update and process any input events.
- */
- while (gtk_events_pending())
- gtk_main_iteration();
-}
-
-/*
- * Destroy the progress dialog.
- */
-void
-destroy_progress_dlg(progdlg_t *dlg)
-{
- GtkWidget *dlg_w = dlg->dlg_w;
-
- window_destroy(GTK_WIDGET(dlg_w));
- g_free(dlg->title);
- g_free(dlg);
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/proto_dlg.c b/ui/gtk/proto_dlg.c
deleted file mode 100644
index e2a03588fe..0000000000
--- a/ui/gtk/proto_dlg.c
+++ /dev/null
@@ -1,913 +0,0 @@
-/* proto_dlg.c
- *
- * Laurent Deniel <laurent.deniel@free.fr>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 2000 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-#include <string.h>
-
-#include <gtk/gtk.h>
-#if GTK_CHECK_VERSION(3,0,0)
-# include <gdk/gdkkeysyms-compat.h>
-#endif
-
-#include <epan/packet.h>
-#include <epan/prefs.h>
-#include <epan/disabled_protos.h>
-
-#include <wsutil/filesystem.h>
-
-#include "ui/util.h"
-
-#include "ui/gtk/main.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/proto_dlg.h"
-#include "ui/gtk/help_dlg.h"
-#include "simple_dialog.h"
-
-#include "globals.h"
-
-static gboolean set_proto_selection(GtkWidget *);
-static gboolean revert_proto_selection(void);
-
-static GtkWidget *proto_w = NULL;
-
-/* list of protocols */
-static wmem_tree_t *protocol_list = NULL;
-
-/* list of heuristic protocols */
-static wmem_tree_t *heur_protocol_list = NULL;
-
-typedef struct protocol_data {
- const char *name;
- const char *abbrev;
- int hfinfo_index;
- gboolean enabled;
- gboolean was_enabled;
- GtkTreeIter iter;
-} protocol_data_t;
-
-typedef struct heur_protocol_data {
- const char *name;
- const char *abbrev;
- gchar *list_name;
- gboolean enabled;
- gboolean was_enabled;
- GtkTreeIter iter;
-} heur_protocol_data_t;
-
-#define DISABLED "Disabled"
-#define STATUS_TXT(x) ((x) ? "" : DISABLED)
-
-#define ENABLE_COLUMN 0
-#define PROTOCOL_COLUMN 1
-#define DESCRIPTION_COLUMN 2
-#define HEUR_SHORT_NAME_COLUMN 2
-#define PROTO_DATA_COLUMN 3
-
-/* protocol list column header clicked (to change sort) */
-/* grab_focus(treeview) req'd so that type-ahead find works. */
-/* (See comment above). */
-static void
-proto_col_clicked_cb(GtkWidget *col _U_, GtkWidget *proto_list) {
- gtk_widget_grab_focus(proto_list);
-}
-
-/* Status toggled */
-static void
-status_toggled(GtkCellRendererToggle *cell _U_, gchar *path_str, gpointer data)
-{
- GtkTreeModel *model = (GtkTreeModel *)data;
- GtkTreeIter iter;
- GtkTreePath *path = gtk_tree_path_new_from_string(path_str);
- protocol_data_t *p;
-
- gtk_tree_model_get_iter(model, &iter, path);
- gtk_tree_model_get(model, &iter, PROTO_DATA_COLUMN, &p, -1);
-
- if (p->enabled)
- p->enabled = FALSE;
- else
- p->enabled = TRUE;
-
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, ENABLE_COLUMN, p->enabled, -1);
-
- gtk_tree_path_free(path);
-} /* status toggled */
-
-static void
-heur_status_toggled(GtkCellRendererToggle *cell _U_, gchar *path_str, gpointer data)
-{
- GtkTreeModel *model = (GtkTreeModel *)data;
- GtkTreeIter iter;
- GtkTreePath *path = gtk_tree_path_new_from_string(path_str);
- heur_protocol_data_t *p;
-
- gtk_tree_model_get_iter(model, &iter, path);
- gtk_tree_model_get(model, &iter, PROTO_DATA_COLUMN, &p, -1);
-
- if (p->enabled)
- p->enabled = FALSE;
- else
- p->enabled = TRUE;
-
- gtk_list_store_set(GTK_LIST_STORE(model), &iter, ENABLE_COLUMN, p->enabled, -1);
-
- gtk_tree_path_free(path);
-} /* heur_status toggled */
-
-/* XXX - We need callbacks for Gtk2 */
-
-
-/* Toggle All */
-static gboolean toggle_all(const void *key _U_, void *value, void *userdata)
-{
- GtkListStore *s = (GtkListStore *)userdata;
- protocol_data_t *p = (protocol_data_t *)value;
-
- if (p->enabled)
- p->enabled = FALSE;
- else
- p->enabled = TRUE;
-
- gtk_list_store_set(s, &p->iter, ENABLE_COLUMN, p->enabled, -1);
- return FALSE;
-}
-
-static void
-toggle_all_cb(GtkWidget *button _U_, gpointer pl)
-{
- wmem_tree_foreach(protocol_list, toggle_all, GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(pl))));
-}
-
-/* Enable/Disable All Helper */
-struct active_all_data
-{
- GtkListStore *s;
- gboolean new_state;
-};
-
-static gboolean active_all(const void *key _U_, void *value, void *userdata)
-{
- struct active_all_data* data = (struct active_all_data*)userdata;
- protocol_data_t *p = (protocol_data_t *)value;
-
- p->enabled = data->new_state;
- gtk_list_store_set(data->s, &p->iter, ENABLE_COLUMN, data->new_state, -1);
- return FALSE;
-}
-
-static void
-set_active_all(GtkWidget *w, gboolean new_state)
-{
- struct active_all_data data;
-
- data.s = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(w)));
- data.new_state = new_state;
-
- wmem_tree_foreach(protocol_list, active_all, &data);
-}
-
-/* Enable All */
-static void
-enable_all_cb(GtkWidget *button _U_, gpointer pl)
-{
- set_active_all((GtkWidget *)pl, TRUE);
-}
-
-/* Disable All */
-static void
-disable_all_cb(GtkWidget *button _U_, gpointer pl)
-{
- set_active_all((GtkWidget *)pl, FALSE);
-}
-
-static void heur_toggle_all_cb(GtkWidget *button _U_, gpointer pl)
-{
- wmem_tree_foreach(heur_protocol_list, toggle_all, GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(pl))));
-}
-
-static void
-heur_set_active_all(GtkWidget *w, gboolean new_state)
-{
- struct active_all_data data;
-
- data.s = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(w)));
- data.new_state = new_state;
-
- wmem_tree_foreach(heur_protocol_list, active_all, &data);
-}
-
-static void heur_enable_all_cb(GtkWidget *button _U_, gpointer pl)
-{
- heur_set_active_all((GtkWidget *)pl, TRUE);
-}
-
-static void heur_disable_all_cb(GtkWidget *button _U_, gpointer pl)
-{
- heur_set_active_all((GtkWidget *)pl, FALSE);
-}
-
-static void
-proto_destroy_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- proto_w = NULL;
- /* remove protocol list */
- if (protocol_list) {
- /* Keys must be freed because they are strings allocated when values are added */
- wmem_tree_destroy(protocol_list, TRUE, TRUE);
- protocol_list = NULL;
- }
-}
-
-static void
-heur_proto_destroy_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- proto_w = NULL;
- /* remove protocol list */
- if (heur_protocol_list) {
- /* Keys must be freed because they are strings allocated when values are added */
- wmem_tree_destroy(heur_protocol_list, TRUE, TRUE);
- heur_protocol_list = NULL;
- }
-}
-
-/* Update protocol_list and heur_protocol_list 'was_enabled' to current value of 'enabled' */
-static gboolean set_proto_was_enabled(const void *key _U_, void *value, void *userdata _U_)
-{
- protocol_data_t *p = (protocol_data_t *)value;
-
- p->was_enabled = p->enabled;
- return FALSE;
-}
-
-static gboolean set_heur_was_enabled(const void *key _U_, void *value, void *userdata _U_)
-{
- heur_protocol_data_t *p = (heur_protocol_data_t *)value;
-
- p->was_enabled = p->enabled;
- return FALSE;
-}
-
-static void
-update_was_enabled(void)
-{
- wmem_tree_foreach(protocol_list, set_proto_was_enabled, NULL);
- wmem_tree_foreach(heur_protocol_list, set_heur_was_enabled, NULL);
-}
-
-static void
-proto_write(gpointer parent_w _U_)
-{
- /* Save the current state of the enabled/disabled lists. */
- save_enabled_and_disabled_lists();
-}
-
-static void
-proto_ok_cb(GtkWidget *ok_bt _U_, gpointer parent_w)
-{
- gboolean redissect;
-
- /* update the selection now, so we'll save the right things */
- redissect = set_proto_selection(GTK_WIDGET(parent_w));
-
- /* if we don't have a Save button, just save the settings now */
- if (!prefs.gui_use_pref_save) {
- proto_write(parent_w);
- }
-
- window_destroy(GTK_WIDGET(parent_w));
- if (redissect)
- redissect_packets();
-}
-
-static void
-proto_apply_cb(GtkWidget *apply_bt _U_, gpointer parent_w)
-{
- gboolean redissect;
-
- /* update the selection now, so we'll save the right things */
- redissect = set_proto_selection(GTK_WIDGET(parent_w));
-
- /* if we don't have a Save button, just save the settings now */
- if (!prefs.gui_use_pref_save) {
- proto_write(parent_w);
- update_was_enabled();
- }
-
- if (redissect)
- redissect_packets();
-}
-
-static void
-proto_save_cb(GtkWidget *save_bt _U_, gpointer parent_w)
-{
-
- proto_write(parent_w);
-
- if (set_proto_selection(GTK_WIDGET(parent_w))) {
- /* Redissect all the packets, and re-evaluate the display filter. */
- redissect_packets();
- }
-}
-
-static void
-proto_cancel_cb(GtkWidget *cancel_bt _U_, gpointer parent_w)
-{
- gboolean redissect;
-
- redissect = revert_proto_selection();
- window_destroy(GTK_WIDGET(parent_w));
- if (redissect)
- redissect_packets();
-}
-
-/* Treat this as a cancel, by calling "proto_cancel_cb()".
- XXX - that'll destroy the Protocols dialog; will that upset
- a higher-level handler that says "OK, we've been asked to delete
- this, so destroy it"? */
-static gboolean
-proto_delete_event_cb(GtkWidget *proto_w_lcl, GdkEvent *event _U_,
- gpointer dummy _U_)
-{
- proto_cancel_cb(NULL, proto_w_lcl);
- return FALSE;
-}
-
-static gboolean set_proto_decoding(const void *key _U_, void *value, void *userdata)
-{
- protocol_data_t *p = (protocol_data_t *)value;
- gboolean* need_redissect = (gboolean*)userdata;
- protocol_t *protocol;
-
- protocol = find_protocol_by_id(p->hfinfo_index);
- if (proto_is_protocol_enabled(protocol) != p->enabled) {
- proto_set_decoding(p->hfinfo_index, p->enabled);
- *need_redissect = TRUE;
- }
-
- return FALSE;
-}
-
-static gboolean set_heur_decoding(const void *key _U_, void *value, void *userdata)
-{
- heur_protocol_data_t *p = (heur_protocol_data_t *)value;
- gboolean* need_redissect = (gboolean*)userdata;
- heur_dtbl_entry_t* h;
-
- h = find_heur_dissector_by_unique_short_name(p->abbrev);
- if ((h != NULL) && (h->enabled != p->enabled)) {
- h->enabled = p->enabled;
- *need_redissect = TRUE;
- }
-
- return FALSE;
-}
-
-static gboolean
-set_proto_selection(GtkWidget *parent_w _U_)
-{
- gboolean need_redissect = FALSE;
-
- wmem_tree_foreach(protocol_list, set_proto_decoding, &need_redissect);
- wmem_tree_foreach(heur_protocol_list, set_heur_decoding, &need_redissect);
-
- return need_redissect;
-
-} /* set_proto_selection */
-
-/*
- * Undo all the changes we've made to protocol enable flags.
- */
-static gboolean revert_proto_decoding(const void *key _U_, void *value, void *userdata)
-{
- protocol_data_t *p = (protocol_data_t *)value;
- gboolean* need_redissect = (gboolean*)userdata;
- protocol_t *protocol;
-
- protocol = find_protocol_by_id(p->hfinfo_index);
- if (proto_is_protocol_enabled(protocol) != p->was_enabled) {
- proto_set_decoding(p->hfinfo_index, p->was_enabled);
- *need_redissect = TRUE;
- }
-
- return FALSE;
-}
-
-/*
- * Undo all the changes we've made to heuristic enable flags.
- */
-static gboolean revert_heur_decoding(const void *key _U_, void *value, void *userdata)
-{
- heur_protocol_data_t *p = (heur_protocol_data_t *)value;
- gboolean* need_redissect = (gboolean*)userdata;
- heur_dtbl_entry_t* h;
-
- h = find_heur_dissector_by_unique_short_name(p->abbrev);
- if ((h != NULL) && (h->enabled != p->was_enabled)) {
- h->enabled = p->was_enabled;
- *need_redissect = TRUE;
- }
-
- return FALSE;
-}
-
-static gboolean
-revert_proto_selection(void)
-{
- gboolean need_redissect = FALSE;
-
- wmem_tree_foreach(protocol_list, revert_proto_decoding, &need_redissect);
- wmem_tree_foreach(heur_protocol_list, revert_heur_decoding, &need_redissect);
-
- return need_redissect;
-
-} /* revert_proto_selection */
-
-static void
-create_protocol_list(void)
-{
- gint i;
- void *cookie;
- protocol_t *protocol;
- protocol_data_t *p;
-
- if (protocol_list == NULL) {
- protocol_list = wmem_tree_new(NULL);
- }
-
- /* Iterate over all the protocols */
- for (i = proto_get_first_protocol(&cookie); i != -1;
- i = proto_get_next_protocol(&cookie)) {
- if (proto_can_toggle_protocol(i)) {
- p = wmem_new(NULL, protocol_data_t);
- protocol = find_protocol_by_id(i);
- p->name = proto_get_protocol_name(i);
- p->abbrev = proto_get_protocol_short_name(protocol);
- p->hfinfo_index = i;
- p->enabled = proto_is_protocol_enabled(protocol);
- p->was_enabled = p->enabled;
- wmem_tree_insert_string(protocol_list, p->abbrev, p, 0);
- }
- }
-}
-
-static gboolean show_proto_func(const void *key _U_, void *value, void *userdata)
-{
- protocol_data_t *p = (protocol_data_t *)value;
- GtkListStore *proto_store = (GtkListStore*)userdata;
-
- gtk_list_store_append(proto_store, &p->iter);
- gtk_list_store_set(proto_store, &p->iter,
- ENABLE_COLUMN, p->enabled,
- PROTOCOL_COLUMN, p->abbrev,
- DESCRIPTION_COLUMN, p->name,
- PROTO_DATA_COLUMN, p,
- -1);
-
- return FALSE;
-}
-
-static void
-show_proto_selection(GtkListStore *proto_store)
-{
- if (protocol_list == NULL)
- create_protocol_list();
-
- wmem_tree_foreach(protocol_list, show_proto_func, proto_store);
-} /* show_proto_selection */
-
-static void
-populate_heur_dissector_table_entries(const char *table_name _U_,
- heur_dtbl_entry_t *dtbl_entry, gpointer user_data _U_)
-{
- heur_protocol_data_t *p;
-
- if (dtbl_entry->protocol) {
-
- p = wmem_new(NULL, heur_protocol_data_t);
- p->name = dtbl_entry->display_name;
- p->abbrev = dtbl_entry->short_name;
- p->enabled = dtbl_entry->enabled;
- p->list_name = dtbl_entry->list_name;
- p->was_enabled = p->enabled;
- if (heur_protocol_list == NULL) {
- heur_protocol_list = wmem_tree_new(NULL);
- }
-
- wmem_tree_insert_string(heur_protocol_list, p->abbrev, p, 0);
-
- }else{
- g_warning("no protocol info");
- }
-}
-
-static void
-populate_heur_dissector_tables(const char *table_name, struct heur_dissector_list *list, gpointer w)
-{
- if (list) {
- heur_dissector_table_foreach(table_name, populate_heur_dissector_table_entries, w);
- }
-}
-
-static gboolean show_heur_func(const void *key _U_, void *value, void *userdata)
-{
- heur_protocol_data_t *p = (heur_protocol_data_t*)value;
- GtkListStore *proto_store = (GtkListStore*)userdata;
-
- gtk_list_store_append(proto_store, &p->iter);
- gtk_list_store_set(proto_store, &p->iter,
- ENABLE_COLUMN, p->enabled,
- PROTOCOL_COLUMN, p->name,
- HEUR_SHORT_NAME_COLUMN, p->abbrev,
- PROTO_DATA_COLUMN, p,
- -1);
-
- return FALSE;
-}
-
-static void
-show_heur_selection(GtkListStore *proto_store)
-{
- if (heur_protocol_list == NULL)
- dissector_all_heur_tables_foreach_table(populate_heur_dissector_tables, NULL, NULL);
-
- wmem_tree_foreach(heur_protocol_list, show_heur_func, proto_store);
-}
-
-static void
-proto_disable_dialog_cb(gpointer dialog _U_, gint btn, gpointer data)
-{
- protocol_t *protocol;
- gint id = GPOINTER_TO_INT(data);
-
- if (btn == ESD_BTN_OK) {
- /* Allow proto_dlg to work with the original settings */
- if (protocol_list == NULL)
- create_protocol_list();
- /* Toggle the protocol if it's enabled and allowed */
- protocol = find_protocol_by_id(id);
- if (proto_is_protocol_enabled(protocol) == TRUE) {
- if (proto_can_toggle_protocol(id) == TRUE) {
- proto_set_decoding(id, FALSE);
- redissect_packets();
- }
- }
- }
-}
-
-void
-proto_disable_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- header_field_info *hfinfo;
- gint id;
- gpointer dialog;
-
- if (cfile.finfo_selected == NULL) {
- /* There is no field selected */
- return;
- }
-
- /* Find the id for the protocol for the selected field. */
- hfinfo = cfile.finfo_selected->hfinfo;
- if (hfinfo->parent == -1)
- id = proto_get_id((protocol_t *)hfinfo->strings);
- else
- id = hfinfo->parent;
-
- dialog = simple_dialog(ESD_TYPE_CONFIRMATION, ESD_BTNS_OK_CANCEL,
- "Do you want to temporarily disable protocol: %s ?",
- proto_registrar_get_abbrev(id));
-
- simple_dialog_set_cb(dialog, proto_disable_dialog_cb, GINT_TO_POINTER(id));
-}
-
-static GtkWidget *
-build_heur_dissectors_treeview(void)
-{
- GtkWidget *bbox, *proto_list, *label, *proto_sw, *proto_vb, *button,
- *ok_bt, *apply_bt, *save_bt, *cancel_bt, *help_bt;
-
- static const gchar *titles[] = { "Status", "Heuristic Protocol", "Short name"};
- GtkListStore *proto_store;
- GtkCellRenderer *proto_rend;
- GtkTreeViewColumn *proto_col;
-
- /* Protocol list */
- proto_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_widget_show(proto_vb);
-
- proto_sw = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(proto_sw),
- GTK_SHADOW_IN);
- gtk_box_pack_start(GTK_BOX(proto_vb), proto_sw, TRUE, TRUE, 0);
- gtk_widget_show(proto_sw);
-
- proto_store = gtk_list_store_new(4, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER);
- show_heur_selection(proto_store);
- /* default sort on "abbrev" column */
- gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(proto_store), PROTOCOL_COLUMN,
- GTK_SORT_ASCENDING);
-
- proto_list = tree_view_new(GTK_TREE_MODEL(proto_store));
- gtk_container_add(GTK_CONTAINER(proto_sw), proto_list);
-
- proto_rend = gtk_cell_renderer_toggle_new();
- g_signal_connect(proto_rend, "toggled", G_CALLBACK(heur_status_toggled), proto_store);
- proto_col = gtk_tree_view_column_new_with_attributes(titles[ENABLE_COLUMN], proto_rend, "active", ENABLE_COLUMN, NULL);
- gtk_tree_view_column_set_sort_column_id(proto_col, ENABLE_COLUMN);
- g_signal_connect(proto_col, "clicked", G_CALLBACK(proto_col_clicked_cb), proto_list);
- gtk_tree_view_append_column(GTK_TREE_VIEW(proto_list), proto_col);
-
- proto_rend = gtk_cell_renderer_text_new();
- proto_col = gtk_tree_view_column_new_with_attributes(titles[PROTOCOL_COLUMN], proto_rend, "text", PROTOCOL_COLUMN, NULL);
- gtk_tree_view_column_set_sort_column_id(proto_col, PROTOCOL_COLUMN);
- g_signal_connect(proto_col, "clicked", G_CALLBACK(proto_col_clicked_cb), proto_list);
- gtk_tree_view_append_column(GTK_TREE_VIEW(proto_list), proto_col);
-
- proto_rend = gtk_cell_renderer_text_new();
- proto_col = gtk_tree_view_column_new_with_attributes(titles[HEUR_SHORT_NAME_COLUMN], proto_rend, "text", HEUR_SHORT_NAME_COLUMN, NULL);
- gtk_tree_view_column_set_sort_column_id(proto_col, HEUR_SHORT_NAME_COLUMN);
- g_signal_connect(proto_col, "clicked", G_CALLBACK(proto_col_clicked_cb), proto_list);
- gtk_tree_view_append_column(GTK_TREE_VIEW(proto_list), proto_col);
-
-
- gtk_tree_view_set_search_column(GTK_TREE_VIEW(proto_list), PROTOCOL_COLUMN); /* col 1 in the *model* */
- g_object_unref(G_OBJECT(proto_store));
- gtk_widget_show(proto_list);
-
- label = gtk_label_new("Disabling a heuristic protocol prevents higher layer protocols from being displayed");
- gtk_misc_set_alignment(GTK_MISC(label), 0.5f, 0.5f);
- gtk_widget_show(label);
- gtk_box_pack_start(GTK_BOX(proto_vb), label, FALSE, FALSE, 5);
-
- bbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
- gtk_box_set_spacing(GTK_BOX(bbox), 5);
- gtk_box_pack_start(GTK_BOX(proto_vb), bbox, FALSE, FALSE, 0);
- gtk_widget_show(bbox);
-
- /* Enable All */
- button = gtk_button_new_with_label("Enable All");
- g_signal_connect(button, "clicked", G_CALLBACK(heur_enable_all_cb), proto_list);
- gtk_box_pack_start(GTK_BOX(bbox), button, TRUE, TRUE, 0);
- gtk_widget_show(button);
-
- /* Disable All */
- button = gtk_button_new_with_label("Disable All");
- g_signal_connect(button, "clicked", G_CALLBACK(heur_disable_all_cb), proto_list);
- gtk_box_pack_start(GTK_BOX(bbox), button, TRUE, TRUE, 0);
- gtk_widget_show(button);
-
- /* Invert */
- button = gtk_button_new_with_label("Invert");
- g_signal_connect(button, "clicked", G_CALLBACK(heur_toggle_all_cb), proto_list);
- gtk_box_pack_start(GTK_BOX(bbox), button, TRUE, TRUE, 0);
- gtk_widget_show(button);
-
-
- /* Button row */
- bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_APPLY, GTK_STOCK_SAVE, GTK_STOCK_CANCEL, GTK_STOCK_HELP, NULL);
- gtk_box_pack_start(GTK_BOX(proto_vb), bbox, FALSE, FALSE, 0);
- gtk_widget_show(bbox);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(proto_ok_cb), proto_w);
- gtk_widget_grab_default(ok_bt);
-
- apply_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_APPLY);
- g_signal_connect(apply_bt, "clicked", G_CALLBACK(proto_apply_cb), proto_w);
-
- save_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_SAVE);
- g_signal_connect(save_bt, "clicked", G_CALLBACK(proto_save_cb), proto_w);
-
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- window_set_cancel_button(proto_w, cancel_bt, proto_cancel_cb);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_ENABLED_HEURISTICS_DIALOG);
-
- g_signal_connect(proto_w, "delete_event", G_CALLBACK(proto_delete_event_cb), NULL);
- g_signal_connect(proto_w, "destroy", G_CALLBACK(heur_proto_destroy_cb), NULL);
-
- gtk_widget_show(proto_w);
-
- gtk_widget_grab_focus(proto_list); /* XXX: force focus to the tree_view. This hack req'd so "type-ahead find"
- * will be effective after the window is displayed. The issue is
- * that any call to gtk_tree_view_column_set_sort_column_id above
- * apparently sets the focus to the column header button and thus
- * type-ahead find is, in effect, disabled on the column.
- * Also required: a grab_focus whenever the column header is
- * clicked to change the column sort order since the click
- * also changes the focus to the column header button.
- * Is there a better way to do this ?
- */
-
- /* hide the Save button if the user uses implicit save */
- if(!prefs.gui_use_pref_save) {
- gtk_widget_hide(save_bt);
- }
-
- return proto_vb;
-
-}
-
-static GtkWidget *
-build_protocols_treeview(void)
-{
- GtkWidget *bbox, *proto_list, *label, *proto_sw, *proto_vb, *button,
- *ok_bt, *apply_bt, *save_bt, *cancel_bt, *help_bt;
-
- static const gchar *titles[] = { "Status", "Protocol", "Description" };
- GtkListStore *proto_store;
- GtkCellRenderer *proto_rend;
- GtkTreeViewColumn *proto_col;
-
- /* Protocol list */
- proto_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_widget_show(proto_vb);
-
- proto_sw = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(proto_sw),
- GTK_SHADOW_IN);
- gtk_box_pack_start(GTK_BOX(proto_vb), proto_sw, TRUE, TRUE, 0);
- gtk_widget_show(proto_sw);
-
- proto_store = gtk_list_store_new(4, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER);
-
- show_proto_selection(proto_store);
- /* default sort on "abbrev" column */
- gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(proto_store), PROTOCOL_COLUMN,
- GTK_SORT_ASCENDING);
-
- proto_list = tree_view_new(GTK_TREE_MODEL(proto_store));
- gtk_container_add(GTK_CONTAINER(proto_sw), proto_list);
-
- proto_rend = gtk_cell_renderer_toggle_new();
- g_signal_connect(proto_rend, "toggled", G_CALLBACK(status_toggled), proto_store);
- proto_col = gtk_tree_view_column_new_with_attributes(titles[ENABLE_COLUMN], proto_rend, "active", ENABLE_COLUMN, NULL);
- gtk_tree_view_column_set_sort_column_id(proto_col, ENABLE_COLUMN);
- g_signal_connect(proto_col, "clicked", G_CALLBACK(proto_col_clicked_cb), proto_list);
- gtk_tree_view_append_column(GTK_TREE_VIEW(proto_list), proto_col);
-
- proto_rend = gtk_cell_renderer_text_new();
- proto_col = gtk_tree_view_column_new_with_attributes(titles[PROTOCOL_COLUMN], proto_rend, "text", PROTOCOL_COLUMN, NULL);
- gtk_tree_view_column_set_sort_column_id(proto_col, PROTOCOL_COLUMN);
- g_signal_connect(proto_col, "clicked", G_CALLBACK(proto_col_clicked_cb), proto_list);
- gtk_tree_view_append_column(GTK_TREE_VIEW(proto_list), proto_col);
-
- proto_rend = gtk_cell_renderer_text_new();
- proto_col = gtk_tree_view_column_new_with_attributes(titles[DESCRIPTION_COLUMN], proto_rend, "text", DESCRIPTION_COLUMN, NULL);
- gtk_tree_view_column_set_sort_column_id(proto_col, DESCRIPTION_COLUMN);
- g_signal_connect(proto_col, "clicked", G_CALLBACK(proto_col_clicked_cb), proto_list);
- gtk_tree_view_append_column(GTK_TREE_VIEW(proto_list), proto_col);
-
- gtk_tree_view_set_search_column(GTK_TREE_VIEW(proto_list), PROTOCOL_COLUMN); /* col 1 in the *model* */
- g_object_unref(G_OBJECT(proto_store));
- gtk_widget_show(proto_list);
-
- label = gtk_label_new("Disabling a protocol prevents higher layer protocols from being displayed");
- gtk_misc_set_alignment(GTK_MISC(label), 0.5f, 0.5f);
- gtk_widget_show(label);
- gtk_box_pack_start(GTK_BOX(proto_vb), label, FALSE, FALSE, 5);
-
- bbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
- gtk_box_set_spacing(GTK_BOX(bbox), 5);
- gtk_box_pack_start(GTK_BOX(proto_vb), bbox, FALSE, FALSE, 0);
- gtk_widget_show(bbox);
-
- /* Enable All */
- button = gtk_button_new_with_label("Enable All");
- g_signal_connect(button, "clicked", G_CALLBACK(enable_all_cb), proto_list);
- gtk_box_pack_start(GTK_BOX(bbox), button, TRUE, TRUE, 0);
- gtk_widget_show(button);
-
- /* Disable All */
- button = gtk_button_new_with_label("Disable All");
- g_signal_connect(button, "clicked", G_CALLBACK(disable_all_cb), proto_list);
- gtk_box_pack_start(GTK_BOX(bbox), button, TRUE, TRUE, 0);
- gtk_widget_show(button);
-
- /* Invert */
- button = gtk_button_new_with_label("Invert");
- g_signal_connect(button, "clicked", G_CALLBACK(toggle_all_cb), proto_list);
- gtk_box_pack_start(GTK_BOX(bbox), button, TRUE, TRUE, 0);
- gtk_widget_show(button);
-
-
- /* Button row */
- bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_APPLY, GTK_STOCK_SAVE, GTK_STOCK_CANCEL, GTK_STOCK_HELP, NULL);
- gtk_box_pack_start(GTK_BOX(proto_vb), bbox, FALSE, FALSE, 0);
- gtk_widget_show(bbox);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(proto_ok_cb), proto_w);
- gtk_widget_grab_default(ok_bt);
-
- apply_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_APPLY);
- g_signal_connect(apply_bt, "clicked", G_CALLBACK(proto_apply_cb), proto_w);
-
- save_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_SAVE);
- g_signal_connect(save_bt, "clicked", G_CALLBACK(proto_save_cb), proto_w);
-
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- window_set_cancel_button(proto_w, cancel_bt, proto_cancel_cb);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_ENABLED_PROTOCOLS_DIALOG);
-
- g_signal_connect(proto_w, "delete_event", G_CALLBACK(proto_delete_event_cb), NULL);
- g_signal_connect(proto_w, "destroy", G_CALLBACK(proto_destroy_cb), NULL);
-
- gtk_widget_show(proto_w);
-
- gtk_widget_grab_focus(proto_list); /* XXX: force focus to the tree_view. This hack req'd so "type-ahead find"
- * will be effective after the window is displayed. The issue is
- * that any call to gtk_tree_view_column_set_sort_column_id above
- * apparently sets the focus to the column header button and thus
- * type-ahead find is, in effect, disabled on the column.
- * Also required: a grab_focus whenever the column header is
- * clicked to change the column sort order since the click
- * also changes the focus to the column header button.
- * Is there a better way to do this ?
- */
-
- /* hide the Save button if the user uses implicit save */
- if(!prefs.gui_use_pref_save) {
- gtk_widget_hide(save_bt);
- }
-
- return proto_vb;
-
-}
-
-void
-proto_cb(GtkWidget *w _U_, gpointer data _U_)
-{
-
- GtkWidget *main_vb, *main_nb, *page_lb, *protocols_page;
- GtkWidget *heur_dissectors_page;
- if (proto_w != NULL) {
- reactivate_window(proto_w);
- return;
- }
-
- proto_w = dlg_conf_window_new("Wireshark: Enabled Protocols");
- gtk_window_set_default_size(GTK_WINDOW(proto_w), DEF_WIDTH , DEF_HEIGHT);
-
- /* Container for each row of widgets */
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 6);
- gtk_container_add(GTK_CONTAINER(proto_w), main_vb);
- gtk_widget_show(main_vb);
-
- main_nb = gtk_notebook_new();
- gtk_box_pack_start(GTK_BOX(main_vb), main_nb, TRUE, TRUE, 0);
-
-
- /* Protocol selection tab ("enable/disable" protocols) */
- page_lb = gtk_label_new("Enabled Protocols");
- protocols_page = build_protocols_treeview();
- gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), protocols_page, page_lb);
-
- page_lb = gtk_label_new("Enabled Heuristic dissectors");
- heur_dissectors_page = build_heur_dissectors_treeview();
- gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), heur_dissectors_page, page_lb);
-
- gtk_widget_show_all(proto_w);
- window_present(proto_w);
-} /* proto_cb */
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/proto_dlg.h b/ui/gtk/proto_dlg.h
deleted file mode 100644
index 7fbe64148e..0000000000
--- a/ui/gtk/proto_dlg.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* proto_dlg.h
- *
- * Laurent Deniel <laurent.deniel@free.fr>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 2000 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- */
-
-#ifndef __PROTO_DLG_H__
-#define __PROTO_DLG_H__
-
-/** @file
- * "Enabled Protocols" dialog box.
- * @ingroup dialog_group
- */
-
-/** Show the enabled protocols dialog.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-void proto_cb(GtkWidget *widget, gpointer data);
-
-/** Disable (temporarily) the selected protocol.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-void proto_disable_cb(GtkWidget *widget, gpointer data);
-
-#endif
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/proto_hier_stats_dlg.c b/ui/gtk/proto_hier_stats_dlg.c
deleted file mode 100644
index 974be9a31f..0000000000
--- a/ui/gtk/proto_hier_stats_dlg.c
+++ /dev/null
@@ -1,609 +0,0 @@
-/* proto_hier_stats_dlg.c
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-
-#include "config.h"
-#include "globals.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include "ui/proto_hier_stats.h"
-#include "ui/simple_dialog.h"
-#include <wsutil/utf8_entities.h>
-
-#include "ui/gtk/proto_hier_stats_dlg.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/filter_utils.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/help_dlg.h"
-
-
-enum {
- PROTOCOL_COLUMN,
- PRCT_PKTS_COLUMN,
- PKTS_COLUMN,
- PRCT_BYTES_COLUMN,
- BYTES_COLUMN,
- BANDWIDTH_COLUMN,
- END_PKTS_COLUMN,
- END_BYTES_COLUMN,
- END_BANDWIDTH_COLUMN,
- FILTER_NAME,
- PRCT_PKTS_VALUE_COLUMN,
- PRCT_BYTES_VALUE_COLUMN,
- NUM_STAT_COLUMNS /* must be the last */
-};
-
-typedef struct {
- GtkTreeView *tree_view;
- GtkTreeIter *iter;
- ph_stats_t *ps;
-} draw_info_t;
-
-static GtkWidget *tree;
-
-#define PCT(x,y) (100.0 * (float)(x) / (float)(y))
-#define BANDWIDTH(bytes,secs) ((bytes) * 8.0 / ((secs) * 1000.0 * 1000.0))
-
-static void
-proto_hier_select_filter_cb(GtkWidget *widget _U_, gpointer callback_data _U_, guint callback_action)
-{
- gchar *str = NULL;
- gchar *strtmp = NULL;
- const char *filter = NULL;
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkTreePath *path;
-
- sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(tree));
- if (!gtk_tree_selection_get_selected(sel, &model, &iter))
- return;
- path = gtk_tree_model_get_path(model,&iter);
-
- gtk_tree_model_get (model, &iter, FILTER_NAME, &filter, -1);
- if (filter && strlen(filter) > 0) {
- str = g_strdup(filter);
- } else {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Could not acquire information to build a filter.\nTry expanding or choosing another item.");
- return;
- }
-
- while (gtk_tree_path_up(path) && gtk_tree_path_get_depth(path) > 0)
- {
- strtmp = g_strdup(str);
- g_free(str);
-
- gtk_tree_model_get_iter(model, &iter, path);
- gtk_tree_model_get(model, &iter, FILTER_NAME, &filter, -1);
- if (filter && strlen(filter) > 0) {
- str = g_strdup_printf("%s and %s", strtmp, filter);
- } else {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Could not acquire information to build a filter.\nTry expanding or choosing another item.");
- g_free(strtmp);
- return;
- }
-
- g_free(strtmp);
- }
-
- apply_selected_filter (callback_action, str);
-
- gtk_tree_path_free(path);
- g_free (str);
-}
-
-
-/* Action callbacks */
-static void
-apply_as_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- proto_hier_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_SELECTED, 0));
-}
-static void
-apply_as_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- proto_hier_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_NOT_SELECTED, 0));
-}
-static void
-apply_as_and_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- proto_hier_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_AND_SELECTED, 0));
-}
-static void
-apply_as_or_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- proto_hier_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_OR_SELECTED, 0));
-}
-static void
-apply_as_and_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- proto_hier_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_AND_NOT_SELECTED, 0));
-}
-static void
-apply_as_or_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- proto_hier_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_OR_NOT_SELECTED, 0));
-}
-
-static void
-prep_as_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- proto_hier_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_SELECTED, 0));
-}
-static void
-prep_as_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- proto_hier_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_NOT_SELECTED, 0));
-}
-static void
-prep_as_and_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- proto_hier_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_AND_SELECTED, 0));
-}
-static void
-prep_as_or_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- proto_hier_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_OR_SELECTED, 0));
-}
-static void
-prep_as_and_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- proto_hier_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_AND_NOT_SELECTED, 0));
-}
-static void
-prep_as_or_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- proto_hier_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_OR_NOT_SELECTED, 0));
-}
-
-static void
-find_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- proto_hier_select_filter_cb( widget , user_data, CALLBACK_FIND_FRAME(ACTYPE_SELECTED, 0));
-}
-static void
-find_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- proto_hier_select_filter_cb( widget , user_data, CALLBACK_FIND_FRAME(ACTYPE_NOT_SELECTED, 0));
-}
-static void
-find_prev_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- proto_hier_select_filter_cb( widget , user_data, CALLBACK_FIND_PREVIOUS(ACTYPE_SELECTED, 0));
-}
-static void
-find_prev_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- proto_hier_select_filter_cb( widget , user_data, CALLBACK_FIND_PREVIOUS(ACTYPE_NOT_SELECTED, 0));
-}
-static void
-find_next_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- proto_hier_select_filter_cb( widget , user_data, CALLBACK_FIND_NEXT(ACTYPE_SELECTED, 0));
-}
-static void
-find_next_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- proto_hier_select_filter_cb( widget , user_data, CALLBACK_FIND_NEXT(ACTYPE_NOT_SELECTED, 0));
-}
-static void
-color_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- proto_hier_select_filter_cb( widget , user_data, CALLBACK_COLORIZE(ACTYPE_SELECTED, 0));
-}
-
-
-static const char *ui_desc_proto_hier_stats_filter_popup =
-"<ui>\n"
-" <popup name='ProtoHierStatsFilterPopup'>\n"
-" <menu action='/Apply as Filter'>\n"
-" <menuitem action='/Apply as Filter/Selected'/>\n"
-" <menuitem action='/Apply as Filter/Not Selected'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected'/>\n"
-" </menu>\n"
-" <menu action='/Prepare a Filter'>\n"
-" <menuitem action='/Prepare a Filter/Selected'/>\n"
-" <menuitem action='/Prepare a Filter/Not Selected'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected'/>\n"
-" </menu>\n"
-" <menu action='/Find Frame'>\n"
-" <menu action='/Find Frame/Find Frame'>\n"
-" <menuitem action='/Find Frame/Selected'/>\n"
-" <menuitem action='/Find Frame/Not Selected'/>\n"
-" </menu>\n"
-" <menu action='/Find Frame/Find Next'>\n"
-" <menuitem action='/Find Next/Selected'/>\n"
-" <menuitem action='/Find Next/Not Selected'/>\n"
-" </menu>\n"
-" <menu action='/Find Frame/Find Previous'>\n"
-" <menuitem action='/Find Previous/Selected'/>\n"
-" <menuitem action='/Find Previous/Not Selected'/>\n"
-" </menu>\n"
-" </menu>\n"
-" <menu action='/Colorize Procedure'>\n"
-" <menuitem action='/Colorize Procedure/Colorize Protocol'/>\n"
-" </menu>\n"
-" </popup>\n"
-"</ui>\n";
-
-/*
- * GtkActionEntry
- * typedef struct {
- * const gchar *name;
- * const gchar *stock_id;
- * const gchar *label;
- * const gchar *accelerator;
- * const gchar *tooltip;
- * GCallback callback;
- * } GtkActionEntry;
- * const gchar *name; The name of the action.
- * const gchar *stock_id; The stock id for the action, or the name of an icon from the icon theme.
- * const gchar *label; The label for the action. This field should typically be marked for translation,
- * see gtk_action_group_set_translation_domain().
- * If label is NULL, the label of the stock item with id stock_id is used.
- * const gchar *accelerator; The accelerator for the action, in the format understood by gtk_accelerator_parse().
- * const gchar *tooltip; The tooltip for the action. This field should typically be marked for translation,
- * see gtk_action_group_set_translation_domain().
- * GCallback callback; The function to call when the action is activated.
- *
- */
-static const GtkActionEntry proto_hier_stats_popup_entries[] = {
- { "/Apply as Filter", NULL, "Apply as Filter", NULL, NULL, NULL },
- { "/Prepare a Filter", NULL, "Prepare a Filter", NULL, NULL, NULL },
- { "/Find Frame", NULL, "Find Frame", NULL, NULL, NULL },
- { "/Find Frame/Find Frame", NULL, "Find Frame", NULL, NULL, NULL },
- { "/Find Frame/Find Next", NULL, "Find Next" , NULL, NULL, NULL },
- { "/Find Frame/Find Previous", NULL, "Find Previous", NULL, NULL, NULL },
- { "/Colorize Procedure", NULL, "Colorize Procedure", NULL, NULL, NULL },
- { "/Apply as Filter/Selected", NULL, "Selected", NULL, "Selected", G_CALLBACK(apply_as_selected_cb) },
- { "/Apply as Filter/Not Selected", NULL, "Not Selected", NULL, "Not Selected", G_CALLBACK(apply_as_not_selected_cb) },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and Selected", G_CALLBACK(apply_as_and_selected_cb) },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or Selected", G_CALLBACK(apply_as_or_selected_cb) },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and not Selected", G_CALLBACK(apply_as_and_not_selected_cb) },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or not Selected", G_CALLBACK(apply_as_or_not_selected_cb) },
- { "/Prepare a Filter/Selected", NULL, "Selected", NULL, "selcted", G_CALLBACK(prep_as_selected_cb) },
- { "/Prepare a Filter/Not Selected", NULL, "Not Selected", NULL, "Not Selected", G_CALLBACK(prep_as_not_selected_cb) },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and Selected", G_CALLBACK(prep_as_and_selected_cb) },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or Selected", G_CALLBACK(prep_as_or_selected_cb) },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and not Selected", G_CALLBACK(prep_as_and_not_selected_cb) },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or not Selected", G_CALLBACK(prep_as_or_not_selected_cb) },
- { "/Find Frame/Selected", NULL, "Selected", NULL, "Selected", G_CALLBACK(find_selected_cb) },
- { "/Find Frame/Not Selected", NULL, "Not Selected", NULL, "Not Selected", G_CALLBACK(find_not_selected_cb) },
- { "/Find Previous/Selected", NULL, "Selected", NULL, "Selected", G_CALLBACK(find_prev_selected_cb) },
- { "/Find Previous/Not Selected", NULL, "Not Selected", NULL, "Not Selected", G_CALLBACK(find_prev_not_selected_cb) },
- { "/Find Next/Selected", NULL, "Selected", NULL, "Selected", G_CALLBACK(find_next_selected_cb) },
- { "/Find Next/Not Selected", NULL, "Not Selected", NULL, "Not Selected", G_CALLBACK(find_next_not_selected_cb) },
- { "/Colorize Procedure/Colorize Protocol", NULL, "Colorize Protocol", NULL, "Colorize Protocol", G_CALLBACK(color_selected_cb) },
-};
-
-static void
-fill_in_tree_node(GNode *node, gpointer data)
-{
- ph_stats_node_t *stats = (ph_stats_node_t *)node->data;
- draw_info_t *di = (draw_info_t *)data;
- ph_stats_t *ps = di->ps;
- draw_info_t child_di;
- double seconds;
- gchar *text[NUM_STAT_COLUMNS];
- float percent_packets, percent_bytes;
- GtkTreeView *tree_view = di->tree_view;
- GtkTreeIter *iter = di->iter;
- GtkTreeStore *store;
- GtkTreeIter new_iter;
-
- seconds = ps->last_time - ps->first_time;
-
- percent_packets = (float) PCT(stats->num_pkts_total, ps->tot_packets);
- percent_bytes = (float) PCT(stats->num_bytes_total, ps->tot_bytes);
- text[PROTOCOL_COLUMN] = (gchar *) (stats->hfinfo->name);
- text[PRCT_PKTS_COLUMN] = g_strdup_printf("%.2f %%", percent_packets);
- text[PKTS_COLUMN] = g_strdup_printf("%u", stats->num_pkts_total);
- text[PRCT_BYTES_COLUMN] = g_strdup_printf("%.2f %%", percent_bytes);
- text[BYTES_COLUMN] = g_strdup_printf("%u", stats->num_bytes_total);
- if (seconds > 0.0) {
- text[BANDWIDTH_COLUMN] = g_strdup_printf("%.3f",
- BANDWIDTH(stats->num_bytes_total, seconds));
- } else {
- text[BANDWIDTH_COLUMN] = g_strdup("n.c.");
- }
- text[END_PKTS_COLUMN] = g_strdup_printf("%u", stats->num_pkts_last);
- text[END_BYTES_COLUMN] = g_strdup_printf("%u", stats->num_bytes_last);
- if (seconds > 0.0) {
- text[END_BANDWIDTH_COLUMN] = g_strdup_printf("%.3f",
- BANDWIDTH(stats->num_bytes_last, seconds));
- } else {
- text[END_BANDWIDTH_COLUMN] = g_strdup("n.c.");
- }
-
- store = GTK_TREE_STORE(gtk_tree_view_get_model(tree_view));
- gtk_tree_store_append(store, &new_iter, iter);
- gtk_tree_store_set(store, &new_iter,
- PROTOCOL_COLUMN, text[PROTOCOL_COLUMN],
- PRCT_PKTS_COLUMN, text[PRCT_PKTS_COLUMN],
- PKTS_COLUMN, text[PKTS_COLUMN],
- PRCT_BYTES_COLUMN, text[PRCT_BYTES_COLUMN],
- BYTES_COLUMN, text[BYTES_COLUMN],
- BANDWIDTH_COLUMN, text[BANDWIDTH_COLUMN],
- END_PKTS_COLUMN, text[END_PKTS_COLUMN],
- END_BYTES_COLUMN, text[END_BYTES_COLUMN],
- END_BANDWIDTH_COLUMN, text[END_BANDWIDTH_COLUMN],
- FILTER_NAME, stats->hfinfo->abbrev,
- PRCT_PKTS_VALUE_COLUMN, percent_packets,
- PRCT_BYTES_VALUE_COLUMN, percent_bytes,
- -1);
-
- g_free(text[PRCT_PKTS_COLUMN]);
- g_free(text[PKTS_COLUMN]);
- g_free(text[PRCT_BYTES_COLUMN]);
- g_free(text[BYTES_COLUMN]);
- if (seconds > 0.0) g_free(text[BANDWIDTH_COLUMN]);
- g_free(text[END_PKTS_COLUMN]);
- g_free(text[END_BYTES_COLUMN]);
- if (seconds > 0.0) g_free(text[END_BANDWIDTH_COLUMN]);
-
- child_di.tree_view = tree_view;
- child_di.iter = &new_iter;
- child_di.ps = ps;
-
- g_node_children_foreach(node, G_TRAVERSE_ALL,
- fill_in_tree_node, &child_di);
-}
-
-static void
-fill_in_tree(GtkWidget *tree_lcl, ph_stats_t *ps)
-{
- draw_info_t di;
-
- di.tree_view = GTK_TREE_VIEW(tree_lcl);
- di.iter = NULL;
- di.ps = ps;
-
- g_node_children_foreach(ps->stats_tree, G_TRAVERSE_ALL,
- fill_in_tree_node, &di);
-}
-
-
-static gboolean
-proto_hier_show_popup_menu_cb(GtkWidget *widget _U_, GdkEvent *event, GtkWidget *popup_menu_object)
-{
- GdkEventButton *bevent = (GdkEventButton *)event;
-
- if (event->type==GDK_BUTTON_PRESS && bevent->button==3) {
- /* If this is a right click on one of our columns, popup the context menu */
- gtk_menu_popup(GTK_MENU(popup_menu_object), NULL, NULL, NULL, NULL, bevent->button, bevent->time);
- }
-
- return FALSE;
-}
-
-static void
-proto_hier_create_popup_menu(void)
-{
-
- GtkUIManager *ui_manager;
- GtkActionGroup *action_group;
- GError *error = NULL;
- GtkWidget *popup_menu_object;
-
- action_group = gtk_action_group_new ("ProtoHierStatsTFilterPopupActionGroup");
- gtk_action_group_add_actions (action_group, /* the action group */
- (GtkActionEntry *)proto_hier_stats_popup_entries, /* an array of action descriptions */
- G_N_ELEMENTS(proto_hier_stats_popup_entries), /* the number of entries */
- NULL); /* data to pass to the action callbacks */
-
- ui_manager = gtk_ui_manager_new ();
- gtk_ui_manager_insert_action_group (ui_manager,
- action_group,
- 0); /* the position at which the group will be inserted */
- gtk_ui_manager_add_ui_from_string (ui_manager,ui_desc_proto_hier_stats_filter_popup, -1, &error);
- if (error != NULL)
- {
- fprintf (stderr, "Warning: building proto hier ststs filter popup failed: %s\n",
- error->message);
- g_error_free (error);
- error = NULL;
- }
- popup_menu_object = gtk_ui_manager_get_widget(ui_manager, "/ProtoHierStatsFilterPopup");
- g_signal_connect(tree, "button_press_event", G_CALLBACK(proto_hier_show_popup_menu_cb), popup_menu_object);
-
-}
-
-static void
-create_tree(GtkWidget *container, ph_stats_t *ps)
-{
- GtkWidget *sw;
- GtkTreeView *tree_view;
- GtkTreeStore *store;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
-
- /* Scrolled Window */
- sw = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw),
- GTK_SHADOW_IN);
- gtk_box_pack_start(GTK_BOX(container), sw, TRUE, TRUE, 0);
-
- store = gtk_tree_store_new(NUM_STAT_COLUMNS, G_TYPE_STRING, G_TYPE_STRING,
- G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
- G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
- G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_FLOAT,
- G_TYPE_FLOAT);
- tree = tree_view_new(GTK_TREE_MODEL(store));
- g_object_unref(G_OBJECT(store));
- tree_view = GTK_TREE_VIEW(tree);
- gtk_tree_view_set_headers_visible(tree_view, TRUE);
- gtk_tree_view_set_headers_clickable(tree_view, FALSE);
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Protocol", renderer,
- "text", PROTOCOL_COLUMN,
- NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_append_column(tree_view, column);
- renderer = gtk_cell_renderer_progress_new();
- column = gtk_tree_view_column_new_with_attributes("% Packets", renderer,
- "text", PRCT_PKTS_COLUMN,
- "value", PRCT_PKTS_VALUE_COLUMN,
- NULL);
- gtk_tree_view_column_set_expand(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_append_column(tree_view, column);
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Packets", renderer,
- "text", PKTS_COLUMN,
- NULL);
- g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_append_column(tree_view, column);
- renderer = gtk_cell_renderer_progress_new();
- column = gtk_tree_view_column_new_with_attributes("% Bytes", renderer,
- "text", PRCT_BYTES_COLUMN,
- "value", PRCT_BYTES_VALUE_COLUMN,
- NULL);
- gtk_tree_view_column_set_expand(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_append_column(tree_view, column);
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Bytes", renderer,
- "text", BYTES_COLUMN,
- NULL);
- g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_append_column(tree_view, column);
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Mbit/s", renderer,
- "text", BANDWIDTH_COLUMN,
- NULL);
- g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_append_column(tree_view, column);
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("End Packets", renderer,
- "text", END_PKTS_COLUMN,
- NULL);
- g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_append_column(tree_view, column);
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("End Bytes", renderer,
- "text", END_BYTES_COLUMN,
- NULL);
- g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_append_column(tree_view, column);
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("End Mbit/s", renderer,
- "text", END_BANDWIDTH_COLUMN,
- NULL);
- g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_append_column(tree_view, column);
-
- /* Fill in the data. */
- fill_in_tree(tree, ps);
-
- gtk_tree_view_expand_all(tree_view);
-
- proto_hier_create_popup_menu ();
-
- gtk_container_add(GTK_CONTAINER(sw), tree);
-}
-
-#define MAX_DLG_HEIGHT 450
-#define DEF_DLG_WIDTH 920
-
-void
-proto_hier_stats_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- ph_stats_t *ps;
- GtkWidget *dlg, *close_bt, *help_bt, *vbox, *bbox;
- GtkWidget *label;
- char title[256];
- const char *current_filter;
-
- /* Get the statistics. */
- ps = ph_stats_new(&cfile);
- if (ps == NULL) {
- /* The user gave up before we finished; don't pop up
- a statistics window. */
- return;
- }
-
- dlg = window_new(GTK_WINDOW_TOPLEVEL, "Wireshark: Protocol Hierarchy Statistics");
- gtk_window_set_default_size(GTK_WINDOW(dlg), DEF_DLG_WIDTH, MAX_DLG_HEIGHT);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 5, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
- gtk_container_add(GTK_CONTAINER(dlg), vbox);
-
- current_filter=gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget));
-
- if (current_filter && strlen(current_filter) != 0) {
- g_snprintf(title, sizeof(title), "Display filter: %s", current_filter);
- } else {
- g_strlcpy(title, "Display filter: none", sizeof(title));
- }
- label = gtk_label_new(title);
- gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
-
- /* Data section */
- create_tree(vbox, ps);
-
- ph_stats_free(ps);
-
- /* Button row. */
- bbox = dlg_button_row_new(GTK_STOCK_CLOSE, GTK_STOCK_HELP, NULL);
- gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
- gtk_widget_show(bbox);
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(dlg, close_bt, window_cancel_button_cb);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_STATS_PROTO_HIERARCHY_DIALOG);
-
- g_signal_connect(dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
-
- gtk_widget_show_all(dlg);
- window_present(dlg);
-}
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/proto_hier_stats_dlg.h b/ui/gtk/proto_hier_stats_dlg.h
deleted file mode 100644
index 116699f99f..0000000000
--- a/ui/gtk/proto_hier_stats_dlg.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/* proto_hier_stats_dlg.h
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __PROTO_HIER_STATS_DLG_H__
-#define __PROTO_HIER_STATS_DLG_H__
-
-/** @file
- * "Protocol Hierarchy" statistics window.
- */
-
-/** Show protocol hierarchy statistics.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-extern void proto_hier_stats_cb(GtkWidget *widget, gpointer data);
-
-#endif
diff --git a/ui/gtk/proto_hier_tree_model.c b/ui/gtk/proto_hier_tree_model.c
deleted file mode 100644
index 08380c03e9..0000000000
--- a/ui/gtk/proto_hier_tree_model.c
+++ /dev/null
@@ -1,500 +0,0 @@
-/* proto_hier_tree_model.c
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
- */
-
-/* This code was originally based on the GTK+ Tree View tutorial at
- * http://scentric.net/tutorial */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include "proto_hier_tree_model.h"
-
-#include <epan/proto.h>
-
-static GObjectClass *parent_class = NULL;
-
-static GtkTreeModelFlags
-proto_hier_tree_get_flags(GtkTreeModel *tree_model)
-{
- g_return_val_if_fail(PROTOHIER_IS_TREE(tree_model), (GtkTreeModelFlags)0);
-
- return GTK_TREE_MODEL_ITERS_PERSIST;
-}
-
-static gint
-proto_hier_tree_get_n_columns(GtkTreeModel *tree_model)
-{
- g_return_val_if_fail(PROTOHIER_IS_TREE(tree_model), 0);
-
- return 2;
-}
-
-static GType
-proto_hier_tree_get_column_type(GtkTreeModel *tree_model, gint idx)
-{
- g_return_val_if_fail(PROTOHIER_IS_TREE(tree_model), G_TYPE_INVALID);
- g_return_val_if_fail(idx == 0 || idx == 1, G_TYPE_INVALID);
-
- switch (idx) {
- case 0:
- return G_TYPE_POINTER;
- case 1:
- return G_TYPE_STRING;
- }
- /* never here */
- return G_TYPE_INVALID;
-}
-
-static gboolean
-proto_hier_tree_iter_nth_child(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent, gint n)
-{
- ProtoHierTreeModel *model;
-
- gint proto_id;
- void *cookie;
-
- g_return_val_if_fail(PROTOHIER_IS_TREE(tree_model), FALSE);
- model = (ProtoHierTreeModel *) tree_model;
-
- if (parent) {
- header_field_info *hfinfo;
-
- g_return_val_if_fail(parent->stamp == model->stamp, FALSE);
-
- /* no child of field */
- if (parent->user_data2 != NULL)
- return FALSE;
-
- proto_id = proto_get_data_protocol(parent->user_data);
-
- /* get n-th field of protocol */
- hfinfo = proto_get_first_protocol_field(proto_id, &cookie);
- while (hfinfo) {
- if (hfinfo->same_name_prev_id == -1) {
- if (!n)
- break;
- n--;
- }
- hfinfo = proto_get_next_protocol_field(proto_id, &cookie);
- }
-
- /* not found? */
- if (!hfinfo)
- return FALSE;
-
- iter->stamp = model->stamp;
- iter->user_data = parent->user_data;
- iter->user_data2 = cookie;
- iter->user_data3 = hfinfo;
- return TRUE;
- }
-
- /* get n-th enabled protocol */
- proto_id = proto_get_first_protocol(&cookie);
- while (proto_id != -1) {
- protocol_t *p = find_protocol_by_id(proto_id);
-
- if (proto_is_protocol_enabled(p)) {
- if (!n)
- break;
- n--;
- }
- proto_id = proto_get_next_protocol(&cookie);
- }
-
- /* not found? */
- if (proto_id == -1)
- return FALSE;
-
- iter->stamp = model->stamp;
- iter->user_data = cookie;
- iter->user_data2 = NULL;
- iter->user_data3 = proto_registrar_get_nth(proto_id);
- return TRUE;
-}
-
-static gboolean
-proto_hier_tree_get_iter(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreePath *path)
-{
- gint *indices, depth;
-
- g_assert(PROTOHIER_IS_TREE(tree_model));
- g_assert(path != NULL);
-
- indices = gtk_tree_path_get_indices(path);
- depth = gtk_tree_path_get_depth(path);
-
- g_assert(depth == 1 || depth == 2);
-
- if (!proto_hier_tree_iter_nth_child(tree_model, iter, NULL, indices[0]))
- return FALSE;
-
- if (depth == 2) {
- if (!proto_hier_tree_iter_nth_child(tree_model, iter, iter, indices[1]))
- return FALSE;
- }
- return TRUE;
-}
-
-static char *
-hfinfo_to_name(const header_field_info *hfinfo)
-{
- if (hfinfo->parent == -1) {
- protocol_t *protocol = find_protocol_by_id(hfinfo->id);
-
- return g_strdup_printf("%s - %s", proto_get_protocol_short_name(protocol), proto_get_protocol_long_name(protocol));
- }
- if (hfinfo->blurb != NULL && hfinfo->blurb[0] != '\0')
- return g_strdup_printf("%s - %s (%s)", hfinfo->abbrev, hfinfo->name, hfinfo->blurb);
- else
- return g_strdup_printf("%s - %s", hfinfo->abbrev, hfinfo->name);
-}
-
-static void
-proto_hier_tree_get_value(GtkTreeModel *tree_model, GtkTreeIter *iter, gint column, GValue *value)
-{
- ProtoHierTreeModel *model;
- header_field_info *hfinfo;
-
- g_return_if_fail(PROTOHIER_IS_TREE(tree_model));
- model = (ProtoHierTreeModel *) tree_model;
-
- g_return_if_fail(iter != NULL);
- g_return_if_fail(iter->stamp == model->stamp);
- g_return_if_fail(column == 0 || column == 1);
-
- hfinfo = (header_field_info *)iter->user_data3;
-
- switch (column) {
- case 0: /* hfinfo */
- g_value_init(value, G_TYPE_POINTER);
- g_value_set_pointer(value, hfinfo);
- break;
-
- case 1: /* field name */
- g_value_init(value, G_TYPE_STRING);
- g_value_take_string(value, hfinfo_to_name(hfinfo));
- break;
- }
-}
-
-static gboolean
-proto_hier_tree_iter_next(GtkTreeModel *tree_model, GtkTreeIter *iter)
-{
- ProtoHierTreeModel *model;
-
- g_return_val_if_fail(PROTOHIER_IS_TREE(tree_model), FALSE);
- model = (ProtoHierTreeModel *) tree_model;
-
- g_return_val_if_fail(iter->stamp == model->stamp, FALSE);
-
- /* protocol */
- if (iter->user_data2 == NULL) {
- void *cookie = iter->user_data;
- int proto_id;
-
- proto_id = proto_get_next_protocol(&cookie);
- /* get next enabled protocol */
- while (proto_id != -1) {
- protocol_t *p = find_protocol_by_id(proto_id);
-
- if (proto_is_protocol_enabled(p))
- break;
- proto_id = proto_get_next_protocol(&cookie);
- }
-
- if (proto_id == -1)
- return FALSE;
-
- iter->user_data = cookie;
- iter->user_data3 = proto_registrar_get_nth(proto_id);
- return TRUE;
- }
-
- /* field */
- {
- void *cookie2 = iter->user_data2;
- header_field_info *hfinfo;
- int proto_id = proto_get_data_protocol(iter->user_data);
-
- hfinfo = proto_get_next_protocol_field(proto_id, &cookie2);
- /* get next field */
- while (hfinfo) {
- if (hfinfo->same_name_prev_id == -1)
- break;
- hfinfo = proto_get_next_protocol_field(proto_id, &cookie2);
- }
-
- /* not found? */
- if (!hfinfo)
- return FALSE;
-
- iter->user_data2 = cookie2;
- iter->user_data3 = hfinfo;
- return TRUE;
- }
-}
-
-static gboolean
-proto_hier_tree_iter_children(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent)
-{
- return proto_hier_tree_iter_nth_child(tree_model, iter, parent, 0);
-}
-
-static gint
-proto_hier_tree_iter_n_children(GtkTreeModel *tree_model, GtkTreeIter *iter)
-{
- ProtoHierTreeModel *model;
- gint count = 0;
-
- int p_id;
- void *cookie;
-
- g_return_val_if_fail(PROTOHIER_IS_TREE(tree_model), 0);
- model = (ProtoHierTreeModel *) tree_model;
-
- g_return_val_if_fail(iter == NULL || iter->user_data != NULL, 0);
-
- if (iter) {
- header_field_info *hfinfo;
-
- g_return_val_if_fail(iter->stamp == model->stamp, 0);
-
- /* field has no child */
- if (iter->user_data2 != NULL)
- return 0;
-
- p_id = proto_get_data_protocol(iter->user_data);
-
- /* count not-duplicated fields */
- for (hfinfo = proto_get_first_protocol_field(p_id, &cookie); hfinfo; hfinfo = proto_get_next_protocol_field(p_id, &cookie)) {
- if (hfinfo->same_name_prev_id != -1)
- continue;
- count++;
- }
-
- } else {
- /* count enabled protocols */
- for (p_id = proto_get_first_protocol(&cookie); p_id != -1; p_id = proto_get_next_protocol(&cookie)) {
- protocol_t *p = find_protocol_by_id(p_id);
-
- if (!proto_is_protocol_enabled(p))
- continue;
- count++;
- }
- }
-
- return count;
-}
-
-static GtkTreePath *
-proto_hier_tree_get_path(GtkTreeModel *tree_model, GtkTreeIter *iter)
-{
- ProtoHierTreeModel *model;
- GtkTreePath *path;
- int pos;
-
- int p_id;
- void *cookie;
-
- g_return_val_if_fail(PROTOHIER_IS_TREE(tree_model), NULL);
- model = (ProtoHierTreeModel *) tree_model;
-
- g_return_val_if_fail(iter != NULL, NULL);
- g_return_val_if_fail(iter->stamp == model->stamp, FALSE);
-
- p_id = proto_get_data_protocol(iter->user_data);
-
- path = gtk_tree_path_new();
-
- /* protocol */
- {
- int id;
-
- /* XXX, assuming that protocols can't be disabled! */
- pos = 0;
- for (id = proto_get_first_protocol(&cookie); id != p_id && id != -1; id = proto_get_next_protocol(&cookie)) {
- protocol_t *p = find_protocol_by_id(id);
-
- if (!proto_is_protocol_enabled(p))
- continue;
- pos++;
- }
- gtk_tree_path_append_index(path, pos);
- }
-
- /* field */
- if (iter->user_data2 != NULL) {
- header_field_info *hfinfo;
-
- pos = 0;
- for (hfinfo = proto_get_first_protocol_field(p_id, &cookie); hfinfo && hfinfo != iter->user_data3; hfinfo = proto_get_next_protocol_field(p_id, &cookie)) {
- if (hfinfo->same_name_prev_id != -1)
- continue;
- pos++;
- }
- gtk_tree_path_append_index(path, pos);
- }
-
- return path;
-}
-
-static gboolean
-proto_hier_tree_iter_has_child(GtkTreeModel *tree_model, GtkTreeIter *iter)
-{
- /* no need to optimize? */
- return proto_hier_tree_iter_n_children(tree_model, iter) != 0;
-}
-
-static gboolean
-proto_hier_tree_iter_parent(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *child)
-{
- ProtoHierTreeModel *model;
-
- g_return_val_if_fail(PROTOHIER_IS_TREE(tree_model), FALSE);
- model = (ProtoHierTreeModel *) tree_model;
-
- g_return_val_if_fail(iter != NULL, FALSE);
- g_return_val_if_fail(child->stamp == model->stamp, FALSE);
-
- /* from field to protocol */
- if (child->user_data2 != NULL) {
- int p_id = proto_get_data_protocol(child->user_data);
-
- iter->stamp = model->stamp;
- iter->user_data = child->user_data;
- iter->user_data2 = NULL;
- iter->user_data3 = proto_registrar_get_nth(p_id);
-
- return TRUE;
- }
- /* protocol has no parent */
- return FALSE;
-}
-
-static void
-proto_hier_tree_model_tree_init(GtkTreeModelIface *iface)
-{
- iface->get_flags = proto_hier_tree_get_flags;
- iface->get_n_columns = proto_hier_tree_get_n_columns;
- iface->get_column_type = proto_hier_tree_get_column_type;
- iface->get_iter = proto_hier_tree_get_iter;
- iface->get_path = proto_hier_tree_get_path;
- iface->get_value = proto_hier_tree_get_value;
- iface->iter_next = proto_hier_tree_iter_next;
- iface->iter_children = proto_hier_tree_iter_children;
- iface->iter_has_child = proto_hier_tree_iter_has_child;
- iface->iter_n_children = proto_hier_tree_iter_n_children;
- iface->iter_nth_child = proto_hier_tree_iter_nth_child;
- iface->iter_parent = proto_hier_tree_iter_parent;
-}
-
-static void
-proto_hier_tree_model_init(ProtoHierTreeModel *model)
-{
- /* To check whether an iter belongs to our model. */
- model->stamp = g_random_int();
-}
-
-static void
-_class_finalize(GObject *object)
-{
- /* must chain up - finalize parent */
- (*parent_class->finalize)(object);
-}
-
-static void
-proto_hier_tree_class_init(ProtoHierTreeModelClass *klass)
-{
- GObjectClass *object_class;
-
- parent_class = (GObjectClass*) g_type_class_peek_parent(klass);
- object_class = (GObjectClass*) klass;
-
- object_class->finalize = _class_finalize;
-}
-
-GType
-proto_hier_tree_get_type(void)
-{
- static GType proto_hier_tree_type = 0;
-
- if (proto_hier_tree_type == 0) {
- static const GTypeInfo proto_hier_tree_info = {
- sizeof(ProtoHierTreeModelClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) proto_hier_tree_class_init,
- NULL, /* class finalize */
- NULL, /* class_data */
- sizeof(ProtoHierTreeModel),
- 0, /* n_preallocs */
- (GInstanceInitFunc) proto_hier_tree_model_init,
- NULL /* value_table */
- };
-
- static const GInterfaceInfo tree_model_info = {
- (GInterfaceInitFunc) proto_hier_tree_model_tree_init,
- NULL,
- NULL
- };
-
- /* Register the new derived type with the GObject type system */
- proto_hier_tree_type = g_type_register_static(G_TYPE_OBJECT,
- "ProtoHierTreeModel",
- &proto_hier_tree_info,
- (GTypeFlags)0);
-
- g_type_add_interface_static(proto_hier_tree_type,
- GTK_TYPE_TREE_MODEL,
- &tree_model_info);
- }
- return proto_hier_tree_type;
-}
-
-ProtoHierTreeModel *
-proto_hier_tree_model_new(void)
-{
- ProtoHierTreeModel *model;
-
- model = (ProtoHierTreeModel *) g_object_new(PROTOHIER_TYPE_TREE, NULL);
-
- g_assert(model != NULL);
-
- return model;
-}
-
-/*
- * Editor modelines - http://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/gtk/proto_hier_tree_model.h b/ui/gtk/proto_hier_tree_model.h
deleted file mode 100644
index 7df4c75b33..0000000000
--- a/ui/gtk/proto_hier_tree_model.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* proto_hier_tree_model.h
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
- */
-
-#ifndef __PROTO_HIER_TREE_MODEL_H__
-#define __PROTO_HIER_TREE_MODEL_H__
-
-#include <glib.h>
-
-#define PROTOHIER_TYPE_TREE (proto_hier_tree_get_type())
-
-#define PROTOHIER_TREE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PROTOHIER_TYPE_TREE, ProtoHierTreeModel))
-#define PROTOHIER_IS_TREE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PROTOHIER_TYPE_TREE))
-
-typedef struct {
- GObject parent; /** MUST be first */
-
- /** Random integer to check whether an iter belongs to our model. */
- gint stamp;
-} ProtoHierTreeModel;
-
-typedef struct {
- GObjectClass parent_class;
-
-} ProtoHierTreeModelClass;
-
-GType proto_hier_tree_get_type(void);
-ProtoHierTreeModel *proto_hier_tree_model_new(void);
-
-#endif /* __PROTO_HIER_TREE_MODEL_H__ */
diff --git a/ui/gtk/proto_tree_model.c b/ui/gtk/proto_tree_model.c
deleted file mode 100644
index 44d7a125b1..0000000000
--- a/ui/gtk/proto_tree_model.c
+++ /dev/null
@@ -1,486 +0,0 @@
-/* proto_tree_model.c
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
- */
-
-/* This code was originally based on the GTK+ Tree View tutorial at
- * http://scentric.net/tutorial */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/addr_resolv.h>
-#include <epan/proto.h>
-
-static GObjectClass *parent_class = NULL;
-
-typedef struct {
- GObjectClass parent_class;
-
-} ProtoTreeModelClass;
-
-struct proto_tree_model {
- GObject parent; /** MUST be first */
-
- /** Random integer to check whether an iter belongs to our model. */
- gint stamp;
-
- proto_tree *protocol_tree;
- int with_hidden;
-
- gboolean resolv_forced;
- e_addr_resolve resolv_flags;
-};
-
-#include "proto_tree_model.h"
-
-static GtkTreeModelFlags
-proto_tree_model_get_flags(GtkTreeModel *tree_model)
-{
- g_return_val_if_fail(PROTO_IS_TREE(tree_model), (GtkTreeModelFlags)0);
-
- return GTK_TREE_MODEL_ITERS_PERSIST;
-}
-
-static gint
-proto_tree_model_get_n_columns(GtkTreeModel *tree_model)
-{
- g_return_val_if_fail(PROTO_IS_TREE(tree_model), 0);
-
- return 2;
-}
-
-static GType
-proto_tree_model_get_column_type(GtkTreeModel *tree_model, gint idx)
-{
- g_return_val_if_fail(PROTO_IS_TREE(tree_model), G_TYPE_INVALID);
- g_return_val_if_fail(idx == 0 || idx == 1, G_TYPE_INVALID);
-
- switch (idx) {
- case 0:
- return G_TYPE_STRING;
- case 1:
- return G_TYPE_POINTER;
- }
- /* never here */
- return G_TYPE_INVALID;
-}
-
-static gboolean
-proto_tree_model_iter_nth_child(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent, gint n)
-{
- ProtoTreeModel *model;
- proto_node *node;
-
- g_return_val_if_fail(PROTO_IS_TREE(tree_model), FALSE);
- model = (ProtoTreeModel *) tree_model;
-
- if (parent) {
- g_return_val_if_fail(parent->stamp == model->stamp, FALSE);
- node = (proto_node *)parent->user_data;
- } else
- node = model->protocol_tree;
-
- if (!node)
- return FALSE;
-
- node = node->first_child;
- while (node != NULL) {
- if (model->with_hidden || !PROTO_ITEM_IS_HIDDEN(node)) {
- if (!n)
- break;
- n--;
- }
- node = node->next;
- }
-
- /* not found? */
- if (!node)
- return FALSE;
-
- iter->stamp = model->stamp;
- iter->user_data = node;
- return TRUE;
-}
-
-static gboolean
-proto_tree_model_get_iter(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreePath *path)
-{
- gint *indices, depth;
-
- g_assert(PROTO_IS_TREE(tree_model));
- g_assert(path != NULL);
-
- indices = gtk_tree_path_get_indices(path);
- depth = gtk_tree_path_get_depth(path);
-
- g_return_val_if_fail(depth > 0, FALSE);
-
- if (!proto_tree_model_iter_nth_child(tree_model, iter, NULL, indices[0]))
- return FALSE;
-
- while (--depth) {
- indices++;
- if (!proto_tree_model_iter_nth_child(tree_model, iter, iter, *indices))
- return FALSE;
- }
- return TRUE;
-}
-
-static char *
-fi_get_string(field_info *fi)
-{
- gchar label_str[ITEM_LABEL_LENGTH];
- gchar *label_ptr;
-
- if (!fi->rep) {
- label_ptr = label_str;
- proto_item_fill_label(fi, label_str);
- } else
- label_ptr = fi->rep->representation;
-
- if (FI_GET_FLAG(fi, FI_GENERATED)) {
- if (FI_GET_FLAG(fi, FI_HIDDEN))
- label_ptr = g_strdup_printf("<[%s]>", label_ptr);
- else
- label_ptr = g_strdup_printf("[%s]", label_ptr);
-
- } else if (FI_GET_FLAG(fi, FI_HIDDEN))
- label_ptr = g_strdup_printf("<%s>", label_ptr);
- else
- label_ptr = g_strdup(label_ptr);
-
- return label_ptr;
-}
-
-static void
-proto_tree_model_get_value(GtkTreeModel *tree_model, GtkTreeIter *iter, gint column, GValue *value)
-{
- ProtoTreeModel *model;
- proto_node *node;
- field_info *fi;
-
- g_return_if_fail(PROTO_IS_TREE(tree_model));
- model = (ProtoTreeModel *) tree_model;
-
- g_return_if_fail(iter != NULL);
- g_return_if_fail(iter->stamp == model->stamp);
- g_return_if_fail(column == 0 || column == 1);
-
- node = (proto_node *)iter->user_data;
- fi = PNODE_FINFO(node);
-
- /* dissection with an invisible proto tree? */
- g_assert(fi);
-
- switch (column) {
- case 0:
- {
- g_value_init(value, G_TYPE_STRING);
- if (model->resolv_forced) {
- e_addr_resolve old_flags = gbl_resolv_flags;
-
- gbl_resolv_flags = model->resolv_flags;
- g_value_take_string(value, fi_get_string(fi));
- gbl_resolv_flags = old_flags;
-
- } else
- g_value_take_string(value, fi_get_string(fi));
- break;
- }
-
- case 1:
- g_value_init(value, G_TYPE_POINTER);
- g_value_set_pointer(value, fi);
- break;
- }
-}
-
-static gboolean
-proto_tree_model_iter_next(GtkTreeModel *tree_model, GtkTreeIter *iter)
-{
- ProtoTreeModel *model;
- proto_node *current;
-
- g_return_val_if_fail(PROTO_IS_TREE(tree_model), FALSE);
- model = (ProtoTreeModel *) tree_model;
-
- g_return_val_if_fail(iter->stamp == model->stamp, FALSE);
-
- current = (proto_node *)iter->user_data;
- current = current->next;
- while (current) {
- if (model->with_hidden || !PROTO_ITEM_IS_HIDDEN(current)) {
- iter->user_data = current;
- return TRUE;
- }
- current = current->next;
- }
- return FALSE;
-}
-
-static gboolean
-proto_tree_model_iter_children(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent)
-{
- return proto_tree_model_iter_nth_child(tree_model, iter, parent, 0);
-}
-
-static gint
-proto_tree_model_iter_n_children(GtkTreeModel *tree_model, GtkTreeIter *iter)
-{
- ProtoTreeModel *model;
- proto_node *node;
- gint count;
-
- g_return_val_if_fail(PROTO_IS_TREE(tree_model), 0);
- model = (ProtoTreeModel *) tree_model;
-
- g_return_val_if_fail(iter == NULL || iter->user_data != NULL, 0);
-
- if (iter) {
- g_return_val_if_fail(iter->stamp == model->stamp, 0);
- node = (proto_node *)iter->user_data;
- } else
- node = model->protocol_tree;
-
- if (!node)
- return 0;
-
- count = 0;
- node = node->first_child;
- while (node != NULL) {
- if (model->with_hidden || !PROTO_ITEM_IS_HIDDEN(node))
- count++;
- node = node->next;
- }
- return count;
-}
-
-static GtkTreePath *
-proto_tree_model_get_path(GtkTreeModel *tree_model, GtkTreeIter *iter)
-{
- ProtoTreeModel *model;
- GtkTreePath *path;
- proto_node *node;
-
- g_return_val_if_fail(PROTO_IS_TREE(tree_model), NULL);
- model = (ProtoTreeModel *) tree_model;
-
- g_return_val_if_fail(iter != NULL, NULL);
- g_return_val_if_fail(iter->stamp == model->stamp, NULL);
-
- node = (proto_node *)iter->user_data;
- g_return_val_if_fail(node != model->protocol_tree, NULL);
-
- path = gtk_tree_path_new();
- do {
- proto_node *cur = node;
- proto_node *node_i;
- int pos;
-
- node = node->parent;
-
- pos = 0;
- for (node_i = node->first_child; node_i; node_i = node_i->next) {
- if (model->with_hidden || !PROTO_ITEM_IS_HIDDEN(node_i)) {
- if (node_i == cur)
- break;
- pos++;
- }
- }
-
- g_assert(node_i != NULL);
- gtk_tree_path_prepend_index(path, pos);
- } while (node != model->protocol_tree);
-
- return path;
-}
-
-static gboolean
-proto_tree_model_iter_has_child(GtkTreeModel *tree_model, GtkTreeIter *iter)
-{
- /* optimized version of:
- * return proto_tree_model_iter_n_children(tree_model, iter) != 0;
- * synchronize when changed!
- */
- ProtoTreeModel *model;
- proto_node *node;
-
- g_return_val_if_fail(PROTO_IS_TREE(tree_model), FALSE);
- model = (ProtoTreeModel *) tree_model;
-
- g_return_val_if_fail(iter == NULL || iter->user_data != NULL, FALSE);
-
- if (iter) {
- g_return_val_if_fail(iter->stamp == model->stamp, FALSE);
- node = (proto_node *)iter->user_data;
- } else
- node = model->protocol_tree;
-
- if (!node)
- return FALSE;
-
- node = node->first_child;
- while (node != NULL) {
- if (model->with_hidden || !PROTO_ITEM_IS_HIDDEN(node))
- return TRUE;
- node = node->next;
- }
- return FALSE;
-}
-
-static gboolean
-proto_tree_model_iter_parent(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *child)
-{
- ProtoTreeModel *model;
- proto_node *node;
-
- g_return_val_if_fail(PROTO_IS_TREE(tree_model), FALSE);
- model = (ProtoTreeModel *) tree_model;
-
- g_return_val_if_fail(iter != NULL, FALSE);
- g_return_val_if_fail(child->stamp == model->stamp, FALSE);
-
- node = (proto_node *)child->user_data;
- if (node->parent == model->protocol_tree)
- return FALSE;
- g_return_val_if_fail(node->parent != NULL, FALSE);
- iter->stamp = model->stamp;
- iter->user_data = node->parent;
- return TRUE;
-}
-
-static void
-proto_tree_model_tree_init(GtkTreeModelIface *iface)
-{
- iface->get_flags = proto_tree_model_get_flags;
- iface->get_n_columns = proto_tree_model_get_n_columns;
- iface->get_column_type = proto_tree_model_get_column_type;
- iface->get_iter = proto_tree_model_get_iter;
- iface->get_path = proto_tree_model_get_path;
- iface->get_value = proto_tree_model_get_value;
- iface->iter_next = proto_tree_model_iter_next;
- iface->iter_children = proto_tree_model_iter_children;
- iface->iter_has_child = proto_tree_model_iter_has_child;
- iface->iter_n_children = proto_tree_model_iter_n_children;
- iface->iter_nth_child = proto_tree_model_iter_nth_child;
- iface->iter_parent = proto_tree_model_iter_parent;
-}
-
-static void
-proto_tree_model_init(ProtoTreeModel *model)
-{
- /* To check whether an iter belongs to our model. */
- model->stamp = g_random_int();
-}
-
-static void
-_class_finalize(GObject *object)
-{
- /* must chain up - finalize parent */
- (*parent_class->finalize)(object);
-}
-
-static void
-proto_tree_model_class_init(ProtoTreeModelClass *klass)
-{
- GObjectClass *object_class;
-
- parent_class = (GObjectClass*) g_type_class_peek_parent(klass);
- object_class = (GObjectClass*) klass;
-
- object_class->finalize = _class_finalize;
-}
-
-GType
-proto_tree_model_get_type(void)
-{
- static GType proto_tree_type = 0;
-
- if (proto_tree_type == 0) {
- static const GTypeInfo proto_tree_info = {
- sizeof(ProtoTreeModelClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) proto_tree_model_class_init,
- NULL, /* class finalize */
- NULL, /* class_data */
- sizeof(ProtoTreeModel),
- 0, /* n_preallocs */
- (GInstanceInitFunc) proto_tree_model_init,
- NULL /* value_table */
- };
-
- static const GInterfaceInfo tree_model_info = {
- (GInterfaceInitFunc) proto_tree_model_tree_init,
- NULL,
- NULL
- };
-
- /* Register the new derived type with the GObject type system */
- proto_tree_type = g_type_register_static(G_TYPE_OBJECT,
- "ProtoTreeModel",
- &proto_tree_info,
- (GTypeFlags)0);
-
- g_type_add_interface_static(proto_tree_type,
- GTK_TYPE_TREE_MODEL,
- &tree_model_info);
- }
- return proto_tree_type;
-}
-
-void
-proto_tree_model_force_resolv(ProtoTreeModel *model, const e_addr_resolve *flags)
-{
- model->resolv_forced = TRUE;
- model->resolv_flags = *flags;
-}
-
-ProtoTreeModel *
-proto_tree_model_new(proto_tree *protocol_tree, int display_hidden_proto_items)
-{
- ProtoTreeModel *model;
-
- model = (ProtoTreeModel *) g_object_new(PROTO_TYPE_TREE, NULL);
-
- g_assert(model != NULL);
- model->protocol_tree = protocol_tree;
- model->with_hidden = display_hidden_proto_items;
- model->resolv_forced = FALSE;
-
- return model;
-}
-
-/*
- * Editor modelines - http://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/gtk/proto_tree_model.h b/ui/gtk/proto_tree_model.h
deleted file mode 100644
index 06dee60c28..0000000000
--- a/ui/gtk/proto_tree_model.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* proto_tree_model.h
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
- */
-
-#ifndef __PROTO_TREE_MODEL_H__
-#define __PROTO_TREE_MODEL_H__
-
-#include <glib.h>
-
-#define PROTO_TYPE_TREE (proto_tree_model_get_type())
-
-#define PROTO_TREE_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PROTO_TYPE_TREE, ProtoTreeModel))
-#define PROTO_IS_TREE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PROTO_TYPE_TREE))
-
-struct proto_tree_model;
-typedef struct proto_tree_model ProtoTreeModel;
-
-GType proto_tree_model_get_type(void);
-ProtoTreeModel *proto_tree_model_new(proto_tree *protocol_tree, int display_hidden_proto_items);
-void proto_tree_model_force_resolv(ProtoTreeModel *model, const e_addr_resolve *resolv_flags);
-
-#endif /* __PROTO_TREE_MODEL_H__ */
diff --git a/ui/gtk/range_utils.c b/ui/gtk/range_utils.c
deleted file mode 100644
index 0c9438ba84..0000000000
--- a/ui/gtk/range_utils.c
+++ /dev/null
@@ -1,734 +0,0 @@
-/* range_utils.c
- * Packet range routines (save, print, ...) for GTK things
- *
- * Ulf Lamping <ulf.lamping@web.de>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <gtk/gtk.h>
-
-#include "../../globals.h"
-#include "ui/simple_dialog.h"
-
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/range_utils.h"
-
-
-#define RANGE_VALUES_KEY "range_values"
-#define RANGE_CAPTURED_BT_KEY "range_captured_button"
-#define RANGE_DISPLAYED_BT_KEY "range_displayed_button"
-
-#define RANGE_SELECT_ALL_KEY "range_select_all_rb"
-#define RANGE_SELECT_ALL_C_KEY "range_select_all_c_lb"
-#define RANGE_SELECT_ALL_D_KEY "range_select_all_d_lb"
-#define RANGE_SELECT_CURR_KEY "range_select_curr_rb"
-#define RANGE_SELECT_CURR_C_KEY "range_select_curr_c_lb"
-#define RANGE_SELECT_CURR_D_KEY "range_select_curr_d_lb"
-#define RANGE_SELECT_MARKED_KEY "range_select_marked_only_rb"
-#define RANGE_SELECT_MARKED_C_KEY "range_select_marked_only_c_lb"
-#define RANGE_SELECT_MARKED_D_KEY "range_select_marked_only_d_lb"
-#define RANGE_SELECT_MARKED_RANGE_KEY "range_select_marked_range_rb"
-#define RANGE_SELECT_MARKED_RANGE_C_KEY "range_select_marked_range_c_lb"
-#define RANGE_SELECT_MARKED_RANGE_D_KEY "range_select_marked_range_d_lb"
-#define RANGE_SELECT_USER_KEY "range_select_user_range_rb"
-#define RANGE_SELECT_USER_C_KEY "range_select_user_range_c_lb"
-#define RANGE_SELECT_USER_D_KEY "range_select_user_range_d_lb"
-#define RANGE_SELECT_USER_ENTRY_KEY "range_select_user_range_entry"
-
-#define RANGE_REMOVE_IGNORED_KEY "range_remove_ignored"
-#define RANGE_IGNORED_C_KEY "range_ignored_c_lb"
-#define RANGE_IGNORED_D_KEY "range_ignored_d_lb"
-
-gboolean
-range_check_validity(packet_range_t *range)
-{
- switch (packet_range_check(range)) {
-
- case CVT_NO_ERROR:
- return TRUE;
-
- case CVT_SYNTAX_ERROR:
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "The specified range of packets isn't a valid range.");
- return FALSE;
-
- case CVT_NUMBER_TOO_BIG:
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "The specified range of packets has a packet number that's too large.");
- return FALSE;
-
- default:
- g_assert_not_reached();
- return FALSE;
- }
-}
-
-gboolean
-range_check_validity_modal(GtkWidget *parent, packet_range_t *range)
-{
- GtkWidget *dialog;
-
- switch (packet_range_check(range)) {
-
- case CVT_NO_ERROR:
- return TRUE;
-
- case CVT_SYNTAX_ERROR:
- dialog = gtk_message_dialog_new(GTK_WINDOW(parent),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_OK,
- "The specified range of packets isn't a valid range.");
- gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
- return FALSE;
-
- case CVT_NUMBER_TOO_BIG:
- dialog = gtk_message_dialog_new(GTK_WINDOW(parent),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_OK,
- "The specified range of packets has a packet number that's too large.");
- gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
- return FALSE;
-
- default:
- g_assert_not_reached();
- return FALSE;
- }
-}
-
-/* update all "dynamic" things */
-void
-range_update_dynamics(gpointer data)
-{
- packet_range_t *range;
- GtkWidget *range_displayed_bt;
- gboolean filtered_active;
- gint selected_num;
- gboolean can_select;
- gboolean selected_packets;
- gchar label_text[100];
- guint32 ignored_cnt = 0, displayed_ignored_cnt = 0;
- guint32 displayed_cnt;
-
- range = (packet_range_t *)g_object_get_data(G_OBJECT(data), RANGE_VALUES_KEY);
-
- range_displayed_bt = (GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_DISPLAYED_BT_KEY);
- filtered_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(range_displayed_bt));
-
- /* Enable saving only the displayed packets only if there *are*
- displayed packets. */
- if (range->displayed_cnt != 0)
- gtk_widget_set_sensitive(range_displayed_bt, TRUE);
- else {
- /* If saving the displayed packets is selected, select saving the
- captured packets. */
- filtered_active = FALSE;
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(data), RANGE_SELECT_ALL_KEY)), FALSE);
- gtk_widget_set_sensitive(range_displayed_bt, FALSE);
- }
-
- /* All / Captured */
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_ALL_C_KEY), !filtered_active);
- if (range->remove_ignored) {
- g_snprintf(label_text, sizeof(label_text), "%u", cfile.count - range->ignored_cnt);
- } else {
- g_snprintf(label_text, sizeof(label_text), "%u", cfile.count);
- }
- gtk_label_set_text(GTK_LABEL(g_object_get_data(G_OBJECT(data), RANGE_SELECT_ALL_C_KEY)), label_text);
-
- /* All / Displayed */
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_ALL_D_KEY), filtered_active);
- if (range->include_dependents)
- displayed_cnt = range->displayed_plus_dependents_cnt;
- else
- displayed_cnt = range->displayed_cnt;
- if (range->remove_ignored) {
- g_snprintf(label_text, sizeof(label_text), "%u", displayed_cnt - range->displayed_ignored_cnt);
- } else {
- g_snprintf(label_text, sizeof(label_text), "%u", displayed_cnt);
- }
- gtk_label_set_text(GTK_LABEL(g_object_get_data(G_OBJECT(data), RANGE_SELECT_ALL_D_KEY)), label_text);
-
- /* Selected / Captured + Displayed */
- /* Enable saving the currently-selected packet only if there *is* a
- currently-selected packet. */
- selected_num = (cfile.current_frame) ? cfile.current_frame->num : 0;
- can_select = (selected_num != 0);
- if (can_select) {
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_CURR_KEY), TRUE);
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_CURR_C_KEY), !filtered_active);
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_CURR_D_KEY), filtered_active);
- } else {
- /* If "save selected packet" is selected, select "save all packets". */
- if (range->process == range_process_selected) {
- range->process = range_process_all;
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(data), RANGE_SELECT_ALL_KEY)), TRUE);
- }
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_CURR_KEY), FALSE);
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_CURR_C_KEY), FALSE);
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_CURR_D_KEY), FALSE);
- }
- /* XXX: how to update the radio button label but keep the mnemonic? */
-/*g_snprintf(label_text, sizeof(label_text), "_Selected packet #%u only", selected_num);
- gtk_label_set_text(GTK_LABEL(GTK_BIN(select_curr_rb)->child), label_text);*/
- if (range->remove_ignored && can_select && cfile.current_frame->flags.ignored) {
- g_snprintf(label_text, sizeof(label_text), "0");
- } else {
- g_snprintf(label_text, sizeof(label_text), "%u", selected_num ? 1 : 0);
- }
- gtk_label_set_text(GTK_LABEL(g_object_get_data(G_OBJECT(data), RANGE_SELECT_CURR_C_KEY)), label_text);
- if (range->remove_ignored && can_select && cfile.current_frame->flags.ignored) {
- g_snprintf(label_text, sizeof(label_text), "0");
- } else {
- g_snprintf(label_text, sizeof(label_text), "%u", selected_num ? 1 : 0);
- }
- gtk_label_set_text(GTK_LABEL(g_object_get_data(G_OBJECT(data), RANGE_SELECT_CURR_D_KEY)), label_text);
-
- /* Marked / Captured + Displayed */
- /* Enable the buttons for saving marked packets only if there *are*
- marked packets. */
- if (filtered_active)
- selected_packets = (range->displayed_marked_cnt != 0);
- else
- selected_packets = (cfile.marked_count > 0);
- if (selected_packets) {
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_MARKED_KEY), TRUE);
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_MARKED_C_KEY), !filtered_active);
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_MARKED_D_KEY), filtered_active);
- }
- else {
- /* If "save marked packet" is selected, select "save all packets". */
- if (range->process == range_process_marked) {
- range->process = range_process_all;
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(data), RANGE_SELECT_ALL_KEY)), TRUE);
- }
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_MARKED_KEY), FALSE);
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_MARKED_C_KEY), FALSE);
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_MARKED_D_KEY), FALSE);
- }
- if (range->remove_ignored) {
- g_snprintf(label_text, sizeof(label_text), "%u", cfile.marked_count - range->ignored_marked_cnt);
- } else {
- g_snprintf(label_text, sizeof(label_text), "%u", cfile.marked_count);
- }
- gtk_label_set_text(GTK_LABEL(g_object_get_data(G_OBJECT(data), RANGE_SELECT_MARKED_C_KEY)), label_text);
- if (range->remove_ignored) {
- g_snprintf(label_text, sizeof(label_text), "%u", range->displayed_marked_cnt - range->displayed_ignored_marked_cnt);
- } else {
- g_snprintf(label_text, sizeof(label_text), "%u", range->displayed_marked_cnt);
- }
- gtk_label_set_text(GTK_LABEL(g_object_get_data(G_OBJECT(data), RANGE_SELECT_MARKED_D_KEY)), label_text);
-
- /* First to last marked / Captured + Displayed */
-
- /* Enable the buttons for saving the range of marked packets only if
- there *is* a range of marked packets. */
- if (filtered_active)
- selected_packets = (range->displayed_mark_range_cnt != 0);
- else
- selected_packets = (range->mark_range_cnt != 0);
- if (selected_packets) {
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_MARKED_RANGE_KEY), TRUE);
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_MARKED_RANGE_C_KEY), !filtered_active);
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_MARKED_RANGE_D_KEY), filtered_active);
- }
- else {
- /* If "save range between first and last marked packet" is selected,
- select "save all packets". */
- if (range->process == range_process_marked_range) {
- range->process = range_process_all;
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(data), RANGE_SELECT_ALL_KEY)), TRUE);
- }
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_MARKED_RANGE_KEY), FALSE);
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_MARKED_RANGE_C_KEY), FALSE);
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_MARKED_RANGE_D_KEY), FALSE);
- }
- if (range->remove_ignored) {
- g_snprintf(label_text, sizeof(label_text), "%u", range->mark_range_cnt - range->ignored_mark_range_cnt);
- } else {
- g_snprintf(label_text, sizeof(label_text), "%u", range->mark_range_cnt);
- }
- gtk_label_set_text(GTK_LABEL(g_object_get_data(G_OBJECT(data), RANGE_SELECT_MARKED_RANGE_C_KEY)), label_text);
- if (range->remove_ignored) {
- g_snprintf(label_text, sizeof(label_text), "%u",
- range->displayed_mark_range_cnt - range->displayed_ignored_mark_range_cnt);
- } else {
- g_snprintf(label_text, sizeof(label_text), "%u", range->displayed_mark_range_cnt);
- }
- gtk_label_set_text(GTK_LABEL(g_object_get_data(G_OBJECT(data), RANGE_SELECT_MARKED_RANGE_D_KEY)), label_text);
-
- /* User specified / Captured + Displayed */
-
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_USER_KEY), TRUE);
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_USER_C_KEY), !filtered_active);
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_USER_D_KEY), filtered_active);
- if (range->remove_ignored) {
- g_snprintf(label_text, sizeof(label_text), "%u", range->user_range_cnt - range->ignored_user_range_cnt);
- } else {
- g_snprintf(label_text, sizeof(label_text), "%u", range->user_range_cnt);
- }
- gtk_label_set_text(GTK_LABEL(g_object_get_data(G_OBJECT(data), RANGE_SELECT_USER_C_KEY)), label_text);
- if (range->remove_ignored) {
- g_snprintf(label_text, sizeof(label_text), "%u",
- range->displayed_user_range_cnt - range->displayed_ignored_user_range_cnt);
- } else {
- g_snprintf(label_text, sizeof(label_text), "%u", range->displayed_user_range_cnt);
- }
- gtk_label_set_text(GTK_LABEL(g_object_get_data(G_OBJECT(data), RANGE_SELECT_USER_D_KEY)), label_text);
-
- /* Ignored */
- switch(range->process) {
- case(range_process_all):
- ignored_cnt = range->ignored_cnt;
- displayed_ignored_cnt = range->displayed_ignored_cnt;
- break;
- case(range_process_selected):
- ignored_cnt = (can_select && cfile.current_frame->flags.ignored) ? 1 : 0;
- displayed_ignored_cnt = ignored_cnt;
- break;
- case(range_process_marked):
- ignored_cnt = range->ignored_marked_cnt;
- displayed_ignored_cnt = range->displayed_ignored_marked_cnt;
- break;
- case(range_process_marked_range):
- ignored_cnt = range->ignored_mark_range_cnt;
- displayed_ignored_cnt = range->displayed_ignored_mark_range_cnt;
- break;
- case(range_process_user_range):
- ignored_cnt = range->ignored_user_range_cnt;
- displayed_ignored_cnt = range->displayed_ignored_user_range_cnt;
- break;
- default:
- g_assert_not_reached();
- }
-
- if (filtered_active)
- selected_packets = (displayed_ignored_cnt != 0);
- else
- selected_packets = (ignored_cnt != 0);
-
- if (selected_packets) {
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_REMOVE_IGNORED_KEY), TRUE);
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_IGNORED_C_KEY), !filtered_active);
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_IGNORED_D_KEY), filtered_active);
- } else {
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_REMOVE_IGNORED_KEY), FALSE);
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_IGNORED_C_KEY), FALSE);
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_IGNORED_D_KEY), FALSE);
- }
-
- g_snprintf(label_text, sizeof(label_text), "%u", ignored_cnt);
- gtk_label_set_text(GTK_LABEL(g_object_get_data(G_OBJECT(data), RANGE_IGNORED_C_KEY)), label_text);
- g_snprintf(label_text, sizeof(label_text), "%u", displayed_ignored_cnt);
- gtk_label_set_text(GTK_LABEL(g_object_get_data(G_OBJECT(data), RANGE_IGNORED_D_KEY)), label_text);
-}
-
-
-static void
-toggle_captured_cb(GtkWidget *widget, gpointer data)
-{
- GtkWidget *bt;
- packet_range_t *range;
-
-
- range = (packet_range_t *)g_object_get_data(G_OBJECT(data), RANGE_VALUES_KEY);
-
- /* is the button now active? */
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget))) {
- /* They changed the state of the "captured" button. */
- range->process_filtered = FALSE;
-
- bt = (GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_CAPTURED_BT_KEY);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bt), TRUE);
- bt = (GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_DISPLAYED_BT_KEY);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bt), FALSE);
-
- range_update_dynamics(data);
- }
-}
-
-static void
-toggle_filtered_cb(GtkWidget *widget, gpointer data)
-{
- GtkWidget *bt;
- packet_range_t *range;
-
-
- range = (packet_range_t *)g_object_get_data(G_OBJECT(data), RANGE_VALUES_KEY);
-
- /* is the button now active? */
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget))) {
- range->process_filtered = TRUE;
- bt = (GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_CAPTURED_BT_KEY);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bt), FALSE);
- bt = (GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_DISPLAYED_BT_KEY);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bt), TRUE);
-
- range_update_dynamics(data);
- }
-}
-
-static void
-toggle_select_all(GtkWidget *widget, gpointer data)
-{
- packet_range_t *range;
-
-
- range = (packet_range_t *)g_object_get_data(G_OBJECT(data), RANGE_VALUES_KEY);
-
- /* is the button now active? */
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget))) {
- range->process = range_process_all;
- range_update_dynamics(data);
- }
-}
-
-static void
-toggle_select_selected(GtkWidget *widget, gpointer data)
-{
- packet_range_t *range;
-
-
- range = (packet_range_t *)g_object_get_data(G_OBJECT(data), RANGE_VALUES_KEY);
-
- /* is the button now active? */
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget))) {
- range->process = range_process_selected;
- range_update_dynamics(data);
- }
-}
-
-static void
-toggle_select_marked_only(GtkWidget *widget, gpointer data)
-{
- packet_range_t *range;
-
-
- range = (packet_range_t *)g_object_get_data(G_OBJECT(data), RANGE_VALUES_KEY);
-
- /* is the button now active? */
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget))) {
- range->process = range_process_marked;
- range_update_dynamics(data);
- }
-}
-
-static void
-toggle_select_marked_range(GtkWidget *widget, gpointer data)
-{
- packet_range_t *range;
-
-
- range = (packet_range_t *)g_object_get_data(G_OBJECT(data), RANGE_VALUES_KEY);
-
- /* is the button now active? */
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget))) {
- range->process = range_process_marked_range;
- range_update_dynamics(data);
- }
-}
-
-static void
-toggle_select_user_range(GtkWidget *widget, gpointer data)
-{
- packet_range_t *range;
-
-
- range = (packet_range_t *)g_object_get_data(G_OBJECT(data), RANGE_VALUES_KEY);
-
- /* is the button now active? */
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget))) {
- range->process = range_process_user_range;
- range_update_dynamics(data);
- }
-
- /* Make the entry widget sensitive or insensitive */
- gtk_widget_set_sensitive((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_USER_ENTRY_KEY),
- range->process == range_process_user_range);
-
- /* When selecting user specified range, then focus on the entry */
- if (range->process == range_process_user_range)
- gtk_widget_grab_focus((GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_USER_ENTRY_KEY));
-
-}
-
-static void
-toggle_remove_ignored(GtkWidget *widget, gpointer data)
-{
- packet_range_t *range;
-
- range = (packet_range_t *)g_object_get_data(G_OBJECT(data), RANGE_VALUES_KEY);
-
- /* is the button now active? */
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget))) {
- range->remove_ignored = TRUE;
- } else {
- range->remove_ignored = FALSE;
- }
-
- range_update_dynamics(data);
-}
-
-static void
-range_entry(GtkWidget *widget _U_, gpointer data)
-{
- const gchar *entry_text;
- GtkWidget *entry;
- packet_range_t *range;
-
-
- range = (packet_range_t *)g_object_get_data(G_OBJECT(data), RANGE_VALUES_KEY);
- entry = (GtkWidget *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_USER_ENTRY_KEY);
-
- gtk_toggle_button_set_active((GtkToggleButton *)g_object_get_data(G_OBJECT(data), RANGE_SELECT_USER_KEY), TRUE);
- entry_text = gtk_entry_get_text (GTK_ENTRY (entry));
- packet_range_convert_str(range, entry_text);
- range_update_dynamics(data);
-}
-
-
-static void
-range_entry_in_event(GtkWidget *widget _U_, GdkEventFocus *event _U_, gpointer user_data _U_)
-{
- /* This event is called, if the "enter" key is pressed while the key focus (right name?) */
- /* is in the range entry field. */
-
- /* Calling range_entry() isn't necessary as all changes are already done while the */
- /* entry was edited. Calling it here will cause a NULL pointer exception, */
- /* so don't do: <range_entry(widget, user_data); as we did before. */
-
- /* What we could do here is to cause the "hosting" dialog box do whatever it */
- /* needs to do when the default button was pressed. This is difficult as we currently */
- /* don't have a concept to call the hosting dialog this way. */
-
- /* XXX - As we might want to put the whole range thing in its own dialog, this would be */
- /* a much easier task than it would be today as we could simply close our own dialog. */
-}
-
-
-/* create a new range "widget" */
-GtkWidget *range_new(packet_range_t *range, gboolean saving)
-{
- GtkWidget *range_grid;
- GtkWidget *captured_bt;
- GtkWidget *displayed_bt;
-
- GtkWidget *select_all_rb;
- GtkWidget *select_all_c_lb;
- GtkWidget *select_all_d_lb;
- GtkWidget *select_curr_rb;
- GtkWidget *select_curr_c_lb;
- GtkWidget *select_curr_d_lb;
- GtkWidget *select_marked_only_rb;
- GtkWidget *select_marked_only_c_lb;
- GtkWidget *select_marked_only_d_lb;
- GtkWidget *select_marked_range_rb;
- GtkWidget *select_marked_range_c_lb;
- GtkWidget *select_marked_range_d_lb;
- GtkWidget *select_user_range_rb;
- GtkWidget *select_user_range_c_lb;
- GtkWidget *select_user_range_d_lb;
- GtkWidget *select_user_range_entry;
- GtkWidget *remove_ignored_cb;
- GtkWidget *ignored_c_lb;
- GtkWidget *ignored_d_lb;
-
- /* range grid */
- range_grid = ws_gtk_grid_new();
- gtk_container_set_border_width(GTK_CONTAINER(range_grid), 5);
-
- /* captured button */
- captured_bt = gtk_toggle_button_new_with_mnemonic("_Captured");
- ws_gtk_grid_attach_defaults(GTK_GRID(range_grid), captured_bt, 1, 0, 1, 1);
- g_signal_connect(captured_bt, "toggled", G_CALLBACK(toggle_captured_cb), range_grid);
- gtk_widget_set_tooltip_text (captured_bt,("Process all the below chosen packets"));
-
- /* displayed button */
- displayed_bt = gtk_toggle_button_new_with_mnemonic("_Displayed");
- ws_gtk_grid_attach_defaults(GTK_GRID(range_grid), displayed_bt, 2, 0, 1, 1);
- g_signal_connect(displayed_bt, "toggled", G_CALLBACK(toggle_filtered_cb), range_grid);
- if (saving)
- /* XXX: Testing shows there's a limit to the number of tooltip character displayed: 72 ? */
- gtk_widget_set_tooltip_text (displayed_bt,("Save the packets chosen below which also pass the current"
- " display filter. If \"all packets\" is selected then the packets"
- " required (e.g., for reassembled data) by the packets"
- " that passed the display filter are also included."));
- else
- gtk_widget_set_tooltip_text (displayed_bt,("Process only the below chosen packets which also pass"
- " the current display filter"));
-
-
- /* Process all packets */
- select_all_rb = gtk_radio_button_new_with_mnemonic_from_widget(NULL, "_All packets");
- ws_gtk_grid_attach_defaults(GTK_GRID(range_grid), select_all_rb, 0, 1, 1, 1);
- gtk_widget_set_tooltip_text (select_all_rb, ("Process all packets"));
- g_signal_connect(select_all_rb, "toggled", G_CALLBACK(toggle_select_all), range_grid);
-
- select_all_c_lb = gtk_label_new("?");
- ws_gtk_grid_attach_defaults(GTK_GRID(range_grid), select_all_c_lb, 1, 1, 1, 1);
- select_all_d_lb = gtk_label_new("?");
- ws_gtk_grid_attach_defaults(GTK_GRID(range_grid), select_all_d_lb, 2, 1, 1, 1);
-
-
- /* Process currently selected */
- select_curr_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(select_all_rb),
- "_Selected packet only");
- ws_gtk_grid_attach_defaults(GTK_GRID(range_grid), select_curr_rb, 0, 2, 1, 1);
- gtk_widget_set_tooltip_text (select_curr_rb, ("Process the currently selected packet only"));
- g_signal_connect(select_curr_rb, "toggled", G_CALLBACK(toggle_select_selected), range_grid);
-
- select_curr_c_lb = gtk_label_new("?");
- ws_gtk_grid_attach_defaults(GTK_GRID(range_grid), select_curr_c_lb, 1, 2, 1, 1);
- select_curr_d_lb = gtk_label_new("?");
- ws_gtk_grid_attach_defaults(GTK_GRID(range_grid), select_curr_d_lb, 2, 2, 1, 1);
-
-
- /* Process marked packets */
- select_marked_only_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(select_all_rb),
- "_Marked packets only");
- ws_gtk_grid_attach_defaults(GTK_GRID(range_grid), select_marked_only_rb, 0, 3, 1, 1);
- gtk_widget_set_tooltip_text (select_marked_only_rb, ("Process marked packets only"));
- g_signal_connect(select_marked_only_rb, "toggled", G_CALLBACK(toggle_select_marked_only), range_grid);
-
- select_marked_only_c_lb = gtk_label_new("?");
- ws_gtk_grid_attach_defaults(GTK_GRID(range_grid), select_marked_only_c_lb, 1, 3, 1, 1);
- select_marked_only_d_lb = gtk_label_new("?");
- ws_gtk_grid_attach_defaults(GTK_GRID(range_grid), select_marked_only_d_lb, 2, 3, 1, 1);
-
-
- /* Process packet range between first and last packet */
- select_marked_range_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(select_all_rb),
- "From first _to last marked packet");
- ws_gtk_grid_attach_defaults(GTK_GRID(range_grid), select_marked_range_rb, 0, 4, 1, 1);
- gtk_widget_set_tooltip_text (select_marked_range_rb,("Process all packets between the first and last marker"));
- g_signal_connect(select_marked_range_rb, "toggled", G_CALLBACK(toggle_select_marked_range), range_grid);
-
- select_marked_range_c_lb = gtk_label_new("?");
- ws_gtk_grid_attach_defaults(GTK_GRID(range_grid), select_marked_range_c_lb, 1, 4, 1, 1);
- select_marked_range_d_lb = gtk_label_new("?");
- ws_gtk_grid_attach_defaults(GTK_GRID(range_grid), select_marked_range_d_lb, 2, 4, 1, 1);
-
-
- /* Process a user specified provided packet range : -10,30,40-70,80- */
- select_user_range_rb = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(select_all_rb),
- "Specify a packet _range:");
- ws_gtk_grid_attach_defaults(GTK_GRID(range_grid), select_user_range_rb, 0, 5, 1, 1);
- gtk_widget_set_tooltip_text (select_user_range_rb,("Process a specified packet range"));
- g_signal_connect(select_user_range_rb, "toggled", G_CALLBACK(toggle_select_user_range), range_grid);
-
- select_user_range_c_lb = gtk_label_new("?");
- ws_gtk_grid_attach_defaults(GTK_GRID(range_grid), select_user_range_c_lb, 1, 5, 1, 1);
- select_user_range_d_lb = gtk_label_new("?");
- ws_gtk_grid_attach_defaults(GTK_GRID(range_grid), select_user_range_d_lb, 2, 5, 1, 1);
-
-
- /* The entry part */
- select_user_range_entry = gtk_entry_new();
- gtk_entry_set_max_length (GTK_ENTRY (select_user_range_entry), 254);
- ws_gtk_grid_attach_defaults(GTK_GRID(range_grid), select_user_range_entry, 0, 6, 1, 1);
- gtk_widget_set_tooltip_text (select_user_range_entry,
- "Specify a range of packet numbers : \nExample : 1-10,18,25-100,332-");
- g_signal_connect(select_user_range_entry,"changed", G_CALLBACK(range_entry), range_grid);
- g_signal_connect(select_user_range_entry,"activate", G_CALLBACK(range_entry_in_event), range_grid);
-
- /* Remove ignored packets */
- remove_ignored_cb = gtk_check_button_new_with_mnemonic("Remove _Ignored packets");
- ws_gtk_grid_attach_defaults(GTK_GRID(range_grid), remove_ignored_cb, 0, 7, 1, 1);
- gtk_widget_set_tooltip_text (remove_ignored_cb,("Remove all packets marked as Ignored"));
- g_signal_connect(remove_ignored_cb, "toggled", G_CALLBACK(toggle_remove_ignored), range_grid);
-
- ignored_c_lb = gtk_label_new("?");
- ws_gtk_grid_attach_defaults(GTK_GRID(range_grid), ignored_c_lb, 1, 7, 1, 1);
- ignored_d_lb = gtk_label_new("?");
- ws_gtk_grid_attach_defaults(GTK_GRID(range_grid), ignored_d_lb, 2, 7, 1, 1);
-
- gtk_widget_show_all(range_grid);
-
-
- g_object_set_data(G_OBJECT(range_grid), RANGE_VALUES_KEY, range);
- g_object_set_data(G_OBJECT(range_grid), RANGE_CAPTURED_BT_KEY, captured_bt);
- g_object_set_data(G_OBJECT(range_grid), RANGE_DISPLAYED_BT_KEY, displayed_bt);
-
- g_object_set_data(G_OBJECT(range_grid), RANGE_SELECT_ALL_KEY, select_all_rb);
- g_object_set_data(G_OBJECT(range_grid), RANGE_SELECT_ALL_C_KEY, select_all_c_lb);
- g_object_set_data(G_OBJECT(range_grid), RANGE_SELECT_ALL_D_KEY, select_all_d_lb);
-
- g_object_set_data(G_OBJECT(range_grid), RANGE_SELECT_CURR_KEY, select_curr_rb);
- g_object_set_data(G_OBJECT(range_grid), RANGE_SELECT_CURR_C_KEY, select_curr_c_lb);
- g_object_set_data(G_OBJECT(range_grid), RANGE_SELECT_CURR_D_KEY, select_curr_d_lb);
- g_object_set_data(G_OBJECT(range_grid), RANGE_SELECT_CURR_D_KEY, select_curr_d_lb);
- g_object_set_data(G_OBJECT(range_grid), RANGE_SELECT_MARKED_KEY, select_marked_only_rb);
- g_object_set_data(G_OBJECT(range_grid), RANGE_SELECT_MARKED_C_KEY, select_marked_only_c_lb);
- g_object_set_data(G_OBJECT(range_grid), RANGE_SELECT_MARKED_D_KEY, select_marked_only_d_lb);
- g_object_set_data(G_OBJECT(range_grid), RANGE_SELECT_MARKED_RANGE_KEY, select_marked_range_rb);
- g_object_set_data(G_OBJECT(range_grid), RANGE_SELECT_MARKED_RANGE_C_KEY,select_marked_range_c_lb);
- g_object_set_data(G_OBJECT(range_grid), RANGE_SELECT_MARKED_RANGE_D_KEY,select_marked_range_d_lb);
- g_object_set_data(G_OBJECT(range_grid), RANGE_SELECT_USER_KEY, select_user_range_rb);
- g_object_set_data(G_OBJECT(range_grid), RANGE_SELECT_USER_C_KEY, select_user_range_c_lb);
- g_object_set_data(G_OBJECT(range_grid), RANGE_SELECT_USER_D_KEY, select_user_range_d_lb);
- g_object_set_data(G_OBJECT(range_grid), RANGE_SELECT_USER_ENTRY_KEY, select_user_range_entry);
-
- g_object_set_data(G_OBJECT(range_grid), RANGE_REMOVE_IGNORED_KEY, remove_ignored_cb);
- g_object_set_data(G_OBJECT(range_grid), RANGE_IGNORED_C_KEY, ignored_c_lb);
- g_object_set_data(G_OBJECT(range_grid), RANGE_IGNORED_D_KEY, ignored_d_lb);
-
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(captured_bt), !range->process_filtered);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(displayed_bt), range->process_filtered);
-
- switch(range->process) {
- case(range_process_all):
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(select_all_rb), TRUE);
- break;
- case(range_process_selected):
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(select_curr_rb), TRUE);
- break;
- case(range_process_marked):
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(select_marked_only_rb), TRUE);
- break;
- case(range_process_marked_range):
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(select_marked_range_rb), TRUE);
- break;
- case(range_process_user_range):
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(select_user_range_rb), TRUE);
- break;
- default:
- g_assert_not_reached();
- }
-
- return range_grid;
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local Variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/range_utils.h b/ui/gtk/range_utils.h
deleted file mode 100644
index 3c189939d9..0000000000
--- a/ui/gtk/range_utils.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* range_utils.h
- * Declarations of utilities to with range_utils.c (packet range dialog)
- *
- * Ulf Lamping <ulf.lamping@web.de>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __RANGE_UTILS_H__
-#define __RANGE_UTILS_H__
-
-/** @file
- * Packet range widget used for example in the "Save" and "Print" dialogs.
- */
-
-/** Check the validity of a packet_range_t, and put up an alert box if
- ** it's not valid.
- *
- * @param range the range to check
- * @return a Boolean that's TRUE if it's valid and FALSE if it isn't
- */
-extern gboolean range_check_validity(packet_range_t *range);
-
-/** Check the validity of a packet_range_t, and put up a modal alert box if
- ** it's not valid.
- *
- * @param parent the widget for the window that contained the range specification
- * @param range the range to check
- * @return a Boolean that's TRUE if it's valid and FALSE if it isn't
- */
-extern gboolean range_check_validity_modal(GtkWidget *parent, packet_range_t *range);
-
-/** Create a new range widget.
- *
- * @param range the range to set
- * @param saving TRUE if range is selecting packets to save
- * @return the new range widget
- */
-extern GtkWidget *range_new(packet_range_t *range, gboolean saving);
-
-/* Update all "dynamic" range things.
- *
- * @param data range widget
- */
-extern void range_update_dynamics(gpointer data);
-
-#endif
diff --git a/ui/gtk/response_time_delay_table.c b/ui/gtk/response_time_delay_table.c
deleted file mode 100644
index 7e4f934299..0000000000
--- a/ui/gtk/response_time_delay_table.c
+++ /dev/null
@@ -1,399 +0,0 @@
-/* response_time_delay_table.c
- *
- * Based on service_response_time_table.c
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <gtk/gtk.h>
-
-#include "epan/packet_info.h"
-#include "epan/proto.h"
-#include <epan/stat_tap_ui.h>
-
-#include "ui/simple_dialog.h"
-#include <wsutil/utf8_entities.h>
-
-#include "ui/gtk/filter_utils.h"
-#include "ui/gtk/gui_stat_util.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/response_time_delay_table.h"
-#include "ui/gtk/tap_param_dlg.h"
-#include "ui/gtk/main.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-#include "globals.h"
-
-enum
-{
- TYPE_COLUMN,
- MESSAGES_COLUMN,
- MIN_SRT_COLUMN,
- MAX_SRT_COLUMN,
- AVG_SRT_COLUMN,
- MIN_FRAME_COLUMN,
- MAX_FRAME_COLUMN,
- OPEN_REQUESTS_COLUMN,
- DISCARDED_RESPONSES_COLUMN,
- REPEATED_REQUESTS_COLUMN,
- REPEATED_RESPONSES_COLUMN
-};
-
-static const stat_column titles[]={
- {G_TYPE_STRING, TAP_ALIGN_LEFT, "Type" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "Messages" },
- {G_TYPE_STRING, TAP_ALIGN_RIGHT, "Min SRT" },
- {G_TYPE_STRING, TAP_ALIGN_RIGHT, "Max SRT" },
- {G_TYPE_STRING, TAP_ALIGN_RIGHT, "Avg SRT" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "Min in Frame" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "Max in Frame" }
-};
-
-static const stat_column titles_more[]={
- {G_TYPE_STRING, TAP_ALIGN_LEFT, "Type" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "Messages" },
- {G_TYPE_STRING, TAP_ALIGN_RIGHT, "Min SRT" },
- {G_TYPE_STRING, TAP_ALIGN_RIGHT, "Max SRT" },
- {G_TYPE_STRING, TAP_ALIGN_RIGHT, "Avg SRT" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "Min in Frame" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "Max in Frame" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "Open Requests" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "Discarded Responses" },
- {G_TYPE_STRING, TAP_ALIGN_RIGHT, "Repeated Requests" },
- {G_TYPE_STRING, TAP_ALIGN_RIGHT, "Repeated Responses"}
-};
-
-typedef struct _gtk_rtd_t {
- GtkWidget *vbox;
- GtkWidget *win;
- GtkTreeView *table; /**< Tree view */
- GtkWidget *scrolled_window; /**< window widget */
- GtkWidget *menu; /**< context menu */
- GtkWidget *open_req_label;
- GtkWidget *dis_rsp_label;
- GtkWidget *repeat_req_label;
- GtkWidget *repeat_rsp_label;
-} gtk_rtd_t;
-
-typedef struct _rtd_t {
- const char *type;
- const char *filter;
- gtk_rtd_t gtk_data;
- register_rtd_t* rtd;
- rtd_data_t data;
-} rtd_t;
-
-static void
-rtd_set_title(rtd_t *rr)
-{
- gchar *str;
-
- str = g_strdup_printf("%s Service Response Time statistics", proto_get_protocol_short_name(find_protocol_by_id(get_rtd_proto_id(rr->rtd))));
- set_window_title(rr->gtk_data.win, str);
- g_free(str);
-}
-
-static void
-win_destroy_cb(GtkWindow *win _U_, gpointer data)
-{
- rtd_t *rr = (rtd_t*)data;
-
- remove_tap_listener(&rr->data);
-
- free_rtd_table(&rr->data.stat_table, NULL, NULL);
-
- g_free(rr);
-}
-
-static void
-init_gtk_rtd_table(rtd_stat_table* rtd, void* gui_data)
-{
- gtk_rtd_t* gtk_data = (gtk_rtd_t*)gui_data;
-
- if (rtd->num_rtds == 1)
- {
- gtk_window_set_default_size(GTK_WINDOW(gtk_data->win), RTD_PREFERRED_WIDTH, 300);
-
- gtk_data->open_req_label = gtk_label_new("Open Requests: 0");
- gtk_box_pack_start(GTK_BOX(gtk_data->vbox), gtk_data->open_req_label, FALSE, FALSE, 0);
- gtk_widget_show(gtk_data->open_req_label);
-
- gtk_data->dis_rsp_label = gtk_label_new("Discarded Responses: 0");
- gtk_box_pack_start(GTK_BOX(gtk_data->vbox), gtk_data->dis_rsp_label, FALSE, FALSE, 0);
- gtk_widget_show(gtk_data->dis_rsp_label);
-
- gtk_data->repeat_req_label = gtk_label_new("Repeated Requests: 0");
- gtk_box_pack_start(GTK_BOX(gtk_data->vbox), gtk_data->repeat_req_label, FALSE, FALSE, 0);
- gtk_widget_show(gtk_data->repeat_req_label);
-
- gtk_data->repeat_rsp_label = gtk_label_new("Repeated Responses: 0");
- gtk_box_pack_start(GTK_BOX(gtk_data->vbox), gtk_data->repeat_rsp_label, FALSE, FALSE, 0);
- gtk_widget_show(gtk_data->repeat_rsp_label);
-
- gtk_data->table = create_stat_table(gtk_data->scrolled_window, gtk_data->vbox, 7, titles);
- }
- else
- {
- gtk_window_set_default_size(GTK_WINDOW(gtk_data->win), RTD_PREFERRED_WIDTH+100, 200);
- gtk_data->table = create_stat_table(gtk_data->scrolled_window, gtk_data->vbox, 11, titles_more);
- }
-}
-
-static void
-rtd_draw(void *arg)
-{
- GtkListStore *store;
- rtd_data_t* rtd_data = (rtd_data_t*)arg;
- rtd_t* rtd = (rtd_t*)rtd_data->user_data;
- rtd_timestat *ms;
- GtkTreeIter iter;
- char str[5][256];
- gchar* tmp_str;
- guint i, j;
- char label_str[256];
-
- /* clear list before printing */
- store = GTK_LIST_STORE(gtk_tree_view_get_model(rtd->gtk_data.table));
- gtk_list_store_clear(store);
-
- if (rtd_data->stat_table.num_rtds == 1)
- {
- ms = &rtd_data->stat_table.time_stats[0];
-
- g_snprintf(label_str, sizeof(char[256]), "Open Requests: %u", ms->open_req_num);
- gtk_label_set_text(GTK_LABEL(rtd->gtk_data.open_req_label), label_str);
- g_snprintf(label_str, sizeof(char[256]), "Discarded Responses: %u", ms->disc_rsp_num);
- gtk_label_set_text(GTK_LABEL(rtd->gtk_data.dis_rsp_label), label_str);
- g_snprintf(label_str, sizeof(char[256]), "Repeated Requests: %u", ms->req_dup_num);
- gtk_label_set_text(GTK_LABEL(rtd->gtk_data.repeat_req_label), label_str);
- g_snprintf(label_str, sizeof(char[256]), "Repeated Responses: %u", ms->rsp_dup_num);
- gtk_label_set_text(GTK_LABEL(rtd->gtk_data.repeat_rsp_label), label_str);
-
- for(i=0;i<ms->num_timestat;i++)
- {
- /* nothing seen, nothing to do */
- if(ms->rtd[i].num==0){
- continue;
- }
-
- g_snprintf(str[0], sizeof(char[256]), "%8.2f msec", nstime_to_msec(&(ms->rtd[i].min)));
- g_snprintf(str[1], sizeof(char[256]), "%8.2f msec", nstime_to_msec(&(ms->rtd[i].max)));
- g_snprintf(str[2], sizeof(char[256]), "%8.2f msec", get_average(&(ms->rtd[i].tot), ms->rtd[i].num));
- tmp_str = val_to_str_wmem(NULL, i, get_rtd_value_string(rtd->rtd), "Other (%d)");
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter,
- TYPE_COLUMN, tmp_str,
- MESSAGES_COLUMN, ms->rtd[i].num,
- MIN_SRT_COLUMN, str[0],
- MAX_SRT_COLUMN, str[1],
- AVG_SRT_COLUMN, str[2],
- MIN_FRAME_COLUMN, ms->rtd[i].min_num,
- MAX_FRAME_COLUMN, ms->rtd[i].max_num,
- -1);
- wmem_free(NULL, tmp_str);
- }
- }
- else
- {
- for (i=0; i<rtd_data->stat_table.num_rtds; i++)
- {
- for (j=0; j<rtd_data->stat_table.time_stats[i].num_timestat; j++)
- {
-
- /* nothing seen, nothing to do */
- if(rtd_data->stat_table.time_stats[i].rtd[j].num==0){
- continue;
- }
-
- g_snprintf(str[0], 256, "%8.2f msec", nstime_to_msec(&(rtd_data->stat_table.time_stats[i].rtd[j].min)));
- g_snprintf(str[1], 256, "%8.2f msec", nstime_to_msec(&(rtd_data->stat_table.time_stats[i].rtd[j].max)));
- g_snprintf(str[2], 256, "%8.2f msec", get_average(&(rtd_data->stat_table.time_stats[i].rtd[j].tot), rtd_data->stat_table.time_stats[i].rtd[j].num));
- g_snprintf(str[3], 256, "%4u (%4.2f%%)", rtd_data->stat_table.time_stats[i].req_dup_num,
- rtd_data->stat_table.time_stats[i].rtd[j].num?((double)rtd_data->stat_table.time_stats[i].req_dup_num*100)/(double)rtd_data->stat_table.time_stats[i].rtd[j].num:0);
- g_snprintf(str[4], 256, "%4u (%4.2f%%)", rtd_data->stat_table.time_stats[i].rsp_dup_num,
- rtd_data->stat_table.time_stats[i].rtd[j].num?((double)rtd_data->stat_table.time_stats[i].rsp_dup_num*100)/(double)rtd_data->stat_table.time_stats[i].rtd[j].num:0);
- tmp_str = val_to_str_wmem(NULL, i, get_rtd_value_string(rtd->rtd), "Other (%d)");
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter,
- TYPE_COLUMN, tmp_str,
- MESSAGES_COLUMN, rtd_data->stat_table.time_stats[i].rtd[j].num,
- MIN_SRT_COLUMN, str[0],
- MAX_SRT_COLUMN, str[1],
- AVG_SRT_COLUMN, str[2],
- MIN_FRAME_COLUMN, rtd_data->stat_table.time_stats[i].rtd[j].min_num,
- MAX_FRAME_COLUMN, rtd_data->stat_table.time_stats[i].rtd[j].max_num,
- OPEN_REQUESTS_COLUMN, rtd_data->stat_table.time_stats[i].open_req_num,
- DISCARDED_RESPONSES_COLUMN, rtd_data->stat_table.time_stats[i].disc_rsp_num,
- REPEATED_REQUESTS_COLUMN, str[3],
- REPEATED_RESPONSES_COLUMN, str[4],
- -1);
- wmem_free(NULL, tmp_str);
- }
- }
- }
-}
-
-static void
-reset_table_data(rtd_stat_table* table _U_, void* gui_data)
-{
- GtkListStore *store;
- gtk_rtd_t* gtk_data = (gtk_rtd_t*)gui_data;
-
- store = GTK_LIST_STORE(gtk_tree_view_get_model(gtk_data->table));
- gtk_list_store_clear(store);
-}
-
-static void
-rtd_reset(void *arg)
-{
- rtd_data_t *rtd = (rtd_data_t*)arg;
- rtd_t *rr = (rtd_t *)rtd->user_data;
-
- reset_rtd_table(&rtd->stat_table, reset_table_data, &rr->gtk_data);
-
- rtd_set_title(rr);
-}
-
-static void
-init_rtd_tables(register_rtd_t* rtd, const char *filter)
-{
- rtd_t *rr;
- gchar *str;
- GString *error_string;
- GtkWidget *bbox;
- GtkWidget *close_bt;
-
- rr = g_new0(rtd_t, 1);
-
- str = g_strdup_printf("%s SRT", proto_get_protocol_short_name(find_protocol_by_id(get_rtd_proto_id(rtd))));
- rr->gtk_data.win=dlg_window_new(str); /* transient_for top_level */
- g_free(str);
- gtk_window_set_destroy_with_parent (GTK_WINDOW(rr->gtk_data.win), TRUE);
-
- rr->gtk_data.vbox=ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
-
- str = g_strdup_printf("%s Service Response Time statistics", proto_get_protocol_short_name(find_protocol_by_id(get_rtd_proto_id(rtd))));
- init_main_stat_window(rr->gtk_data.win, rr->gtk_data.vbox, str, filter);
- g_free(str);
-
- /* init a scrolled window*/
- rr->gtk_data.scrolled_window = scrolled_window_new(NULL, NULL);
-
- rr->type = proto_get_protocol_short_name(find_protocol_by_id(get_rtd_proto_id(rtd)));
- rr->filter = g_strdup(filter);
- rr->rtd = rtd;
- rr->data.user_data = rr;
-
- rtd_table_dissector_init(rtd, &rr->data.stat_table, init_gtk_rtd_table, &rr->gtk_data);
-
- error_string = register_tap_listener(get_rtd_tap_listener_name(rtd), &rr->data, filter, 0, rtd_reset, get_rtd_packet_func(rtd), rtd_draw);
- if(error_string){
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
- g_string_free(error_string, TRUE);
- free_rtd_table(&rr->data.stat_table, NULL, NULL);
- g_free(rr);
- return;
- }
-
- /* Button row. */
- bbox = dlg_button_row_new(GTK_STOCK_CLOSE, NULL);
- gtk_box_pack_end(GTK_BOX(rr->gtk_data.vbox), bbox, FALSE, FALSE, 0);
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(rr->gtk_data.win, close_bt, window_cancel_button_cb);
-
- g_signal_connect(rr->gtk_data.win, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(rr->gtk_data.win, "destroy", G_CALLBACK(win_destroy_cb), rr);
-
- gtk_widget_show_all(rr->gtk_data.win);
- window_present(rr->gtk_data.win);
-
- cf_retap_packets(&cfile);
- gdk_window_raise(gtk_widget_get_window(rr->gtk_data.win));
-}
-
-static void
-gtk_rtdstat_init(const char *opt_arg, void *userdata _U_)
-{
- gchar** dissector_name;
- register_rtd_t *rtd;
- const char *filter=NULL;
- char* err;
-
- /* Use first comma to find dissector name */
- dissector_name = g_strsplit(opt_arg, ",", -1);
- g_assert(dissector_name[0]);
-
- /* Use dissector name to find SRT table */
- rtd = get_rtd_table_by_name(dissector_name[0]);
- g_assert(rtd);
-
- rtd_table_get_filter(rtd, opt_arg, &filter, &err);
-
- if (err != NULL)
- {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err);
- g_free(err);
- return;
- }
-
- init_rtd_tables(rtd, filter);
-}
-
-static tap_param rtd_stat_params[] = {
- { PARAM_FILTER, "filter", "Filter", NULL, TRUE }
-};
-
-gboolean register_response_time_delay_tables(const void *key _U_, void *value, void *userdata _U_)
-{
- register_rtd_t* rtd = (register_rtd_t*)value;
- const char* short_name = proto_get_protocol_short_name(find_protocol_by_id(get_rtd_proto_id(rtd)));
- tap_param_dlg* rtd_dlg;
-
- rtd_dlg = g_new(tap_param_dlg, 1);
-
- rtd_dlg->win_title = g_strdup_printf("%s RTD Statistics", short_name);
- rtd_dlg->init_string = rtd_table_get_tap_string(rtd);
- rtd_dlg->tap_init_cb = gtk_rtdstat_init;
- rtd_dlg->index = -1;
-
- rtd_dlg->nparams = G_N_ELEMENTS(rtd_stat_params);
- rtd_dlg->params = rtd_stat_params;
- rtd_dlg->user_data = rtd; /* TODO: Actually use this */
-
- register_param_stat(rtd_dlg, short_name, REGISTER_STAT_GROUP_RESPONSE_TIME);
- return FALSE;
-}
-
-/*
- * Editor modelines - http://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/gtk/response_time_delay_table.h b/ui/gtk/response_time_delay_table.h
deleted file mode 100644
index bd178796cd..0000000000
--- a/ui/gtk/response_time_delay_table.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* response_time_delay_table.h
- *
- * Based on service_response_time_table.h
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __RESPONSE_TIME_DELAY_TABLE_H__
-#define __RESPONSE_TIME_DELAY_TABLE_H__
-
-#include <gtk/gtk.h>
-#include "wsutil/nstime.h"
-#include "epan/rtd_table.h"
-
-
-/** Suggested width of RTD window */
-#define RTD_PREFERRED_WIDTH 650
-
-/** Register function to register dissectors that support RTD for GTK.
- *
- * @param key is unused
- * @param value register_rtd_t* representing dissetor RTD table
- * @param userdata is unused
- */
-gboolean register_response_time_delay_tables(const void *key, void *value, void *userdata);
-
-#endif /* __RESPONSE_TIME_DELAY_TABLE_H__ */
diff --git a/ui/gtk/rlc_lte_graph.c b/ui/gtk/rlc_lte_graph.c
deleted file mode 100644
index 02b8e51af7..0000000000
--- a/ui/gtk/rlc_lte_graph.c
+++ /dev/null
@@ -1,2733 +0,0 @@
-/* rlc_lte_graph.c
- * By Martin Mathieson
- * Based upon tcp_graph.c
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <math.h>
-
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-#if GTK_CHECK_VERSION(3,0,0)
-# include <gdk/gdkkeysyms-compat.h>
-#endif
-
-#include <ui/tap-rlc-graph.h>
-
-#include <epan/packet.h>
-#include <epan/epan_dissect.h>
-#include <epan/dissectors/packet-rlc-lte.h>
-#include <epan/tap.h>
-
-#include "../../globals.h"
-#include "../../frame_tvbuff.h"
-#include "ui/simple_dialog.h"
-#include <epan/stat_groups.h>
-
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_stat_menu.h"
-#include "ui/gtk/tap_param_dlg.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-#include <wsutil/strtoi.h>
-
-#ifndef HAVE_LRINT
-#define lrint rint
-#endif
-
-#define AXIS_HORIZONTAL 0
-#define AXIS_VERTICAL 1
-
-#define WINDOW_TITLE_LENGTH 256
-
-#define MOUSE_BUTTON_LEFT 1
-#define MOUSE_BUTTON_MIDDLE 2
-#define MOUSE_BUTTON_RIGHT 3
-
-#define MAX_PIXELS_PER_SN 90
-#define MAX_PIXELS_PER_SECOND 50000
-
-extern int proto_rlc_lte;
-
-
-
-struct line {
- double x1, y1, x2, y2;
-};
-
-struct irect {
- int x, y, width, height;
-};
-
-struct zoomfactor {
- double x, y;
-};
-
-typedef enum {
- ELMT_NONE = 0,
- ELMT_LINE = 1,
- ELMT_ELLIPSE = 2
-} ElementType;
-
-struct line_params {
- struct line dim;
-};
-
-struct rect {
- double x, y, width, height;
-};
-
-struct ellipse_params {
- struct rect dim;
-};
-
-struct element {
- ElementType type;
- GdkRGBA *elment_color_p;
- struct rlc_segment *parent;
- union {
- struct line_params line;
- struct ellipse_params ellipse;
- } p;
-};
-
-struct element_list {
- struct element_list *next;
- struct element *elements;
-};
-
-struct axis {
- struct gtk_rlc_graph *g; /* which graph we belong to */
- GtkWidget *drawing_area;
- /* Double-buffering to avoid flicker */
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_surface_t *surface[2];
-#else
- GdkPixmap *pixmap[2];
-#endif
- /* Which of the 2 buffers we are currently showing */
- int displayed;
- gboolean is_horizontal_axis;
- /* dim and orig (relative to origin of window) of axis' pixmap */
- struct irect p;
- /* dim and orig (relative to origin of axis' pixmap) of scale itself */
- struct irect s;
- gdouble min, max;
- gdouble major, minor; /* major and minor ticks */
- const char **label;
-};
-
-#define HAXIS_INIT_HEIGHT 70
-#define VAXIS_INIT_WIDTH 100
-#define TITLEBAR_HEIGHT 50
-#define RMARGIN_WIDTH 30
-
-struct style_rlc_lte {
- GdkRGBA seq_color;
- GdkRGBA seq_resegmented_color;
- GdkRGBA ack_color[2];
- int flags;
-};
-
-/* style flags */
-#define TIME_ORIGIN 0x10
-/* show time from beginning of capture as opposed to time from beginning
- * of the connection */
-#define TIME_ORIGIN_CAP 0x10
-#define TIME_ORIGIN_CONN 0x00
-
-struct cross {
- int x, y;
- int draw; /* indicates whether we should draw cross at all */
- int erase_needed; /* indicates whether currently drawn at recorded position */
-};
-
-struct bounds {
- double x0, y0, width, height;
-};
-
-struct zoom {
- double x, y;
-};
-
-struct zooms {
- double x, y;
- double step_x, step_y;
- struct zoom initial;
-#define ZOOM_OUT (1 << 0)
- int flags;
-};
-
-struct grab {
- int grabbed;
- int x, y;
-};
-
-
-
-/* struct rlc_graph is shared between GTK and Qt implementations. */
-struct gtk_rlc_graph {
-#define GRAPH_DESTROYED (1 << 0)
- int flags;
- GtkWidget *toplevel; /* keypress handler needs this */
- GtkWidget *drawing_area;
- PangoFontDescription *font; /* font used for annotations etc. */
-
- /* Double-buffering */
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_surface_t *title_surface;
- cairo_surface_t *surface[2];
-#else
- GdkPixmap *title_pixmap;
- GdkPixmap *pixmap[2];
-#endif
- int displayed; /* which of both pixmaps is on screen right now */
-
- /* Next 4 attribs describe the graph in natural units, before any scaling.
- * For example, if we want to display graph of TCP conversation that
- * started 112.309845 s after beginning of the capture and ran until
- * 479.093582 s, 237019 B went through the connection (in one direction)
- * starting with isn 31934022, then (bounds.x0, bounds.y0)=(112.309845,
- * 31934022) and (bounds.width, bounds.height)=(366.783737, 237019). */
- struct bounds bounds;
- /* dimensions and position of the graph, both expressed already in pixels.
- * x and y give the position of upper left corner of the graph relative
- * to origin of the graph window, size is basically bounds*zoom */
- struct irect geom;
- /* viewport (=graph window area which is reserved for graph itself), its
- * size and position relative to origin of the graph window */
- struct irect wp;
- struct grab grab;
- /* If we need to display 237019 sequence numbers (=bytes) onto say 500
- * pixels, we have to scale the graph down by factor of 0.002109. This
- * number would be zoom.y. Obviously, both directions have separate zooms.*/
- struct zooms zoom;
- gboolean zoomrect_erase_needed;
- struct cross cross;
- struct axis *x_axis, *y_axis;
-
- struct rlc_graph graph;
-
- /* Colours, etc to be used in drawing */
- struct style_rlc_lte style;
-};
-
-static int refnum = 0;
-
-#define debug(section) if (debugging & section)
-/* print function entry points */
-#define DBS_FENTRY (1 << 0)
-#define DBS_AXES_TICKS (1 << 1)
-#define DBS_AXES_DRAWING (1 << 2)
-#define DBS_GRAPH_DRAWING (1 << 3)
-#define DBS_TPUT_ELMTS (1 << 4)
-/*static int debugging = DBS_FENTRY;*/
-/*static int debugging = DBS_AXES_TICKS;*/
-/*static int debugging = DBS_AXES_DRAWING;*/
-/*static int debugging = DBS_GRAPH_DRAWING;*/
-/*static int debugging = DBS_TPUT_ELMTS;*/
-static int debugging = 0;
-
-static void create_gui(struct gtk_rlc_graph * );
-static void create_drawing_area(struct gtk_rlc_graph * );
-static void callback_toplevel_destroy(GtkWidget * , gpointer );
-static void callback_create_help(GtkWidget * , gpointer );
-static void get_mouse_position(GtkWidget *, int *pointer_x, int *pointer_y, GdkModifierType *mask);
-static void get_data_control_counts(struct gtk_rlc_graph *g, int *data, int *acks, int *nacks);
-
-static struct gtk_rlc_graph *graph_new(void);
-static void graph_destroy(struct gtk_rlc_graph * );
-static void graph_initialize_values(struct gtk_rlc_graph * );
-static void graph_init_sequence(struct gtk_rlc_graph * );
-static void draw_element_line(struct gtk_rlc_graph * , struct element * , cairo_t * , GdkRGBA *new_color);
-static void draw_element_ellipse(struct gtk_rlc_graph * , struct element * , cairo_t *cr , GdkRGBA *new_color);
-static void graph_display(struct gtk_rlc_graph * );
-static void graph_pixmaps_create(struct gtk_rlc_graph * );
-static void graph_pixmaps_switch(struct gtk_rlc_graph * );
-static void graph_pixmap_draw(struct gtk_rlc_graph * );
-static void graph_pixmap_display(struct gtk_rlc_graph * );
-static void graph_element_lists_make(struct gtk_rlc_graph * );
-static void graph_element_lists_free(struct gtk_rlc_graph * );
-static void graph_element_lists_initialize(struct gtk_rlc_graph * );
-static void graph_title_pixmap_create(struct gtk_rlc_graph * );
-static void graph_title_pixmap_draw(struct gtk_rlc_graph * );
-static void graph_title_pixmap_display(struct gtk_rlc_graph * );
-static void graph_select_segment(struct gtk_rlc_graph * , int , int );
-static int line_detect_collision(struct element * , int , int );
-static int ellipse_detect_collision(struct element *e, int x, int y);
-static void axis_pixmaps_create(struct axis * );
-static void axis_pixmaps_switch(struct axis * );
-static void axis_display(struct axis * );
-static void v_axis_pixmap_draw(struct axis * );
-static void h_axis_pixmap_draw(struct axis * );
-static void axis_pixmap_display(struct axis * );
-static void axis_compute_ticks(struct axis * , double , double , int );
-static double axis_zoom_get(struct axis * , int );
-static void axis_ticks_up(int * , int * );
-static void axis_ticks_down(int * , int * );
-static void axis_destroy(struct axis * );
-static int get_label_dim(struct axis * , int , double );
-
-static void toggle_crosshairs(struct gtk_rlc_graph *);
-static void cross_draw(struct gtk_rlc_graph * , int x, int y);
-static void cross_erase(struct gtk_rlc_graph * );
-static void zoomrect_draw(struct gtk_rlc_graph * , int , int );
-static void zoomrect_erase(struct gtk_rlc_graph * );
-static gboolean motion_notify_event(GtkWidget * , GdkEventMotion * , gpointer );
-
-static void toggle_time_origin(struct gtk_rlc_graph * );
-static void restore_initial_graph_view(struct gtk_rlc_graph *g);
-static gboolean configure_event(GtkWidget * , GdkEventConfigure * , gpointer );
-#if GTK_CHECK_VERSION(3,0,0)
-static gboolean draw_event(GtkWidget *widget, cairo_t *cr, gpointer user_data);
-#else
-static gboolean expose_event(GtkWidget * , GdkEventExpose * , gpointer );
-#endif
-static gboolean button_press_event(GtkWidget * , GdkEventButton * , gpointer );
-static gboolean button_release_event(GtkWidget * , GdkEventButton * , gpointer );
-static gboolean key_press_event(GtkWidget * , GdkEventKey * , gpointer );
-static void graph_initialize(struct gtk_rlc_graph *);
-static void graph_get_bounds(struct gtk_rlc_graph *);
-static void graph_read_config(struct gtk_rlc_graph *);
-static void rlc_lte_make_elmtlist(struct gtk_rlc_graph *);
-
-#if defined(_WIN32) && !defined(__MINGW32__) && (_MSC_VER < 1800)
-/* Starting VS2013, rint already defined in math.h. No need to redefine */
-static int rint(double ); /* compiler template for Windows */
-#endif
-
-/* This should arguably be part of the graph, but in practice you can
- only click on one graph at a time, so this is probably OK */
-static struct irect zoomrect;
-
-
-/* XXX - what about macOS? */
-static char helptext[] =
- "Here's what you can do:\n"
- "\n"
- " Left Mouse Button selects segment under cursor in Wireshark's packet list\n"
- " can also drag to zoom in on a rectangular region\n"
- " Middle Mouse Button zooms in (towards area under cursor)\n"
- " Right Mouse Button moves the graph (if zoomed in)\n"
- "\n"
- " <Space bar> toggles crosshairs on/off\n"
- "\n"
- " 'i' or '+' zoom in (towards area under mouse pointer)\n"
- " 'o' or '-' zoom out\n"
- " (add shift to lock Y axis, control to lock X axis)\n"
- " 'r' or <Home> restore graph to initial state (zoom out max)\n"
- " 't' toggle time axis to being at zero, or to use time in capture\n"
- "\n"
- " <Left> move view left by 100 pixels (if zoomed in)\n"
- " <Right> move view right 100 pixels (if zoomed in)\n"
- " <Up> move view up by 100 pixels (if zoomed in)\n"
- " <Down> move view down by 100 pixels (if zoomed in)\n"
- "\n"
- " <Shift><Left> move view left by 10 pixels (if zoomed in)\n"
- " <Shift><Right> move view right 10 pixels (if zoomed in)\n"
- " <Shift><Up> move view up by 10 pixels (if zoomed in)\n"
- " <Shift><Down> move view down by 10 pixels (if zoomed in)\n"
- "\n"
- " <Ctrl><Left> move view left by 1 pixel (if zoomed in)\n"
- " <Ctrl><Right> move view right 1 pixel (if zoomed in)\n"
- " <Ctrl><Up> move view up by 1 pixel (if zoomed in)\n"
- " <Ctrl><Down> move view down by 1 pixel (if zoomed in)\n"
- "\n"
- " <Page_Up> move up by a large number of pixels (if zoomed in)\n"
- " <Page_Down> move down by a large number of pixels (if zoomed in)\n"
-;
-
-static void set_busy_cursor(GdkWindow *w)
-{
- GdkCursor* cursor = gdk_cursor_new(GDK_WATCH);
- gdk_window_set_cursor(w, cursor);
- gdk_flush();
-#if GTK_CHECK_VERSION(3,0,0)
- g_object_unref(cursor);
-#else
- gdk_cursor_unref(cursor);
-#endif
-}
-
-static void unset_busy_cursor(GdkWindow *w)
-{
- gdk_window_set_cursor(w, NULL);
- gdk_flush();
-}
-
-void rlc_lte_graph_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- struct rlc_segment current;
- struct gtk_rlc_graph *g;
- gchar *err_msg = NULL;
-
- debug(DBS_FENTRY) puts("rlc_lte_graph_cb()");
-
- /* Can we choose an RLC channel from the selected frame? */
- if (!select_rlc_lte_session(&cfile, &current, &err_msg)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg);
- g_free(err_msg);
- return;
- }
-
- if (!(g = graph_new())) {
- return;
- }
-
- refnum++;
- graph_initialize_values(g);
-
- /* Get our list of segments from the packet list */
- if (!rlc_graph_segment_list_get(&cfile, &(g->graph), FALSE, &err_msg)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg);
- g_free(err_msg);
- return;
- }
-
- create_gui(g);
- graph_init_sequence(g);
-}
-
-void rlc_lte_graph_known_channel_launch(guint16 ueid, guint8 rlcMode,
- guint16 channelType, guint16 channelId,
- guint8 direction)
-{
- struct gtk_rlc_graph *g;
- gchar *err_msg = NULL;
-
- debug(DBS_FENTRY) puts("rlc_lte_graph_known_channel_launch()");
-
- if (!(g = graph_new())) {
- return;
- }
-
- refnum++;
- graph_initialize_values(g);
-
- /* Can set channel info for graph now */
- g->graph.ueid = ueid;
- g->graph.rlcMode = rlcMode;
- g->graph.channelType = channelType;
- g->graph.channelId = channelId;
- g->graph.direction = direction;
- g->graph.channelSet = TRUE;
-
- /* Get our list of segments from the packet list */
- if (!rlc_graph_segment_list_get(&cfile, &(g->graph), TRUE, &err_msg)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg);
- g_free(err_msg);
- return;
- }
-
- create_gui(g);
- graph_init_sequence(g);
-}
-
-
-static void create_gui(struct gtk_rlc_graph *g)
-{
- debug(DBS_FENTRY) puts("create_gui()");
- /* create_text_widget(g); */
- create_drawing_area(g);
-}
-
-static void create_drawing_area(struct gtk_rlc_graph *g)
-{
-#if GTK_CHECK_VERSION(3,0,0)
- GtkStyleContext *context;
-#endif
- char *display_name;
- char window_title[WINDOW_TITLE_LENGTH];
- GtkAllocation widget_alloc;
-
- debug(DBS_FENTRY) puts("create_drawing_area()");
- display_name = cf_get_display_name(&cfile);
- /* Set channel details in title */
- g_snprintf(window_title, WINDOW_TITLE_LENGTH, "LTE RLC Graph %d: %s (UE-%u, chan=%s%u %s - %s)",
- refnum, display_name,
- g->graph.ueid, (g->graph.channelType == CHANNEL_TYPE_SRB) ? "SRB" : "DRB",
- g->graph.channelId,
- (g->graph.direction == DIRECTION_UPLINK) ? "UL" : "DL",
- (g->graph.rlcMode == RLC_UM_MODE) ? "UM" : "AM");
- g_free(display_name);
- g->toplevel = dlg_window_new("RLC Graph");
- gtk_window_set_title(GTK_WINDOW(g->toplevel), window_title);
- gtk_widget_set_name(g->toplevel, "Test Graph");
-
- /* Create the drawing area */
- g->drawing_area = gtk_drawing_area_new();
- g->x_axis->drawing_area = g->y_axis->drawing_area = g->drawing_area;
- gtk_widget_set_size_request(g->drawing_area,
- g->wp.width + g->wp.x + RMARGIN_WIDTH,
- g->wp.height + g->wp.y + g->x_axis->s.height);
- gtk_widget_show(g->drawing_area);
-
-#if GTK_CHECK_VERSION(3,0,0)
- g_signal_connect(g->drawing_area, "draw", G_CALLBACK(draw_event), g);
-#else
- g_signal_connect(g->drawing_area, "expose_event", G_CALLBACK(expose_event), g);
-#endif
-
- g_signal_connect(g->drawing_area, "button_press_event",
- G_CALLBACK(button_press_event), g);
- g_signal_connect(g->drawing_area, "button_release_event",
- G_CALLBACK(button_release_event), g);
- g_signal_connect(g->toplevel, "destroy", G_CALLBACK(callback_toplevel_destroy), g);
- g_signal_connect(g->drawing_area, "motion_notify_event",
- G_CALLBACK(motion_notify_event), g);
-
- /* why doesn't drawing area send key_press_signals? */
- g_signal_connect(g->toplevel, "key_press_event", G_CALLBACK(key_press_event), g);
- gtk_widget_set_events(g->toplevel,
- GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK);
-
- gtk_widget_set_events(g->drawing_area,
- GDK_EXPOSURE_MASK
- | GDK_LEAVE_NOTIFY_MASK
- | GDK_ENTER_NOTIFY_MASK
- | GDK_BUTTON_PRESS_MASK
- | GDK_BUTTON_RELEASE_MASK
- | GDK_POINTER_MOTION_MASK
- | GDK_POINTER_MOTION_HINT_MASK);
-
- gtk_container_add(GTK_CONTAINER(g->toplevel), g->drawing_area);
- gtk_widget_show(g->toplevel);
-
- /* In case we didn't get what we asked for */
- gtk_widget_get_allocation(GTK_WIDGET(g->drawing_area), &widget_alloc);
- g->wp.width = widget_alloc.width - g->wp.x - RMARGIN_WIDTH;
- g->wp.height = widget_alloc.height - g->wp.y - g->x_axis->s.height;
-
-#if GTK_CHECK_VERSION(3,0,0)
- context = gtk_widget_get_style_context(g->drawing_area);
- gtk_style_context_get(context, GTK_STATE_FLAG_NORMAL,
- GTK_STYLE_PROPERTY_FONT, &g->font,
- NULL);
-#else
- g->font = gtk_widget_get_style(g->drawing_area)->font_desc;
-
-#endif
-
- g_signal_connect(g->drawing_area, "configure_event", G_CALLBACK(configure_event), g);
-}
-
-static void callback_toplevel_destroy(GtkWidget *widget _U_, gpointer data)
-{
- struct gtk_rlc_graph *g = (struct gtk_rlc_graph * )data;
-
- if (!(g->flags & GRAPH_DESTROYED)) {
- g->flags |= GRAPH_DESTROYED;
- graph_destroy((struct gtk_rlc_graph * )data);
- }
-}
-
-static void callback_create_help(GtkWidget *widget _U_, gpointer data _U_)
-{
- GtkWidget *toplevel, *vbox, *text, *scroll, *bbox, *close_bt;
- GtkTextBuffer *buf;
-
- toplevel = dlg_window_new("Help for LTE RLC graphing");
- gtk_window_set_default_size(GTK_WINDOW(toplevel), 540, 540);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 12);
- gtk_container_add(GTK_CONTAINER(toplevel), vbox);
-
- scroll = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scroll),
- GTK_SHADOW_IN);
- gtk_box_pack_start(GTK_BOX(vbox), scroll, TRUE, TRUE, 0);
- text = gtk_text_view_new();
- gtk_text_view_set_editable(GTK_TEXT_VIEW(text), FALSE);
- buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
- gtk_text_buffer_set_text(buf, helptext, -1);
- gtk_container_add(GTK_CONTAINER(scroll), text);
-
- /* Button row. */
- bbox = dlg_button_row_new(GTK_STOCK_CLOSE, NULL);
- gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
- gtk_widget_show(bbox);
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(toplevel, close_bt, window_cancel_button_cb);
-
- g_signal_connect(toplevel, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
-
- gtk_widget_show_all(toplevel);
- window_present(toplevel);
-}
-
-static void get_mouse_position(GtkWidget *widget, int *pointer_x, int *pointer_y, GdkModifierType *mask)
-{
-#if GTK_CHECK_VERSION(3,0,0)
- gdk_window_get_device_position (gtk_widget_get_window(widget),
- gdk_device_manager_get_client_pointer(
- gdk_display_get_device_manager(
- gtk_widget_get_display(GTK_WIDGET(widget)))),
- pointer_x, pointer_y, mask);
-
-#else
- gdk_window_get_pointer (gtk_widget_get_window(widget), pointer_x, pointer_y, mask);
-#endif
-}
-
-static struct gtk_rlc_graph *graph_new(void)
-{
- struct gtk_rlc_graph *g;
-
- g = (struct gtk_rlc_graph * )g_malloc0(sizeof(struct gtk_rlc_graph));
- graph_element_lists_initialize(g);
-
- g->x_axis = (struct axis * )g_malloc0(sizeof(struct axis));
- g->y_axis = (struct axis * )g_malloc0(sizeof(struct axis));
-
- g->x_axis->g = g;
- g->x_axis->is_horizontal_axis = TRUE;
- g->x_axis->s.x = g->x_axis->s.y = 0;
- g->x_axis->s.height = HAXIS_INIT_HEIGHT;
- g->x_axis->p.x = VAXIS_INIT_WIDTH;
- g->x_axis->p.height = HAXIS_INIT_HEIGHT;
-
- g->y_axis->g = g;
- g->y_axis->is_horizontal_axis = FALSE;
- g->y_axis->p.x = g->y_axis->p.y = 0;
- g->y_axis->p.width = VAXIS_INIT_WIDTH;
- g->y_axis->s.x = 0;
- g->y_axis->s.y = TITLEBAR_HEIGHT;
- g->y_axis->s.width = VAXIS_INIT_WIDTH;
-
- return g;
-}
-
-static void graph_initialize_values(struct gtk_rlc_graph *g)
-{
- g->geom.width = g->wp.width = 750;
- g->geom.height = g->wp.height = 550;
- g->geom.x = g->wp.x = VAXIS_INIT_WIDTH;
- g->geom.y = g->wp.y = TITLEBAR_HEIGHT;
- g->flags = 0;
- g->zoom.x = g->zoom.y = 1.0;
-
- /* Zooming in step - set same for both dimensions */
- g->zoom.step_x = g->zoom.step_y = 1.15;
- g->zoom.flags = 0;
-
- g->cross.draw = g->cross.erase_needed = FALSE;
- g->zoomrect_erase_needed = FALSE;
- g->grab.grabbed = 0;
-}
-
-static void graph_init_sequence(struct gtk_rlc_graph *g)
-{
- debug(DBS_FENTRY) puts("graph_init_sequence()");
-
- graph_initialize(g);
- g->zoom.initial.x = g->zoom.x;
- g->zoom.initial.y = g->zoom.y;
- graph_element_lists_make(g);
- g->x_axis->s.width = g->wp.width;
- g->x_axis->p.width = g->x_axis->s.width + RMARGIN_WIDTH;
- g->x_axis->p.y = TITLEBAR_HEIGHT + g->wp.height;
- g->x_axis->s.height = g->x_axis->p.height = HAXIS_INIT_HEIGHT;
- g->y_axis->s.height = g->wp.height;
- g->y_axis->p.height = g->wp.height + TITLEBAR_HEIGHT;
- graph_pixmaps_create(g);
- axis_pixmaps_create(g->y_axis);
- axis_pixmaps_create(g->x_axis);
- graph_title_pixmap_create(g);
- graph_title_pixmap_draw(g);
- graph_title_pixmap_display(g);
- graph_display(g);
- axis_display(g->y_axis);
- axis_display(g->x_axis);
-}
-
-static void graph_initialize(struct gtk_rlc_graph *g)
-{
- debug(DBS_FENTRY) puts("graph_initialize()");
- graph_get_bounds(g);
-
- /* Want to start with absolute times, rather than being relative to 0 */
- g->x_axis->min = g->bounds.x0;
- g->y_axis->min = 0;
-
- graph_read_config(g);
-}
-
-static void graph_destroy(struct gtk_rlc_graph *g)
-{
- debug(DBS_FENTRY) puts("graph_destroy()");
-
- axis_destroy(g->x_axis);
- axis_destroy(g->y_axis);
- /* window_destroy(g->drawing_area); */
- window_destroy(g->toplevel);
- /* window_destroy(g->text); */
-#if GTK_CHECK_VERSION(2,22,0)
- if (g->title_surface){
- cairo_surface_destroy(g->title_surface);
- }
- if (g->surface[0]){
- cairo_surface_destroy(g->surface[0]);
- }
- if (g->surface[1]){
- cairo_surface_destroy(g->surface[1]);
- }
-#else
- g_object_unref(g->pixmap[0]);
- g_object_unref(g->pixmap[1]);
-#endif /* GTK_CHECK_VERSION(2,22,0) */
- g_free(g->x_axis);
- g_free(g->y_axis);
- rlc_graph_segment_list_free(&g->graph);
- graph_element_lists_free(g);
-
- g_free(g);
-}
-
-static void graph_element_lists_initialize(struct gtk_rlc_graph *g)
-{
- g->graph.elists = (struct element_list *)g_malloc0(sizeof(struct element_list));
- g->graph.elists->elements = NULL;
- g->graph.elists->next = NULL;
-}
-
-static void graph_element_lists_make(struct gtk_rlc_graph *g)
-{
- debug(DBS_FENTRY) puts("graph_element_lists_make()");
- rlc_lte_make_elmtlist(g);
-}
-
-static void graph_element_lists_free(struct gtk_rlc_graph *g)
-{
- struct element_list *list, *next_list;
-
- for (list=g->graph.elists; list; list=next_list) {
- g_free(list->elements);
- next_list = list->next;
- g_free(list);
- }
- g->graph.elists = NULL; /* just to make debugging easier */
-}
-
-static void graph_title_pixmap_create(struct gtk_rlc_graph *g)
-{
-#if GTK_CHECK_VERSION(2,22,0)
- if (g->title_surface){
- cairo_surface_destroy(g->title_surface);
- g->title_surface = NULL;
- }
-
- g->title_surface = gdk_window_create_similar_surface(gtk_widget_get_window(g->drawing_area),
- CAIRO_CONTENT_COLOR,
- g->x_axis->p.width,
- g->wp.y);
-
-#else
- if (g->title_pixmap)
- g_object_unref(g->title_pixmap);
-
- g->title_pixmap = gdk_pixmap_new(gtk_widget_get_window(g->drawing_area),
- g->x_axis->p.width, g->wp.y, -1);
-#endif
-}
-
-static void graph_title_pixmap_draw(struct gtk_rlc_graph *g)
-{
- gint w, h;
- PangoLayout *layout;
- cairo_t *cr;
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create(g->title_surface);
-#else
- cr = gdk_cairo_create(g->title_pixmap);
-#endif
- cairo_set_source_rgb(cr, 1, 1, 1);
- cairo_rectangle(cr, 0, 0, g->x_axis->p.width, g->wp.y);
- cairo_fill(cr);
-
- layout = gtk_widget_create_pango_layout(g->drawing_area, "");
- pango_layout_get_pixel_size(layout, &w, &h);
- cairo_move_to(cr, g->wp.width/2 - w/2, 20);
- pango_cairo_show_layout(cr, layout);
- g_object_unref(G_OBJECT(layout));
-
- cairo_destroy(cr);
-}
-
-static void graph_title_pixmap_display(struct gtk_rlc_graph *g)
-{
- cairo_t *cr;
-
- cr = gdk_cairo_create(gtk_widget_get_window(g->drawing_area));
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface(cr, g->title_surface, g->wp.x, 0);
-#else
- ws_gdk_cairo_set_source_pixmap(cr, g->title_pixmap, g->wp.x, 0);
-#endif
- cairo_rectangle(cr, g->wp.x, 0, g->x_axis->p.width, g->wp.y);
- cairo_fill(cr);
- cairo_destroy(cr);
-}
-
-static void graph_pixmaps_create(struct gtk_rlc_graph *g)
-{
- debug(DBS_FENTRY) puts("graph_pixmaps_create()");
-#if GTK_CHECK_VERSION(2,22,0)
- if (g->surface[0]){
- cairo_surface_destroy(g->surface[0]);
- g->surface[0] = NULL;
- }
-
- if (g->surface[1]){
- cairo_surface_destroy(g->surface[1]);
- g->surface[1] = NULL;
- }
-
- g->surface[0] = gdk_window_create_similar_surface(gtk_widget_get_window(g->drawing_area),
- CAIRO_CONTENT_COLOR,
- g->wp.width,
- g->wp.height);
-
- g->surface[1] = gdk_window_create_similar_surface(gtk_widget_get_window(g->drawing_area),
- CAIRO_CONTENT_COLOR,
- g->wp.width,
- g->wp.height);
-
- g->displayed = 0;
-#else
- if (g->pixmap[0])
- g_object_unref(g->pixmap[0]);
- if (g->pixmap[1])
- g_object_unref(g->pixmap[1]);
-
- g->pixmap[0] = gdk_pixmap_new(gtk_widget_get_window(g->drawing_area),
- g->wp.width, g->wp.height, -1);
- g->pixmap[1] = gdk_pixmap_new(gtk_widget_get_window(g->drawing_area),
- g->wp.width, g->wp.height, -1);
-
- g->displayed = 0;
-#endif /* GTK_CHECK_VERSION(2,22,0) */
-}
-
-
-static void graph_display(struct gtk_rlc_graph *g)
-{
- set_busy_cursor(gtk_widget_get_window(g->drawing_area));
- graph_pixmap_draw(g);
- unset_busy_cursor(gtk_widget_get_window(g->drawing_area));
- graph_pixmaps_switch(g);
- graph_pixmap_display(g);
-}
-
-static void graph_pixmap_display(struct gtk_rlc_graph *g)
-{
- cairo_t *cr;
-
- cr = gdk_cairo_create(gtk_widget_get_window(g->drawing_area));
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface(cr, g->surface[g->displayed], g->wp.x, g->wp.y);
-#else
- ws_gdk_cairo_set_source_pixmap(cr, g->pixmap[g->displayed], g->wp.x, g->wp.y);
-#endif /* GTK_CHECK_VERSION(2,22,0) */
- cairo_rectangle(cr, g->wp.x, g->wp.y, g->wp.width, g->wp.height);
- cairo_fill(cr);
- cairo_destroy(cr);
-}
-
-static void graph_pixmaps_switch(struct gtk_rlc_graph *g)
-{
- g->displayed = 1 ^ g->displayed;
-}
-
-static void graph_pixmap_draw(struct gtk_rlc_graph *g)
-{
- struct element_list *list;
- struct element *e;
- int not_disp;
- cairo_t *cr;
- cairo_t *cr_elements;
- GdkRGBA *current_color = NULL;
- GdkRGBA *color_to_set = NULL;
- gboolean line_stroked = TRUE;
-
- debug(DBS_FENTRY) puts("graph_display()");
- not_disp = 1 ^ g->displayed;
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create(g->surface[not_disp]);
-#else
- cr = gdk_cairo_create(g->pixmap[not_disp]);
-#endif /* GTK_CHECK_VERSION(2,22,0) */
- cairo_set_source_rgb(cr, 1, 1, 1);
- cairo_rectangle(cr, 0, 0, g->wp.width, g->wp.height);
- cairo_fill(cr);
- cairo_destroy(cr);
-
- /* Create one cairo_t for use with all of the lines, rather than continually
- creating and destroying one for each line */
-#if GTK_CHECK_VERSION(2,22,0)
- cr_elements = cairo_create(g->surface[not_disp]);
-#else
- cr_elements = gdk_cairo_create(g->pixmap[not_disp]);
-#endif
-
- /* N.B. This makes drawing circles take half the time of the default setting.
- Changing from the default fill rule didn't make any noticeable difference
- though */
- cairo_set_tolerance(cr_elements, 1.0);
-
- /* Line width is always 1 pixel */
- cairo_set_line_width(cr_elements, 1.0);
-
- /* Draw all elements */
- for (list=g->graph.elists; list; list=list->next) {
- for (e=list->elements; e->type != ELMT_NONE; e++) {
-
- /* Work out if we need to change colour */
- if (current_color == e->elment_color_p) {
- /* No change needed */
- color_to_set = NULL;
- }
- else {
- /* Changing colour */
- current_color = color_to_set = e->elment_color_p;
- cairo_stroke(cr_elements);
- }
-
- switch (e->type) {
- case ELMT_LINE:
- /* Draw the line */
- draw_element_line(g, e, cr_elements, color_to_set);
- line_stroked = FALSE;
- break;
-
- case ELMT_ELLIPSE:
- if (!line_stroked) {
- cairo_stroke(cr_elements);
- line_stroked = TRUE;
- }
- /* Draw the ellipse */
- draw_element_ellipse(g, e, cr_elements, color_to_set);
- break;
-
- default:
- /* No other element types supported at the moment */
- break;
- }
- }
-
- /* Make sure any remaining lines get drawn */
- if (!line_stroked) {
- cairo_stroke(cr_elements);
- }
- }
-
- cairo_destroy(cr_elements);
-}
-
-static void draw_element_line(struct gtk_rlc_graph *g, struct element *e, cairo_t *cr,
- GdkRGBA *new_color)
-{
- int xx1, xx2, yy1, yy2;
-
- debug(DBS_GRAPH_DRAWING)
- printf("\nline element: (%.2f,%.2f)->(%.2f,%.2f), seg %u ...\n",
- e->p.line.dim.x1, e->p.line.dim.y1,
- e->p.line.dim.x2, e->p.line.dim.y2, e->parent->num);
-
- /* Set our new colour (if changed) */
- if (new_color != NULL) {
- gdk_cairo_set_source_rgba(cr, new_color);
- }
-
- /* Map point into graph area, and round to nearest int */
- xx1 = (int)lrint(e->p.line.dim.x1 + g->geom.x - g->wp.x);
- xx2 = (int)lrint(e->p.line.dim.x2 + g->geom.x - g->wp.x);
- yy1 = (int)lrint((g->geom.height-1-e->p.line.dim.y1) + g->geom.y-g->wp.y);
- yy2 = (int)lrint((g->geom.height-1-e->p.line.dim.y2) + g->geom.y-g->wp.y);
-
- /* If line completely out of the area, we won't show it */
- if (((xx1 < 0) && (xx2 < 0)) || ((xx1 >= g->wp.width) && (xx2 >= g->wp.width)) ||
- ((yy1 < 0) && (yy2 < 0)) || ((yy1 >= g->wp.height) && (yy2 >= g->wp.height))) {
- debug(DBS_GRAPH_DRAWING) printf(" refusing: (%d,%d)->(%d,%d)\n", xx1, yy1, xx2, yy2);
- return;
- }
-
- /* If one end of the line is out of bounds, don't worry. Cairo will
- clip the line to the outside of g->wp at the correct angle! */
-
- debug(DBS_GRAPH_DRAWING) printf("line: (%d,%d)->(%d,%d)\n", xx1, yy1, xx2, yy2);
-
- /* Draw from first position to second */
- cairo_move_to(cr, xx1+0.5, yy1+0.5);
- cairo_line_to(cr, xx2+0.5, yy2+0.5);
-}
-
-static void draw_element_ellipse(struct gtk_rlc_graph *g, struct element *e, cairo_t *cr,
- GdkRGBA *new_color)
-{
- gdouble w = e->p.ellipse.dim.width;
- gdouble h = e->p.ellipse.dim.height;
- gdouble x = e->p.ellipse.dim.x + g->geom.x - g->wp.x;
- gdouble y = g->geom.height-1 - e->p.ellipse.dim.y + g->geom.y - g->wp.y;
-
- debug(DBS_GRAPH_DRAWING) printf ("ellipse: (x, y) -> (w, h): (%f, %f) -> (%f, %f)\n", x, y, w, h);
-
- /* Set our new colour (if changed) */
- if (new_color != NULL) {
- gdk_cairo_set_source_rgba(cr, new_color);
- }
-
- cairo_save(cr);
- cairo_translate(cr, x + w/2.0, y + h/2.0);
- cairo_scale(cr, w/2.0, h/2.0);
- cairo_arc(cr, 0.0, 0.0, 1.0, 0.0, 2*G_PI);
- cairo_fill(cr);
- cairo_restore(cr);
-}
-
-
-static void axis_pixmaps_create(struct axis *axis)
-{
- debug(DBS_FENTRY) puts("axis_pixmaps_create()");
-#if GTK_CHECK_VERSION(2,22,0)
- if (axis->surface[0]){
- cairo_surface_destroy(axis->surface[0]);
- axis->surface[0] = NULL;
- }
- if (axis->surface[1]){
- cairo_surface_destroy(axis->surface[1]);
- axis->surface[1] = NULL;
- }
- axis->surface[0] = gdk_window_create_similar_surface(gtk_widget_get_window(axis->drawing_area),
- CAIRO_CONTENT_COLOR,
- axis->p.width,
- axis->p.height);
-
- axis->surface[1] = gdk_window_create_similar_surface(gtk_widget_get_window(axis->drawing_area),
- CAIRO_CONTENT_COLOR,
- axis->p.width,
- axis->p.height);
-
- axis->displayed = 0;
-#else
- if (axis->pixmap[0])
- g_object_unref(axis->pixmap[0]);
- if (axis->pixmap[1])
- g_object_unref(axis->pixmap[1]);
-
- axis->pixmap[0] = gdk_pixmap_new(gtk_widget_get_window(axis->drawing_area),
- axis->p.width, axis->p.height, -1);
- axis->pixmap[1] = gdk_pixmap_new(gtk_widget_get_window(axis->drawing_area),
- axis->p.width, axis->p.height, -1);
-
- axis->displayed = 0;
-#endif
-}
-
-static void axis_destroy(struct axis *axis)
-{
-#if GTK_CHECK_VERSION(2,22,0)
- if (axis->surface[0]){
- cairo_surface_destroy(axis->surface[0]);
- axis->surface[0] = NULL;
- }
- if (axis->surface[1]){
- cairo_surface_destroy(axis->surface[1]);
- axis->surface[1] = NULL;
- }
-#else
- g_object_unref(axis->pixmap[0]);
- g_object_unref(axis->pixmap[1]);
-#endif
- g_free((gpointer)(axis->label) );
-}
-
-static void axis_display(struct axis *axis)
-{
- if (axis->is_horizontal_axis)
- h_axis_pixmap_draw(axis);
- else
- v_axis_pixmap_draw(axis);
-
- axis_pixmaps_switch(axis);
- axis_pixmap_display(axis);
-}
-
-/* These show sequence numbers. Avoid subdividing whole numbers. */
-static void v_axis_pixmap_draw(struct axis *axis)
-{
- struct gtk_rlc_graph *g = axis->g;
- int i;
- double major_tick;
- int not_disp, offset, imin, imax;
- double bottom, top, fl, corr;
- PangoLayout *layout;
- cairo_t *cr;
-
- debug(DBS_FENTRY) puts("v_axis_pixmap_draw()");
-
- /* Work out extent of axis */
- bottom = (g->geom.height - (g->wp.height + g->wp.y + (-g->geom.y))) /
- (double )g->geom.height * g->bounds.height;
- bottom += axis->min;
- top = (g->geom.height - (g->wp.y + (-g->geom.y))) /
- (double )g->geom.height * g->bounds.height;
- top += axis->min;
- axis_compute_ticks(axis, bottom, top, AXIS_VERTICAL);
-
- not_disp = 1 ^ axis->displayed;
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create(axis->surface[not_disp]);
-#else
- cr = gdk_cairo_create(axis->pixmap[not_disp]);
-#endif
- cairo_set_source_rgb(cr, 1, 1, 1);
- cairo_rectangle(cr, 0, 0, axis->p.width, axis->p.height);
- cairo_fill(cr);
-
- /* axis */
- cairo_set_source_rgb(cr, 0, 0, 0);
- cairo_set_line_width(cr, 1.0);
- cairo_move_to(cr, axis->p.width - 1.5, (axis->p.height-axis->s.height)/2.0);
- cairo_line_to(cr, axis->s.width - 1.5, axis->p.height);
-
- offset = g->wp.y + (-g->geom.y);
- fl = floor(axis->min / axis->major) * axis->major;
- corr = rint((axis->min - fl) * g->zoom.y);
-
- /* major ticks */
- major_tick = axis->major * g->zoom.y;
- imin = (int) ((g->geom.height - offset + corr - g->wp.height) / major_tick + 1);
- imax = (int) ((g->geom.height - offset + corr) / major_tick);
- for (i=imin; i <= imax; i++) {
- gint w, h;
- char desc[32];
- int y = (int) (g->geom.height-1 - (int )lrint(i * major_tick) -
- offset + corr + axis->s.y);
-
- debug(DBS_AXES_DRAWING) printf("%f @ %d\n",
- i*axis->major + fl, y);
- if ((y < 0) || (y > axis->p.height))
- continue;
-
- cairo_move_to(cr, axis->p.width - 15, y+0.5);
- cairo_line_to(cr, axis->s.width - 1, y+0.5);
-
- /* Won't be showing any decimal places here... */
- g_snprintf(desc, sizeof(desc), "%u", (unsigned int)(i*axis->major + fl));
- layout = gtk_widget_create_pango_layout(g->drawing_area, desc);
- pango_layout_get_pixel_size(layout, &w, &h);
- cairo_move_to(cr, axis->s.width-14-4-w, y - h/2);
- pango_cairo_show_layout(cr, layout);
- g_object_unref(G_OBJECT(layout));
- }
- /* minor ticks */
- if (axis->minor) {
- double minor_tick = axis->minor * g->zoom.y;
- imin = (int) ((g->geom.height - offset + corr - g->wp.height)/minor_tick + 1);
- imax = (int) ((g->geom.height - offset + corr) / minor_tick);
- for (i=imin; i <= imax; i++) {
- int y = (int) (g->geom.height-1 - (int )lrint(i*minor_tick) -
- offset + corr + axis->s.y);
-
- if ((y > 0) && (y < axis->p.height)) {
- cairo_set_line_width(cr, 1.0);
- cairo_move_to(cr, axis->s.width - 8, y+0.5);
- cairo_line_to(cr, axis->s.width - 1, y+0.5);
- }
- }
- }
- for (i=0; axis->label[i]; i++) {
- gint w, h;
- layout = gtk_widget_create_pango_layout(g->drawing_area,
- axis->label[i]);
- pango_layout_get_pixel_size(layout, &w, &h);
- cairo_move_to(cr, (axis->p.width - w)/2, TITLEBAR_HEIGHT-10 - i*(h+3) - h);
- pango_cairo_show_layout(cr, layout);
- g_object_unref(G_OBJECT(layout));
- }
- cairo_stroke(cr);
- cairo_destroy(cr);
-}
-
-
-/* TODO: natural time units are subframes (ms), so might be good to always
- show 3 decimal places? */
-static void h_axis_pixmap_draw(struct axis *axis)
-{
- struct gtk_rlc_graph *g = axis->g;
- int i;
- double major_tick, minor_tick;
- int not_disp, rdigits, offset, imin, imax;
- double left, right, j, fl, corr;
- PangoLayout *layout;
- cairo_t *cr;
-
- debug(DBS_FENTRY) puts("h_axis_pixmap_draw()");
- left = (g->wp.x-g->geom.x) / (double)g->geom.width * g->bounds.width;
- left += axis->min;
- right = (g->wp.x-g->geom.x+g->wp.width) / (double)g->geom.width * g->bounds.width;
- right += axis->min;
- axis_compute_ticks(axis, left, right, AXIS_HORIZONTAL);
-
- /* Work out how many decimal places should be shown */
- j = axis->major - floor(axis->major);
- for (rdigits=0; rdigits <= 6; rdigits++) {
- j *= 10;
- if (j <= 0.000001)
- break;
- j = j - floor(j);
- }
-
- not_disp = 1 ^ axis->displayed;
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create(axis->surface[not_disp]);
-#else
- cr = gdk_cairo_create(axis->pixmap[not_disp]);
-#endif
- cairo_set_source_rgb(cr, 1, 1, 1);
- cairo_rectangle(cr, 0, 0, axis->p.width, axis->p.height);
- cairo_fill(cr);
-
- /* axis */
- cairo_set_source_rgb(cr, 0, 0, 0);
- cairo_set_line_width(cr, 1.0);
- cairo_move_to(cr, 0, 0.5);
- cairo_line_to(cr, axis->s.width + (axis->p.width-axis->s.width)/2.0, 0.5);
-
- offset = g->wp.x - g->geom.x;
-
- fl = floor(axis->min / axis->major) * axis->major;
- corr = rint((axis->min - fl) * g->zoom.x);
-
- /* major ticks */
- major_tick = axis->major*g->zoom.x;
- imin = (int) ((offset + corr) / major_tick + 1);
- imax = (int) ((offset + corr + axis->s.width) / major_tick);
- for (i=imin; i <= imax; i++) {
- char desc[32];
- int w, h;
- int x = (int) (rint(i * major_tick) - offset - corr);
-
- /* printf("%f @ %d\n", i*axis->major + fl, x); */
- if ((x < 0) || (x > axis->s.width))
- continue;
- cairo_move_to(cr, x+0.5, 0);
- cairo_line_to(cr, x+0.5, 15);
-
- g_snprintf(desc, sizeof(desc), "%.*f", rdigits, i*axis->major + fl);
- layout = gtk_widget_create_pango_layout(g->drawing_area, desc);
- pango_layout_get_pixel_size(layout, &w, &h);
- cairo_move_to(cr, x - w/2, 15+4);
- pango_cairo_show_layout(cr, layout);
- g_object_unref(G_OBJECT(layout));
- }
- if (axis->minor > 0) {
- /* minor ticks */
- minor_tick = axis->minor*g->zoom.x;
- imin = (int) ((offset + corr) / minor_tick + 1);
- imax = (int) ((offset + corr + g->wp.width) / minor_tick);
- for (i=imin; i <= imax; i++) {
- int x = (int) (rint(i * minor_tick) - offset - corr);
- if ((x > 0) && (x < axis->s.width)){
- cairo_move_to(cr, x+0.5, 0);
- cairo_line_to(cr, x+0.5, 8);
- }
- }
- }
- for (i=0; axis->label[i]; i++) {
- gint w, h;
- layout = gtk_widget_create_pango_layout(g->drawing_area,
- axis->label[i]);
- pango_layout_get_pixel_size(layout, &w, &h);
- cairo_move_to(cr, axis->s.width - w - 50, 15+h+15 + i*(h+3));
- pango_cairo_show_layout(cr, layout);
- g_object_unref(G_OBJECT(layout));
- }
-
- cairo_stroke(cr);
- cairo_destroy(cr);
-}
-
-static void axis_pixmaps_switch(struct axis *axis)
-{
- axis->displayed = 1 ^ axis->displayed;
-}
-
-static void axis_pixmap_display(struct axis *axis)
-{
- cairo_t *cr;
-
- cr = gdk_cairo_create(gtk_widget_get_window(axis->drawing_area));
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface(cr, axis->surface[axis->displayed], axis->p.x, axis->p.y);
-#else
- ws_gdk_cairo_set_source_pixmap(cr, axis->pixmap[axis->displayed], axis->p.x, axis->p.y);
-#endif
- cairo_rectangle(cr, axis->p.x, axis->p.y, axis->p.width, axis->p.height);
- cairo_fill(cr);
- cairo_destroy(cr);
-}
-
-static void axis_compute_ticks(struct axis *axis, double x0, double xmax, int dir)
-{
- int i, j, ii, jj, ms;
- double zoom, x, steps[3] = { 0.1, 0.5 };
- int dim, check_needed, diminished;
- double majthresh[2] = {2.0, 3.0};
-
- debug((DBS_FENTRY | DBS_AXES_TICKS)) puts("axis_compute_ticks()");
- debug(DBS_AXES_TICKS)
- printf("x0=%f xmax=%f dir=%s\n", x0,xmax, dir? "VERTICAL" : "HORIZONTAL");
-
- zoom = axis_zoom_get(axis, dir);
- x = xmax-x0;
- for (i=-9; i <= 12; i++) {
- if (x / pow(10, i) < 1)
- break;
- }
- --i;
- ms = (int )(x / pow(10, i));
-
- if (ms > 5) {
- j = 0;
- ++i;
- } else if (ms > 2)
- j = 1;
- else
- j = 0;
-
- axis->major = steps[j] * pow(10, i);
- if (dir == AXIS_VERTICAL) {
- /* But don't divide further than whole sequence numbers */
- axis->major = MAX(axis->major, 1.0);
- }
-
- debug(DBS_AXES_TICKS) printf("zoom=%.1f, x=%f -> i=%d -> ms=%d -> j=%d ->"
- " axis->major=%f\n", zoom, x, i, ms, j, axis->major);
-
- /* Compute minor ticks */
- jj = j;
- ii = i;
- axis_ticks_down(&ii, &jj);
-
- if ((dir == AXIS_VERTICAL) && (axis->major <= 1)) {
- /* Don't subdivide whole sequence numbers */
- axis->minor = 0;
- }
- else {
- axis->minor = steps[jj] * pow(10, ii);
- /* We don't want minors if they would be less than 10 pixels apart */
- if (axis->minor*zoom < 10) {
- debug(DBS_AXES_TICKS) printf("refusing axis->minor of %f: "
- "axis->minor*zoom == %f\n",
- axis->minor, axis->minor*zoom);
- axis->minor = 0;
- }
- }
-
- check_needed = TRUE;
- diminished = FALSE;
- while (check_needed) {
- check_needed = FALSE;
- dim = get_label_dim(axis, dir, xmax);
- debug(DBS_AXES_TICKS) printf("axis->major==%.1f, axis->minor==%.1f =>"
- " axis->major*zoom/dim==%f, axis->minor*zoom/dim==%f\n",
- axis->major, axis->minor, axis->major*zoom/dim,
- axis->minor*zoom/dim);
-
- /* corrections: if majors are less than majthresh[dir] times label
- * dimension apart, we need to use bigger ones */
- if (axis->major*zoom / dim < majthresh[dir]) {
- axis_ticks_up(&ii, &jj);
- axis->minor = axis->major;
- axis_ticks_up(&i, &j);
- axis->major = steps[j] * pow(10, i);
- check_needed = TRUE;
- debug(DBS_AXES_TICKS) printf("axis->major enlarged to %.1f\n",
- axis->major);
- }
- /* if minor ticks are bigger than majthresh[dir] times label dimension,
- * we could promote them to majors as well */
- if ((axis->minor*zoom / dim > majthresh[dir]) && !diminished) {
- axis_ticks_down(&i, &j);
- axis->major = axis->minor;
- axis_ticks_down(&ii, &jj);
- axis->minor = steps[jj] * pow(10, ii);
- check_needed = TRUE;
- diminished = TRUE;
-
- debug(DBS_AXES_TICKS) printf("axis->minor diminished to %.1f\n",
- axis->minor);
-
- if (axis->minor*zoom < 10) {
- debug(DBS_AXES_TICKS) printf("refusing axis->minor of %f: "
- "axis->minor*zoom == %f\n", axis->minor, axis->minor*zoom);
- axis->minor = 0;
- }
- }
- }
-
- debug(DBS_AXES_TICKS) printf("corrected: axis->major == %.1f -> "
- "axis->minor == %.1f\n", axis->major, axis->minor);
-}
-
-static void axis_ticks_up(int *i, int *j)
-{
- (*j)++;
- if (*j>1) {
- (*i)++;
- *j = 0;
- }
-}
-
-static void axis_ticks_down(int *i, int *j)
-{
- (*j)--;
- if (*j < 0) {
- (*i)--;
- *j = 1;
- }
-}
-
-static int get_label_dim(struct axis *axis, int dir, double label)
-{
- double y;
- char str[32];
- int rdigits, dim;
- PangoLayout *layout;
-
- /* First, let's compute how many digits to the right of radix
- * we need to print */
- y = axis->major - floor(axis->major);
- for (rdigits=0; rdigits <= 6; rdigits++) {
- y *= 10;
- if (y <= 0.000001)
- break;
- y = y - floor(y);
- }
- g_snprintf(str, sizeof(str), "%.*f", rdigits, label);
- switch (dir) {
- case AXIS_HORIZONTAL:
- layout = gtk_widget_create_pango_layout(axis->g->drawing_area, str);
- pango_layout_get_pixel_size(layout, &dim, NULL);
- g_object_unref(G_OBJECT(layout));
- break;
- case AXIS_VERTICAL:
- layout = gtk_widget_create_pango_layout(axis->g->drawing_area, str);
- pango_layout_get_pixel_size(layout, NULL, &dim);
- g_object_unref(G_OBJECT(layout));
- break;
- default:
- puts("initialize axis: an axis must be either horizontal or vertical");
- return -1;
- }
- return dim;
-}
-
-static double axis_zoom_get(struct axis *axis, int dir)
-{
- switch (dir) {
- case AXIS_HORIZONTAL:
- return axis->g->zoom.x;
- case AXIS_VERTICAL:
- return axis->g->zoom.y;
- default:
- return -1;
- }
-}
-
-static void graph_select_segment(struct gtk_rlc_graph *g, int x, int y)
-{
- struct element_list *list;
- struct element *e;
- guint num = 0;
-
- debug(DBS_FENTRY) puts("graph_select_segment()");
-
- x -= g->geom.x;
- y = g->geom.height-1 - (y - g->geom.y);
-
- set_busy_cursor(gtk_widget_get_window(g->drawing_area));
-
- for (list=g->graph.elists; list; list=list->next) {
- for (e=list->elements; e->type != ELMT_NONE; e++) {
- switch (e->type) {
- case ELMT_LINE:
- if (line_detect_collision(e, x, y)) {
- num = e->parent->num;
- }
- break;
- case ELMT_ELLIPSE:
- if (ellipse_detect_collision(e, x, y)) {
- num = e->parent->num;
- }
- break;
-
- default:
- break;
- }
- }
- }
-
-
- if (num) {
- cf_goto_frame(&cfile, num);
- }
-}
-
-static int line_detect_collision(struct element *e, int x, int y)
-{
- int xx1, yy1, xx2, yy2;
-
- /* Get sorted x, y co-ordinates for line */
- if (e->p.line.dim.x1 < e->p.line.dim.x2) {
- xx1 = (int)lrint(e->p.line.dim.x1);
- xx2 = (int)lrint(e->p.line.dim.x2);
- } else {
- xx1 = (int)lrint(e->p.line.dim.x2);
- xx2 = (int)lrint(e->p.line.dim.x1);
- }
- if (e->p.line.dim.y1 < e->p.line.dim.y2) {
- yy1 = (int)lrint(e->p.line.dim.y1);
- yy2 = (int)lrint(e->p.line.dim.y2);
- } else {
- yy1 = (int)lrint(e->p.line.dim.y2);
- yy2 = (int)lrint(e->p.line.dim.y1);
- }
- /*
- printf("line: (%d,%d)->(%d,%d), clicked: (%d,%d)\n", xx1, yy1, xx2, yy2, x, y);
- */
-
- /* N.B. won't match with diagonal lines... */
- if (((xx1 == x) && (xx2 == x) && (yy1 <= y) && (y <= yy2) )| /* lies along vertical line */
- ((yy1 == y) && (yy2 == y) && (xx1 <= x) && (x <= xx2))) { /* lies along horizontal line */
- return TRUE;
- }
- else {
- return FALSE;
- }
-}
-
-static int ellipse_detect_collision(struct element *e, int x, int y)
-{
- int xx1, yy1, xx2, yy2;
-
- xx1 = (int )lrint (e->p.ellipse.dim.x);
- xx2 = (int )lrint (e->p.ellipse.dim.x + e->p.ellipse.dim.width);
- yy1 = (int )lrint (e->p.ellipse.dim.y - e->p.ellipse.dim.height);
- yy2 = (int )lrint (e->p.ellipse.dim.y);
- /*
- printf ("ellipse: (%d,%d)->(%d,%d), clicked: (%d,%d)\n", xx1, yy1, xx2, yy2, x, y);
- */
- if ((xx1 <= x) && (x <= xx2) && (yy1 <= y) && (y <= yy2)) {
- return TRUE;
- }
- else {
- return FALSE;
- }
-}
-
-
-
-static gboolean configure_event(GtkWidget *widget _U_, GdkEventConfigure *event, gpointer user_data)
-{
- struct gtk_rlc_graph *g = (struct gtk_rlc_graph *)user_data;
- struct zoom new_zoom;
- int cur_g_width, cur_g_height;
- int cur_wp_width, cur_wp_height;
-
- debug(DBS_FENTRY) puts("configure_event()");
-
- cur_wp_width = g->wp.width;
- cur_wp_height = g->wp.height;
- g->wp.width = event->width - g->y_axis->p.width - RMARGIN_WIDTH;
- g->wp.height = event->height - g->x_axis->p.height - g->wp.y;
- g->x_axis->s.width = g->wp.width;
- g->x_axis->p.width = g->wp.width + RMARGIN_WIDTH;
- g->y_axis->p.height = g->wp.height + g->wp.y;
- g->y_axis->s.height = g->wp.height;
- g->x_axis->p.y = g->y_axis->p.height;
- new_zoom.x = (double)g->wp.width / cur_wp_width;
- new_zoom.y = (double)g->wp.height / cur_wp_height;
- cur_g_width = g->geom.width;
- cur_g_height = g->geom.height;
- g->geom.width = (int)lrint(g->geom.width * new_zoom.x);
- g->geom.height = (int)lrint(g->geom.height * new_zoom.y);
- g->zoom.x = (double)(g->geom.width - 1) / g->bounds.width;
- g->zoom.y = (double)(g->geom.height -1) / g->bounds.height;
-
- g->geom.x = (int)(g->wp.x - (double)g->geom.width/cur_g_width * (g->wp.x - g->geom.x));
- g->geom.y = (int)(g->wp.y - (double)g->geom.height/cur_g_height * (g->wp.y - g->geom.y));
-#if 0
- printf("configure: graph: (%d,%d), (%d,%d); viewport: (%d,%d), (%d,%d); "
- "zooms: (%f,%f)\n", g->geom.x, g->geom.y, g->geom.width,
- g->geom.height, g->wp.x, g->wp.y, g->wp.width, g->wp.height,
- g->zoom.x, g->zoom.y);
-#endif
-
- graph_element_lists_make(g);
- graph_pixmaps_create(g);
- graph_title_pixmap_create(g);
- axis_pixmaps_create(g->y_axis);
- axis_pixmaps_create(g->x_axis);
- /* we don't do actual drawing here; we leave it to expose handler */
- graph_pixmap_draw(g);
- graph_pixmaps_switch(g);
- graph_title_pixmap_draw(g);
- h_axis_pixmap_draw(g->x_axis);
- axis_pixmaps_switch(g->x_axis);
- v_axis_pixmap_draw(g->y_axis);
- axis_pixmaps_switch(g->y_axis);
-
- return TRUE;
-}
-
-
-#if GTK_CHECK_VERSION(3,0,0)
-static gboolean
-draw_event(GtkWidget *widget _U_, cairo_t *cr, gpointer user_data)
-{
- struct gtk_rlc_graph *g = (struct gtk_rlc_graph *)user_data;
-
- debug(DBS_FENTRY) puts("draw_event()");
-
- /* lower left corner */
- cairo_set_source_rgb(cr, 1, 1, 1);
- cairo_rectangle(cr, 0, g->wp.y + g->wp.height, g->y_axis->p.width, g->x_axis->p.height);
- cairo_fill(cr);
-
- /* right margin */
- cairo_rectangle(cr, g->wp.x + g->wp.width, g->wp.y, RMARGIN_WIDTH, g->wp.height);
- cairo_fill(cr);
-
- /* Should these routines be copied here, or be given the cairo_t ?? */
- graph_pixmap_display(g);
- graph_title_pixmap_display(g);
- axis_pixmap_display(g->x_axis);
- axis_pixmap_display(g->y_axis);
-
- return TRUE;
-}
-#else
-static gboolean expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer user_data)
-{
- struct gtk_rlc_graph *g = (struct gtk_rlc_graph *)user_data;
- cairo_t *cr;
-
- debug(DBS_FENTRY) puts("expose_event()");
-
- if (event->count)
- return TRUE;
-
- /* lower left corner */
- cr = gdk_cairo_create(gtk_widget_get_window(widget));
- cairo_set_source_rgb(cr, 1, 1, 1);
- cairo_rectangle(cr, 0, g->wp.y + g->wp.height, g->y_axis->p.width, g->x_axis->p.height);
- cairo_fill(cr);
- cairo_destroy(cr);
- cr = NULL;
-
- /* right margin */
- cr = gdk_cairo_create(gtk_widget_get_window(widget));
- cairo_set_source_rgb(cr, 1, 1, 1);
- cairo_rectangle(cr, g->wp.x + g->wp.width, g->wp.y, RMARGIN_WIDTH, g->wp.height);
- cairo_fill(cr);
- cairo_destroy(cr);
- cr = NULL;
-
- graph_pixmap_display(g);
- graph_title_pixmap_display(g);
- axis_pixmap_display(g->x_axis);
- axis_pixmap_display(g->y_axis);
-
- return TRUE;
-}
-#endif
-
-
-static void
-perform_zoom(struct gtk_rlc_graph *g, struct zoomfactor *zf,
- int origin_x, int origin_y)
-{
- int cur_width = g->geom.width, cur_height = g->geom.height;
-
- /* Multiply by x and y factors */
- g->geom.width = (int )lrint(g->geom.width * zf->x);
- g->geom.height = (int )lrint(g->geom.height * zf->y);
-
- /* If already fully-zoomed out, don't waste time re-drawing */
- if ((g->geom.width <= g->wp.width) &&
- (g->geom.height <= g->wp.height)) {
- return;
- }
-
- /* Don't go out of bounds */
- if (g->geom.width < g->wp.width) {
- g->geom.width = g->wp.width;
- }
- if (g->geom.height < g->wp.height) {
- g->geom.height = g->wp.height;
- }
-
- /* Divide to work out new zoom */
- g->zoom.x = (g->geom.width - 1) / g->bounds.width;
- g->zoom.y = (g->geom.height- 1) / g->bounds.height;
-
- /* Move origin to keep mouse position at centre of view */
- g->geom.x -= (int)lrint((g->geom.width - cur_width) *
- ((origin_x - g->geom.x)/(double )cur_width));
- g->geom.y -= (int)lrint((g->geom.height - cur_height) *
- ((origin_y - g->geom.y)/(double )cur_height));
-
- /* Again, don't go out of bounds */
- if (g->geom.x > g->wp.x)
- g->geom.x = g->wp.x;
- if (g->geom.y > g->wp.y)
- g->geom.y = g->wp.y;
- if (g->wp.x + g->wp.width > g->geom.x + g->geom.width)
- g->geom.x = g->wp.width + g->wp.x - g->geom.width;
- if (g->wp.y + g->wp.height > g->geom.y + g->geom.height)
- g->geom.y = g->wp.height + g->wp.y - g->geom.height;
-}
-
-static void
-do_zoom_rectangle(struct gtk_rlc_graph *g, struct irect lcl_zoomrect)
-{
- int cur_width = g->wp.width, cur_height = g->wp.height;
- /* Make copy of geom1 before working out zoom */
- struct irect geom1 = g->geom;
- struct zoomfactor factor;
-
- /* Left hand too much to the right */
- if (lcl_zoomrect.x > g->wp.x + g->wp.width)
- return;
- /* Right hand not far enough */
- if (lcl_zoomrect.x + lcl_zoomrect.width < g->wp.x)
- return;
- /* Left hand too much to the left */
- if (lcl_zoomrect.x < g->wp.x) {
- int dx = g->wp.x - lcl_zoomrect.x;
- lcl_zoomrect.x += dx;
- lcl_zoomrect.width -= dx;
- }
- /* Right hand too much to the right */
- if (lcl_zoomrect.x + lcl_zoomrect.width > g->wp.x + g->wp.width) {
- int dx = lcl_zoomrect.width + lcl_zoomrect.x - g->wp.x - g->wp.width;
- lcl_zoomrect.width -= dx;
- }
-
- /* Top too low */
- if (lcl_zoomrect.y > g->wp.y + g->wp.height)
- return;
- /* Bottom too high */
- if (lcl_zoomrect.y + lcl_zoomrect.height < g->wp.y)
- return;
- /* Top too high */
- if (lcl_zoomrect.y < g->wp.y) {
- int dy = g->wp.y - lcl_zoomrect.y;
- lcl_zoomrect.y += dy;
- lcl_zoomrect.height -= dy;
- }
- /* Bottom too low */
- if (lcl_zoomrect.y + lcl_zoomrect.height > g->wp.y + g->wp.height) {
- int dy = lcl_zoomrect.height + lcl_zoomrect.y - g->wp.y - g->wp.height;
- lcl_zoomrect.height -= dy;
- }
-
-/*
- printf("before:\n"
- "\tgeom: (%d, %d)+(%d x %d)\n"
-*/
-
- factor.x = (double)cur_width / lcl_zoomrect.width;
- factor.y = (double)cur_height / lcl_zoomrect.height;
-
-/*
- printf("Zoomfactor: %f x %f\n", factor.x, factor.y);
-*/
- /* Work out new geom settings and zoom factor */
- perform_zoom(g, &factor,
- lcl_zoomrect.x, lcl_zoomrect.y);
-
-/*
- printf("middle:\n"
- "\tgeom: (%d, %d)+(%d x %d)\n"
- "\twp: (%d, %d)+(%d x %d)\n"
- "\tzoomrect: (%d, %d)+(%d x %d)\n",
- g->geom.x, g->geom.y,
- g->geom.width, g->geom.height,
- g->wp.x, g->wp.y, g->wp.width, g->wp.height,
- lcl_zoomrect.x, lcl_zoomrect.y, lcl_zoomrect.width, lcl_zoomrect.height);
-*/
-
- /* Final geom settings are in terms of old geom, zoomreect and zoom factor */
- g->geom.x = (int)(geom1.x * (1 + factor.x) -
- lcl_zoomrect.x * factor.x - (geom1.x - g->wp.x));
- g->geom.y = (int)(geom1.y * (1 + factor.y) -
- lcl_zoomrect.y * factor.y - (geom1.y - g->wp.y));
-
-/*
- printf("after:\n"
- "\tgeom: (%d, %d)+(%d x %d)\n"
- "\twp: (%d, %d)+(%d x %d)\n"
- "\tzoomrect: (%d, %d)+(%d x %d)\n",
- g->geom.x, g->geom.y,
- g->geom.width, g->geom.height,
- g->wp.x, g->wp.y, g->wp.width, g->wp.height,
- lcl_zoomrect.x, lcl_zoomrect.y, lcl_zoomrect.width, lcl_zoomrect.height);
-*/
-
- /* Redraw */
- graph_element_lists_make(g);
- g->cross.erase_needed = FALSE;
- graph_display(g);
- axis_display(g->y_axis);
- axis_display(g->x_axis);
-}
-
-
-/* Zoom because of keyboard or mouse press */
-static void do_zoom_common(struct gtk_rlc_graph *g, GdkEventButton *event,
- gboolean lock_vertical, gboolean lock_horizontal)
-{
- int cur_width = g->geom.width, cur_height = g->geom.height;
- struct { double x, y; } factor;
- int pointer_x, pointer_y;
-
- /* Get mouse position */
- if (event == NULL) {
- /* Keyboard - query it */
- get_mouse_position(g->drawing_area, &pointer_x, &pointer_y, NULL);
- }
- else {
- /* Mouse - just read it from event */
- pointer_x = (int)event->x;
- pointer_y = (int)event->y;
- }
-
-
- if (g->zoom.flags & ZOOM_OUT) {
-
- /* If can't zoom out anymore so don't waste time redrawing the whole graph! */
- if ((g->geom.height <= g->wp.height) &&
- (g->geom.width <= g->wp.width)) {
- return;
- }
-
- /* Zoom out */
- if (lock_horizontal) {
- factor.x = 1.0;
- }
- else {
- factor.x = 1 / g->zoom.step_x;
- }
-
- if (lock_vertical) {
- factor.y = 1.0;
- }
- else {
- factor.y = 1 / g->zoom.step_y;
- }
- } else {
- /* Zoom in */
- if ((lock_horizontal) || (g->geom.width >= (g->bounds.width * MAX_PIXELS_PER_SECOND))) {
- factor.x = 1.0;
- }
- else {
- factor.x = g->zoom.step_x;
- }
-
- /* Don't zoom in too far vertically */
- if (lock_vertical || (g->geom.height >= (g->bounds.height * MAX_PIXELS_PER_SN))) {
- factor.y = 1.0;
- }
- else {
- factor.y = g->zoom.step_y;
- }
- }
-
- /* Multiply by x and y factors */
- g->geom.width = (int )lrint(g->geom.width * factor.x);
- g->geom.height = (int )lrint(g->geom.height * factor.y);
-
- /* Clip to space if necessary */
- if (g->geom.width < g->wp.width)
- g->geom.width = g->wp.width;
- if (g->geom.height < g->wp.height)
- g->geom.height = g->wp.height;
-
- /* Work out new zoom */
- g->zoom.x = (g->geom.width - 1) / g->bounds.width;
- g->zoom.y = (g->geom.height- 1) / g->bounds.height;
-
- /* Move origin to keep mouse position at centre of view */
- g->geom.x -= (int )lrint((g->geom.width - cur_width) *
- ((pointer_x - g->geom.x)/(double)cur_width));
- g->geom.y -= (int )lrint((g->geom.height - cur_height) *
- ((pointer_y - g->geom.y)/(double)cur_height));
-
- /* Make sure we haven't moved outside the whole graph */
- if (g->geom.x > g->wp.x)
- g->geom.x = g->wp.x;
- if (g->geom.y > g->wp.y)
- g->geom.y = g->wp.y;
- if (g->wp.x + g->wp.width > g->geom.x + g->geom.width)
- g->geom.x = g->wp.width + g->wp.x - g->geom.width;
- if (g->wp.y + g->wp.height > g->geom.y + g->geom.height)
- g->geom.y = g->wp.height + g->wp.y - g->geom.height;
-#if 0
- printf("%s press: graph: (%d,%d), (%d,%d); viewport: (%d,%d), "
- "(%d,%d); zooms: (%f,%f)\n",
- (event != NULL) ? "mouse" : "key", g->geom.x, g->geom.y,
- g->geom.width, g->geom.height, g->wp.x, g->wp.y, g->wp.width,
- g->wp.height, g->zoom.x, g->zoom.y);
-#endif
-
- graph_element_lists_make(g);
- graph_display(g);
- axis_display(g->y_axis);
- axis_display(g->x_axis);
-
- if (g->cross.draw) {
- g->cross.erase_needed = FALSE;
- cross_draw(g, pointer_x, pointer_y);
- }
-}
-
-
-static void do_zoom_keyboard(struct gtk_rlc_graph *g,
- gboolean lock_vertical,
- gboolean lock_horizontal)
-{
- do_zoom_common(g, NULL, lock_vertical, lock_horizontal);
-}
-
-static void do_zoom_mouse(struct gtk_rlc_graph *g, GdkEventButton *event)
-{
- do_zoom_common(g, event,
- event->state & GDK_SHIFT_MASK,
- event->state & GDK_CONTROL_MASK);
-}
-
-static void do_zoom_in_keyboard(struct gtk_rlc_graph *g,
- gboolean lock_vertical,
- gboolean lock_horizontal)
-{
- g->zoom.flags &= ~ZOOM_OUT;
- do_zoom_keyboard(g, lock_vertical, lock_horizontal);
-}
-
-static void do_zoom_out_keyboard(struct gtk_rlc_graph *g,
- gboolean lock_vertical,
- gboolean lock_horizontal)
-{
- g->zoom.flags |= ZOOM_OUT;
- do_zoom_keyboard(g, lock_vertical, lock_horizontal);
-}
-
-static void do_key_motion(struct gtk_rlc_graph *g)
-{
- if (g->geom.x > g->wp.x) {
- g->geom.x = g->wp.x;
- }
- if (g->geom.y > g->wp.y) {
- g->geom.y = g->wp.y;
- }
- if ((g->wp.x + g->wp.width) > (g->geom.x + g->geom.width)) {
- g->geom.x = g->wp.width + g->wp.x - g->geom.width;
- }
- if ((g->wp.y + g->wp.height) > (g->geom.y + g->geom.height)) {
- g->geom.y = g->wp.height + g->wp.y - g->geom.height;
- }
-
- graph_display(g);
- axis_display(g->y_axis);
- axis_display(g->x_axis);
-
- if (g->cross.draw) {
- int pointer_x, pointer_y;
- get_mouse_position(g->drawing_area, &pointer_x, &pointer_y, NULL);
- g->cross.erase_needed = FALSE;
- cross_draw (g, pointer_x, pointer_y);
- }
-}
-
-static void do_key_motion_up(struct gtk_rlc_graph *g, int step)
-{
- g->geom.y += step;
- do_key_motion(g);
-}
-
-static void do_key_motion_down(struct gtk_rlc_graph *g, int step)
-{
- g->geom.y -= step;
- do_key_motion(g);
-}
-
-static void do_key_motion_left(struct gtk_rlc_graph *g, int step)
-{
- g->geom.x += step;
- do_key_motion(g);
-}
-
-static void do_key_motion_right(struct gtk_rlc_graph *g, int step)
-{
- g->geom.x -= step;
- do_key_motion(g);
-}
-
-static gboolean button_press_event(GtkWidget *widget _U_, GdkEventButton *event, gpointer user_data)
-{
- struct gtk_rlc_graph *g = (struct gtk_rlc_graph *)user_data;
-
- debug(DBS_FENTRY) puts("button_press_event()");
-
- if (event->button == MOUSE_BUTTON_RIGHT) {
- /* Turn on grab. N.B. using (maybe) approx mouse position from event... */
- g->grab.x = (int )lrint (event->x) - g->geom.x;
- g->grab.y = (int )lrint (event->y) - g->geom.y;
- g->grab.grabbed = TRUE;
- } else if (event->button == MOUSE_BUTTON_MIDDLE) {
- do_zoom_mouse(g, event);
- } else if (event->button == MOUSE_BUTTON_LEFT) {
- /* See if we're on an element that links to a frame */
- graph_select_segment(g, (int)event->x, (int)event->y);
-
- /* Set origin of rect, even if outside graph area */
- zoomrect.x = (int)event->x;
- zoomrect.y = (int)event->y;
- }
-
- unset_busy_cursor(gtk_widget_get_window(g->drawing_area));
- return TRUE;
-}
-
-static gboolean button_release_event(GtkWidget *widget _U_, GdkEventButton *event _U_, gpointer user_data)
-{
- struct gtk_rlc_graph *g = (struct gtk_rlc_graph *)user_data;
-
- /* Turn off grab if right button released */
- if (event->button == MOUSE_BUTTON_RIGHT) {
- g->grab.grabbed = FALSE;
- }
- else if (event->button == MOUSE_BUTTON_LEFT) {
- int xx1 = zoomrect.x;
- int xx2 = (int)event->x;
- int yy1 = zoomrect.y;
- int yy2 = (int)event->y;
- zoomrect.x = MIN(xx1, xx2);
- zoomrect.width = abs(xx1 - xx2);
- zoomrect.y = MIN(yy1, yy2);
- zoomrect.height = abs(yy1 - yy2);
-
- /* Finish selecting a region to zoom in on.
- Take care not to choose a too-small area (by accident?) */
- if ((zoomrect.width > 3) && (zoomrect.height > 3)) {
- int oldflags = g->zoom.flags;
-
- debug(DBS_GRAPH_DRAWING) printf("Zoom in from (%d, %d) - (%d, %d)\n",
- zoomrect.x, zoomrect.y,
- zoomrect.width, zoomrect.height);
-
- g->zoom.flags &= ~ZOOM_OUT;
- do_zoom_rectangle(g, zoomrect);
- g->zoom.flags = oldflags;
- }
- }
-
- return TRUE;
-}
-
-static gboolean motion_notify_event(GtkWidget *widget _U_, GdkEventMotion *event, gpointer user_data)
-{
- struct gtk_rlc_graph *g = (struct gtk_rlc_graph *)user_data;
- int x, y;
- GdkModifierType state;
-
- /* debug(DBS_FENTRY) puts ("motion_notify_event()"); */
-
- /* Make sure we have accurate mouse position */
- if (event->is_hint)
- get_mouse_position(g->drawing_area, &x, &y, &state);
- else {
- x = (int) event->x;
- y = (int) event->y;
- state = (GdkModifierType)event->state;
- }
-
- if (state & GDK_BUTTON3_MASK) {
- if (g->grab.grabbed) {
- /* Move view by difference between where we grabbed and where we are now */
- g->geom.x = x-g->grab.x;
- g->geom.y = y-g->grab.y;
-
- /* Limit to outer bounds of graph */
- if (g->geom.x > g->wp.x)
- g->geom.x = g->wp.x;
- if (g->geom.y > g->wp.y)
- g->geom.y = g->wp.y;
- if (g->wp.x + g->wp.width > g->geom.x + g->geom.width)
- g->geom.x = g->wp.width + g->wp.x - g->geom.width;
- if (g->wp.y + g->wp.height > g->geom.y + g->geom.height)
- g->geom.y = g->wp.height + g->wp.y - g->geom.height;
-
- /* Redraw everything */
- g->cross.erase_needed = 0;
- graph_display(g);
- axis_display(g->y_axis);
- axis_display(g->x_axis);
- if (g->cross.draw) {
- cross_draw(g, x, y);
- }
- }
- }
- else if (state & GDK_BUTTON1_MASK) {
-
- /* Draw bounded box for zoomrect being chosen! */
- if (g->zoomrect_erase_needed) {
- zoomrect_erase(g);
- }
- zoomrect_draw(g, x, y);
- }
-
- /* No button currently pressed */
- else {
- /* Update the cross if it's being shown */
- if (g->cross.erase_needed)
- cross_erase(g);
- if (g->cross.draw) {
- cross_draw(g, x, y);
- }
- }
-
- return TRUE;
-}
-
-static gboolean key_press_event(GtkWidget *widget _U_, GdkEventKey *event, gpointer user_data)
-{
- struct gtk_rlc_graph *g = (struct gtk_rlc_graph *)user_data;
- int step;
-
- debug(DBS_FENTRY) puts("key_press_event()");
-
- /* Holding down these keys can affect the step used for moving */
- if ((event->state & GDK_CONTROL_MASK) && (event->state & GDK_SHIFT_MASK)) {
- step = 0;
- }
- else if (event->state & GDK_CONTROL_MASK) {
- step = 1;
- }
- else if (event->state & GDK_SHIFT_MASK) {
- step = 10;
- }
- else {
- step = 100;
- }
-
- switch (event->keyval) {
- case ' ':
- toggle_crosshairs(g);
- break;
- case 't':
- /* Toggle betwee showing the time starting at 0, or time in capture */
- toggle_time_origin(g);
- break;
- case 'r':
- case GDK_Home:
- /* Go back to original view, all zoomed out */
- restore_initial_graph_view(g);
- break;
-
- /* Zooming in */
- case 'i':
- case 'I':
- do_zoom_in_keyboard(g,
- event->state & GDK_SHIFT_MASK,
- event->state & GDK_CONTROL_MASK);
- break;
- case '+':
- do_zoom_in_keyboard(g,
- FALSE,
- event->state & GDK_CONTROL_MASK);
- break;
-
- /* Zooming out */
- case 'o':
- case 'O':
- do_zoom_out_keyboard(g,
- event->state & GDK_SHIFT_MASK,
- event->state & GDK_CONTROL_MASK);
- break;
- case '-':
- do_zoom_out_keyboard(g,
- FALSE,
- event->state & GDK_CONTROL_MASK);
- break;
- /* Direction keys */
- case GDK_Left:
- do_key_motion_left(g, step);
- break;
- case GDK_Up:
- do_key_motion_up(g, step);
- break;
- case GDK_Right:
- do_key_motion_right(g, step);
- break;
- case GDK_Down:
- do_key_motion_down(g, step);
- break;
-
- case GDK_Page_Up:
- do_key_motion_up(g, 2000);
- break;
- case GDK_Page_Down:
- do_key_motion_down(g, 2000);
- break;
-
- /* Help */
- case GDK_F1:
- callback_create_help(NULL, NULL);
- break;
-
- default:
- break;
- }
- return TRUE;
-}
-
-static void toggle_crosshairs(struct gtk_rlc_graph *g)
-{
- /* Toggle state */
- g->cross.draw ^= 1;
-
- /* Draw or erase as needed */
- if (g->cross.draw) {
- int x, y;
- get_mouse_position(g->drawing_area, &x, &y, NULL);
- cross_draw(g, x, y);
- } else if (g->cross.erase_needed) {
- cross_erase(g);
- }
-}
-
-static void cross_draw(struct gtk_rlc_graph *g, int x, int y)
-{
- /* Shouldn't draw twice onto the same position if haven't erased in the
- meantime! */
- if (g->cross.erase_needed && (g->cross.x == x) && (g->cross.y == y)) {
- return;
- }
-
- /* Draw the cross */
- if ((x > g->wp.x) && (x < g->wp.x+g->wp.width) &&
- (y > g->wp.y) && (y < g->wp.y+g->wp.height)) {
-
- cairo_t *cr = gdk_cairo_create(gtk_widget_get_window(g->drawing_area));
- gdk_cairo_set_source_rgba(cr, &g->style.seq_color);
- cairo_set_line_width(cr, 1.0);
-
- /* Horizonal line */
- cairo_move_to(cr, g->wp.x, y);
- cairo_line_to(cr, g->wp.x + g->wp.width, y);
-
- /* Vertical line */
- cairo_move_to(cr, x, g->wp.y);
- cairo_line_to(cr, x, g->wp.y + g->wp.height);
- cairo_stroke(cr);
- cairo_destroy(cr);
- }
-
- /* Update state */
- g->cross.x = x;
- g->cross.y = y;
- g->cross.erase_needed = TRUE;
-}
-
-static void cross_erase(struct gtk_rlc_graph *g)
-{
- int x = g->cross.x;
- int y = g->cross.y;
-
- if ((x > g->wp.x) && (x < g->wp.x+g->wp.width) &&
- (y >= g->wp.y) && (y < g->wp.y+g->wp.height)) {
-
- /* Just redraw what is in the pixmap buffer */
- graph_pixmap_display(g);
- }
-
- g->cross.erase_needed = FALSE;
-}
-
-static void zoomrect_draw(struct gtk_rlc_graph *g, int x, int y)
-{
- if ((zoomrect.x > g->wp.x) && (zoomrect.x < g->wp.x + g->wp.width) &&
- (zoomrect.y > g->wp.y) && (zoomrect.y < g->wp.y + g->wp.height) &&
- (x > g->wp.x + 0.5) && (x < g->wp.x+g->wp.width) &&
- (y > g->wp.y) && (y < g->wp.y+g->wp.height)) {
-
- cairo_t *cr = gdk_cairo_create(gtk_widget_get_window(g->drawing_area));
- gdk_cairo_set_source_rgba(cr, &g->style.seq_color);
- cairo_set_line_width(cr, 1.0);
-
- /* Do outline of rect */
- cairo_rectangle(cr, zoomrect.x, zoomrect.y, x-zoomrect.x, y-zoomrect.y);
- cairo_stroke(cr);
- cairo_destroy(cr);
- }
-
- g->zoomrect_erase_needed = TRUE;
-}
-
-static void zoomrect_erase(struct gtk_rlc_graph *g)
-{
- /* Just redraw what is in the pixmap buffer */
- graph_pixmap_display(g);
- g->zoomrect_erase_needed = FALSE;
-}
-
-
-/* Toggle between showing the time starting at 0, or time in capture */
-static void toggle_time_origin(struct gtk_rlc_graph *g)
-{
- g->style.flags ^= TIME_ORIGIN;
-
- if ((g->style.flags & TIME_ORIGIN) == TIME_ORIGIN_CAP) {
- g->x_axis->min = g->bounds.x0;
- }
- else {
- g->x_axis->min = 0;
- }
-
- /* Redraw the axis */
- axis_display(g->x_axis);
-}
-
-static void restore_initial_graph_view(struct gtk_rlc_graph *g)
-{
- g->geom.width = g->wp.width;
- g->geom.height = g->wp.height;
- g->geom.x = g->wp.x;
- g->geom.y = g->wp.y;
- graph_init_sequence(g);
-
- /* Set flags so that mouse zoom will zoom in (zooming out is not possible!) */
- g->zoom.flags &= ~ZOOM_OUT;
-
- if (g->cross.draw) {
- g->cross.erase_needed = FALSE;
- }
-}
-
-/* Walk the segment list, totalling up data PDUs, status ACKs and NACKs */
-static void get_data_control_counts(struct gtk_rlc_graph *g, int *data, int *acks, int *nacks)
-{
- struct rlc_segment *tmp;
- *data = 0;
- *acks = 0;
- *nacks = 0;
-
- for (tmp=g->graph.segments; tmp; tmp=tmp->next) {
- if (tmp->isControlPDU) {
- (*acks)++;
- (*nacks) += tmp->noOfNACKs;
- }
- else {
- (*data)++;
- }
- }
-}
-
-/* Determine "bounds"
- * Essentially: look for lowest/highest time and seq in the list of segments
- * Not currently trying to work out the upper bound of the window, as we
- * don't reliably know the RLC channel state variables...
- */
-static void graph_get_bounds(struct gtk_rlc_graph *g)
-{
- struct rlc_segment *tmp;
- double tim;
- gboolean data_frame_seen = FALSE;
- double data_tim_low = 0;
- double data_tim_high = 0;
- guint32 data_seq_cur;
- guint32 data_seq_low = 0;
- guint32 data_seq_high = 0;
- gboolean ack_frame_seen = FALSE;
-
- double ack_tim_low = 0;
- double ack_tim_high = 0;
- guint32 ack_seq_cur;
- guint32 ack_seq_low = 0;
- guint32 ack_seq_high = 0;
-
- /* Go through all segments to determine "bounds" */
- for (tmp=g->graph.segments; tmp; tmp=tmp->next) {
- if (!tmp->isControlPDU) {
-
- /* DATA frame */
- tim = tmp->rel_secs + tmp->rel_usecs / 1000000.0;
- data_seq_cur = tmp->SN;
-
- /* Want to include a little beyond end, so that cross on last SN
- will (more likely) fit within bounds */
- #define A_FEW_SUBFRAMES 0.005
-
- /* Initialise if first time seen */
- if (!data_frame_seen) {
- data_tim_low = tim;
- data_tim_high = tim + A_FEW_SUBFRAMES;
- data_seq_low = data_seq_cur;
- data_seq_high = data_seq_cur+1;
- data_frame_seen = TRUE;
- }
-
- /* Update bounds after this frame */
- if (tim < data_tim_low) data_tim_low = tim;
- if (tim+0.02 > data_tim_high) data_tim_high = tim + A_FEW_SUBFRAMES;
- if (data_seq_cur < data_seq_low) data_seq_low = data_seq_cur;
- if (data_seq_cur+1 > data_seq_high) data_seq_high = data_seq_cur+1;
- }
- else {
-
- /* STATUS PDU */
- int n;
- guint32 nack_seq_cur;
-
- tim = tmp->rel_secs + tmp->rel_usecs / 1000000.0;
- ack_seq_cur = tmp->ACKNo;
-
- /* Initialise if first status PDU seen */
- if (!ack_frame_seen) {
- ack_tim_low = ack_tim_high = tim;
- ack_seq_low = ack_seq_cur;
- ack_seq_high = ack_seq_cur;
- ack_frame_seen = TRUE;
- }
-
- /* Update bounds after this frame */
- if (tim < ack_tim_low) ack_tim_low = tim;
- if (tim > ack_tim_high) ack_tim_high = tim;
- if (ack_seq_cur < ack_seq_low) ack_seq_low = ack_seq_cur;
- if (ack_seq_cur > ack_seq_high) ack_seq_high = ack_seq_cur;
-
- /* Also run through any/all NACKs to see if ack_seq_low/ack_seq_high
- should be extended */
- for (n=0; n < tmp->noOfNACKs; n++) {
- nack_seq_cur = tmp->NACKs[n];
-
- if (nack_seq_cur < ack_seq_low) ack_seq_low = nack_seq_cur;
- if (nack_seq_cur > ack_seq_high) ack_seq_high = nack_seq_cur;
- }
- }
- }
-
- g->bounds.x0 = (((data_tim_low <= ack_tim_low) && data_frame_seen) || (!ack_frame_seen)) ? data_tim_low : ack_tim_low;
- g->bounds.width = ((((data_tim_high >= ack_tim_high) && data_frame_seen) || (!ack_frame_seen)) ? data_tim_high : ack_tim_high) - g->bounds.x0;
- g->bounds.y0 = 0; /* We always want the overal bounds to go back down to SN=0 */
- g->bounds.height = (((data_seq_high >= ack_seq_high) && data_frame_seen) || (!ack_frame_seen)) ? data_seq_high : ack_seq_high;
-
- g->zoom.x = (g->geom.width - 1) / g->bounds.width;
- g->zoom.y = (g->geom.height -1) / g->bounds.height;
-}
-
-static void graph_read_config(struct gtk_rlc_graph *g)
-{
- /* Black for PDUs */
- g->style.seq_color.red = (double)0 / 65535.0;
- g->style.seq_color.green = (double)0 / 65535.0;
- g->style.seq_color.blue = (double)0 / 65535.0;
- g->style.seq_color.alpha = 1.0;
-
- /* Grey for resegmentations */
- g->style.seq_resegmented_color.red = (double)0x7777 / 65535.0;
- g->style.seq_resegmented_color.green = (double)0x7777 / 65535.0;
- g->style.seq_resegmented_color.blue = (double)0x7777 / 65535.0;
- g->style.seq_resegmented_color.alpha = 1.0;
-
- /* Blueish */
- g->style.ack_color[0].red = (double)0x2222 / 65535.0;
- g->style.ack_color[0].green = (double)0x2222 / 65535.0;
- g->style.ack_color[0].blue = (double)0xaaaa / 65535.0;
- g->style.ack_color[0].alpha = 1.0;
-
- /* Reddish */
- g->style.ack_color[1].red = (double)0xaaaa / 65535.0;
- g->style.ack_color[1].green = (double)0x2222 / 65535.0;
- g->style.ack_color[1].blue = (double)0x2222 / 65535.0;
- g->style.ack_color[1].alpha = 1.0;
-
- /* Time origin should be shown as time in capture by default */
- g->style.flags = TIME_ORIGIN_CAP;
-
- g->y_axis->label = (const char ** )g_malloc(3 * sizeof(char * ));
- g->y_axis->label[0] = "Number";
- g->y_axis->label[1] = "Sequence";
- g->y_axis->label[2] = NULL;
- g->x_axis->label = (const char ** )g_malloc(2 * sizeof(char * ));
- g->x_axis->label[0] = "Time[s]";
- g->x_axis->label[1] = NULL;
-}
-
-static void rlc_lte_make_elmtlist(struct gtk_rlc_graph *g)
-{
- struct rlc_segment *tmp;
- struct element *elements0, *e0; /* list of elmts showing control */
- struct element *elements1, *e1; /* list of elmts showing data */
- struct rlc_segment *last_status_segment = NULL;
- double xx0, yy0;
- gboolean ack_seen = FALSE;
- guint32 seq_base;
- guint32 seq_cur;
- int n, data, acks, nacks;
-
- double previous_status_x = 0.0, previous_status_y = 0.0;
-
- debug(DBS_FENTRY) puts("rlc_lte_make_elmtlist()");
-
- /* Allocate all needed elements up-front */
- if (g->graph.elists->elements == NULL) {
- get_data_control_counts(g, &data, &acks, &nacks);
-
- /* Allocate elements for data */
- n = data + 1;
- e0 = elements0 = (struct element *)g_malloc(n*sizeof(struct element));
-
- /* Allocate elements for status */
- n = (2*acks) + (4*nacks) + 2;
- e1 = elements1 = (struct element *)g_malloc(n*sizeof(struct element));
-
- /* Allocate container for 2nd list of elements */
- g->graph.elists->next = (struct element_list *)g_malloc0(sizeof(struct element_list));
-
- } else {
- e0 = elements0 = g->graph.elists->elements;
- e1 = elements1 = g->graph.elists->next->elements;
- }
-
- xx0 = g->bounds.x0;
- yy0 = g->bounds.y0;
- seq_base = (guint32) yy0;
-
- for (tmp=g->graph.segments; tmp; tmp=tmp->next) {
- double secs;
- double x, y;
-
- /****************************************/
- /* X axis is time, Y is sequence number */
- /****************************************/
-
- secs = tmp->rel_secs + (tmp->rel_usecs / 1000000.0);
- x = secs - xx0;
- x *= g->zoom.x;
-
- if (!tmp->isControlPDU) {
-
- /* DATA */
-
- /* seq_cur is SN */
- seq_cur = tmp->SN - seq_base;
-
- /* Work out positions around this SN */
- #define DATA_BLOB_SIZE 4
- y = (g->zoom.y * seq_cur);
-
- /* Circle for data point */
- e0->type = ELMT_ELLIPSE;
- e0->parent = tmp;
- if (!tmp->isResegmented) {
- e0->elment_color_p = &g->style.seq_color;
- }
- else {
- e0->elment_color_p = &g->style.seq_resegmented_color;
- }
-
- e0->p.ellipse.dim.width = DATA_BLOB_SIZE;
- e0->p.ellipse.dim.height = DATA_BLOB_SIZE;
- e0->p.ellipse.dim.x = x;
- e0->p.ellipse.dim.y = y;
- e0++;
- } else {
-
- /* Remember the last status segment */
- last_status_segment = tmp;
-
- /* -1 so ACK lines up with last data, rather than showing above it... */
- seq_cur = tmp->ACKNo - seq_base - 1;
-
- /* Work out positions around this SN */
- y = (g->zoom.y * seq_cur);
-
- if (ack_seen) {
-
- if (y > previous_status_y) {
- /* Draw from previous ACK point horizontally to this time */
- e1->type = ELMT_LINE;
- e1->parent = tmp;
- e1->elment_color_p = &g->style.ack_color[0];
- e1->p.line.dim.x1 = previous_status_x;
- e1->p.line.dim.y1 = previous_status_y;
- e1->p.line.dim.x2 = x;
- e1->p.line.dim.y2 = previous_status_y;
- e1++;
-
- /* Now draw up to current ACK */
- e1->type = ELMT_LINE;
- e1->parent = tmp;
- e1->elment_color_p = &g->style.ack_color[0];
- e1->p.line.dim.x1 = x;
- e1->p.line.dim.y1 = previous_status_y;
- e1->p.line.dim.x2 = x;
- e1->p.line.dim.y2 = y;
- e1++;
- }
- else {
- /* Want to go down, then along in this case... */
- e1->type = ELMT_LINE;
- e1->parent = tmp;
- e1->elment_color_p = &g->style.ack_color[0];
- e1->p.line.dim.x1 = previous_status_x;
- e1->p.line.dim.y1 = previous_status_y;
- e1->p.line.dim.x2 = previous_status_x;
- e1->p.line.dim.y2 = y;
- e1++;
-
- /* Now draw up to current ACK */
- e1->type = ELMT_LINE;
- e1->parent = tmp;
- e1->elment_color_p = &g->style.ack_color[0];
- e1->p.line.dim.x1 = previous_status_x;
- e1->p.line.dim.y1 = y;
- e1->p.line.dim.x2 = x;
- e1->p.line.dim.y2 = y;
- e1++;
- }
- }
-
- if (tmp->noOfNACKs > 0) {
- for (n=0; n < tmp->noOfNACKs; n++) {
- double nack_y = (g->zoom.y * tmp->NACKs[n]);
-
- /* A red cross to show where the NACK is reported */
- #define NACK_CROSS_SIZE 3
- e1->type = ELMT_LINE;
- e1->parent = tmp;
- e1->elment_color_p = &g->style.ack_color[1];
- e1->p.line.dim.x1 = x -NACK_CROSS_SIZE;
- e1->p.line.dim.y1 = nack_y - NACK_CROSS_SIZE;
- e1->p.line.dim.x2 = x + NACK_CROSS_SIZE;
- e1->p.line.dim.y2 = nack_y + NACK_CROSS_SIZE;
- e1++;
-
- e1->type = ELMT_LINE;
- e1->parent = tmp;
- e1->elment_color_p = &g->style.ack_color[1];
- e1->p.line.dim.x1 = x - NACK_CROSS_SIZE;
- e1->p.line.dim.y1 = nack_y + NACK_CROSS_SIZE;
- e1->p.line.dim.x2 = x + NACK_CROSS_SIZE;
- e1->p.line.dim.y2 = nack_y - NACK_CROSS_SIZE;
- e1++;
-
- e1->type = ELMT_LINE;
- e1->parent = tmp;
- e1->elment_color_p = &g->style.ack_color[1];
- e1->p.line.dim.x1 = x;
- e1->p.line.dim.y1 = nack_y + NACK_CROSS_SIZE;
- e1->p.line.dim.x2 = x;
- e1->p.line.dim.y2 = nack_y - NACK_CROSS_SIZE;
- e1++;
-
- e1->type = ELMT_LINE;
- e1->parent = tmp;
- e1->elment_color_p = &g->style.ack_color[1];
- e1->p.line.dim.x1 = x - NACK_CROSS_SIZE;
- e1->p.line.dim.y1 = nack_y;
- e1->p.line.dim.x2 = x + NACK_CROSS_SIZE;
- e1->p.line.dim.y2 = nack_y;
- e1++;
- }
- }
-
- ack_seen = TRUE;
-
- previous_status_x = x;
- previous_status_y = y;
- }
- }
-
- if (ack_seen) {
- /* Add one more line for status, from the last PDU -> rhs of graph */
- e1->type = ELMT_LINE;
- e1->parent = last_status_segment;
- e1->elment_color_p = &g->style.ack_color[0];
- e1->p.line.dim.x1 = previous_status_x;
- e1->p.line.dim.y1 = previous_status_y;
- e1->p.line.dim.x2 = g->bounds.width * g->zoom.x; /* right edge of graph area */
- e1->p.line.dim.y2 = previous_status_y;
- e1++;
- }
-
- /* Complete both element lists */
- e0->type = ELMT_NONE;
- e1->type = ELMT_NONE;
- g->graph.elists->elements = elements0;
- g->graph.elists->next->elements = elements1;
-}
-
-#if defined(_WIN32) && !defined(__MINGW32__) && (_MSC_VER < 1800)
-/* Starting VS2013, rint already defined in math.h. N o need to redefine */
-/* replacement of Unix rint() for Windows */
-static int rint(double x)
-{
- char *buf;
- int i = 0;
- int dec,sig;
-
- buf = _fcvt(x, 0, &dec, &sig);
- ws_strtoi32(buf, NULL, &i);
- if (sig == 1) {
- i = i * -1;
- }
- return i;
-}
-#endif
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/rlc_lte_stat_dlg.c b/ui/gtk/rlc_lte_stat_dlg.c
deleted file mode 100644
index 134661d996..0000000000
--- a/ui/gtk/rlc_lte_stat_dlg.c
+++ /dev/null
@@ -1,1685 +0,0 @@
-/* rlc_lte_stat_dlg.c
- * Copyright 2010 Martin Mathieson
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-
-/* TODO:
- - per-channel graph tap?
-*/
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include "ui/gtk/gtkglobals.h"
-
-#include <epan/packet.h>
-#include <epan/tap.h>
-#include <epan/dissectors/packet-rlc-lte.h>
-
-#include "ui/simple_dialog.h"
-#include <epan/stat_groups.h>
-
-#include <wsutil/strtoi.h>
-
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_stat_menu.h"
-#include "ui/gtk/tap_param_dlg.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/main.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-#include "ui/recent.h"
-
-#include "globals.h"
-
-void register_tap_listener_rlc_lte_stat(void);
-
-/**********************************************/
-/* Table column identifiers and title strings */
-
-enum {
- UEID_COLUMN,
- UL_FRAMES_COLUMN,
- UL_BYTES_COLUMN,
- UL_BW_COLUMN,
- UL_ACKS_COLUMN,
- UL_NACKS_COLUMN,
- UL_MISSING_COLUMN,
- DL_FRAMES_COLUMN,
- DL_BYTES_COLUMN,
- DL_BW_COLUMN,
- DL_ACKS_COLUMN,
- DL_NACKS_COLUMN,
- DL_MISSING_COLUMN,
- UE_TABLE_COLUMN,
- NUM_UE_COLUMNS
-};
-
-enum {
- CHANNEL_NAME,
- CHANNEL_MODE,
- CHANNEL_PRIORITY,
- CHANNEL_UL_FRAMES,
- CHANNEL_UL_BYTES,
- CHANNEL_UL_BW,
- CHANNEL_UL_ACKS,
- CHANNEL_UL_NACKS,
- CHANNEL_UL_MISSING,
- CHANNEL_DL_FRAMES,
- CHANNEL_DL_BYTES,
- CHANNEL_DL_BW,
- CHANNEL_DL_ACKS,
- CHANNEL_DL_NACKS,
- CHANNEL_DL_MISSING,
- CHANNEL_TABLE_COLUMN,
- NUM_CHANNEL_COLUMNS
-};
-
-static const gchar *ue_titles[] = { "UEId",
- "UL Frames", "UL Bytes", "UL MBit/sec", "UL ACKs", "UL NACKs", "UL Missing",
- "DL Frames", "DL Bytes", "DL MBit/sec", "DL ACKs", "DL NACKs", "DL Missing"};
-
-static const gchar *channel_titles[] = { "", "Mode", "Priority",
- "UL Frames", "UL Bytes", "UL MBit/sec", "UL ACKs", "UL NACKs", "UL Missing",
- "DL Frames", "DL Bytes", "DL MBit/sec", "DL ACKs", "DL NACKs", "DL Missing"};
-
-/* Stats kept for one channel */
-typedef struct rlc_channel_stats {
- guint8 inUse;
- guint8 rlcMode;
- guint8 priority;
- guint16 channelType;
- guint16 channelId;
-
- guint32 UL_frames;
- guint32 UL_bytes;
- nstime_t UL_time_start;
- nstime_t UL_time_stop;
-
- guint32 DL_frames;
- guint32 DL_bytes;
- nstime_t DL_time_start;
- nstime_t DL_time_stop;
-
- guint32 UL_acks;
- guint32 UL_nacks;
-
- guint32 DL_acks;
- guint32 DL_nacks;
-
- guint32 UL_missing;
- guint32 DL_missing;
-
- GtkTreeIter iter;
- gboolean iter_valid;
-} rlc_channel_stats;
-
-
-/* Stats for one UE */
-typedef struct rlc_lte_row_data {
- /* Key for matching this row */
- guint16 ueid;
-
- gboolean is_predefined_data;
-
- guint32 UL_frames;
- guint32 UL_total_bytes;
- nstime_t UL_time_start;
- nstime_t UL_time_stop;
- guint32 UL_total_acks;
- guint32 UL_total_nacks;
- guint32 UL_total_missing;
-
- guint32 DL_frames;
- guint32 DL_total_bytes;
- nstime_t DL_time_start;
- nstime_t DL_time_stop;
- guint32 DL_total_acks;
- guint32 DL_total_nacks;
- guint32 DL_total_missing;
-
- rlc_channel_stats CCCH_stats;
- rlc_channel_stats srb_stats[2];
- rlc_channel_stats drb_stats[32];
-} rlc_lte_row_data;
-
-
-/* Common channel stats */
-typedef struct rlc_lte_common_stats {
- guint32 bcch_frames;
- guint32 bcch_bytes;
- guint32 pcch_frames;
- guint32 pcch_bytes;
-} rlc_lte_common_stats;
-
-
-/* One row/UE in the UE table */
-typedef struct rlc_lte_ep {
- struct rlc_lte_ep *next;
- struct rlc_lte_row_data stats;
- GtkTreeIter iter;
- gboolean iter_valid;
-} rlc_lte_ep_t;
-
-
-/* Used to keep track of whole RLC LTE statistics window */
-typedef struct rlc_lte_stat_t {
- GtkTreeView *ue_table;
- rlc_lte_ep_t *ep_list;
- guint32 total_frames;
-
- char *filter;
-
- /* Top-level dialog and labels */
- GtkWidget *dlg_w;
- GtkWidget *ues_lb;
-
- /* Other widgets */
- GtkWidget *ul_filter_bt;
- GtkWidget *dl_filter_bt;
- GtkWidget *uldl_filter_bt;
- GtkWidget *ul_graph_bt;
- GtkWidget *dl_graph_bt;
- GtkWidget *show_only_control_pdus_cb;
- GtkWidget *show_mac_rach_cb;
- GtkWidget *show_mac_srs_cb;
- GtkWidget *show_dct_errors_cb;
- GtkWidget *dct_error_substring_lb;
- GtkWidget *dct_error_substring_te;
- GtkWidget *sn_filter_lb;
- GtkWidget *sn_filter_te;
-
- /* Common stats */
- rlc_lte_common_stats common_stats;
- GtkWidget *common_bcch_frames;
- GtkWidget *common_bcch_bytes;
- GtkWidget *common_pcch_frames;
- GtkWidget *common_pcch_bytes;
-
- gboolean show_mac;
-
- /* State used to attempt to re-select chosen UE/channel */
- guint16 reselect_ue;
- guint16 reselect_channel_type;
- guint16 reselect_channel_id;
-
- GtkTreeView *channel_table;
-} rlc_lte_stat_t;
-
-
-static int get_channel_selection(rlc_lte_stat_t *hs,
- guint16 *ueid, guint8 *rlcMode,
- guint16 *channelType, guint16 *channelId);
-
-/* Show filter controls appropriate to current selection */
-static void enable_filter_controls(guint8 enabled, guint8 rlcMode, rlc_lte_stat_t *hs)
-{
- guint8 show_dct_errors = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_dct_errors_cb));
-
- gtk_widget_set_sensitive(hs->ul_filter_bt, enabled);
- gtk_widget_set_sensitive(hs->dl_filter_bt, enabled);
- gtk_widget_set_sensitive(hs->uldl_filter_bt, enabled);
- gtk_widget_set_sensitive(hs->ul_graph_bt, enabled);
- gtk_widget_set_sensitive(hs->dl_graph_bt, enabled);
- gtk_widget_set_sensitive(hs->show_mac_rach_cb, enabled);
- gtk_widget_set_sensitive(hs->show_mac_srs_cb, enabled);
- gtk_widget_set_sensitive(hs->show_dct_errors_cb, enabled);
-
- /* Enabling substring control only if errors enabled */
- gtk_widget_set_sensitive(hs->dct_error_substring_lb, enabled && show_dct_errors);
- gtk_widget_set_sensitive(hs->dct_error_substring_te, enabled && show_dct_errors);
-
- switch (rlcMode) {
- case RLC_TM_MODE:
- gtk_widget_set_sensitive(hs->show_only_control_pdus_cb, FALSE);
- gtk_widget_set_sensitive(hs->sn_filter_lb, FALSE);
- gtk_widget_set_sensitive(hs->sn_filter_te, FALSE);
- break;
- case RLC_UM_MODE:
- gtk_widget_set_sensitive(hs->show_only_control_pdus_cb, FALSE);
- gtk_widget_set_sensitive(hs->sn_filter_lb, TRUE);
- gtk_widget_set_sensitive(hs->sn_filter_te, TRUE);
- break;
- case RLC_AM_MODE:
- gtk_widget_set_sensitive(hs->show_only_control_pdus_cb, TRUE);
- gtk_widget_set_sensitive(hs->sn_filter_lb, TRUE);
- gtk_widget_set_sensitive(hs->sn_filter_te, TRUE);
- break;
-
- default:
- gtk_widget_set_sensitive(hs->show_only_control_pdus_cb, FALSE);
- gtk_widget_set_sensitive(hs->sn_filter_lb, FALSE);
- gtk_widget_set_sensitive(hs->sn_filter_te, FALSE);
- break;
- }
-}
-
-
-
-/* Reset the statistics window */
-static void rlc_lte_stat_reset(void *phs)
-{
- rlc_lte_stat_t *rlc_lte_stat = (rlc_lte_stat_t *)phs;
- rlc_lte_ep_t *list = rlc_lte_stat->ep_list;
- gchar *display_name;
- gchar title[256];
- GtkListStore *store;
-
- /* Set the title */
- if (rlc_lte_stat->dlg_w != NULL) {
- display_name = cf_get_display_name(&cfile);
- g_snprintf(title, sizeof(title), "Wireshark: LTE RLC Traffic Statistics: %s (filter=\"%s\")",
- display_name,
- ((rlc_lte_stat->filter != NULL) && (rlc_lte_stat->filter[0] != 0)) ? rlc_lte_stat->filter : "none");
- g_free(display_name);
- gtk_window_set_title(GTK_WINDOW(rlc_lte_stat->dlg_w), title);
- }
-
- g_snprintf(title, sizeof(title), "0 UEs");
- gtk_frame_set_label(GTK_FRAME(rlc_lte_stat->ues_lb), title);
-
- rlc_lte_stat->total_frames = 0;
- memset(&rlc_lte_stat->common_stats, 0, sizeof(rlc_lte_common_stats));
-
- /* Remove all entries from the UE list */
- store = GTK_LIST_STORE(gtk_tree_view_get_model(rlc_lte_stat->ue_table));
- gtk_list_store_clear(store);
-
- if (!list) {
- return;
- }
-
- rlc_lte_stat->ep_list = NULL;
-}
-
-
-/* Allocate a rlc_lte_ep_t struct to store info for new UE */
-static rlc_lte_ep_t* alloc_rlc_lte_ep(const struct rlc_lte_tap_info *si, packet_info *pinfo _U_)
-{
- rlc_lte_ep_t *ep;
- int n;
-
- if (!si) {
- return NULL;
- }
-
- if (!(ep = (rlc_lte_ep_t *)g_malloc(sizeof(rlc_lte_ep_t)))) {
- return NULL;
- }
-
- /* Copy SI data into ep->stats */
- ep->stats.ueid = si->ueid;
-
- /* Counts for new UE are all 0 */
- ep->stats.UL_frames = 0;
- ep->stats.DL_frames = 0;
- ep->stats.UL_total_bytes = 0;
- ep->stats.DL_total_bytes = 0;
- memset(&ep->stats.DL_time_start, 0, sizeof(nstime_t));
- memset(&ep->stats.DL_time_stop, 0, sizeof(nstime_t));
- ep->stats.UL_total_acks = 0;
- ep->stats.DL_total_acks = 0;
- ep->stats.UL_total_nacks = 0;
- ep->stats.DL_total_nacks = 0;
- ep->stats.UL_total_missing = 0;
- ep->stats.DL_total_missing = 0;
-
- memset(&ep->stats.CCCH_stats, 0, sizeof(rlc_channel_stats));
- for (n=0; n < 2; n++) {
- memset(&ep->stats.srb_stats[n], 0, sizeof(rlc_channel_stats));
- }
- for (n=0; n < 32; n++) {
- memset(&ep->stats.drb_stats[n], 0, sizeof(rlc_channel_stats));
- }
-
- ep->next = NULL;
- ep->iter_valid = FALSE;
-
- return ep;
-}
-
-
-/* Return string for RLC mode for display */
-static const char *print_rlc_channel_mode(guint8 mode)
-{
- static char unknown[32];
-
- switch (mode) {
- case RLC_TM_MODE: return "TM";
- case RLC_UM_MODE: return "UM";
- case RLC_AM_MODE: return "AM";
- case RLC_PREDEF: return "Predef";
-
- default:
- g_snprintf(unknown, sizeof(unknown), "Unknown (%u)", mode);
- return unknown;
- }
-}
-
-
-/* Process stat struct for a RLC LTE frame */
-static int rlc_lte_stat_packet(void *phs, packet_info *pinfo, epan_dissect_t *edt _U_,
- const void *phi)
-{
- /* Get reference to stat window instance */
- rlc_lte_stat_t *hs = (rlc_lte_stat_t *)phs;
- rlc_lte_ep_t *tmp = NULL, *te = NULL;
- rlc_channel_stats *channel_stats = NULL;
-
- /* Cast tap info struct */
- const struct rlc_lte_tap_info *si = (const struct rlc_lte_tap_info *)phi;
-
- /* Need this */
- if (!hs) {
- return 0;
- }
-
- /* Are we ignoring RLC frames that were found in MAC frames, or only those
- that were logged separately? */
- if ((!hs->show_mac && si->loggedInMACFrame) ||
- (hs->show_mac && !si->loggedInMACFrame)) {
- return 0;
- }
-
- /* Inc top-level frame count */
- hs->total_frames++;
-
- /* Common channel stats */
- switch (si->channelType) {
- case CHANNEL_TYPE_BCCH_BCH:
- case CHANNEL_TYPE_BCCH_DL_SCH:
- hs->common_stats.bcch_frames++;
- hs->common_stats.bcch_bytes += si->pduLength;
- return 1;
- case CHANNEL_TYPE_PCCH:
- hs->common_stats.pcch_frames++;
- hs->common_stats.pcch_bytes += si->pduLength;
- return 1;
-
- default:
- break;
- }
-
- /* For per-UE data, must create a new row if none already existing */
- if (!hs->ep_list) {
- /* Allocate new list */
- hs->ep_list = alloc_rlc_lte_ep(si, pinfo);
- /* Make it the first/only entry */
- te = hs->ep_list;
- } else {
- /* Look among existing rows for this UEId */
- for (tmp = hs->ep_list; (tmp != NULL); tmp = tmp->next) {
- if (tmp->stats.ueid == si->ueid) {
- te = tmp;
- break;
- }
- }
-
- /* Not found among existing, so create a new one anyway */
- if (te == NULL) {
- if ((te = alloc_rlc_lte_ep(si, pinfo))) {
- /* Add new item to end of list */
- rlc_lte_ep_t *p = hs->ep_list;
- while (p->next) {
- p = p->next;
- }
- p->next = te;
- te->next = NULL;
- }
- }
- }
-
- /* Really should have a row pointer by now */
- if (!te) {
- return 0;
- }
-
- /* Update entry with details from si */
- te->stats.ueid = si->ueid;
-
- /* Top-level traffic stats */
- if (si->direction == DIRECTION_UPLINK) {
- /* Update time range */
- if (te->stats.UL_frames == 0) {
- te->stats.UL_time_start = si->rlc_lte_time;
- }
- te->stats.UL_time_stop = si->rlc_lte_time;
-
- te->stats.UL_frames++;
- te->stats.UL_total_bytes += si->pduLength;
- }
- else {
- /* Update time range */
- if (te->stats.DL_frames == 0) {
- te->stats.DL_time_start = si->rlc_lte_time;
- }
- te->stats.DL_time_stop = si->rlc_lte_time;
-
- te->stats.DL_frames++;
- te->stats.DL_total_bytes += si->pduLength;
- }
-
- /* Find channel struct */
- switch (si->channelType) {
- case CHANNEL_TYPE_CCCH:
- channel_stats = &te->stats.CCCH_stats;
- break;
-
- case CHANNEL_TYPE_SRB:
- channel_stats = &te->stats.srb_stats[si->channelId-1];
- break;
-
- case CHANNEL_TYPE_DRB:
- channel_stats = &te->stats.drb_stats[si->channelId-1];
- break;
-
- default:
- /* Shouldn't get here... */
- return 0;
- }
-
- if (channel_stats != NULL) {
- /* (Over)-write these params */
- channel_stats->inUse = TRUE;
- channel_stats->iter_valid = FALSE;
- channel_stats->rlcMode = si->rlcMode;
- channel_stats->channelType = si->channelType;
- channel_stats->channelId = si->channelId;
- if (si->priority != 0) {
- channel_stats->priority = si->priority;
- }
- }
- else {
- /* Giving up if no channel found... */
- return 0;
- }
-
- if (si->direction == DIRECTION_UPLINK) {
- /* Update time range */
- if (channel_stats->UL_frames == 0) {
- channel_stats->UL_time_start = si->rlc_lte_time;
- }
- channel_stats->UL_time_stop = si->rlc_lte_time;
-
- channel_stats->UL_frames++;
- channel_stats->UL_bytes += si->pduLength;
- channel_stats->UL_nacks += si->noOfNACKs;
- channel_stats->UL_missing += si->missingSNs;
- if (si->isControlPDU) {
- channel_stats->UL_acks++;
- te->stats.UL_total_acks++;
- }
- te->stats.UL_total_nacks += si->noOfNACKs;
- te->stats.UL_total_missing += si->missingSNs;
- }
- else {
- /* Update time range */
- if (channel_stats->DL_frames == 0) {
- channel_stats->DL_time_start = si->rlc_lte_time;
- }
- channel_stats->DL_time_stop = si->rlc_lte_time;
-
- channel_stats->DL_frames++;
- channel_stats->DL_bytes += si->pduLength;
- channel_stats->DL_nacks += si->noOfNACKs;
- channel_stats->DL_missing += si->missingSNs;
- if (si->isControlPDU) {
- channel_stats->DL_acks++;
- te->stats.DL_total_acks++;
- }
- te->stats.DL_total_nacks += si->noOfNACKs;
- te->stats.DL_total_missing += si->missingSNs;
- }
-
- return 1;
-}
-
-
-/* The channels for any UE would need to be re-added to the list */
-static void invalidate_channel_iters(rlc_lte_stat_t *hs)
-{
- gint n;
- rlc_lte_ep_t *ep = hs->ep_list;
-
- while (ep) {
- ep->stats.CCCH_stats.iter_valid = FALSE;
- for (n=0; n < 2; n++) {
- ep->stats.srb_stats[n].iter_valid = FALSE;
- }
- for (n=0; n < 32; n++) {
- ep->stats.drb_stats[n].iter_valid = FALSE;
- }
-
- ep = ep->next;
- }
-}
-
-
-/* Calculate and return a bandwidth figure, in Mbs */
-static float calculate_bw(nstime_t *start_time, nstime_t *stop_time, guint32 bytes)
-{
- /* Can only calculate bandwidth if have time delta */
- if (memcmp(start_time, stop_time, sizeof(nstime_t)) != 0) {
- float elapsed_ms = (((float)stop_time->secs - (float)start_time->secs) * 1000) +
- (((float)stop_time->nsecs - (float)start_time->nsecs) / 1000000);
-
- /* Only really meaningful if have a few frames spread over time...
- For now at least avoid dividing by something very close to 0.0 */
- if (elapsed_ms < 2.0) {
- return 0.0f;
- }
- return ((bytes * 8) / elapsed_ms) / 1000;
- }
- else {
- return 0.0f;
- }
-}
-
-
-/* Draw the channels table according to the current UE selection */
-static void rlc_lte_channels(rlc_lte_ep_t *rlc_stat_ep, rlc_lte_stat_t *hs)
-{
- GtkListStore *channels_store = GTK_LIST_STORE(gtk_tree_view_get_model(hs->channel_table));
- rlc_channel_stats *channel_stats;
- char buff[32];
- int n;
-
- /* Clear any existing rows */
- gtk_list_store_clear(channels_store);
- invalidate_channel_iters(hs);
-
- if (rlc_stat_ep == NULL) {
- return;
- }
-
- /* Add one row for each channel */
-
- /* CCCH */
- channel_stats = &rlc_stat_ep->stats.CCCH_stats;
- if (channel_stats->inUse) {
-
- if (!channel_stats->iter_valid) {
- /* Add to list control if not drawn this UE before */
- gtk_list_store_append(channels_store, &channel_stats->iter);
- channel_stats->iter_valid = TRUE;
- }
-
- /* Set each column for this row */
- gtk_list_store_set(channels_store, &channel_stats->iter,
- CHANNEL_NAME, "CCCH",
- CHANNEL_MODE, print_rlc_channel_mode(channel_stats->rlcMode),
- CHANNEL_PRIORITY, 0,
- CHANNEL_UL_FRAMES, channel_stats->UL_frames,
- CHANNEL_UL_BYTES, channel_stats->UL_bytes,
- CHANNEL_DL_FRAMES, channel_stats->DL_frames,
- CHANNEL_DL_BYTES, channel_stats->DL_bytes,
- CHANNEL_TABLE_COLUMN, channel_stats,
- -1);
- }
-
-
- /* SRB */
- for (n=0; n < 2; n++) {
- channel_stats = &rlc_stat_ep->stats.srb_stats[n];
- if (channel_stats->inUse) {
-
- /* Calculate bandwidth */
- float UL_bw = calculate_bw(&channel_stats->UL_time_start,
- &channel_stats->UL_time_stop,
- channel_stats->UL_bytes);
- float DL_bw = calculate_bw(&channel_stats->DL_time_start,
- &channel_stats->DL_time_stop,
- channel_stats->DL_bytes);
-
- if (!channel_stats->iter_valid) {
- /* Add to list control if not drawn this UE before */
- gtk_list_store_append(channels_store, &channel_stats->iter);
- channel_stats->iter_valid = TRUE;
- }
-
- g_snprintf(buff, sizeof(buff), "SRB-%u", n+1);
-
- /* Set each column for this row */
- gtk_list_store_set(channels_store, &channel_stats->iter,
- CHANNEL_NAME, buff,
- CHANNEL_MODE, print_rlc_channel_mode(channel_stats->rlcMode),
- CHANNEL_PRIORITY, channel_stats->priority,
- CHANNEL_UL_FRAMES, channel_stats->UL_frames,
- CHANNEL_UL_BYTES, channel_stats->UL_bytes,
- CHANNEL_UL_BW, UL_bw,
- CHANNEL_UL_ACKS, channel_stats->UL_acks,
- CHANNEL_UL_NACKS, channel_stats->UL_nacks,
- CHANNEL_UL_MISSING, channel_stats->UL_missing,
- CHANNEL_DL_FRAMES, channel_stats->DL_frames,
- CHANNEL_DL_BYTES, channel_stats->DL_bytes,
- CHANNEL_DL_BW, DL_bw,
- CHANNEL_DL_ACKS, channel_stats->DL_acks,
- CHANNEL_DL_NACKS, channel_stats->DL_nacks,
- CHANNEL_DL_MISSING, channel_stats->DL_missing,
- CHANNEL_TABLE_COLUMN, channel_stats,
- -1);
- }
- }
-
-
- /* DRB */
- for (n=0; n < 32; n++) {
- channel_stats = &rlc_stat_ep->stats.drb_stats[n];
- if (channel_stats->inUse) {
-
- /* Calculate bandwidth */
- float UL_bw = calculate_bw(&channel_stats->UL_time_start,
- &channel_stats->UL_time_stop,
- channel_stats->UL_bytes);
- float DL_bw = calculate_bw(&channel_stats->DL_time_start,
- &channel_stats->DL_time_stop,
- channel_stats->DL_bytes);
-
- if (!channel_stats->iter_valid) {
- /* Add to list control if not drawn this UE before */
- gtk_list_store_append(channels_store, &channel_stats->iter);
- channel_stats->iter_valid = TRUE;
- }
-
- g_snprintf(buff, sizeof(buff), "DRB-%u", n+1);
-
- /* Set each column for this row */
- gtk_list_store_set(channels_store, &channel_stats->iter,
- CHANNEL_NAME, buff,
- CHANNEL_MODE, print_rlc_channel_mode(channel_stats->rlcMode),
- CHANNEL_PRIORITY, channel_stats->priority,
- CHANNEL_UL_FRAMES, channel_stats->UL_frames,
- CHANNEL_UL_BYTES, channel_stats->UL_bytes,
- CHANNEL_UL_BW, UL_bw,
- CHANNEL_UL_ACKS, channel_stats->UL_acks,
- CHANNEL_UL_NACKS, channel_stats->UL_nacks,
- CHANNEL_UL_MISSING, channel_stats->UL_missing,
- CHANNEL_DL_FRAMES, channel_stats->DL_frames,
- CHANNEL_DL_BYTES, channel_stats->DL_bytes,
- CHANNEL_DL_BW, DL_bw,
- CHANNEL_DL_ACKS, channel_stats->DL_acks,
- CHANNEL_DL_NACKS, channel_stats->DL_nacks,
- CHANNEL_DL_MISSING, channel_stats->DL_missing,
- CHANNEL_TABLE_COLUMN, channel_stats,
- -1);
- }
- }
-}
-
-
-
-/* (Re)draw the whole dialog window */
-static void rlc_lte_stat_draw(void *phs)
-{
- gchar buff[32];
- guint16 number_of_ues = 0;
- gchar *display_name;
- gchar title[256];
-
- /* Look up the statistics window */
- rlc_lte_stat_t *hs = (rlc_lte_stat_t *)phs;
- rlc_lte_ep_t* list = hs->ep_list, *tmp = 0;
-
- GtkListStore *ues_store;
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- GtkTreeIter iter;
- rlc_channel_stats *channel_stats = NULL;
-
- /* Common channel data */
- g_snprintf(buff, sizeof(buff), "BCCH Frames: %u", hs->common_stats.bcch_frames);
- gtk_label_set_text(GTK_LABEL(hs->common_bcch_frames), buff);
- g_snprintf(buff, sizeof(buff), "BCCH Bytes: %u", hs->common_stats.bcch_bytes);
- gtk_label_set_text(GTK_LABEL(hs->common_bcch_bytes), buff);
- g_snprintf(buff, sizeof(buff), "PCCH Frames: %u", hs->common_stats.pcch_frames);
- gtk_label_set_text(GTK_LABEL(hs->common_pcch_frames), buff);
- g_snprintf(buff, sizeof(buff), "PCCH Bytes: %u", hs->common_stats.pcch_bytes);
- gtk_label_set_text(GTK_LABEL(hs->common_pcch_bytes), buff);
-
- /* Per-UE table entries */
- ues_store = GTK_LIST_STORE(gtk_tree_view_get_model(hs->ue_table));
-
- /* Set title that shows how many UEs currently in table */
- for (tmp = list; (tmp!=NULL); tmp=tmp->next, number_of_ues++);
- g_snprintf(title, sizeof(title), "%u UEs", number_of_ues);
- gtk_frame_set_label(GTK_FRAME(hs->ues_lb), title);
-
- /* Update title to include number of UEs and frames */
- display_name = cf_get_display_name(&cfile);
- g_snprintf(title, sizeof(title), "Wireshark: LTE RLC Traffic Statistics: %s (%u UEs, %u frames) (filter=\"%s\")",
- display_name,
- number_of_ues,
- hs->total_frames,
- ((hs->filter != NULL) && (hs->filter[0] != 0)) ? hs->filter : "none");
- g_free(display_name);
- gtk_window_set_title(GTK_WINDOW(hs->dlg_w), title);
-
-
- /* For each row/UE in the model */
- for (tmp = list; tmp; tmp=tmp->next) {
- /* Calculate bandwidth */
- float UL_bw = calculate_bw(&tmp->stats.UL_time_start,
- &tmp->stats.UL_time_stop,
- tmp->stats.UL_total_bytes);
- float DL_bw = calculate_bw(&tmp->stats.DL_time_start,
- &tmp->stats.DL_time_stop,
- tmp->stats.DL_total_bytes);
-
- if (tmp->iter_valid != TRUE) {
- /* Add to list control if not drawn this UE before */
- gtk_list_store_append(ues_store, &tmp->iter);
- tmp->iter_valid = TRUE;
- }
-
- /* Set each column for this row */
- gtk_list_store_set(ues_store, &tmp->iter,
- UEID_COLUMN, tmp->stats.ueid,
- UL_FRAMES_COLUMN, tmp->stats.UL_frames,
- UL_BYTES_COLUMN, tmp->stats.UL_total_bytes,
- UL_BW_COLUMN, UL_bw,
- UL_ACKS_COLUMN, tmp->stats.UL_total_acks,
- UL_NACKS_COLUMN, tmp->stats.UL_total_nacks,
- UL_MISSING_COLUMN, tmp->stats.UL_total_missing,
- DL_FRAMES_COLUMN, tmp->stats.DL_frames,
- DL_BYTES_COLUMN, tmp->stats.DL_total_bytes,
- DL_BW_COLUMN, DL_bw,
- DL_ACKS_COLUMN, tmp->stats.DL_total_acks,
- DL_NACKS_COLUMN, tmp->stats.DL_total_nacks,
- DL_MISSING_COLUMN, tmp->stats.DL_total_missing,
- UE_TABLE_COLUMN, tmp,
- -1);
- }
-
- /* Reselect UE? */
- /* Note that this no longer works well, as we now get spurious UE selection callbacks
- while packets are being retapped (seen with Gtk 3.4.4 at least), leading to the wrong
- UE being reselected! */
- if (hs->reselect_ue != 0) {
- GtkTreeIter *ue_iter = NULL;
- rlc_lte_ep_t *ep = hs->ep_list;
- while (ep != NULL) {
- if (ep->stats.ueid == hs->reselect_ue) {
- ue_iter = &ep->iter;
- break;
- }
- ep = ep->next;
- }
- if (ue_iter != NULL) {
- gtk_tree_selection_select_iter(gtk_tree_view_get_selection(hs->ue_table), ue_iter);
- }
- }
-
- /* If there is a UE selected, update its counters in details window */
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(hs->ue_table));
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- rlc_lte_ep_t *ep;
-
- gtk_tree_model_get(model, &iter, UE_TABLE_COLUMN, &ep, -1);
- rlc_lte_channels(ep, hs);
-
- /* Reselect channel? */
- switch (hs->reselect_channel_type) {
- case CHANNEL_TYPE_CCCH:
- channel_stats = &(ep->stats.CCCH_stats);
- break;
- case CHANNEL_TYPE_DRB:
- channel_stats = &(ep->stats.drb_stats[hs->reselect_channel_id-1]);
- break;
- case CHANNEL_TYPE_SRB:
- channel_stats = &(ep->stats.srb_stats[hs->reselect_channel_id-1]);
- break;
- default:
- break;
- }
-
- if ((channel_stats != NULL) && channel_stats->inUse && channel_stats->iter_valid) {
- gtk_tree_selection_select_iter(gtk_tree_view_get_selection(hs->channel_table), &channel_stats->iter);
- }
- }
-}
-
-/* When DCT errors check-box is toggled, enable substring controls accordingly */
-static void rlc_lte_dct_errors_cb(GtkTreeSelection *sel _U_, gpointer data)
-{
- rlc_lte_stat_t *hs = (rlc_lte_stat_t*)data;
- guint8 show_dct_errors = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_dct_errors_cb));
-
- gtk_widget_set_sensitive(hs->dct_error_substring_lb, show_dct_errors);
- gtk_widget_set_sensitive(hs->dct_error_substring_te, show_dct_errors);
-}
-
-/* What to do when a UE list item is selected/unselected */
-static void rlc_lte_select_ue_cb(GtkTreeSelection *sel, gpointer data)
-{
- rlc_lte_ep_t *ep;
- GtkTreeModel *model;
- GtkTreeIter iter;
- rlc_lte_stat_t *hs = (rlc_lte_stat_t*)data;
-
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- /* Show details of selected UE */
- gtk_tree_model_get(model, &iter, UE_TABLE_COLUMN, &ep, -1);
- hs->reselect_ue = ep->stats.ueid;
- rlc_lte_channels(ep, hs);
- }
- else {
- rlc_lte_channels(NULL, hs);
- }
-
- /* Channel will be deselected */
- enable_filter_controls(FALSE, 0, hs);
-}
-
-
-/* What to do when a channel list item is selected/unselected */
-static void rlc_lte_select_channel_cb(GtkTreeSelection *sel, gpointer data)
-{
- GtkTreeModel *model;
- GtkTreeIter iter;
- rlc_lte_stat_t *hs = (rlc_lte_stat_t *)data;
-
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- guint16 ueid;
- guint8 rlcMode;
-
- /* Remember selected channel */
- if (get_channel_selection(hs, &ueid, &rlcMode,
- &(hs->reselect_channel_type), &(hs->reselect_channel_id))) {
- /* Enable buttons */
- enable_filter_controls(TRUE, rlcMode, hs);
- }
- }
- else {
- /* No channel selected - disable buttons */
- enable_filter_controls(FALSE, 0, hs);
- }
-}
-
-
-/* Destroy the stats window */
-static void win_destroy_cb(GtkWindow *win _U_, gpointer data)
-{
- rlc_lte_stat_t *hs = (rlc_lte_stat_t *)data;
-
- remove_tap_listener(hs);
-
- if (hs->dlg_w != NULL) {
- window_destroy(hs->dlg_w);
- hs->dlg_w = NULL;
- }
- rlc_lte_stat_reset(hs);
- g_free(hs);
-}
-
-
-/* When source of packets (MAC or RLC-only) changes, re-display */
-static void toggle_show_mac(GtkWidget *widget, gpointer data)
-{
- rlc_lte_stat_t *hs = (rlc_lte_stat_t *)data;
-
- /* Read state */
- hs->show_mac = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
- recent.gui_rlc_use_pdus_from_mac = hs->show_mac;
-
- /* Retap */
- cf_retap_packets(&cfile);
-}
-
-
-
-/* Check that a UE / channel is currently selected. If so, fill in out
- parameters with details of channel.
- Return TRUE if a channel is selected */
-static int get_channel_selection(rlc_lte_stat_t *hs,
- guint16 *ueid, guint8 *rlcMode,
- guint16 *channelType, guint16 *channelId)
-{
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- /* Check UE selection */
- GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(hs->ue_table));
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- rlc_lte_ep_t *ep;
-
- gtk_tree_model_get(model, &iter, UE_TABLE_COLUMN, &ep, -1);
- *ueid = ep->stats.ueid;
-
- /* Check channel selection */
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(hs->channel_table));
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- /* Find details of selected channel */
- rlc_channel_stats *channel_stats;
- gtk_tree_model_get(model, &iter, CHANNEL_TABLE_COLUMN, &channel_stats, -1);
- *rlcMode = channel_stats->rlcMode;
- *channelType = channel_stats->channelType;
- *channelId = channel_stats->channelId;
- }
- else {
- return FALSE;
- }
- }
- else {
- return FALSE;
- }
-
- return TRUE;
-}
-
-
-/* Build and set a display filter to match the given channel settings */
-typedef enum ChannelDirection_t {UL_Only, DL_Only, UL_and_DL} ChannelDirection_t;
-static void set_channel_filter_expression(guint16 ueid,
- guint8 rlcMode,
- guint16 channelType,
- guint16 channelId,
- ChannelDirection_t channelDirection,
- gint filterOnSN,
- gint statusOnlyPDUs,
- gint showMACRACH,
- gint showMACSRs,
- gint showDCTErrors,
- const gchar *DCTErrorSubstring,
- rlc_lte_stat_t *hs)
-{
- #define MAX_FILTER_LEN 1024
- static char buffer[MAX_FILTER_LEN];
- int offset = 0;
-
- /* Show MAC RACH (preamble attempts and RAR PDUs) */
- if (showMACRACH) {
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset,
- "(mac-lte.rar or (mac-lte.preamble-sent and mac-lte.ueid == %u)) or (",
- ueid);
- }
-
- /* Show MAC SRs */
- if (showMACSRs) {
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset,
- "(mac-lte.sr-req and mac-lte.ueid == %u) or (",
- ueid);
- }
-
- /* Show DCT errors */
- if (showDCTErrors) {
- if (strlen(DCTErrorSubstring) > 0) {
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset,
- "(dct2000.error-comment and (dct2000.comment contains \"%s\")) or (",
- DCTErrorSubstring);
- }
- else {
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset,
- "dct2000.error-comment or (");
- }
- }
-
- /* Include dialog filter */
- if (strlen(hs->filter)) {
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset, "%s and ", hs->filter);
- }
-
- /* Should we exclude MAC frames? */
- if (!hs->show_mac) {
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset, "not mac-lte and ");
- }
- else {
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset, "mac-lte and ");
- }
-
- /* UEId */
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset, "(rlc-lte.ueid == %u) and ", ueid);
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset, "(rlc-lte.channel-type == %u)", channelType);
-
- /* Channel-id for srb/drb */
- if ((channelType == CHANNEL_TYPE_SRB) || (channelType == CHANNEL_TYPE_DRB)) {
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset, " and (rlc-lte.channel-id == %u)", channelId);
- }
-
- /* Direction (also depends upon RLC mode) */
- switch (channelDirection) {
- case UL_Only:
- if (rlcMode == RLC_AM_MODE) {
- /* Always filter status PDUs */
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset,
- " and (rlc-lte.direction == 1 and rlc-lte.am.frame-type == 0)");
- if (!statusOnlyPDUs) {
- /* Also filter data */
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset,
- " or (rlc-lte.direction == 0 and rlc-lte.am.frame-type == 1)");
- }
- }
- else {
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset, " and (rlc-lte.direction == 0)");
- }
- break;
- case DL_Only:
- if (rlcMode == RLC_AM_MODE) {
- /* Always filter status PDs */
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset,
- " and (rlc-lte.direction == 0 and rlc-lte.am.frame-type == 0)");
- if (!statusOnlyPDUs) {
- /* Also filter data */
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset,
- " or (rlc-lte.direction == 1 and rlc-lte.am.frame-type == 1)");
- }
- }
- else {
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset, " and (rlc-lte.direction == 1)");
- }
- break;
- case UL_and_DL:
- if (rlcMode == RLC_AM_MODE) {
- if (statusOnlyPDUs) {
- g_snprintf(buffer+offset, MAX_FILTER_LEN-offset, " and (rlc-lte.am.frame-type == 0)");
- }
- }
-
- default:
- break;
- }
-
- /* Filter on a specific sequence number */
- if (filterOnSN != -1) {
- switch (rlcMode) {
- case RLC_AM_MODE:
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset,
- " and ((rlc-lte.am.fixed.sn == %u) or "
- "(rlc-lte.am.ack-sn == %u) or "
- "(rlc-lte.am.nack-sn == %u))",
- filterOnSN, (filterOnSN+1) % 1024, filterOnSN);
- break;
- case RLC_UM_MODE:
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset,
- " and (rlc-lte.um.sn == %u)", filterOnSN);
- break;
-
- default:
- break;
- }
- }
-
- /* Close () if open */
- if (showDCTErrors) {
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset, ")");
- }
-
- /* Close () if open */
- if (showMACSRs) {
- offset += g_snprintf(buffer+offset, MAX_FILTER_LEN-offset, ")");
- }
-
- /* Close () if open */
- if (showMACRACH) {
- /*offset +=*/ g_snprintf(buffer+offset, MAX_FILTER_LEN-offset, ")");
- }
-
-
- /* Set its value to our new string */
- gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), buffer);
-
- /* Run the filter */
- main_filter_packets(&cfile, buffer, TRUE);
-}
-
-/* Respond to UL filter button being clicked by building and using filter */
-static void ul_filter_clicked(GtkWindow *win _U_, rlc_lte_stat_t* hs)
-{
- guint16 ueid;
- guint8 rlcMode;
- guint16 channelType;
- guint16 channelId;
- int sn = -1;
- const gchar *sn_string;
-
- /* Read SN to filter on (if present) */
- sn_string = gtk_entry_get_text(GTK_ENTRY(hs->sn_filter_te));
- if (strlen(sn_string) > 0) {
- ws_strtoi32(sn_string, NULL, &sn);
- }
-
- if (!get_channel_selection(hs, &ueid, &rlcMode, &channelType, &channelId)) {
- return;
- }
-
- set_channel_filter_expression(ueid, rlcMode, channelType, channelId, UL_Only, sn,
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_only_control_pdus_cb)),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_mac_rach_cb)),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_mac_srs_cb)),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_dct_errors_cb)),
- gtk_entry_get_text(GTK_ENTRY(hs->dct_error_substring_te)),
- hs);
-}
-
-/* Respond to DL filter button being clicked by building and using filter */
-static void dl_filter_clicked(GtkWindow *win _U_, rlc_lte_stat_t* hs)
-{
- guint16 ueid;
- guint8 rlcMode;
- guint16 channelType;
- guint16 channelId;
- int sn = -1;
- const gchar *sn_string;
-
- /* Read SN to filter on (if present) */
- sn_string = gtk_entry_get_text(GTK_ENTRY(hs->sn_filter_te));
- if (strlen(sn_string) > 0) {
- ws_strtoi32(sn_string, NULL, &sn);
- }
-
- if (!get_channel_selection(hs, &ueid, &rlcMode, &channelType, &channelId)) {
- return;
- }
-
- set_channel_filter_expression(ueid, rlcMode, channelType, channelId, DL_Only, sn,
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_only_control_pdus_cb)),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_mac_rach_cb)),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_mac_srs_cb)),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_dct_errors_cb)),
- gtk_entry_get_text(GTK_ENTRY(hs->dct_error_substring_te)),
- hs);
-}
-
-/* Respond to UL/DL filter button being clicked by building and using filter */
-static void uldl_filter_clicked(GtkWindow *win _U_, rlc_lte_stat_t* hs)
-{
- guint16 ueid;
- guint8 rlcMode;
- guint16 channelType;
- guint16 channelId;
- int sn = -1;
- const gchar *sn_string;
-
- /* Read SN to filter on (if present) */
- sn_string = gtk_entry_get_text(GTK_ENTRY(hs->sn_filter_te));
- if (strlen(sn_string) > 0) {
- ws_strtoi32(sn_string, NULL, &sn);
- }
-
- if (!get_channel_selection(hs, &ueid, &rlcMode, &channelType, &channelId)) {
- return;
- }
-
- set_channel_filter_expression(ueid, rlcMode, channelType, channelId, UL_and_DL, sn,
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_only_control_pdus_cb)),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_mac_rach_cb)),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_mac_srs_cb)),
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hs->show_dct_errors_cb)),
- gtk_entry_get_text(GTK_ENTRY(hs->dct_error_substring_te)),
- hs);
-}
-
-/* Create a graph for the UL direction */
-static void ul_graph_clicked(GtkWidget *win _U_, rlc_lte_stat_t* hs)
-{
- guint16 ueid, channelType, channelId;
- guint8 rlcMode;
-
- if (!get_channel_selection(hs, &ueid, &rlcMode, &channelType, &channelId)) {
- return;
- }
- rlc_lte_graph_known_channel_launch(ueid, rlcMode, channelType, channelId, DIRECTION_UPLINK);
-}
-
-/* Create a graph for the DL direction */
-static void dl_graph_clicked(GtkWidget *win _U_, rlc_lte_stat_t* hs)
-{
- guint16 ueid, channelType, channelId;
- guint8 rlcMode;
-
- if (!get_channel_selection(hs, &ueid, &rlcMode, &channelType, &channelId)) {
- return;
- }
- rlc_lte_graph_known_channel_launch(ueid, rlcMode, channelType, channelId, DIRECTION_DOWNLINK);
-}
-
-
-/* Create a new RLC LTE stats dialog */
-static void gtk_rlc_lte_stat_init(const char *opt_arg, void *userdata _U_)
-{
- rlc_lte_stat_t *hs;
- const char *filter = NULL;
- GString *error_string;
- GtkWidget *ues_scrolled_window;
- GtkWidget *channels_scrolled_window;
- GtkWidget *bbox;
- GtkWidget *top_level_vbox;
-
- GtkWidget *pdu_source_lb;
- GtkWidget *common_channel_lb;
- GtkWidget *channels_lb;
- GtkWidget *action_buttons_lb;
-
- GtkWidget *common_row_hbox;
- GtkWidget *show_mac_cb;
- GtkWidget *ues_vb;
- GtkWidget *channels_vb;
- GtkWidget *filter_vb;
- GtkWidget *action_buttons_hb;
- GtkWidget *sn_filter_hb;
-
- GtkWidget *close_bt;
- GtkWidget *help_bt;
- GtkListStore *store;
-
- GtkTreeView *tree_view;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
- GtkTreeSelection *sel;
- gchar *display_name;
- gchar title[256];
- gint i;
-
- /* Check for a filter string */
- if (strncmp(opt_arg, "rlc-lte,stat,", 13) == 0) {
- /* Skip those characters from filter to display */
- filter = opt_arg + 13;
- }
- else {
- /* No filter */
- filter = NULL;
- }
-
-
- /* Create dialog */
- hs = (rlc_lte_stat_t *)g_malloc(sizeof(rlc_lte_stat_t));
- hs->ep_list = NULL;
-
- /* Copy filter (so can be used for window title at reset) */
- hs->filter = g_strdup(filter);
-
- /* Set title */
- display_name = cf_get_display_name(&cfile);
- g_snprintf(title, sizeof(title), "Wireshark: LTE RLC Statistics: %s",
- display_name);
- g_free(display_name);
- hs->dlg_w = window_new_with_geom(GTK_WINDOW_TOPLEVEL, title, "LTE RLC Statistics", GTK_WIN_POS_CENTER_ON_PARENT);
-
- /* Window size */
- gtk_window_set_default_size(GTK_WINDOW(hs->dlg_w), 600, 300);
-
- /* Will stack widgets vertically inside dlg */
- top_level_vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE); /* FALSE = not homogeneous */
- gtk_container_add(GTK_CONTAINER(hs->dlg_w), top_level_vbox);
- gtk_container_set_border_width(GTK_CONTAINER(top_level_vbox), 6);
- gtk_widget_show(top_level_vbox);
-
- /**********************************************/
- /* Exclude-MAC checkbox */
- pdu_source_lb = gtk_frame_new("PDUs to use");
- show_mac_cb = gtk_check_button_new_with_mnemonic("Show RLC PDUs found inside logged MAC frames");
- gtk_container_add(GTK_CONTAINER(pdu_source_lb), show_mac_cb);
- gtk_widget_set_tooltip_text(show_mac_cb, "Can either use separately-logged RLC PDUs, OR find them "
- "decoded inside MAC PDUs (enabled in MAC dissector preferences)");
-
-
- /* Get settings from recent. */
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(show_mac_cb),
- recent.gui_rlc_use_pdus_from_mac);
- hs->show_mac = recent.gui_rlc_use_pdus_from_mac;
- gtk_box_pack_start(GTK_BOX(top_level_vbox), pdu_source_lb, FALSE, FALSE, 0);
- /* TODO: add tooltips... */
- g_signal_connect(show_mac_cb, "toggled", G_CALLBACK(toggle_show_mac), hs);
-
-
- /**********************************************/
- /* Common Channel data */
- /**********************************************/
- common_channel_lb = gtk_frame_new("Common Channel Data");
-
- /* Will add BCCH and PCCH counters into one row */
- common_row_hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(common_channel_lb), common_row_hbox);
- gtk_container_set_border_width(GTK_CONTAINER(common_row_hbox), 5);
- gtk_box_pack_start(GTK_BOX(top_level_vbox), common_channel_lb, FALSE, FALSE, 0);
-
- /* Create labels (that will hold label and counter value) */
- hs->common_bcch_frames = gtk_label_new("BCCH Frames:");
- gtk_misc_set_alignment(GTK_MISC(hs->common_bcch_frames), 0.0f, .5f);
- gtk_box_pack_start(GTK_BOX(common_row_hbox), hs->common_bcch_frames, TRUE, TRUE, 0);
- gtk_widget_show(hs->common_bcch_frames);
-
- hs->common_bcch_bytes = gtk_label_new("BCCH Bytes:");
- gtk_misc_set_alignment(GTK_MISC(hs->common_bcch_bytes), 0.0f, .5f);
- gtk_box_pack_start(GTK_BOX(common_row_hbox), hs->common_bcch_bytes, TRUE, TRUE, 0);
- gtk_widget_show(hs->common_bcch_bytes);
-
- hs->common_pcch_frames = gtk_label_new("PCCH Frames:");
- gtk_misc_set_alignment(GTK_MISC(hs->common_pcch_frames), 0.0f, .5f);
- gtk_box_pack_start(GTK_BOX(common_row_hbox), hs->common_pcch_frames, TRUE, TRUE, 0);
- gtk_widget_show(hs->common_pcch_frames);
-
- hs->common_pcch_bytes = gtk_label_new("PCCH Bytes:");
- gtk_misc_set_alignment(GTK_MISC(hs->common_pcch_bytes), 0.0f, .5f);
- gtk_box_pack_start(GTK_BOX(common_row_hbox), hs->common_pcch_bytes, TRUE, TRUE, 0);
- gtk_widget_show(hs->common_pcch_bytes);
-
-
- /**********************************************/
- /* UE List */
- /**********************************************/
-
- hs->ues_lb = gtk_frame_new("UE Data (0 UEs)");
- ues_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(hs->ues_lb), ues_vb);
- gtk_container_set_border_width(GTK_CONTAINER(ues_vb), 5);
-
- ues_scrolled_window = scrolled_window_new(NULL, NULL);
- gtk_box_pack_start(GTK_BOX(ues_vb), ues_scrolled_window, TRUE, TRUE, 0);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(ues_scrolled_window),
- GTK_SHADOW_IN);
-
- /* Create the table of UE data */
- store = gtk_list_store_new(NUM_UE_COLUMNS, G_TYPE_INT,
- G_TYPE_INT, G_TYPE_INT, G_TYPE_FLOAT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, /* UL */
- G_TYPE_INT, G_TYPE_INT, G_TYPE_FLOAT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, /* DL */
- G_TYPE_POINTER);
- hs->ue_table = GTK_TREE_VIEW(tree_view_new(GTK_TREE_MODEL(store)));
- gtk_container_add(GTK_CONTAINER (ues_scrolled_window), GTK_WIDGET(hs->ue_table));
- g_object_unref(G_OBJECT(store));
-
- tree_view = hs->ue_table;
- gtk_tree_view_set_headers_visible(tree_view, TRUE);
- gtk_tree_view_set_headers_clickable(tree_view, TRUE);
-
- /* Create the titles for each column of the per-UE table */
- for (i = 0; i < UE_TABLE_COLUMN; i++) {
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes(ue_titles[i], renderer,
- "text", i, NULL);
- gtk_tree_view_column_set_sort_column_id(column, i);
-
- if (i == 0) {
- /* Expand first column (RNTI, which is Key) */
- gtk_tree_view_column_set_expand(column, TRUE);
- } else {
- /* For other columns, set all of the free space to be on the left */
- g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
- }
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_append_column(tree_view, column);
- }
-
- /* Set callback function for selecting a row in the UE table */
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(hs->ue_table));
- gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
- g_signal_connect(sel, "changed", G_CALLBACK(rlc_lte_select_ue_cb), hs);
-
- gtk_box_pack_start(GTK_BOX(top_level_vbox), hs->ues_lb, TRUE, TRUE, 0);
-
-
- /**********************************************/
- /* Channels of selected UE */
- /**********************************************/
- channels_lb = gtk_frame_new("Channels of selected UE");
-
- channels_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- gtk_container_add(GTK_CONTAINER(channels_lb), channels_vb);
- gtk_container_set_border_width(GTK_CONTAINER(channels_vb), 5);
-
- channels_scrolled_window = scrolled_window_new(NULL, NULL);
- gtk_box_pack_start(GTK_BOX(channels_vb), channels_scrolled_window, TRUE, TRUE, 0);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(channels_scrolled_window),
- GTK_SHADOW_IN);
-
- /* Create the table of UE data */
- store = gtk_list_store_new(NUM_CHANNEL_COLUMNS,
- G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, /* name, type, priority */
- G_TYPE_INT, G_TYPE_INT, G_TYPE_FLOAT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, /* UL */
- G_TYPE_INT, G_TYPE_INT, G_TYPE_FLOAT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, /* DL */
- G_TYPE_POINTER);
- hs->channel_table = GTK_TREE_VIEW(tree_view_new(GTK_TREE_MODEL(store)));
- gtk_container_add(GTK_CONTAINER (channels_scrolled_window), GTK_WIDGET(hs->channel_table));
- g_object_unref(G_OBJECT(store));
-
- tree_view = hs->channel_table;
- gtk_tree_view_set_headers_visible(tree_view, TRUE);
- gtk_tree_view_set_headers_clickable(tree_view, TRUE);
-
- /* Create the titles for each column of the per-UE table */
- for (i = 0; i < CHANNEL_TABLE_COLUMN; i++) {
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes(channel_titles[i], renderer,
- "text", i, NULL);
- gtk_tree_view_column_set_sort_column_id(column, i);
-
- if (i == 0) {
- /* Expand first column (Type) */
- gtk_tree_view_column_set_expand(column, TRUE);
- } else {
- /* For other columns, set all of the free space to be on the left */
- g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
- }
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_append_column(tree_view, column);
- }
-
- /* Set callback function for selecting a row in the channel table */
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(hs->channel_table));
- gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
- g_signal_connect(sel, "changed", G_CALLBACK(rlc_lte_select_channel_cb), hs);
-
- gtk_box_pack_start(GTK_BOX(top_level_vbox), channels_lb, TRUE, TRUE, 0);
-
-
- /**********************************************/
- /* Channel filters */
- /**********************************************/
-
- action_buttons_lb = gtk_frame_new("Action on selected channel");
-
- filter_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_add(GTK_CONTAINER(action_buttons_lb), filter_vb);
-
- /* Horizontal row of filter buttons */
- action_buttons_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6, FALSE);
- gtk_box_pack_start(GTK_BOX(filter_vb), action_buttons_hb, FALSE, FALSE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(action_buttons_hb), 2);
-
- /* UL only */
- hs->ul_filter_bt = gtk_button_new_with_label("UL display filter for this channel");
- gtk_box_pack_start(GTK_BOX(action_buttons_hb), hs->ul_filter_bt, TRUE, TRUE, 0);
- g_signal_connect(hs->ul_filter_bt, "clicked", G_CALLBACK(ul_filter_clicked), hs);
- gtk_widget_show(hs->ul_filter_bt);
- gtk_widget_set_tooltip_text(hs->ul_filter_bt, "Generate and set a display filter to show frames "
- "associated with the channel, in the UL direction only. "
- "N.B. DL Status PDUs sent on this channel will also be shown for AM");
-
- /* DL only */
- hs->dl_filter_bt = gtk_button_new_with_label("DL display filter for this channel");
- gtk_box_pack_start(GTK_BOX(action_buttons_hb), hs->dl_filter_bt, TRUE, TRUE, 0);
- g_signal_connect(hs->dl_filter_bt, "clicked", G_CALLBACK(dl_filter_clicked), hs);
- gtk_widget_show(hs->dl_filter_bt);
- gtk_widget_set_tooltip_text(hs->dl_filter_bt, "Generate and set a display filter to show frames "
- "associated with the channel, in the DL direction only. "
- "N.B. UL Status PDUs sent on this channel will also be shown for AM");
-
- /* UL and DL */
- hs->uldl_filter_bt = gtk_button_new_with_label("UL / DL display filter for this channel");
- gtk_box_pack_start(GTK_BOX(action_buttons_hb), hs->uldl_filter_bt, TRUE, TRUE, 0);
- g_signal_connect(hs->uldl_filter_bt, "clicked", G_CALLBACK(uldl_filter_clicked), hs);
- gtk_widget_show(hs->uldl_filter_bt);
- gtk_widget_set_tooltip_text(hs->uldl_filter_bt, "Generate and set a display filter to show frames "
- "associated with the channel, in UL and DL");
-
- /* UL graph */
- hs->ul_graph_bt = gtk_button_new_with_label("UL Graph");
- gtk_box_pack_start(GTK_BOX(action_buttons_hb), hs->ul_graph_bt, TRUE, TRUE, 0);
- g_signal_connect(hs->ul_graph_bt, "clicked", G_CALLBACK(ul_graph_clicked), hs);
- gtk_widget_show(hs->ul_graph_bt);
- gtk_widget_set_tooltip_text(hs->ul_graph_bt, "Launch RLC graph for this channel in UL");
-
- /* DL graph */
- hs->dl_graph_bt = gtk_button_new_with_label("DL Graph");
- gtk_box_pack_start(GTK_BOX(action_buttons_hb), hs->dl_graph_bt, TRUE, TRUE, 0);
- g_signal_connect(hs->dl_graph_bt, "clicked", G_CALLBACK(dl_graph_clicked), hs);
- gtk_widget_show(hs->dl_graph_bt);
- gtk_widget_set_tooltip_text(hs->dl_graph_bt, "Launch RLC graph for this channel in DL");
-
- /* Allow filtering on specific SN number. */
- /* Row with label and text entry control */
- sn_filter_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(filter_vb), sn_filter_hb, FALSE, FALSE, 0);
- gtk_widget_show(sn_filter_hb);
-
- /* Allow filtering only to select status PDUs for AM */
- hs->show_only_control_pdus_cb = gtk_check_button_new_with_mnemonic("Show only status PDUs");
- gtk_container_add(GTK_CONTAINER(sn_filter_hb), hs->show_only_control_pdus_cb);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(hs->show_only_control_pdus_cb), FALSE);
- gtk_widget_set_tooltip_text(hs->show_only_control_pdus_cb, "Generated filters will only show AM status PDUs "
- "(i.e. if you filter on UL you'll see ACKs/NACK replies sent in the DL)");
-
- /* Show MAC RACH */
- hs->show_mac_rach_cb = gtk_check_button_new_with_mnemonic("Show MAC RACH");
- gtk_container_add(GTK_CONTAINER(sn_filter_hb), hs->show_mac_rach_cb);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(hs->show_mac_rach_cb), FALSE);
- gtk_widget_set_tooltip_text(hs->show_mac_rach_cb, "When checked, generated filters will show "
- "MAC RACH attempts for the UE");
-
- /* Show MAC SRs */
- hs->show_mac_srs_cb = gtk_check_button_new_with_mnemonic("Show MAC SRs");
- gtk_container_add(GTK_CONTAINER(sn_filter_hb), hs->show_mac_srs_cb);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(hs->show_mac_srs_cb), FALSE);
- gtk_widget_set_tooltip_text(hs->show_mac_srs_cb, "When checked, generated filters will show "
- "MAC SRs for the UE");
-
- /* Allow DCT errors to be shown... */
- hs->show_dct_errors_cb = gtk_check_button_new_with_mnemonic("Show DCT2000 error strings...");
- gtk_container_add(GTK_CONTAINER(sn_filter_hb), hs->show_dct_errors_cb);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(hs->show_dct_errors_cb), FALSE);
- g_signal_connect(hs->show_dct_errors_cb, "toggled", G_CALLBACK(rlc_lte_dct_errors_cb), hs);
- gtk_widget_set_tooltip_text(hs->show_dct_errors_cb, "When checked, generated filters will "
- "include DCT2000 error strings");
-
- /* ... optionally limited by a substring */
- hs->dct_error_substring_lb = gtk_label_new("...containing");
- gtk_box_pack_start(GTK_BOX(sn_filter_hb), hs->dct_error_substring_lb, FALSE, FALSE, 0);
- gtk_widget_show(hs->dct_error_substring_lb);
-
- hs->dct_error_substring_te = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(sn_filter_hb), hs->dct_error_substring_te, FALSE, FALSE, 0);
- gtk_widget_show(hs->dct_error_substring_te);
- gtk_widget_set_tooltip_text(hs->dct_error_substring_te,
- "If given, only match error strings containing this substring");
-
- /* Allow filtering of a particular sequence number */
- hs->sn_filter_te = gtk_entry_new();
- gtk_box_pack_end(GTK_BOX(sn_filter_hb), hs->sn_filter_te, FALSE, FALSE, 0);
- gtk_widget_show(hs->sn_filter_te);
- gtk_widget_set_tooltip_text(hs->sn_filter_te, "Can limit generated filters to a given sequence number (0-1023). "
- "Will also include relevant AM status PDUs");
-
- hs->sn_filter_lb = gtk_label_new("Sequence number to filter on:");
- gtk_box_pack_end(GTK_BOX(sn_filter_hb), hs->sn_filter_lb, FALSE, FALSE, 0);
- gtk_widget_show(hs->sn_filter_lb);
-
-
- /* Add filters box to top-level window */
- gtk_box_pack_start(GTK_BOX(top_level_vbox), action_buttons_lb, FALSE, FALSE, 0);
-
- enable_filter_controls(FALSE, 0, hs);
-
- /**********************************************/
- /* Register the tap listener */
- /**********************************************/
-
- error_string = register_tap_listener("rlc-lte", hs,
- filter, 0,
- rlc_lte_stat_reset,
- rlc_lte_stat_packet,
- rlc_lte_stat_draw);
- if (error_string) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
- g_string_free(error_string, TRUE);
- g_free(hs);
- return;
- }
-
-
- /************************************/
- /* Bottom button row. */
- /************************************/
-
- bbox = dlg_button_row_new(GTK_STOCK_CLOSE, GTK_STOCK_HELP, NULL);
- gtk_box_pack_end(GTK_BOX(top_level_vbox), bbox, FALSE, FALSE, 0);
-
- /* Add the close button */
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(hs->dlg_w, close_bt, window_cancel_button_cb);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_STATS_LTE_RLC_TRAFFIC_DIALOG);
-
- /* Set callbacks */
- g_signal_connect(hs->dlg_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(hs->dlg_w, "destroy", G_CALLBACK(win_destroy_cb), hs);
-
- /* Show the window */
- gtk_widget_show_all(hs->dlg_w);
- window_present(hs->dlg_w);
-
- /* Retap */
- cf_retap_packets(&cfile);
- gdk_window_raise(gtk_widget_get_window(hs->dlg_w));
-}
-
-
-static tap_param rlc_lte_stat_params[] = {
- { PARAM_FILTER, "filter", "Filter", NULL, TRUE }
-};
-
-static tap_param_dlg rlc_lte_stat_dlg = {
- "LTE RLC Stats",
- "rlc-lte,stat",
- gtk_rlc_lte_stat_init,
- -1,
- G_N_ELEMENTS(rlc_lte_stat_params),
- rlc_lte_stat_params,
- NULL
-};
-
-
-/* Register this tap listener (need void on own so line register function found) */
-void
-register_tap_listener_rlc_lte_stat(void)
-{
- register_param_stat(&rlc_lte_stat_dlg, "_RLC", REGISTER_STAT_GROUP_TELEPHONY_LTE);
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/rpc_stat.c b/ui/gtk/rpc_stat.c
deleted file mode 100644
index 4f1b456878..0000000000
--- a/ui/gtk/rpc_stat.c
+++ /dev/null
@@ -1,532 +0,0 @@
-/* rpc_stat.c
- * rpc_stat 2002 Ronnie Sahlberg
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/* This module provides rpc call/reply SRT (Server Response Time) statistics
- * to Wireshark.
- *
- * It serves as an example on how to use the tap api.
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/packet_info.h>
-#include <epan/stat_tap_ui.h>
-#include <epan/tap.h>
-#include <epan/dissectors/packet-rpc.h>
-
-#include "ui/simple_dialog.h"
-
-#include "ui/gtk/gui_stat_menu.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/filter_dlg.h"
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/service_response_time_table.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/filter_autocomplete.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-#include "globals.h"
-
-void register_tap_listener_gtkrpcstat(void);
-
-/* used to keep track of the statistics for an entire program interface */
-typedef struct _rpcstat_t {
- const char *prog;
- guint32 version;
- gtk_srt_t gtk_data;
- register_srt_t* srt;
- srt_data_t data;
-} rpcstat_t;
-
-static char *
-rpcstat_gen_title(rpcstat_t *rs)
-{
- char *display_name;
- char *title;
-
- display_name = cf_get_display_name(&cfile);
- title = g_strdup_printf("ONC-RPC Service Response Time statistics for %s version %d: %s",
- rs->prog, rs->version, display_name);
- g_free(display_name);
- return title;
-}
-
-static void
-rpcstat_set_title(rpcstat_t *rs)
-{
- char *title;
-
- title = rpcstat_gen_title(rs);
- gtk_window_set_title(GTK_WINDOW(rs->gtk_data.win), title);
- g_free(title);
-}
-
-static void
-rpcstat_reset(void *arg)
-{
- srt_data_t *srt = (srt_data_t*)arg;
- rpcstat_t *rs = (rpcstat_t *)srt->user_data;
-
- reset_srt_table(rs->data.srt_array, reset_table_data, &rs->gtk_data);
-
- rpcstat_set_title(rs);
-}
-
-static void
-rpcstat_draw(void *arg)
-{
- guint i = 0;
- srt_stat_table *srt_table;
- srt_data_t *srt = (srt_data_t*)arg;
- rpcstat_t *rs = (rpcstat_t *)srt->user_data;
-
- for (i = 0; i < srt->srt_array->len; i++)
- {
- srt_table = g_array_index(srt->srt_array, srt_stat_table*, i);
- draw_srt_table_data(srt_table, &rs->gtk_data);
- }
-}
-
-
-
-static guint32 rpc_program=0;
-static guint32 rpc_version=0;
-static gint32 rpc_min_vers=-1;
-static gint32 rpc_max_vers=-1;
-static gint32 rpc_min_proc=-1;
-static gint32 rpc_max_proc=-1;
-
-static void
-rpcstat_find_procs(const gchar *table_name _U_, ftenum_t selector_type _U_, gpointer key, gpointer value _U_, gpointer user_data _U_)
-{
- rpc_proc_info_key *k=(rpc_proc_info_key *)key;
-
- if(k->prog!=rpc_program){
- return;
- }
- if(k->vers!=rpc_version){
- return;
- }
- if(rpc_min_proc==-1){
- rpc_min_proc=k->proc;
- rpc_max_proc=k->proc;
- }
- if((gint32)k->proc<rpc_min_proc){
- rpc_min_proc=k->proc;
- }
- if((gint32)k->proc>rpc_max_proc){
- rpc_max_proc=k->proc;
- }
-
- return;
-}
-
-static void
-rpcstat_find_vers(const gchar *table_name _U_, ftenum_t selector_type _U_, gpointer key, gpointer value _U_, gpointer user_data _U_)
-{
- rpc_proc_info_key *k=(rpc_proc_info_key *)key;
-
- if(k->prog!=rpc_program){
- return;
- }
- if(rpc_min_vers==-1){
- rpc_min_vers=k->vers;
- rpc_max_vers=k->vers;
- }
- if((gint32)k->vers<rpc_min_vers){
- rpc_min_vers=k->vers;
- }
- if((gint32)k->vers>rpc_max_vers){
- rpc_max_vers=k->vers;
- }
-
- return;
-}
-
-static void
-win_destroy_cb(GtkWindow *win _U_, gpointer data)
-{
- rpcstat_t *rs=(rpcstat_t *)data;
-
- remove_tap_listener(&rs->data);
-
- free_srt_table(rs->srt, rs->data.srt_array, free_table_data, &rs->gtk_data);
- g_free(rs);
-}
-
-/* When called, this function will create a new instance of gtk2-rpcstat.
- */
-static void
-gtk_rpcstat_init(const char *opt_arg, void* userdata _U_)
-{
- rpcstat_t *rs;
- char *title_string;
- char *filter_string;
- GtkWidget *stat_label;
- GtkWidget *filter_label;
- GtkWidget *bbox;
- GtkWidget *close_bt;
- int program, version, pos;
- const char *filter=NULL;
- GString *error_string;
- rpcstat_tap_data_t* tap_data;
-
- pos=0;
- if(sscanf(opt_arg,"rpc,srt,%d,%d,%n",&program,&version,&pos)==2){
- if(pos){
- filter=opt_arg+pos;
- } else {
- filter=NULL;
- }
- } else {
- fprintf(stderr, "wireshark: invalid \"-z rpc,srt,<program>,<version>[,<filter>]\" argument\n");
- exit(1);
- }
-
- rpc_program=program;
- rpc_version=version;
-
- rs=(rpcstat_t *)g_malloc0(sizeof(rpcstat_t));
- rs->prog = rpc_prog_name(program);
- rs->version = version;
-
- rs->gtk_data.win = dlg_window_new("rpc-stat"); /* transient_for top_level */
- gtk_window_set_destroy_with_parent (GTK_WINDOW(rs->gtk_data.win), TRUE);
- gtk_window_set_default_size(GTK_WINDOW(rs->gtk_data.win), SRT_PREFERRED_WIDTH, SRT_PREFERRED_HEIGHT);
- rpcstat_set_title(rs);
-
- rs->gtk_data.vbox=ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_add(GTK_CONTAINER(rs->gtk_data.win), rs->gtk_data.vbox);
- gtk_container_set_border_width(GTK_CONTAINER(rs->gtk_data.vbox), 12);
-
- title_string = rpcstat_gen_title(rs);
- stat_label=gtk_label_new(title_string);
- g_free(title_string);
- gtk_box_pack_start(GTK_BOX(rs->gtk_data.vbox), stat_label, FALSE, FALSE, 0);
-
- filter_string = g_strdup_printf("Filter: %s", filter ? filter : "");
- filter_label=gtk_label_new(filter_string);
- g_free(filter_string);
- gtk_label_set_line_wrap(GTK_LABEL(filter_label), TRUE);
- gtk_box_pack_start(GTK_BOX(rs->gtk_data.vbox), filter_label, FALSE, FALSE, 0);
-
- rpc_min_proc=-1;
- rpc_max_proc=-1;
-
- /* Need to run over both dissector tables */
- dissector_table_foreach ("rpc.call", rpcstat_find_procs, NULL);
- dissector_table_foreach ("rpc.reply", rpcstat_find_procs, NULL);
-
- /* We must display TOP LEVEL Widget before calling init_gtk_srt_table() */
- gtk_widget_show_all(rs->gtk_data.win);
-
- rs->srt = get_srt_table_by_name("rpc");
-
- /* Setup the tap data */
- tap_data = g_new0(rpcstat_tap_data_t, 1);
-
- tap_data->prog = rpc_prog_name(program);
- tap_data->program = program;
- tap_data->version = version;
- tap_data->num_procedures = rpc_max_proc+1;
-
- set_srt_table_param_data(rs->srt, tap_data);
-
- rs->gtk_data.gtk_srt_array = g_array_new(FALSE, TRUE, sizeof(gtk_srt_table_t*));
- rs->data.srt_array = g_array_new(FALSE, TRUE, sizeof(srt_stat_table*));
- rs->data.user_data = rs;
-
- srt_table_dissector_init(rs->srt, rs->data.srt_array, init_gtk_srt_table, &rs->gtk_data);
-
- error_string=register_tap_listener("rpc", &rs->data, filter, 0, rpcstat_reset, get_srt_packet_func(rs->srt), rpcstat_draw);
- if(error_string){
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
- g_string_free(error_string, TRUE);
- free_srt_table(rs->srt, rs->data.srt_array, NULL, NULL);
- g_free(rs);
- return;
- }
-
- /* Button row. */
- bbox = dlg_button_row_new(GTK_STOCK_CLOSE, NULL);
- gtk_box_pack_end(GTK_BOX(rs->gtk_data.vbox), bbox, FALSE, FALSE, 0);
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(rs->gtk_data.win, close_bt, window_cancel_button_cb);
-
- g_signal_connect(rs->gtk_data.win, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(rs->gtk_data.win, "destroy", G_CALLBACK(win_destroy_cb), rs);
-
- gtk_widget_show_all(rs->gtk_data.win);
- window_present(rs->gtk_data.win);
-
- cf_retap_packets(&cfile);
- gdk_window_raise(gtk_widget_get_window(rs->gtk_data.win));
-}
-
-
-
-
-static GtkWidget *dlg=NULL;
-static GtkWidget *filter_entry;
-
-static void
-rpcstat_start_button_clicked(GtkWidget *item _U_, gpointer data _U_)
-{
- GString *str;
- const char *filter;
-
- str = g_string_new("rpc,srt");
- g_string_append_printf(str, ",%d,%d", rpc_program, rpc_version);
- filter=gtk_entry_get_text(GTK_ENTRY(filter_entry));
- if(filter[0]!=0){
- g_string_append_printf(str, ",%s", filter);
- }
-
- gtk_rpcstat_init(str->str,NULL);
- g_string_free(str, TRUE);
-}
-
-
-static void
-rpcstat_version_select(GtkWidget *vers_combo_box, gpointer user_data _U_)
-{
- gpointer ptr;
-
- if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(vers_combo_box), &ptr)) {
- g_assert_not_reached(); /* Programming error: somehow no active item */
- }
-
- rpc_version=GPOINTER_TO_INT(ptr);
-}
-
-
-static void
-rpcstat_program_select(GtkWidget *prog_combo_box, gpointer user_data)
-{
- guint32 k;
- GtkWidget *vers_combo_box;
- int i;
-
- vers_combo_box = (GtkWidget *)user_data;
-
- if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(prog_combo_box), (gpointer *)&k)) {
- g_assert_not_reached(); /* Programming error: somehow no active item */
- }
- rpc_program=k;
-
- /* re-create version menu */
- rpc_version=0;
- g_signal_handlers_disconnect_by_func(vers_combo_box, G_CALLBACK(rpcstat_version_select), NULL );
- ws_combo_box_clear_text_and_pointer(GTK_COMBO_BOX(vers_combo_box));
- rpc_min_vers=-1;
- rpc_max_vers=-1;
- dissector_table_foreach ("rpc.call", rpcstat_find_vers, NULL);
- dissector_table_foreach ("rpc.reply", rpcstat_find_vers, NULL);
- for(i=rpc_min_vers;i<=rpc_max_vers;i++){
- char vs[5];
- g_snprintf(vs, sizeof(vs), "%d",i);
- ws_combo_box_append_text_and_pointer(GTK_COMBO_BOX(vers_combo_box),
- vs, GINT_TO_POINTER(i));
- }
- g_signal_connect(vers_combo_box, "changed", G_CALLBACK(rpcstat_version_select), NULL);
- ws_combo_box_set_active(GTK_COMBO_BOX(vers_combo_box), 0); /* default: will trigger rpcstat_version_select callback */
-}
-
-
-
-static void
-rpcstat_list_programs(gpointer *key, gpointer *value, gpointer user_data)
-{
- guint32 k=GPOINTER_TO_UINT(key);
- rpc_prog_info_value *v=(rpc_prog_info_value *)value;
- GtkComboBox *prog_combo_box = (GtkComboBox *)user_data;
-
- ws_combo_box_append_text_and_pointer(prog_combo_box, v->progname, GUINT_TO_POINTER(k));
-
- if(!rpc_program){
- rpc_program=k;
- }
-}
-
-static void
-dlg_destroy_cb(GtkWidget *w _U_, gpointer user_data _U_)
-{
- dlg=NULL;
-}
-
-void
-gtk_rpcstat_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- GtkWidget *dlg_box;
- GtkWidget *prog_box, *prog_label;
- GtkWidget *vers_label;
- GtkWidget *prog_combo_box, *vers_combo_box;
- GtkWidget *filter_box, *filter_bt;
- GtkWidget *bbox, *start_button, *cancel_button;
- const char *filter;
- static construct_args_t args = {
- "Service Response Time Statistics Filter",
- TRUE,
- FALSE,
- FALSE
- };
-
- /* if the window is already open, bring it to front */
- if(dlg){
- gdk_window_raise(gtk_widget_get_window(dlg));
- return;
- }
-
- dlg=dlg_window_new("Wireshark: Compute ONC-RPC SRT statistics");
- gtk_window_set_default_size(GTK_WINDOW(dlg), 300, -1);
-
- dlg_box=ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 10, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(dlg_box), 10);
- gtk_container_add(GTK_CONTAINER(dlg), dlg_box);
- gtk_widget_show(dlg_box);
-
- /* Program box */
- prog_box=ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10, FALSE);
-
- /* Program label */
- gtk_container_set_border_width(GTK_CONTAINER(prog_box), 10);
- prog_label=gtk_label_new("Program:");
- gtk_box_pack_start(GTK_BOX(prog_box), prog_label, FALSE, FALSE, 0);
- gtk_widget_show(prog_label);
-
- /* Program menu */
- prog_combo_box=ws_combo_box_new_text_and_pointer();
- g_hash_table_foreach(rpc_progs, (GHFunc)rpcstat_list_programs, prog_combo_box);
- gtk_box_pack_start(GTK_BOX(prog_box), prog_combo_box, TRUE, TRUE, 0);
- gtk_widget_show(prog_combo_box);
-
- /* Version label */
- gtk_container_set_border_width(GTK_CONTAINER(prog_box), 10);
- vers_label=gtk_label_new("Version:");
- gtk_box_pack_start(GTK_BOX(prog_box), vers_label, FALSE, FALSE, 0);
- gtk_widget_show(vers_label);
-
- /* Note: version combo box rows set when rpcstat_program_select callback invoked below */
- vers_combo_box=ws_combo_box_new_text_and_pointer();
- gtk_box_pack_start(GTK_BOX(prog_box), vers_combo_box, TRUE, TRUE, 0);
- gtk_widget_show(vers_combo_box);
-
- gtk_box_pack_start(GTK_BOX(dlg_box), prog_box, TRUE, TRUE, 0);
-
- g_signal_connect(prog_combo_box, "changed", G_CALLBACK(rpcstat_program_select), vers_combo_box);
- ws_combo_box_set_active(GTK_COMBO_BOX(prog_combo_box), 0); /* invokes rpcstat_program_select callback */
-
- gtk_widget_show(prog_box);
-
- /* Filter box */
- filter_box=ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
-
- /* Filter label */
- filter_bt=ws_gtk_button_new_from_stock(WIRESHARK_STOCK_DISPLAY_FILTER_ENTRY);
- g_signal_connect(filter_bt, "clicked", G_CALLBACK(display_filter_construct_cb), &args);
- gtk_box_pack_start(GTK_BOX(filter_box), filter_bt, FALSE, FALSE, 0);
- gtk_widget_show(filter_bt);
-
- /* Filter entry */
- filter_entry=gtk_entry_new();
- g_signal_connect(filter_entry, "changed", G_CALLBACK(filter_te_syntax_check_cb), NULL);
- g_object_set_data(G_OBJECT(filter_box), E_FILT_AUTOCOMP_PTR_KEY, NULL);
- g_signal_connect(filter_entry, "key-press-event", G_CALLBACK (filter_string_te_key_pressed_cb), NULL);
- g_signal_connect(dlg, "key-press-event", G_CALLBACK (filter_parent_dlg_key_pressed_cb), NULL);
-
- /* filter prefs dialog */
- g_object_set_data(G_OBJECT(filter_bt), E_FILT_TE_PTR_KEY, filter_entry);
- /* filter prefs dialog */
-
- gtk_box_pack_start(GTK_BOX(filter_box), filter_entry, TRUE, TRUE, 0);
- filter=gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget));
- if(filter){
- gtk_entry_set_text(GTK_ENTRY(filter_entry), filter);
- } else {
- colorize_filter_te_as_empty(filter_entry);
- }
- gtk_widget_show(filter_entry);
-
- gtk_box_pack_start(GTK_BOX(dlg_box), filter_box, TRUE, TRUE, 0);
- gtk_widget_show(filter_box);
-
- /* button box */
- bbox = dlg_button_row_new(WIRESHARK_STOCK_CREATE_STAT, GTK_STOCK_CANCEL, NULL);
- gtk_box_pack_start(GTK_BOX(dlg_box), bbox, FALSE, FALSE, 0);
- gtk_widget_show(bbox);
-
- start_button = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_CREATE_STAT);
- g_signal_connect_swapped(start_button, "clicked",
- G_CALLBACK(rpcstat_start_button_clicked), NULL);
-
- cancel_button = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- window_set_cancel_button(dlg, cancel_button, window_cancel_button_cb);
-
- /* Give the initial focus to the "Filter" entry box. */
- gtk_widget_grab_focus(filter_entry);
-
- gtk_widget_grab_default(start_button );
-
- g_signal_connect(dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(dlg, "destroy", G_CALLBACK(dlg_destroy_cb), NULL);
-
- gtk_widget_show_all(dlg);
- window_present(dlg);
-}
-
-
-static stat_tap_ui rpcstat_ui = {
- REGISTER_STAT_GROUP_RESPONSE_TIME,
- NULL,
- "rpc,srt",
- gtk_rpcstat_init,
- 0,
- NULL
-};
-
-void
-register_tap_listener_gtkrpcstat(void)
-{
- register_stat_tap_ui(&rpcstat_ui, NULL);
-}
-
-
-/*
- * Editor modelines - http://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/gtk/rtp_analysis.c b/ui/gtk/rtp_analysis.c
deleted file mode 100644
index 936c68ea84..0000000000
--- a/ui/gtk/rtp_analysis.c
+++ /dev/null
@@ -1,4026 +0,0 @@
-/* rtp_analysis.c
- * RTP analysis addition for Wireshark
- *
- * Copyright 2003, Alcatel Business Systems
- * By Lars Ruoff <lars.ruoff@gmx.net>
- *
- * based on tap_rtp.c
- * Copyright 2003, Iskratel, Ltd, Kranj
- * By Miha Jemec <m.jemec@iskratel.si>
- *
- * Graph. Copyright 2004, Verso Technology
- * By Alejandro Vaquero <alejandro.vaquero@verso.com>
- * Based on io_stat.c by Ronnie Sahlberg
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <math.h>
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <wsutil/file_util.h>
-#include <wsutil/tempfile.h>
-#include <wsutil/g711.h>
-#include <wsutil/pint.h>
-
-#include <epan/epan_dissect.h>
-#include <wsutil/filesystem.h>
-#include <epan/tap.h>
-#include <epan/dissectors/packet-rtp.h>
-#include <epan/rtp_pt.h>
-#include <epan/addr_resolv.h>
-#include <epan/stat_tap_ui.h>
-#include <epan/strutil.h>
-
-#include <epan/stat_groups.h>
-
-#include "ui/util.h"
-#include "ui/alert_box.h"
-#include "ui/last_open_dir.h"
-#include "ui/progress_dlg.h"
-#include "ui/simple_dialog.h"
-#include <wsutil/utf8_entities.h>
-
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/file_dlg.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/gui_stat_menu.h"
-#include "ui/gtk/pixmap_save.h"
-#include "ui/gtk/main.h"
-#include "ui/rtp_stream.h"
-#include "ui/tap-rtp-analysis.h"
-#include "ui/gtk/rtp_stream_dlg.h"
-#include "ui/gtk/stock_icons.h"
-
-#ifdef HAVE_LIBPORTAUDIO
-#include "ui/voip_calls.h"
-#include "ui/gtk/graph_analysis.h"
-#include "ui/gtk/rtp_player.h"
-#endif /* HAVE_LIBPORTAUDIO */
-
-#include "ui/gtk/old-gtk-compat.h"
-
-#include "frame_tvbuff.h"
-
-#include "globals.h"
-
-void register_tap_listener_rtp_analysis(void);
-
-enum
-{
- PACKET_COLUMN,
- SEQUENCE_COLUMN,
- TIMESTAMP_COLUMN,
- DELTA_COLUMN,
- JITTER_COLUMN,
- SKEW_COLUMN,
- IPBW_COLUMN,
- MARKER_COLUMN,
- STATUS_COLUMN,
- DATE_COLUMN,
- LENGTH_COLUMN,
- FOREGROUND_COLOR_COL,
- BACKGROUND_COLOR_COL,
- N_COLUMN /* The number of columns */
-};
-/****************************************************************************/
-
-#define NUM_COLS 9
-#define NUM_GRAPH_ITEMS 100000
-#define MAX_YSCALE 16
-#define DEFAULT_YSCALE_INDEX 0 /* AUTO_MAX_YSCALE */
-#define AUTO_MAX_YSCALE 0
-#define MAX_GRAPHS 6
-#define GRAPH_FWD_JITTER 0
-#define GRAPH_FWD_DIFF 1
-#define GRAPH_FWD_DELTA 2
-#define GRAPH_REV_JITTER 3
-#define GRAPH_REV_DIFF 4
-#define GRAPH_REV_DELTA 5
-
-static guint32 yscale_max[MAX_YSCALE] = {
- AUTO_MAX_YSCALE, 1000, 2000, 5000, 10000, 20000, 50000, 100000, 200000, 500000,
- 1000000, 2000000, 5000000, 10000000, 20000000, 50000000
-};
-
-#define MAX_PIXELS_PER_TICK 4
-#define DEFAULT_PIXELS_PER_TICK_INDEX 2
-static guint32 pixels_per_tick[MAX_PIXELS_PER_TICK] = {1, 2, 5, 10};
-
-static const char *graph_descr[MAX_GRAPHS] = {
- "Fwd Jitter", "Fwd Difference", "Fwd Delta", "Rvr Jitter", "Rvr Difference", "Rvr Delta"
-};
-
-/* unit is in ms */
-#define MAX_TICK_VALUES 5
-#define DEFAULT_TICK_VALUE_INDEX 1
-static guint tick_interval_values[MAX_TICK_VALUES] = { 1, 10, 100, 1000, 10000 };
-
-typedef struct _dialog_graph_graph_item_t {
- guint32 value;
- guint32 flags;
-} dialog_graph_graph_item_t;
-
-typedef struct _dialog_graph_graph_t {
- struct _user_data_t *ud;
- dialog_graph_graph_item_t items[NUM_GRAPH_ITEMS];
- int plot_style;
- gboolean display;
- GtkWidget *display_button;
- int hf_index;
- GdkRGBA rgba_color;
- GdkColor color;
- gchar title[100];
-} dialog_graph_graph_t;
-
-
-typedef struct _dialog_graph_t {
- gboolean needs_redraw;
- gint32 interval; /* measurement interval in ms */
- guint32 last_interval;
- guint32 max_interval; /* XXX max_interval and num_items are redundant */
- guint32 num_items;
- double start_time;
-
- struct _dialog_graph_graph_t graph[MAX_GRAPHS];
- GtkWidget *window;
- GtkWidget *draw_area;
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_surface_t *surface;
-#else
- GdkPixmap *pixmap;
-#endif
- GtkAdjustment *scrollbar_adjustment;
- GtkWidget *scrollbar;
- int surface_width;
- int surface_height;
- int pixels_per_tick;
- int max_y_units;
-} dialog_graph_t;
-
-typedef struct _dialog_data_t {
- GtkWidget *window;
- GtkWidget *list_fwd;
- GtkTreeIter iter;
- GtkWidget *list_rev;
- GtkWidget *label_stats_fwd;
- GtkWidget *label_stats_rev;
- GtkWidget *selected_list;
- guint number_of_nok;
- GtkTreeSelection *selected_list_sel;
- gint selected_list_row;
- GtkWidget *notebook;
- GtkWidget *save_voice_as_w;
- GtkWidget *save_csv_as_w;
- gulong notebook_signal_id;
- dialog_graph_t dialog_graph;
-} dialog_data_t;
-
-#define OK_TEXT "[ Ok ]"
-
-/* type of error when saving voice in a file didn't succeed */
-typedef enum {
- TAP_RTP_WRONG_CODEC,
- TAP_RTP_WRONG_LENGTH,
- TAP_RTP_PADDING_ERROR,
- TAP_RTP_SHORT_FRAME,
- TAP_RTP_FILE_OPEN_ERROR,
- TAP_RTP_FILE_WRITE_ERROR,
- TAP_RTP_NO_DATA
-} error_type_t;
-
-typedef struct _tap_rtp_save_info_t {
- FILE *fp;
- guint32 count;
- error_type_t error_type;
- gboolean saved;
-} tap_rtp_save_info_t;
-
-
-/* structure that holds the information about the forward and reversed direction */
-struct _info_direction {
- tap_rtp_stat_t statinfo;
- tap_rtp_save_info_t saveinfo;
-};
-
-#define SILENCE_PCMU (guint8)0xFF
-#define SILENCE_PCMA (guint8)0x55
-
-/* structure that holds general information about the connection
-* and structures for both directions */
-typedef struct _user_data_t {
- /* tap associated data*/
- address src_fwd;
- guint32 port_src_fwd;
- address dst_fwd;
- guint32 port_dst_fwd;
- guint32 ssrc_fwd;
- address src_rev;
- guint32 port_src_rev;
- address dst_rev;
- guint32 port_dst_rev;
- guint32 ssrc_rev;
-
- struct _info_direction forward;
- struct _info_direction reversed;
-
- char *f_tempname;
- char *r_tempname;
-
- /* dialog associated data */
- dialog_data_t dlg;
-
-} user_data_t;
-
-
-/* Column titles. */
-static const gchar *titles[11] = {
- "Packet",
- "Sequence",
- "Time stamp",
- "Delta (ms)",
- "Jitter (ms)",
- "Skew(ms)",
- "IP BW (kbps)",
- "Marker",
- "Status",
- "Date",
- "Length"
-};
-
-#define SAVE_FORWARD_DIRECTION_MASK 0x01
-#define SAVE_REVERSE_DIRECTION_MASK 0x02
-#define SAVE_BOTH_DIRECTION_MASK (SAVE_FORWARD_DIRECTION_MASK|SAVE_REVERSE_DIRECTION_MASK)
-
-#define SAVE_NONE_FORMAT 0
-#define SAVE_WAV_FORMAT 1
-#define SAVE_AU_FORMAT 2
-#define SAVE_SW_FORMAT 3
-#define SAVE_RAW_FORMAT 4
-
-
-static void on_refresh_bt_clicked(GtkWidget *bt _U_, user_data_t *user_data);
-
-/****************************************************************************/
-static void
-enable_graph(dialog_graph_graph_t *dgg)
-{
-
- dgg->display = TRUE;
-
-}
-
-static void dialog_graph_reset(user_data_t* user_data);
-
-
-
-/****************************************************************************/
-/* TAP FUNCTIONS */
-
-/****************************************************************************/
-/* when there is a [re]reading of packet's */
-static void
-rtp_reset(void *user_data_arg)
-{
- user_data_t *user_data = (user_data_t *)user_data_arg;
-
- user_data->forward.statinfo.first_packet = TRUE;
- user_data->reversed.statinfo.first_packet = TRUE;
- user_data->forward.statinfo.max_delta = 0;
- user_data->reversed.statinfo.max_delta = 0;
- user_data->forward.statinfo.max_jitter = 0;
- user_data->reversed.statinfo.max_jitter = 0;
- user_data->forward.statinfo.max_skew = 0;
- user_data->reversed.statinfo.max_skew = 0;
- user_data->forward.statinfo.mean_jitter = 0;
- user_data->reversed.statinfo.mean_jitter = 0;
- user_data->forward.statinfo.delta = 0;
- user_data->reversed.statinfo.delta = 0;
- user_data->forward.statinfo.diff = 0;
- user_data->reversed.statinfo.diff = 0;
- user_data->forward.statinfo.jitter = 0;
- user_data->reversed.statinfo.jitter = 0;
- user_data->forward.statinfo.skew = 0;
- user_data->reversed.statinfo.skew = 0;
- user_data->forward.statinfo.sumt = 0;
- user_data->reversed.statinfo.sumt = 0;
- user_data->forward.statinfo.sumTS = 0;
- user_data->reversed.statinfo.sumTS = 0;
- user_data->forward.statinfo.sumt2 = 0;
- user_data->reversed.statinfo.sumt2 = 0;
- user_data->forward.statinfo.sumtTS = 0;
- user_data->reversed.statinfo.sumtTS = 0;
- user_data->forward.statinfo.bandwidth = 0;
- user_data->reversed.statinfo.bandwidth = 0;
- user_data->forward.statinfo.total_bytes = 0;
- user_data->reversed.statinfo.total_bytes = 0;
- user_data->forward.statinfo.bw_start_index = 0;
- user_data->reversed.statinfo.bw_start_index = 0;
- user_data->forward.statinfo.bw_index = 0;
- user_data->reversed.statinfo.bw_index = 0;
- user_data->forward.statinfo.timestamp = 0;
- user_data->reversed.statinfo.timestamp = 0;
- user_data->forward.statinfo.max_nr = 0;
- user_data->reversed.statinfo.max_nr = 0;
- user_data->forward.statinfo.total_nr = 0;
- user_data->reversed.statinfo.total_nr = 0;
- user_data->forward.statinfo.sequence = 0;
- user_data->reversed.statinfo.sequence = 0;
- user_data->forward.statinfo.start_seq_nr = 0;
- user_data->reversed.statinfo.start_seq_nr = 1; /* 1 is ok (for statistics in reversed direction) */
- user_data->forward.statinfo.stop_seq_nr = 0;
- user_data->reversed.statinfo.stop_seq_nr = 0;
- user_data->forward.statinfo.cycles = 0;
- user_data->reversed.statinfo.cycles = 0;
- user_data->forward.statinfo.under = FALSE;
- user_data->reversed.statinfo.under = FALSE;
- user_data->forward.statinfo.start_time = 0;
- user_data->reversed.statinfo.start_time = 0;
- user_data->forward.statinfo.time = 0;
- user_data->reversed.statinfo.time = 0;
- user_data->forward.statinfo.reg_pt = PT_UNDEFINED;
- user_data->reversed.statinfo.reg_pt = PT_UNDEFINED;
-
- user_data->forward.saveinfo.count = 0;
- user_data->reversed.saveinfo.count = 0;
- user_data->forward.saveinfo.saved = FALSE;
- user_data->reversed.saveinfo.saved = FALSE;
-
- /* clear the dialog box lists */
- gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(user_data->dlg.list_fwd))));
- gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(user_data->dlg.list_rev))));
-
- /* reset graph info */
- dialog_graph_reset(user_data);
-
-#ifdef HAVE_LIBPORTAUDIO
- /* reset the RTP player */
- reset_rtp_player();
-#endif
- /* XXX check for error at fclose? */
- if (user_data->forward.saveinfo.fp != NULL)
- fclose(user_data->forward.saveinfo.fp);
- if (user_data->reversed.saveinfo.fp != NULL)
- fclose(user_data->reversed.saveinfo.fp);
- user_data->forward.saveinfo.fp = ws_fopen(user_data->f_tempname, "wb");
- if (user_data->forward.saveinfo.fp == NULL)
- user_data->forward.saveinfo.error_type = TAP_RTP_FILE_OPEN_ERROR;
- user_data->reversed.saveinfo.fp = ws_fopen(user_data->r_tempname, "wb");
- if (user_data->reversed.saveinfo.fp == NULL)
- user_data->reversed.saveinfo.error_type = TAP_RTP_FILE_OPEN_ERROR;
- return;
-}
-
-/****************************************************************************/
-static gboolean
-rtp_packet_add_graph(dialog_graph_graph_t *dgg, tap_rtp_stat_t *statinfo, packet_info *pinfo, guint32 value)
-{
- dialog_graph_graph_item_t *it;
- guint32 idx;
- double rtp_time;
-
- /*
- * We sometimes get called when dgg is disabled.
- * This is a bug since the tap listener should be removed first
- */
- if (!dgg->display) {
- return FALSE;
- }
-
- dgg->ud->dlg.dialog_graph.needs_redraw = TRUE;
-
- /*
- * Find which interval this is supposed to go in and store the
- * interval index as idx
- */
- if (dgg->ud->dlg.dialog_graph.start_time == -1) { /* it is the first */
- dgg->ud->dlg.dialog_graph.start_time = statinfo->start_time;
- }
- rtp_time = nstime_to_msec(&pinfo->rel_ts) - dgg->ud->dlg.dialog_graph.start_time;
- if (rtp_time < 0) {
- return FALSE;
- }
- idx = (guint32)(rtp_time)/dgg->ud->dlg.dialog_graph.interval;
-
- /* some sanity checks */
- if (idx >= NUM_GRAPH_ITEMS) {
- return FALSE;
- }
-
- /* update num_items */
- if (idx > dgg->ud->dlg.dialog_graph.num_items) {
- dgg->ud->dlg.dialog_graph.num_items = idx;
- dgg->ud->dlg.dialog_graph.max_interval = idx*dgg->ud->dlg.dialog_graph.interval;
- }
-
- /*
- * Find the appropriate dialog_graph_graph_item_t structure
- */
- it = &dgg->items[idx];
-
- /*
- * Use the max value to highlight RTP problems
- */
- if (value > it->value) {
- it->value = value;
- }
- it->flags = it->flags | statinfo->flags;
-
- return TRUE;
-}
-
-/****************************************************************************/
-/* here we can redraw the output */
-/* not used yet */
-static void
-rtp_draw(void *prs _U_)
-{
- return;
-}
-
-/* forward declarations */
-static void add_to_list(GtkWidget *list, user_data_t * user_data, guint32 number, guint16 seq_num, guint32 timestamp,
- double delta, double jitter, double skew , double bandwidth, gchar *status, gboolean marker,
- gchar *timeStr, guint32 pkt_len, gchar *color_str, guint32 flags);
-
-static int rtp_packet_add_info(GtkWidget *list, user_data_t * user_data,
- tap_rtp_stat_t *statinfo, packet_info *pinfo,
- const struct _rtp_info *rtpinfo);
-
-static int rtp_packet_save_payload(tap_rtp_save_info_t *saveinfo,
- tap_rtp_stat_t *statinfo,
- packet_info *pinfo,
- const struct _rtp_info *rtpinfo);
-
-
-/****************************************************************************/
-/* whenever a RTP packet is seen by the tap listener */
-static gboolean
-rtp_packet(void *user_data_arg, packet_info *pinfo, epan_dissect_t *edt _U_, const void *rtpinfo_arg)
-{
- user_data_t *user_data = (user_data_t *)user_data_arg;
- const struct _rtp_info *rtpinfo = (const struct _rtp_info *)rtpinfo_arg;
- gboolean rtp_selected = FALSE;
-
- /* we ignore packets that are not displayed */
- if (pinfo->fd->flags.passed_dfilter == 0)
- return FALSE;
- /* also ignore RTP Version != 2 */
- else if (rtpinfo->info_version != 2)
- return FALSE;
- /* is it the forward direction? */
- else if (user_data->ssrc_fwd == rtpinfo->info_sync_src
- && (cmp_address(&(user_data->src_fwd), &(pinfo->src)) == 0)
- && (user_data->port_src_fwd == pinfo->srcport)
- && (cmp_address(&(user_data->dst_fwd), &(pinfo->dst)) == 0)
- && (user_data->port_dst_fwd == pinfo->destport)) {
- rtp_packet_analyse(&(user_data->forward.statinfo), pinfo, rtpinfo);
- rtp_packet_add_graph(&(user_data->dlg.dialog_graph.graph[GRAPH_FWD_JITTER]),
- &(user_data->forward.statinfo), pinfo,
- (guint32)(user_data->forward.statinfo.jitter*1000));
- rtp_packet_add_graph(&(user_data->dlg.dialog_graph.graph[GRAPH_FWD_DIFF]),
- &(user_data->forward.statinfo), pinfo,
- (guint32)(user_data->forward.statinfo.diff*1000));
- rtp_packet_add_graph(&(user_data->dlg.dialog_graph.graph[GRAPH_FWD_DELTA]),
- &(user_data->forward.statinfo), pinfo,
- (guint32)(user_data->forward.statinfo.delta*1000));
- rtp_packet_add_info(user_data->dlg.list_fwd, user_data,
- &(user_data->forward.statinfo), pinfo, rtpinfo);
- rtp_packet_save_payload(&(user_data->forward.saveinfo),
- &(user_data->forward.statinfo), pinfo, rtpinfo);
- rtp_selected = TRUE;
- }
- /* is it the reversed direction? */
- else if (user_data->ssrc_rev == rtpinfo->info_sync_src
- && (cmp_address(&(user_data->src_rev), &(pinfo->src)) == 0)
- && (user_data->port_src_rev == pinfo->srcport)
- && (cmp_address(&(user_data->dst_rev), &(pinfo->dst)) == 0)
- && (user_data->port_dst_rev == pinfo->destport)) {
- rtp_packet_analyse(&(user_data->reversed.statinfo), pinfo, rtpinfo);
- rtp_packet_add_graph(&(user_data->dlg.dialog_graph.graph[GRAPH_REV_JITTER]),
- &(user_data->reversed.statinfo), pinfo,
- (guint32)(user_data->reversed.statinfo.jitter*1000));
- rtp_packet_add_graph(&(user_data->dlg.dialog_graph.graph[GRAPH_REV_DIFF]),
- &(user_data->reversed.statinfo), pinfo,
- (guint32)(user_data->reversed.statinfo.diff*1000));
- rtp_packet_add_graph(&(user_data->dlg.dialog_graph.graph[GRAPH_REV_DELTA]),
- &(user_data->reversed.statinfo), pinfo,
- (guint32)(user_data->reversed.statinfo.delta*1000));
- rtp_packet_add_info(user_data->dlg.list_rev, user_data,
- &(user_data->reversed.statinfo), pinfo, rtpinfo);
- rtp_packet_save_payload(&(user_data->reversed.saveinfo),
- &(user_data->reversed.statinfo), pinfo, rtpinfo);
- rtp_selected = TRUE;
- }
- /* add this RTP for future listening using the RTP Player*/
- if (rtp_selected) {
-#ifdef HAVE_LIBPORTAUDIO
- add_rtp_packet(rtpinfo, pinfo);
-#endif
- }
-
- return FALSE;
-}
-
-/*
-Replaced by using the strings instead.
-static const GdkColor COLOR_DEFAULT = {0, 0xffff, 0xffff, 0xffff};
-static const GdkColor COLOR_ERROR = {0, 0xffff, 0xbfff, 0xbfff};
-static const GdkColor COLOR_WARNING = {0, 0xffff, 0xdfff, 0xbfff};
-static const GdkColor COLOR_CN = {0, 0xbfff, 0xbfff, 0xffff};
-GdkColor yellow = {0, 0xffff, 0xffff, 0x0000};
-COLOR_T_EVENT g_snprintf(color_str, sizeof(color_str), "#ef8c bfff ffff");
-static const GdkColor COLOR_FOREGROUND = {0, 0x0000, 0x0000, 0x0000};
-*/
-/****************************************************************************/
-/* adds statistics information from the packet to the list */
-static int
-rtp_packet_add_info(GtkWidget *list, user_data_t * user_data,
- tap_rtp_stat_t *statinfo, packet_info *pinfo,
- const struct _rtp_info *rtpinfo)
-{
- guint16 msecs;
- gchar timeStr[32];
- struct tm *tm_tmp;
- time_t then;
- gchar status[80];
- gchar color_str[14];
-
- then = pinfo->abs_ts.secs;
- msecs = (guint16)(pinfo->abs_ts.nsecs/1000000);
- tm_tmp = localtime(&then);
- if (tm_tmp != NULL) {
- /*
- * XXX - somewhat US-centric.
- */
- g_snprintf(timeStr, sizeof(timeStr), "%02d/%02d/%04d %02d:%02d:%02d.%03d",
- tm_tmp->tm_mon + 1,
- tm_tmp->tm_mday,
- tm_tmp->tm_year + 1900,
- tm_tmp->tm_hour,
- tm_tmp->tm_min,
- tm_tmp->tm_sec,
- msecs);
- } else
- g_snprintf(timeStr, sizeof(timeStr), "XX/XX/XXXX XX:XX:XX.XXX");
-
- /* Default to using black on white text if nothing below overrides it */
- g_snprintf(color_str, sizeof(color_str), "#ffffffffffff");
-
- if (statinfo->pt == PT_CN) {
- g_snprintf(status, sizeof(status), "Comfort noise (PT=13, RFC 3389)");
- /* color = COLOR_CN; */
- g_snprintf(color_str, sizeof(color_str), "#bfffbfffffff");
- }
- else if (statinfo->pt == PT_CN_OLD) {
- g_snprintf(status, sizeof(status), "Comfort noise (PT=19, reserved)");
- /* color = COLOR_CN; */
- g_snprintf(color_str, sizeof(color_str), "#bfffbfffffff");
- }
- else if (statinfo->flags & STAT_FLAG_WRONG_SEQ) {
- g_snprintf(status, sizeof(status), "Wrong sequence nr.");
- /* color = COLOR_ERROR; */
- g_snprintf(color_str, sizeof(color_str), "#ffffbfffbfff");
- }
- else if (statinfo->flags & STAT_FLAG_DUP_PKT) {
- g_snprintf(status, sizeof(status), "Suspected duplicate (MAC address) only delta time calculated");
- /* color = Yellow; */
- g_snprintf(color_str, sizeof(color_str), "#ffffffff0000");
- }
- else if (statinfo->flags & STAT_FLAG_REG_PT_CHANGE) {
- if (statinfo->flags & STAT_FLAG_PT_T_EVENT) {
- g_snprintf(status, sizeof(status), "Payload changed to PT=%u telephone/event", statinfo->pt);
- }else{
- g_snprintf(status, sizeof(status), "Payload changed to PT=%u", statinfo->pt);
- }
- /* color = COLOR_WARNING; */
- g_snprintf(color_str, sizeof(color_str), "#ffffdfffbfff");
- }
- else if (statinfo->flags & STAT_FLAG_WRONG_TIMESTAMP) {
- g_snprintf(status, sizeof(status), "Incorrect timestamp");
- /* color = COLOR_WARNING; */
- g_snprintf(color_str, sizeof(color_str), "#ffffdfffbfff");
- }
- else if ((statinfo->flags & STAT_FLAG_PT_CHANGE)
- && !(statinfo->flags & STAT_FLAG_FIRST)
- && !(statinfo->flags & STAT_FLAG_PT_CN)
- && (statinfo->flags & STAT_FLAG_FOLLOW_PT_CN)
- && !(statinfo->flags & STAT_FLAG_MARKER)) {
- g_snprintf(status, sizeof(status), "Marker missing?");
- /* color = COLOR_WARNING; */
- g_snprintf(color_str, sizeof(color_str), "#ffffdfffbfff");
- }else if (statinfo->flags & STAT_FLAG_PT_T_EVENT) {
- g_snprintf(status, sizeof(status), "PT=%u telephone/event", statinfo->pt);
- /* XXX add color? */
- /* color = COLOR_T_EVENT; */
- g_snprintf(color_str, sizeof(color_str), "#ef8cbfffffff");
- }else {
- if (statinfo->flags & STAT_FLAG_MARKER) {
- /* color = COLOR_WARNING; */
- g_snprintf(color_str, sizeof(color_str), "#ffffdfffbfff");
- }
- g_snprintf(status, sizeof(status), OK_TEXT);
- }
- /* is this the first packet we got in this direction? */
- if (statinfo->flags & STAT_FLAG_FIRST) {
- add_to_list(list, user_data,
- pinfo->num, rtpinfo->info_seq_num,
- statinfo->timestamp,
- 0,
- 0,
- 0,
- statinfo->bandwidth,
- status,
- rtpinfo->info_marker_set,
- timeStr, pinfo->fd->pkt_len,
- color_str,
- statinfo->flags);
- }
- else {
- add_to_list(list, user_data,
- pinfo->num, rtpinfo->info_seq_num,
- statinfo->timestamp,
- statinfo->delta,
- statinfo->jitter,
- statinfo->skew,
- statinfo->bandwidth,
- status,
- rtpinfo->info_marker_set,
- timeStr, pinfo->fd->pkt_len,
- color_str,
- statinfo->flags);
- }
- return 0;
-}
-
-#define MAX_SILENCE_TICKS 1000000
-/****************************************************************************/
-static int
-rtp_packet_save_payload(tap_rtp_save_info_t *saveinfo,
- tap_rtp_stat_t *statinfo,
- packet_info *pinfo,
- const struct _rtp_info *rtpinfo)
-{
- guint i;
- const guint8 *data;
- guint8 tmp;
- size_t nchars;
-
- /* is this the first packet we got in this direction? */
- if (statinfo->flags & STAT_FLAG_FIRST) {
- if (saveinfo->fp == NULL) {
- saveinfo->saved = FALSE;
- saveinfo->error_type = TAP_RTP_FILE_OPEN_ERROR;
- }
- else
- saveinfo->saved = TRUE;
- }
-
- /* save the voice information */
- /* if there was already an error, we quit */
- if (saveinfo->saved == FALSE)
- return 0;
-
- /* if the captured length and packet length aren't equal, we quit
- * if also the RTP dissector thinks there is some information missing */
- if ((pinfo->fd->pkt_len != pinfo->fd->cap_len)
- && (!rtpinfo->info_all_data_present)) {
- saveinfo->saved = FALSE;
- saveinfo->error_type = TAP_RTP_WRONG_LENGTH;
- return 0;
- }
-
- /* if padding bit is set, but the padding count is bigger
- * then the whole RTP data - error with padding count */
- if ( (rtpinfo->info_padding_set != FALSE)
- && (rtpinfo->info_padding_count > rtpinfo->info_payload_len) ) {
- saveinfo->saved = FALSE;
- saveinfo->error_type = TAP_RTP_PADDING_ERROR;
- return 0;
- }
-
- /* do we need to insert some silence? */
- if ((rtpinfo->info_marker_set)
- && ! (statinfo->flags & STAT_FLAG_FIRST)
- && ! (statinfo->flags & STAT_FLAG_WRONG_TIMESTAMP)
- && (statinfo->delta_timestamp > (rtpinfo->info_payload_len - rtpinfo->info_padding_count)) ) {
- /* the amount of silence should be the difference between
- * the last timestamp and the current one minus x
- * x should equal the amount of information in the last frame
- * XXX not done yet */
- for (i = 0;
- (i < (statinfo->delta_timestamp - rtpinfo->info_payload_len - rtpinfo->info_padding_count))
- && (i < MAX_SILENCE_TICKS);
- i++) {
- switch (statinfo->reg_pt) {
- case PT_PCMU:
- tmp = SILENCE_PCMU;
- break;
- case PT_PCMA:
- tmp = SILENCE_PCMA;
- break;
- default:
- tmp = 0;
- break;
- }
- nchars = fwrite(&tmp, 1, 1, saveinfo->fp);
- if (nchars != 1) {
- /* Write error or short write */
- saveinfo->saved = FALSE;
- saveinfo->error_type = TAP_RTP_FILE_WRITE_ERROR;
- return 0;
- }
- saveinfo->count++;
- }
- fflush(saveinfo->fp);
- }
-
-
- if ((rtpinfo->info_payload_type == PT_CN)
- || (rtpinfo->info_payload_type == PT_CN_OLD)) {
- }
- /* all other payloads */
- else {
- if (!rtpinfo->info_all_data_present) {
- /* Not all the data was captured. */
- saveinfo->saved = FALSE;
- saveinfo->error_type = TAP_RTP_SHORT_FRAME;
- return 0;
- }
-
- /* we put the pointer at the beginning of the RTP
- * payload, that is, at the beginning of the RTP data
- * plus the offset of the payload from the beginning
- * of the RTP data */
- data = rtpinfo->info_data + rtpinfo->info_payload_offset;
- nchars = fwrite(data, sizeof(unsigned char),
- (rtpinfo->info_payload_len - rtpinfo->info_padding_count),
- saveinfo->fp);
- if (nchars != (rtpinfo->info_payload_len - rtpinfo->info_padding_count)) {
- /* Write error or short write */
- saveinfo->saved = FALSE;
- saveinfo->error_type = TAP_RTP_FILE_WRITE_ERROR;
- return 0;
- }
- saveinfo->count += rtpinfo->info_payload_len - rtpinfo->info_padding_count;
-
- fflush(saveinfo->fp);
- saveinfo->saved = TRUE;
- return 0;
- }
-
- return 0;
-}
-
-
-/****************************************************************************/
-/* CALLBACKS */
-
-/****************************************************************************/
-
-/****************************************************************************/
-/* close the dialog window and remove the tap listener */
-static void
-on_destroy(GtkWidget *win _U_, user_data_t *user_data)
-{
- /* remove tap listener */
- remove_tap_listener(user_data);
-
- /* close and remove temporary files */
- if (user_data->forward.saveinfo.fp != NULL)
- fclose(user_data->forward.saveinfo.fp);
- if (user_data->reversed.saveinfo.fp != NULL)
- fclose(user_data->reversed.saveinfo.fp);
- /*XXX: test for error **/
- ws_remove(user_data->f_tempname);
- ws_remove(user_data->r_tempname);
-
-#if 0 /* XXX: GtkFileChooserDialog/gtk_dialog_run currently being used is effectively modal so this is not req'd */
- /* destroy save_voice_as window if open */
- if (user_data->dlg.save_voice_as_w != NULL)
- window_destroy(user_data->dlg.save_voice_as_w);
-#endif
- /* destroy graph window if open */
- if (user_data->dlg.dialog_graph.window != NULL)
- window_destroy(user_data->dlg.dialog_graph.window);
-
- /* disable the "switch_page" signal in the dlg, otherwise will be called when the windows
- * is destroyed and cause an exception using GTK1*/
- g_signal_handler_disconnect(user_data->dlg.notebook, user_data->dlg.notebook_signal_id);
-
- g_free(user_data->f_tempname);
- g_free(user_data->r_tempname);
- g_free(user_data);
-}
-
-
-/****************************************************************************/
-static void
-on_notebook_switch_page(GtkNotebook *notebook _U_,
- gpointer *page _U_,
- gint page_num,
- user_data_t *user_data)
-{
- user_data->dlg.selected_list =
- (page_num == 0) ? user_data->dlg.list_fwd : user_data->dlg.list_rev ;
-
- user_data->dlg.selected_list_row = 0;
-}
-
-/****************************************************************************/
-
-static void
-on_list_select_row(GtkTreeSelection *selection,
- user_data_t *user_data /*gpointer data */)
-{
- user_data->dlg.selected_list_sel = selection;
-}
-
-
-/****************************************************************************/
-static void
-dialog_graph_set_title(user_data_t* user_data)
-{
- char *title;
- char *src_fwd_addr, *dst_fwd_addr, *src_rev_addr, *dst_rev_addr;
-
- if (!user_data->dlg.dialog_graph.window) {
- return;
- }
-
- src_fwd_addr = address_to_display(NULL, &(user_data->src_fwd));
- dst_fwd_addr = address_to_display(NULL, &(user_data->dst_fwd));
- src_rev_addr = address_to_display(NULL, &(user_data->src_rev));
- dst_rev_addr = address_to_display(NULL, &(user_data->dst_rev));
- title = g_strdup_printf("RTP Graph Analysis Forward: %s:%u to %s:%u Reverse: %s:%u to %s:%u",
- src_fwd_addr,
- user_data->port_src_fwd,
- dst_fwd_addr,
- user_data->port_dst_fwd,
- src_rev_addr,
- user_data->port_src_rev,
- dst_rev_addr,
- user_data->port_dst_rev);
-
- gtk_window_set_title(GTK_WINDOW(user_data->dlg.dialog_graph.window), title);
- g_free(title);
- wmem_free(NULL, src_fwd_addr);
- wmem_free(NULL, dst_fwd_addr);
- wmem_free(NULL, src_rev_addr);
- wmem_free(NULL, dst_rev_addr);
-}
-
-
-/****************************************************************************/
-static void
-dialog_graph_reset(user_data_t* user_data)
-{
- int i, j;
- char *src_addr, *dst_addr;
-
- user_data->dlg.dialog_graph.needs_redraw = TRUE;
- for (i = 0; i < MAX_GRAPHS; i++) {
- for (j = 0; j < NUM_GRAPH_ITEMS; j++) {
- dialog_graph_graph_item_t *dggi;
- dggi=&user_data->dlg.dialog_graph.graph[i].items[j];
- dggi->value = 0;
- dggi->flags = 0;
- }
- }
- user_data->dlg.dialog_graph.last_interval = 0xffffffff;
- user_data->dlg.dialog_graph.max_interval = 0;
- user_data->dlg.dialog_graph.num_items = 0;
-
- /* create the color titles near the filter buttons */
- for (i = 0; i < MAX_GRAPHS; i++) {
- /* it is forward */
- if (i < (MAX_GRAPHS/2)) {
- src_addr = address_to_display(NULL, &(user_data->src_fwd));
- dst_addr = address_to_display(NULL, &(user_data->dst_fwd));
- g_snprintf(user_data->dlg.dialog_graph.graph[i].title,
- sizeof(user_data->dlg.dialog_graph.graph[0].title),
- "%s: %s:%u to %s:%u (SSRC=0x%X)",
- graph_descr[i],
- src_addr,
- user_data->port_src_fwd,
- dst_addr,
- user_data->port_dst_fwd,
- user_data->ssrc_fwd);
- /* it is reverse */
- } else {
- src_addr = address_to_display(NULL, &(user_data->src_rev));
- dst_addr = address_to_display(NULL, &(user_data->dst_rev));
- g_snprintf(user_data->dlg.dialog_graph.graph[i].title,
- sizeof(user_data->dlg.dialog_graph.graph[0].title),
- "%s: %s:%u to %s:%u (SSRC=0x%X)",
- graph_descr[i],
- src_addr,
- user_data->port_src_rev,
- dst_addr,
- user_data->port_dst_rev,
- user_data->ssrc_rev);
- }
- wmem_free(NULL, src_addr);
- wmem_free(NULL, dst_addr);
- }
-
- dialog_graph_set_title(user_data);
-}
-
-/****************************************************************************/
-static guint32
-get_it_value(dialog_graph_graph_t *dgg, int idx)
-{
- dialog_graph_graph_item_t *it;
-
- it = &dgg->items[idx];
-
- return it->value;
-}
-
-/****************************************************************************/
-static void
-print_time_scale_string(char *buf, int buf_len, guint32 t)
-{
- if (t >= 10000000) {
- g_snprintf(buf, buf_len, "%ds", t/1000000);
- } else if (t >= 1000000) {
- g_snprintf(buf, buf_len, "%d.%03ds", t/1000000, (t%1000000)/1000);
- } else if (t >= 10000) {
- g_snprintf(buf, buf_len, "%dms", t/1000);
- } else if (t >= 1000) {
- g_snprintf(buf, buf_len, "%d.%03dms", t/1000, t%1000);
- } else {
- g_snprintf(buf, buf_len, "%dus", t);
- }
-}
-
-/****************************************************************************/
-static void
-dialog_graph_draw(user_data_t* user_data)
-{
- int i, lwidth;
- guint32 last_interval, first_interval, interval_delta, delta_multiplier;
- gint32 current_interval;
- guint32 left_x_border;
- guint32 right_x_border;
- guint32 top_y_border;
- guint32 bottom_y_border;
- PangoLayout *layout;
- int label_width, label_height;
- int label_width_mid, label_height_mid;
- guint32 draw_width, draw_height;
- char label_string[15];
- GtkAllocation widget_alloc;
- cairo_t *cr;
-
- /* new variables */
- guint32 num_time_intervals;
- guint32 max_value; /* max value of seen data */
- guint32 max_y; /* max value of the Y scale */
-
- if (!user_data->dlg.dialog_graph.needs_redraw) {
- return;
- }
- user_data->dlg.dialog_graph.needs_redraw = FALSE;
-
- /*
- * Find the length of the intervals we have data for
- * so we know how large arrays we need to malloc()
- */
- num_time_intervals = user_data->dlg.dialog_graph.num_items;
- /* if there isn't anything to do, just return */
- if (num_time_intervals == 0) {
- return;
- }
- num_time_intervals+=1;
- /* XXX move this check to _packet() */
- if (num_time_intervals>NUM_GRAPH_ITEMS) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "RTP Graph error. There are too many entries, bailing out");
- return;
- }
-
- /*
- * find the max value so we can autoscale the y axis
- */
- max_value = 0;
- for (i = 0; i < MAX_GRAPHS; i++) {
- int idx;
-
- if (!user_data->dlg.dialog_graph.graph[i].display) {
- continue;
- }
- for (idx = 0; (guint32)(idx) < num_time_intervals; idx++) {
- guint32 val;
-
- val = get_it_value(&user_data->dlg.dialog_graph.graph[i], idx);
-
- /* keep track of the max value we have encountered */
- if (val>max_value) {
- max_value = val;
- }
- }
- }
-
- /*
- * Clear out old plot
- */
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_set_source_rgb (cr, 1, 1, 1);
- gtk_widget_get_allocation(user_data->dlg.dialog_graph.draw_area, &widget_alloc);
- cairo_rectangle (cr,
- 0,
- 0,
- widget_alloc.width,
- widget_alloc.height);
- cairo_fill (cr);
- cairo_destroy (cr);
-
- /*
- * Calculate the y scale we should use
- */
- if (user_data->dlg.dialog_graph.max_y_units == AUTO_MAX_YSCALE) {
- max_y = yscale_max[MAX_YSCALE-1];
- for (i = MAX_YSCALE-1; i > 0; i--) {
- if (max_value<yscale_max[i]) {
- max_y = yscale_max[i];
- }
- }
- } else {
- /* the user had specified an explicit y scale to use */
- max_y = user_data->dlg.dialog_graph.max_y_units;
- }
-
- /*
- * Calculate size of borders surrounding the plot
- * The border on the right side needs to be adjusted depending
- * on the width of the text labels.
- */
- print_time_scale_string(label_string, sizeof(label_string), max_y);
- layout = gtk_widget_create_pango_layout(user_data->dlg.dialog_graph.draw_area, label_string);
- pango_layout_get_pixel_size(layout, &label_width, &label_height);
- print_time_scale_string(label_string, sizeof(label_string), max_y*5/10);
- layout = gtk_widget_create_pango_layout(user_data->dlg.dialog_graph.draw_area, label_string);
- pango_layout_get_pixel_size(layout, &label_width_mid, &label_height_mid);
- if (label_width_mid > label_width) {
- label_width = label_width_mid;
- label_height = label_height_mid;
- }
-
- left_x_border = 10;
- right_x_border = label_width + 20;
- top_y_border = 10;
- bottom_y_border = label_height + 20;
-
-
- /*
- * Calculate the size of the drawing area for the actual plot
- */
- draw_width = user_data->dlg.dialog_graph.surface_width - right_x_border - left_x_border;
- draw_height = user_data->dlg.dialog_graph.surface_height - top_y_border - bottom_y_border;
-
-
- /*
- * Draw the y axis and labels
- * (we always draw the y scale with 11 ticks along the axis)
- */
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr,
- user_data->dlg.dialog_graph.surface_width - right_x_border + 1.5,
- top_y_border + 0.5);
- cairo_line_to(cr,
- user_data->dlg.dialog_graph.surface_width - right_x_border + 1.5,
- user_data->dlg.dialog_graph.surface_height - bottom_y_border + 0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
-
- for (i = 0; i <= 10; i++) {
- int xwidth;
-
- xwidth = 5;
- if (!(i%5)) {
- /* first, middle and last tick are slightly longer */
- xwidth = 10;
- }
- /* draw the tick */
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr,
- user_data->dlg.dialog_graph.surface_width - right_x_border + 1.5,
- user_data->dlg.dialog_graph.surface_height - bottom_y_border - draw_height*i/10 + 0.5);
-
- cairo_line_to(cr,
- user_data->dlg.dialog_graph.surface_width - right_x_border + 1.5 + xwidth,
- user_data->dlg.dialog_graph.surface_height - bottom_y_border - draw_height*i/10 + 0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
- /* draw the labels */
- if (i == 0) {
- print_time_scale_string(label_string, sizeof(label_string), (max_y*i/10));
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_move_to (cr,
- user_data->dlg.dialog_graph.surface_width - right_x_border + 15 + label_width - lwidth,
- user_data->dlg.dialog_graph.surface_height - bottom_y_border - draw_height*i/10 - label_height/2);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
- }
- if (i == 5) {
- print_time_scale_string(label_string, sizeof(label_string), (max_y*i/10));
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_move_to (cr,
- user_data->dlg.dialog_graph.surface_width - right_x_border + 15 + label_width - lwidth,
- user_data->dlg.dialog_graph.surface_height - bottom_y_border - draw_height*i/10 - label_height/2);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
- }
- if (i == 10) {
- print_time_scale_string(label_string, sizeof(label_string), (max_y*i/10));
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_move_to (cr,
- user_data->dlg.dialog_graph.surface_width - right_x_border + 15 + label_width - lwidth,
- user_data->dlg.dialog_graph.surface_height - bottom_y_border - draw_height*i/10 - label_height/2);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
- }
- }
-
-
-
- /*
- * if we have not specified the last_interval via the gui,
- * then just pick the current end of the capture so that is scrolls
- * nicely when doing live captures
- */
- if (user_data->dlg.dialog_graph.last_interval == 0xffffffff) {
- last_interval = user_data->dlg.dialog_graph.max_interval;
- } else {
- last_interval = user_data->dlg.dialog_graph.last_interval;
- }
-
-
-
-
-/*XXX*/
- /* plot the x-scale */
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr,
- left_x_border + 0.5,
- user_data->dlg.dialog_graph.surface_height-bottom_y_border + 1.5);
- cairo_line_to(cr,
- user_data->dlg.dialog_graph.surface_width - right_x_border + 1.5,
- user_data->dlg.dialog_graph.surface_height - bottom_y_border + 1.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
-
- if ((last_interval/user_data->dlg.dialog_graph.interval) > draw_width/user_data->dlg.dialog_graph.pixels_per_tick+1) {
- first_interval = (last_interval/user_data->dlg.dialog_graph.interval)
- - draw_width/user_data->dlg.dialog_graph.pixels_per_tick + 1;
- first_interval *= user_data->dlg.dialog_graph.interval;
- } else {
- first_interval = 0;
- }
-
- interval_delta = 1;
- delta_multiplier = 5;
- while (interval_delta<((last_interval-first_interval)/10)) {
- interval_delta*=delta_multiplier;
- if (delta_multiplier == 5) {
- delta_multiplier = 2;
- } else {
- delta_multiplier = 5;
- }
- }
-
- for (current_interval = last_interval;
- current_interval > (gint32)first_interval;
- current_interval = current_interval-user_data->dlg.dialog_graph.interval) {
- int x, xlen;
-
- /* if pixels_per_tick is <5, only draw every 10 ticks */
- if ((user_data->dlg.dialog_graph.pixels_per_tick<10)
- && (current_interval%(10*user_data->dlg.dialog_graph.interval))) {
- continue;
- }
-
- if (current_interval%interval_delta) {
- xlen = 5;
- } else {
- xlen = 17;
- }
-
- x = draw_width+left_x_border
- - (((last_interval-current_interval)/user_data->dlg.dialog_graph.interval)
- * user_data->dlg.dialog_graph.pixels_per_tick);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr,
- x - 1 - user_data->dlg.dialog_graph.pixels_per_tick/2 + 0.5,
- user_data->dlg.dialog_graph.surface_height-bottom_y_border + 1.5);
- cairo_line_to(cr, x-1-user_data->dlg.dialog_graph.pixels_per_tick/2+0.5, user_data->dlg.dialog_graph.surface_height-bottom_y_border+xlen+1.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
-
- if (xlen == 17) {
- if (user_data->dlg.dialog_graph.interval >= 1000) {
- g_snprintf(label_string, sizeof(label_string),
- "%ds", current_interval/1000);
- } else if (user_data->dlg.dialog_graph.interval >= 100) {
- g_snprintf(label_string, sizeof(label_string),
- "%d.%1ds", current_interval/1000, (current_interval/100)%10);
- } else if (user_data->dlg.dialog_graph.interval >= 10) {
- g_snprintf(label_string, sizeof(label_string),
- "%d.%2ds", current_interval/1000, (current_interval/10)%100);
- } else {
- g_snprintf(label_string, sizeof(label_string),
- "%d.%3ds", current_interval/1000, current_interval%1000);
- }
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_move_to (cr,
- x - 1 - user_data->dlg.dialog_graph.pixels_per_tick/2 - lwidth/2,
- user_data->dlg.dialog_graph.surface_height-bottom_y_border + 20);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
- }
-
- }
-
-
-
-
-
-
- /*
- * Draw "x" for Sequence Errors and "m" for Marks
- */
- /* Draw the labels Fwd and Rev */
- g_strlcpy(label_string, UTF8_LEFTWARDS_ARROW "Fwd", sizeof(label_string));
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_move_to (cr,
- user_data->dlg.dialog_graph.surface_width - right_x_border + 33 - lwidth,
- user_data->dlg.dialog_graph.surface_height - bottom_y_border + 3);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
-
- g_strlcpy(label_string, UTF8_LEFTWARDS_ARROW "Rev", sizeof(label_string));
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_move_to (cr,
- user_data->dlg.dialog_graph.surface_width - right_x_border + 33 - lwidth,
- user_data->dlg.dialog_graph.surface_height - bottom_y_border + 3 + 9);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
-
- /* Draw the marks */
- for (i = MAX_GRAPHS-1; i >= 0; i--) {
- guint32 interval;
- guint32 x_pos/*, prev_x_pos*/;
-
- /* XXX for fwd or rev, the flag info for jitter and diff is the same, and here I loop twice */
- if (!user_data->dlg.dialog_graph.graph[i].display) {
- continue;
- }
- /* initialize prev x/y to the low left corner of the graph */
- /*prev_x_pos = draw_width-1-user_data->dlg.dialog_graph.pixels_per_tick*((last_interval-first_interval)/user_data->dlg.dialog_graph.interval+1)+left_x_border;*/
-
- for (interval = first_interval+user_data->dlg.dialog_graph.interval;
- interval <= last_interval;
- interval += user_data->dlg.dialog_graph.interval) {
- x_pos = draw_width - 1
- - (user_data->dlg.dialog_graph.pixels_per_tick
- * ((last_interval-interval)/user_data->dlg.dialog_graph.interval + 1))
- + left_x_border;
-
- if (user_data->dlg.dialog_graph.graph[i].items[interval/user_data->dlg.dialog_graph.interval].flags &
- (STAT_FLAG_WRONG_SEQ|STAT_FLAG_MARKER|STAT_FLAG_DUP_PKT)) {
- if (user_data->dlg.dialog_graph.graph[i].items[interval/user_data->dlg.dialog_graph.interval].flags &
- (STAT_FLAG_WRONG_SEQ|STAT_FLAG_DUP_PKT)) {
- g_strlcpy(label_string, "x", sizeof(label_string));
- } else {
- g_strlcpy(label_string, "m", sizeof(label_string));
- }
-
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_move_to (cr,
- x_pos - 1 - lwidth/2,
- user_data->dlg.dialog_graph.surface_height - bottom_y_border + 3 + 7*(i/2));
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
-
- }
-
- /*prev_x_pos = x_pos;*/
- }
- }
-
- g_object_unref(G_OBJECT(layout));
-
- /*
- * Loop over all graphs and draw them
- */
- for (i = MAX_GRAPHS-1; i >= 0; i--) {
- guint32 interval;
- guint32 x_pos, y_pos, /*prev_x_pos,*/ prev_y_pos;
- if (! user_data->dlg.dialog_graph.graph[i].display) {
- continue;
- }
- /* initialize prev x/y to the low left corner of the graph */
- /*prev_x_pos = draw_width-1-user_data->dlg.dialog_graph.pixels_per_tick*((last_interval-first_interval)/user_data->dlg.dialog_graph.interval+1)+left_x_border;*/
- prev_y_pos = draw_height-1+top_y_border;
-
- for (interval = first_interval+user_data->dlg.dialog_graph.interval;
- interval <= last_interval;
- interval+=user_data->dlg.dialog_graph.interval) {
- guint32 val;
- x_pos = draw_width - 1
- - (user_data->dlg.dialog_graph.pixels_per_tick
- * ((last_interval-interval)/user_data->dlg.dialog_graph.interval+1))
- + left_x_border;
- val = get_it_value(&user_data->dlg.dialog_graph.graph[i],
- interval/user_data->dlg.dialog_graph.interval);
- if (val>max_y) {
- y_pos = 0;
- } else {
- y_pos = draw_height - 1 - (val*draw_height)/max_y + top_y_border;
- }
-
- /* don't need to draw anything if the segment
- * is entirely above the top of the graph
- */
- if ( (prev_y_pos == 0) && (y_pos == 0) ) {
- prev_y_pos = y_pos;
- /*prev_x_pos = x_pos;*/
- continue;
- }
-
- if (val) {
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- gdk_cairo_set_source_rgba (cr, &user_data->dlg.dialog_graph.graph[i].rgba_color);
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr, x_pos + 0.5, draw_height - 1 + top_y_border + 0.5);
- cairo_line_to(cr, x_pos + 0.5, y_pos + 0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
- }
-
- prev_y_pos = y_pos;
- /*prev_x_pos = x_pos;*/
- }
- }
-
- cr = gdk_cairo_create (gtk_widget_get_window(user_data->dlg.dialog_graph.draw_area));
-
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, user_data->dlg.dialog_graph.surface, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, user_data->dlg.dialog_graph.pixmap, 0, 0);
-#endif
- cairo_rectangle (cr, 0, 0,
- user_data->dlg.dialog_graph.surface_width,
- user_data->dlg.dialog_graph.surface_height);
- cairo_fill (cr);
-
- cairo_destroy (cr);
-
- /* update the scrollbar */
- gtk_adjustment_set_upper(user_data->dlg.dialog_graph.scrollbar_adjustment,
- (gfloat) user_data->dlg.dialog_graph.max_interval);
- gtk_adjustment_set_step_increment(user_data->dlg.dialog_graph.scrollbar_adjustment,
- (gfloat) ((last_interval - first_interval)/10));
- gtk_adjustment_set_page_increment(user_data->dlg.dialog_graph.scrollbar_adjustment,
- (gfloat) (last_interval - first_interval));
- if (((last_interval-first_interval)*100) < user_data->dlg.dialog_graph.max_interval) {
- gtk_adjustment_set_page_size(user_data->dlg.dialog_graph.scrollbar_adjustment,
- (gfloat) (user_data->dlg.dialog_graph.max_interval/100));
- } else {
- gtk_adjustment_set_page_size(user_data->dlg.dialog_graph.scrollbar_adjustment,
- (gfloat) (last_interval - first_interval));
- }
- gtk_adjustment_set_value(user_data->dlg.dialog_graph.scrollbar_adjustment,
- last_interval
- - gtk_adjustment_get_page_size(user_data->dlg.dialog_graph.scrollbar_adjustment));
- gtk_adjustment_changed(user_data->dlg.dialog_graph.scrollbar_adjustment);
- gtk_adjustment_value_changed(user_data->dlg.dialog_graph.scrollbar_adjustment);
-
-}
-
-/****************************************************************************/
-static void
-dialog_graph_redraw(user_data_t* user_data)
-{
- user_data->dlg.dialog_graph.needs_redraw = TRUE;
- dialog_graph_draw(user_data);
-}
-
-/****************************************************************************/
-static void
-quit(GtkWidget *widget _U_, user_data_t *user_data)
-{
- GtkWidget *bt_save = (GtkWidget *)g_object_get_data(G_OBJECT(user_data->dlg.dialog_graph.window), "bt_save");
- surface_info_t *surface_info = (surface_info_t *)g_object_get_data(G_OBJECT(bt_save), "surface-info");
-
- g_free(surface_info);
- user_data->dlg.dialog_graph.window = NULL;
-}
-
-/****************************************************************************/
-#if GTK_CHECK_VERSION(3,0,0)
-static gboolean
-draw_area_draw(GtkWidget *widget, cairo_t *cr, gpointer data)
-{
- user_data_t *user_data = (user_data_t *)data;
- GtkAllocation allocation;
-
- gtk_widget_get_allocation (widget, &allocation);
-
- cairo_set_source_surface (cr, user_data->dlg.dialog_graph.surface, 0, 0);
- cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
- cairo_fill (cr);
-
- return FALSE;
-}
-#else
-static gint
-expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
-{
- user_data_t *user_data = (user_data_t *)data;
- cairo_t *cr = gdk_cairo_create (gtk_widget_get_window(widget));
-
-
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, user_data->dlg.dialog_graph.surface, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, user_data->dlg.dialog_graph.pixmap, 0, 0);
-#endif
- cairo_rectangle (cr, event->area.x, event->area.y, event->area.width, event->area.height);
- cairo_fill (cr);
-
- cairo_destroy (cr);
-
- return FALSE;
-}
-#endif
-
-/****************************************************************************/
-static gint
-configure_event(GtkWidget *widget, GdkEventConfigure *event _U_, gpointer data)
-{
- user_data_t *user_data = (user_data_t *)data;
- GtkWidget *bt_save;
- GtkAllocation widget_alloc;
- cairo_t *cr;
-#if GTK_CHECK_VERSION(2,22,0)
- surface_info_t *surface_info = g_new(surface_info_t, 1);
-#endif
-
- if (!user_data) {
- exit(10);
- }
-
-#if GTK_CHECK_VERSION(2,22,0)
- if (user_data->dlg.dialog_graph.surface) {
- g_object_unref(user_data->dlg.dialog_graph.surface);
- user_data->dlg.dialog_graph.surface = NULL;
- }
- gtk_widget_get_allocation(widget, &widget_alloc);
- user_data->dlg.dialog_graph.surface = gdk_window_create_similar_surface (gtk_widget_get_window(widget),
- CAIRO_CONTENT_COLOR,
- widget_alloc.width,
- widget_alloc.height);
-#else
- if (user_data->dlg.dialog_graph.pixmap) {
- g_object_unref(user_data->dlg.dialog_graph.pixmap);
- user_data->dlg.dialog_graph.pixmap = NULL;
- }
-
- gtk_widget_get_allocation(widget, &widget_alloc);
- user_data->dlg.dialog_graph.pixmap = gdk_pixmap_new(gtk_widget_get_window(widget),
- widget_alloc.width,
- widget_alloc.height,
- -1);
-#endif
- user_data->dlg.dialog_graph.surface_width = widget_alloc.width;
- user_data->dlg.dialog_graph.surface_height = widget_alloc.height;
-
- bt_save = (GtkWidget *)g_object_get_data(G_OBJECT(user_data->dlg.dialog_graph.window), "bt_save");
-#if GTK_CHECK_VERSION(2,22,0)
- surface_info->surface = user_data->dlg.dialog_graph.surface;
- surface_info->width = widget_alloc.width;
- surface_info->height = widget_alloc.height;
- g_object_set_data(G_OBJECT(bt_save), "surface-info", surface_info);
- gtk_widget_set_sensitive(bt_save, TRUE);
-
- cr = cairo_create (user_data->dlg.dialog_graph.surface);
-#else
- g_object_set_data(G_OBJECT(bt_save), "pixmap", user_data->dlg.dialog_graph.pixmap);
- gtk_widget_set_sensitive(bt_save, TRUE);
-
- cr = gdk_cairo_create (user_data->dlg.dialog_graph.pixmap);
-#endif
- cairo_rectangle (cr, 0, 0, widget_alloc.width, widget_alloc.height);
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_fill (cr);
- cairo_destroy (cr);
-
- dialog_graph_redraw(user_data);
- return TRUE;
-}
-
-/****************************************************************************/
-static gint
-scrollbar_changed(GtkWidget *widget _U_, gpointer data)
-{
- user_data_t *user_data = (user_data_t *)data;
- guint32 mi;
-
- mi = (guint32) (gtk_adjustment_get_value(user_data->dlg.dialog_graph.scrollbar_adjustment)
- + gtk_adjustment_get_page_size(user_data->dlg.dialog_graph.scrollbar_adjustment));
- if (user_data->dlg.dialog_graph.last_interval == mi) {
- return TRUE;
- }
- if ( (user_data->dlg.dialog_graph.last_interval == 0xffffffff)
- && (mi == user_data->dlg.dialog_graph.max_interval) ) {
- return TRUE;
- }
-
- user_data->dlg.dialog_graph.last_interval =
- (mi / user_data->dlg.dialog_graph.interval) * user_data->dlg.dialog_graph.interval;
-
- dialog_graph_redraw(user_data);
- return TRUE;
-}
-
-/****************************************************************************/
-static void
-create_draw_area(user_data_t* user_data, GtkWidget *box)
-{
- user_data->dlg.dialog_graph.draw_area = gtk_drawing_area_new();
- g_signal_connect(user_data->dlg.dialog_graph.draw_area, "destroy", G_CALLBACK(quit), user_data);
-
- gtk_widget_set_size_request(user_data->dlg.dialog_graph.draw_area,
- user_data->dlg.dialog_graph.surface_width,
- user_data->dlg.dialog_graph.surface_height);
-
- /* signals needed to handle backing pixmap */
-#if GTK_CHECK_VERSION(3,0,0)
- g_signal_connect(user_data->dlg.dialog_graph.draw_area, "draw", G_CALLBACK(draw_area_draw), user_data);
-#else
- g_signal_connect(user_data->dlg.dialog_graph.draw_area, "expose_event", G_CALLBACK(expose_event), user_data);
-#endif
- g_signal_connect(user_data->dlg.dialog_graph.draw_area, "configure_event", G_CALLBACK(configure_event), user_data);
-
- gtk_widget_show(user_data->dlg.dialog_graph.draw_area);
- gtk_box_pack_start(GTK_BOX(box), user_data->dlg.dialog_graph.draw_area, TRUE, TRUE, 0);
-
- /* create the associated scrollbar */
- user_data->dlg.dialog_graph.scrollbar_adjustment = (GtkAdjustment *)gtk_adjustment_new(0, 0, 0, 0, 0, 0);
- user_data->dlg.dialog_graph.scrollbar = gtk_scrollbar_new(GTK_ORIENTATION_HORIZONTAL,
- user_data->dlg.dialog_graph.scrollbar_adjustment);
- gtk_widget_show(user_data->dlg.dialog_graph.scrollbar);
- gtk_box_pack_start(GTK_BOX(box), user_data->dlg.dialog_graph.scrollbar, FALSE, FALSE, 0);
- g_signal_connect(user_data->dlg.dialog_graph.scrollbar_adjustment,
- "value_changed",
- G_CALLBACK(scrollbar_changed),
- user_data);
-}
-
-/****************************************************************************/
-static void
-disable_graph(dialog_graph_graph_t *dgg)
-{
- if (dgg->display) {
- dgg->display = FALSE;
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dgg->display_button),
- FALSE);
- }
-}
-
-/****************************************************************************/
-static gint
-filter_callback(GtkWidget *widget _U_, dialog_graph_graph_t *dgg)
-{
- /* this graph is not active, just update display and redraw */
- if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dgg->display_button))) {
- disable_graph(dgg);
- dialog_graph_redraw(dgg->ud);
- return 0;
- }
-
- enable_graph(dgg);
- cf_retap_packets(&cfile);
- dialog_graph_redraw(dgg->ud);
-
- return 0;
-}
-
-/****************************************************************************/
-static void
-create_filter_box(dialog_graph_graph_t *dgg, GtkWidget *vbox, int num)
-{
- GtkWidget *hbox;
- GtkWidget *label;
- char str[256];
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
- gtk_widget_show(hbox);
-
- g_snprintf(str, sizeof(str), "Graph %d", num);
- dgg->display_button = gtk_toggle_button_new_with_label(str);
- gtk_box_pack_start(GTK_BOX(hbox), dgg->display_button, FALSE, FALSE, 0);
- gtk_widget_show(dgg->display_button);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dgg->display_button), dgg->display);
- g_signal_connect(dgg->display_button, "toggled", G_CALLBACK(filter_callback), dgg);
-
- label = gtk_label_new(dgg->title);
- gtk_widget_show(label);
- gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_override_color(label, GTK_STATE_FLAG_NORMAL, &dgg->rgba_color);
- gtk_widget_override_color(label, GTK_STATE_FLAG_ACTIVE, &dgg->rgba_color);
- gtk_widget_override_color(label, GTK_STATE_FLAG_PRELIGHT, &dgg->rgba_color);
- gtk_widget_override_color(label, GTK_STATE_FLAG_SELECTED, &dgg->rgba_color);
- gtk_widget_override_color(label, GTK_STATE_FLAG_INSENSITIVE, &dgg->rgba_color);
-#else
- gtk_widget_modify_fg(label, GTK_STATE_NORMAL, &dgg->color);
- gtk_widget_modify_fg(label, GTK_STATE_ACTIVE, &dgg->color);
- gtk_widget_modify_fg(label, GTK_STATE_PRELIGHT, &dgg->color);
- gtk_widget_modify_fg(label, GTK_STATE_SELECTED, &dgg->color);
- gtk_widget_modify_fg(label, GTK_STATE_INSENSITIVE, &dgg->color);
-#endif
- return;
-}
-
-/****************************************************************************/
-static void
-create_filter_area(user_data_t* user_data, GtkWidget *box)
-{
- GtkWidget *frame;
- GtkWidget *vbox;
- int i;
- GtkWidget *label;
-
- frame = gtk_frame_new("Graphs");
- gtk_box_pack_start(GTK_BOX(box), frame, TRUE, TRUE, 0);
- gtk_widget_show(frame);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 1, FALSE);
- gtk_container_add(GTK_CONTAINER(frame), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 3);
- gtk_widget_show(vbox);
-
- for (i = 0; i < MAX_GRAPHS; i++) {
- create_filter_box(&user_data->dlg.dialog_graph.graph[i], vbox, i+1);
- }
-
- label = gtk_label_new("Label: x = Wrong Seq. number m = Mark set");
- gtk_widget_show(label);
- gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
-
- return;
-}
-
-/****************************************************************************/
-static void
-yscale_select(GtkWidget *item, gpointer key)
-{
- int i;
- user_data_t *user_data;
-
- user_data = (user_data_t *)key;
- i = gtk_combo_box_get_active (GTK_COMBO_BOX(item));
-
- user_data->dlg.dialog_graph.max_y_units = yscale_max[i];
- dialog_graph_redraw(user_data);
-}
-
-/****************************************************************************/
-static void
-pixels_per_tick_select(GtkWidget *item, gpointer key)
-{
- int i;
- user_data_t *user_data;
-
- user_data = (user_data_t *)key;
- i = gtk_combo_box_get_active (GTK_COMBO_BOX(item));
-
- user_data->dlg.dialog_graph.pixels_per_tick = pixels_per_tick[i];
- dialog_graph_redraw(user_data);
-}
-
-/****************************************************************************/
-static void
-tick_interval_select(GtkWidget *item, gpointer key)
-{
- int i;
- user_data_t *user_data;
-
- user_data = (user_data_t *)key;
- i = gtk_combo_box_get_active (GTK_COMBO_BOX(item));
-
- user_data->dlg.dialog_graph.interval = tick_interval_values[i];
- cf_retap_packets(&cfile);
- dialog_graph_redraw(user_data);
-}
-
-/****************************************************************************/
-static GtkWidget *
-create_yscale_max_menu_items(user_data_t* user_data)
-{
- char str[15];
- GtkWidget *combo_box;
- int i;
-
- combo_box = gtk_combo_box_text_new();
-
- for (i = 0; i < MAX_YSCALE; i++) {
- if (yscale_max[i] == AUTO_MAX_YSCALE) {
- g_strlcpy(str, "Auto", sizeof(str));
- } else if (yscale_max[i] < 1000000) {
- g_snprintf(str, sizeof(str), "%u ms", yscale_max[i]/1000);
- } else {
- g_snprintf(str, sizeof(str), "%u s", yscale_max[i]/1000000);
- }
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), str);
- }
- gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), DEFAULT_YSCALE_INDEX);
- g_signal_connect(combo_box, "changed", G_CALLBACK(yscale_select), (gpointer)user_data);
-
- return combo_box;
-}
-
-/****************************************************************************/
-static GtkWidget *
-create_pixels_per_tick_menu_items(user_data_t *user_data)
-{
- char str[5];
- GtkWidget *combo_box;
- int i;
-
- combo_box = gtk_combo_box_text_new();
-
- for (i = 0; i < MAX_PIXELS_PER_TICK; i++) {
- g_snprintf(str, sizeof(str), "%u", pixels_per_tick[i]);
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), str);
- }
- gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), DEFAULT_PIXELS_PER_TICK_INDEX);
-
- g_signal_connect(combo_box, "changed", G_CALLBACK(pixels_per_tick_select), (gpointer)user_data);
-
- return combo_box;
-}
-
-/****************************************************************************/
-static GtkWidget *
-create_tick_interval_menu_items(user_data_t *user_data)
-{
- GtkWidget *combo_box;
- char str[15];
- int i;
-
- combo_box = gtk_combo_box_text_new();
-
- for (i = 0; i < MAX_TICK_VALUES; i++) {
- if (tick_interval_values[i] >= 1000) {
- g_snprintf(str, sizeof(str), "%u sec", tick_interval_values[i]/1000);
- } else if (tick_interval_values[i] >= 100) {
- g_snprintf(str, sizeof(str), "0.%1u sec", (tick_interval_values[i]/100)%10);
- } else if (tick_interval_values[i] >= 10) {
- g_snprintf(str, sizeof(str), "0.%02u sec", (tick_interval_values[i]/10)%10);
- } else {
- g_snprintf(str, sizeof(str), "0.%03u sec", (tick_interval_values[i])%10);
- }
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), str);
- }
- gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), DEFAULT_TICK_VALUE_INDEX);
- g_signal_connect(combo_box, "changed", G_CALLBACK(tick_interval_select), (gpointer)user_data);
-
- return combo_box;
-}
-
-/****************************************************************************/
-static void
-create_ctrl_menu(user_data_t* user_data, GtkWidget *vbox, const char *name, GtkWidget *(*func)(user_data_t* user_data))
-{
- GtkWidget *hbox;
- GtkWidget *label;
- GtkWidget *combo_box;
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
- gtk_widget_show(hbox);
-
- label = gtk_label_new(name);
- gtk_widget_show(label);
- gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-
- combo_box = (*func)(user_data);
- gtk_box_pack_end(GTK_BOX(hbox), combo_box, FALSE, FALSE, 0);
- gtk_widget_show(combo_box);
-}
-
-/****************************************************************************/
-static void
-create_ctrl_area(user_data_t* user_data, GtkWidget *box)
-{
- GtkWidget *frame_vbox;
- GtkWidget *frame;
- GtkWidget *vbox;
-
- frame_vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(box), frame_vbox, TRUE, TRUE, 0);
- gtk_widget_show(frame_vbox);
-
- frame = gtk_frame_new("X Axis");
- gtk_container_add(GTK_CONTAINER(frame_vbox), frame);
- gtk_widget_show(frame);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(frame), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 3);
- gtk_widget_show(vbox);
-
- create_ctrl_menu(user_data, vbox, "Tick interval:", create_tick_interval_menu_items);
- create_ctrl_menu(user_data, vbox, "Pixels per tick:", create_pixels_per_tick_menu_items);
-
- frame = gtk_frame_new("Y Axis");
- gtk_container_add(GTK_CONTAINER(frame_vbox), frame);
- gtk_widget_show(frame);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(frame), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 3);
- gtk_widget_show(vbox);
-
- create_ctrl_menu(user_data, vbox, "Scale:", create_yscale_max_menu_items);
-
- return;
-}
-
-/****************************************************************************/
-static void
-dialog_graph_init_window(user_data_t* user_data)
-{
- GtkWidget *vbox;
- GtkWidget *hbox;
- GtkWidget *bt_close;
- GtkWidget *bt_save;
-
- /* create the main window */
- user_data->dlg.dialog_graph.window = dlg_window_new("I/O Graphs"); /* transient_for top_level */
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(user_data->dlg.dialog_graph.window), vbox);
- gtk_widget_show(vbox);
-
- create_draw_area(user_data, vbox);
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
- gtk_container_set_border_width(GTK_CONTAINER(hbox), 3);
- gtk_widget_show(hbox);
-
- create_filter_area(user_data, hbox);
- create_ctrl_area(user_data, hbox);
-
- dialog_graph_set_title(user_data);
-
- hbox = dlg_button_row_new(GTK_STOCK_CLOSE, GTK_STOCK_SAVE, NULL);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
- gtk_widget_show(hbox);
-
- bt_close = (GtkWidget *)g_object_get_data(G_OBJECT(hbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(user_data->dlg.dialog_graph.window, bt_close, window_cancel_button_cb);
-
- bt_save = (GtkWidget *)g_object_get_data(G_OBJECT(hbox), GTK_STOCK_SAVE);
- gtk_widget_set_sensitive(bt_save, FALSE);
- gtk_widget_set_tooltip_text(bt_save, "Save the displayed graph to a file");
- g_signal_connect(bt_save, "clicked", G_CALLBACK(pixmap_save_cb), NULL);
- g_object_set_data(G_OBJECT(user_data->dlg.dialog_graph.window), "bt_save", bt_save);
-
- g_signal_connect(user_data->dlg.dialog_graph.window, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
-
- gtk_widget_show(user_data->dlg.dialog_graph.window);
- window_present(user_data->dlg.dialog_graph.window);
-
-}
-
-
-/****************************************************************************/
-static void
-on_graph_bt_clicked(GtkWidget *bt _U_, user_data_t *user_data)
-{
- if (user_data->dlg.dialog_graph.window != NULL) {
- /* There's already a graph window; reactivate it. */
- reactivate_window(user_data->dlg.dialog_graph.window);
- return;
- }
-
- dialog_graph_init_window(user_data);
-
-}
-
-/****************************************************************************/
-
-static void
-on_goto_bt_clicked_lst(GtkWidget *bt _U_, user_data_t *user_data _U_)
-{
- GtkTreeIter iter;
- GtkTreeModel *model;
- GtkTreeSelection *selection;
- guint fnumber;
-
- selection = user_data->dlg.selected_list_sel;
-
- if (selection == NULL)
- return;
-
- if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
- gtk_tree_model_get (model, &iter, PACKET_COLUMN, &fnumber, -1);
- cf_goto_frame(&cfile, fnumber);
- }
-
-}
-
-static void draw_stat(user_data_t *user_data);
-
-/****************************************************************************/
-/* re-dissects all packets */
-static void
-on_refresh_bt_clicked(GtkWidget *bt _U_, user_data_t *user_data)
-{
- GString *error_string;
-
- /* remove tap listener */
- remove_tap_listener(user_data);
-
- /* register tap listener */
- error_string = register_tap_listener("rtp", user_data, NULL, 0,
- rtp_reset, rtp_packet, rtp_draw);
- if (error_string != NULL) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
- g_string_free(error_string, TRUE);
- return;
- }
-
- /* retap all packets */
- cf_retap_packets(&cfile);
-
- /* draw statistics info */
- draw_stat(user_data);
-
-}
-
-#ifdef HAVE_LIBPORTAUDIO
-/****************************************************************************/
-static void
-on_player_bt_clicked(GtkButton *button _U_, gpointer user_data _U_)
-{
- rtp_player_init(NULL);
-}
-#endif /* HAVE_LIBPORTAUDIO */
-
-static void
-on_next_bt_clicked_list(GtkWidget *bt _U_, user_data_t *user_data _U_)
-{
- GtkTreeIter iter;
- GtkTreeModel *model;
- gchar *text;
- GtkTreeSelection *selection;
- GtkTreePath *path;
-
- selection = user_data->dlg.selected_list_sel;
-
- if (selection == NULL)
- return;
-
-try_again:
- if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
- while (gtk_tree_model_iter_next (model, &iter)) {
- gtk_tree_model_get (model, &iter, STATUS_COLUMN, &text, -1);
- if (strcmp(text, OK_TEXT) != 0) {
- gtk_tree_selection_select_iter (selection, &iter);
- path = gtk_tree_model_get_path(model, &iter);
- gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW( user_data->dlg.selected_list),
- path,
- NULL, FALSE, 0, 0);
- gtk_tree_path_free(path);
- g_free (text);
- return;
- }
- g_free (text);
- }
- /* wrap around */
- if (user_data->dlg.number_of_nok>1) {
- /* Get the first iter and select it before starting over */
- gtk_tree_model_get_iter_first(model, &iter);
- gtk_tree_selection_select_iter (selection, &iter);
- goto try_again;
- }
- }
-}
-
-
-/****************************************************************************/
-/* when we want to save the information */
-static gboolean
-save_csv_as_ok_cb(GtkWidget *w _U_, gpointer fc /*user_data_t *user_data*/)
-{
- gchar *g_dest;
- GtkWidget *rev, *forw, *both;
- user_data_t *user_data;
-
- GtkListStore *store;
- GtkTreeIter iter;
- GtkTreeModel *model;
- gboolean more_items = TRUE;
-
- /* To Hold data from the list row */
- guint32 packet; /* Packet */
- guint16 sequence; /* Sequence */
- guint32 timestamp; /* timestamp */
- gfloat delta; /* Delta(ms) */
- gfloat jitter; /* Jitter(ms) */
- gfloat skew; /* Skew(ms) */
- gfloat ipbw; /* IP BW(kbps) */
- gboolean marker; /* Marker */
- char *status_str; /* Status */
- char *date_str; /* Date */
- guint length; /* Length */
-
- FILE *fp;
- int j;
-
- g_dest = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fc));
-
- /* Perhaps the user specified a directory instead of a file.
- * Check whether they did.
- */
- if (test_for_directory(g_dest) == EISDIR) {
- /* It's a directory - set the file selection box to display it. */
- set_last_open_dir(g_dest);
- g_free(g_dest);
- file_selection_set_current_folder((GtkWidget *)fc, get_last_open_dir());
- gtk_file_chooser_set_current_name((GtkFileChooser *)fc, "");
- return FALSE; /* run the dialog again */
- }
-
- rev = (GtkWidget*)g_object_get_data(G_OBJECT(fc), "reversed_rb");
- forw = (GtkWidget*)g_object_get_data(G_OBJECT(fc), "forward_rb");
- both = (GtkWidget*)g_object_get_data(G_OBJECT(fc), "both_rb");
- user_data = (user_data_t*)g_object_get_data(G_OBJECT(fc), "user_data");
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(forw))
- || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(both))) {
- fp = ws_fopen(g_dest, "w");
- if (fp == NULL) {
- open_failure_alert_box(g_dest, errno, TRUE);
- g_free(g_dest);
- return TRUE; /* we're done */
- }
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(both))) {
- fprintf(fp, "Forward\n");
- if (ferror(fp)) {
- write_failure_alert_box(g_dest, errno);
- fclose(fp);
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- }
-
- for (j = 0; j < NUM_COLS; j++) {
- if (j == 0) {
- fprintf(fp, "\"%s\"", titles[j]);
- } else {
- fprintf(fp, ",\"%s\"", titles[j]);
- }
- }
- fprintf(fp, "\n");
- if (ferror(fp)) {
- write_failure_alert_box(g_dest, errno);
- fclose(fp);
- g_free(g_dest);
- return TRUE;
- }
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(user_data->dlg.list_fwd));
- store = GTK_LIST_STORE(model);
- if ( gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter) ) {
-
- while (more_items) {
- gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
- PACKET_COLUMN, &packet,
- SEQUENCE_COLUMN, &sequence,
- TIMESTAMP_COLUMN, &timestamp,
- DELTA_COLUMN, &delta,
- JITTER_COLUMN, &jitter,
- SKEW_COLUMN, &skew,
- IPBW_COLUMN, &ipbw,
- MARKER_COLUMN, &marker,
- STATUS_COLUMN, &status_str,
- DATE_COLUMN, &date_str,
- LENGTH_COLUMN, &length,
- -1);
- fprintf(fp, "\"%u\"", packet);
- fprintf(fp, ",\"%u\"", sequence);
- fprintf(fp, ",\"%u\"", timestamp);
- fprintf(fp, ",\"%.2f\"", delta);
- fprintf(fp, ",\"%.2f\"", jitter);
- fprintf(fp, ",\"%.2f\"", skew);
- fprintf(fp, ",\"%.2f\"", ipbw);
- fprintf(fp, ",\"%s\"", marker? "SET" : "");
- fprintf(fp, ",\"%s\"", status_str);
- fprintf(fp, ",\"%s\"", date_str);
- fprintf(fp, ",\"%u\"", length);
- fprintf(fp,"\n");
- g_free(status_str);
- g_free(date_str);
- if (ferror(fp)) {
- write_failure_alert_box(g_dest, errno);
- fclose(fp);
- g_free(g_dest);
- return TRUE; /* we're done */
- }
-
- more_items = gtk_tree_model_iter_next (model, &iter);
- }
- }
-
- if (fclose(fp) == EOF) {
- write_failure_alert_box(g_dest, errno);
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- }
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rev))
- || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(both))) {
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(both))) {
- fp = ws_fopen(g_dest, "a");
- if (fp == NULL) {
- open_failure_alert_box(g_dest, errno, TRUE);
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- fprintf(fp, "\nReverse\n");
- if (ferror(fp)) {
- write_failure_alert_box(g_dest, errno);
- fclose(fp);
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- } else {
- fp = ws_fopen(g_dest, "w");
- if (fp == NULL) {
- open_failure_alert_box(g_dest, errno, TRUE);
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- }
- for (j = 0; j < NUM_COLS; j++) {
- if (j == 0) {
- fprintf(fp, "\"%s\"", titles[j]);
- } else {
- fprintf(fp, ",\"%s\"", titles[j]);
- }
- }
- fprintf(fp, "\n");
- if (ferror(fp)) {
- write_failure_alert_box(g_dest, errno);
- fclose(fp);
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(user_data->dlg.list_rev));
- store = GTK_LIST_STORE(model);
- if ( gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter) ) {
-
- more_items = TRUE;
-
- while (more_items) {
- gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
- PACKET_COLUMN, &packet,
- SEQUENCE_COLUMN, &sequence,
- TIMESTAMP_COLUMN, &timestamp,
- DELTA_COLUMN, &delta,
- JITTER_COLUMN, &jitter,
- SKEW_COLUMN, &skew,
- IPBW_COLUMN, &ipbw,
- MARKER_COLUMN, &marker,
- STATUS_COLUMN, &status_str,
- DATE_COLUMN, &date_str,
- LENGTH_COLUMN, &length,
- -1);
- fprintf(fp, "\"%u\"", packet);
- fprintf(fp, ",\"%u\"", sequence);
- fprintf(fp, ",\"%u\"", timestamp);
- fprintf(fp, ",\"%.2f\"", delta);
- fprintf(fp, ",\"%.2f\"", jitter);
- fprintf(fp, ",\"%.2f\"", skew);
- fprintf(fp, ",\"%.2f\"", ipbw);
- fprintf(fp, ",\"%s\"", marker? "SET" : "");
- fprintf(fp, ",\"%s\"", status_str);
- fprintf(fp, ",\"%s\"", date_str);
- fprintf(fp, ",\"%u\"", length);
- fprintf(fp, "\n");
- g_free(status_str);
- g_free(date_str);
- if (ferror(fp)) {
- write_failure_alert_box(g_dest, errno);
- fclose(fp);
- g_free(g_dest);
- return TRUE; /* we're done */
- }
-
- more_items = gtk_tree_model_iter_next (model, &iter);
- }
- }
- if (fclose(fp) == EOF) {
- write_failure_alert_box(g_dest, errno);
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- }
-
- g_free(g_dest);
- return TRUE; /* we're done */
-}
-
-static void
-save_csv_as_destroy_cb(GtkWidget *win _U_, user_data_t *user_data)
-{
- user_data->dlg.save_csv_as_w = NULL;
-}
-
-/* when the user wants to save the csv information in a file */
-static void
-save_csv_as_cb(GtkWidget *bt _U_, user_data_t *user_data)
-{
- GtkWidget *vertb;
- GtkWidget *grid1;
- GtkWidget *label_format;
- GtkWidget *channels_label;
- GtkWidget *forward_rb;
- GtkWidget *reversed_rb;
- GtkWidget *both_rb;
-
-#if 0 /* XXX: GtkFileChooserDialog/gtk_dialog_run currently being used is effectively modal so this is not req'd */
- if (user_data->dlg.save_csv_as_w != NULL) {
- /* There's already a Save CSV info dialog box; reactivate it. */
- reactivate_window(user_data->dlg.save_csv_as_w);
- return;
- }
-#endif
- user_data->dlg.save_csv_as_w = gtk_file_chooser_dialog_new("Wireshark: Save Data As CSV",
- GTK_WINDOW(user_data->dlg.notebook),
- GTK_FILE_CHOOSER_ACTION_SAVE,
- GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- NULL);
- gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(user_data->dlg.save_csv_as_w), TRUE);
-
- /* Container for each row of widgets */
- vertb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(vertb), 5);
- gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(user_data->dlg.save_csv_as_w), vertb);
- gtk_widget_show (vertb);
-
- grid1 = ws_gtk_grid_new ();
- gtk_widget_show (grid1);
- gtk_box_pack_start (GTK_BOX (vertb), grid1, FALSE, FALSE, 0);
- gtk_container_set_border_width (GTK_CONTAINER (grid1), 10);
- ws_gtk_grid_set_row_spacing (GTK_GRID (grid1), 20);
-
- label_format = gtk_label_new ("Format: Comma Separated Values");
- gtk_widget_show (label_format);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), label_format, 0, 0, 3, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-
- gtk_misc_set_alignment (GTK_MISC (label_format), 0, 0.5f);
-
-
- channels_label = gtk_label_new ("Channels: ");
- gtk_widget_show (channels_label);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), channels_label, 0, 1, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (channels_label), 0, 0.5f);
-
- forward_rb = gtk_radio_button_new_with_label (NULL, "forward ");
- gtk_widget_show (forward_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), forward_rb, 1, 1, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-
- reversed_rb = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(forward_rb), "reversed ");
- gtk_widget_show (reversed_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), reversed_rb, 2, 1, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-
- both_rb = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(forward_rb), "both");
- gtk_widget_show (both_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), both_rb, 3, 1, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(both_rb), TRUE);
-
- g_object_set_data(G_OBJECT(user_data->dlg.save_csv_as_w), "forward_rb", forward_rb);
- g_object_set_data(G_OBJECT(user_data->dlg.save_csv_as_w), "reversed_rb", reversed_rb);
- g_object_set_data(G_OBJECT(user_data->dlg.save_csv_as_w), "both_rb", both_rb);
- g_object_set_data(G_OBJECT(user_data->dlg.save_csv_as_w), "user_data", user_data);
-
- g_signal_connect(user_data->dlg.save_csv_as_w, "delete_event",
- G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(user_data->dlg.save_csv_as_w, "destroy",
- G_CALLBACK(save_csv_as_destroy_cb), user_data);
-
- gtk_widget_show(user_data->dlg.save_csv_as_w);
- window_present(user_data->dlg.save_csv_as_w);
-
- /* "Run" the GtkFileChooserDialog. */
- /* Upon exit: If "Accept" run the OK callback. */
- /* If the OK callback returns with a FALSE status, re-run the dialog.*/
- /* Destroy the window. */
- /* XXX: If the OK callback pops up an alert box (eg: for an error) it *must* */
- /* return with a TRUE status so that the dialog window will be destroyed. */
- /* Trying to re-run the dialog after popping up an alert box will not work */
- /* since the user will not be able to dismiss the alert box. */
- /* The (somewhat unfriendly) effect: the user must re-invoke the */
- /* GtkFileChooserDialog whenever the OK callback pops up an alert box. */
- /* */
- /* ToDo: use GtkFileChooserWidget in a dialog window instead of */
- /* GtkFileChooserDialog. */
- while (gtk_dialog_run(GTK_DIALOG(user_data->dlg.save_csv_as_w)) == GTK_RESPONSE_ACCEPT) {
- if (save_csv_as_ok_cb(NULL, user_data->dlg.save_csv_as_w)) {
- break; /* we're done */
- }
- }
- window_destroy(user_data->dlg.save_csv_as_w);
-}
-
-
-/****************************************************************************/
-static void
-save_voice_as_destroy_cb(GtkWidget *win _U_, user_data_t *user_data)
-{
- /* Note that we no longer have a Save voice info dialog box. */
- user_data->dlg.save_voice_as_w = NULL;
-}
-
-/****************************************************************************/
-/* here we save it into a file that user specified */
-/* XXX what about endians here? could go something wrong? */
-
-static gboolean
-copy_file(gchar *dest, gint channels, gint format, user_data_t *user_data)
-{
- FILE *to_stream, *forw_stream, *rev_stream;
- size_t fwritten, rwritten;
- int f_rawvalue, r_rawvalue, rawvalue;
- gint16 sample;
- gchar pd[4];
- guint32 f_write_silence = 0;
- guint32 r_write_silence = 0;
- progdlg_t *progbar;
- guint32 progbar_count, progbar_quantum;
- guint32 progbar_nextstep = 0;
- guint32 count = 0;
- gboolean stop_flag = FALSE;
- size_t nchars;
- gboolean ret_val;
-
- forw_stream = ws_fopen(user_data->f_tempname, "rb");
- if (forw_stream == NULL)
- return FALSE;
- rev_stream = ws_fopen(user_data->r_tempname, "rb");
- if (rev_stream == NULL) {
- fclose(forw_stream);
- return FALSE;
- }
-
- /* open file for saving */
- to_stream = ws_fopen(dest, "wb");
- if (to_stream == NULL) {
- fclose(forw_stream);
- fclose(rev_stream);
- return FALSE;
- }
-
- progbar = create_progress_dlg(top_level, "Saving voice in a file", dest, TRUE, &stop_flag);
-
- if (format == SAVE_AU_FORMAT) /* au format */
- {
- /* First we write the .au header. XXX Hope this is endian independent */
- /* the magic word 0x2e736e64 == .snd */
- phton32(pd, 0x2e736e64);
- nchars = fwrite(pd, 1, 4, to_stream);
- if (nchars != 4)
- goto copy_file_err;
- /* header offset == 24 bytes */
- phton32(pd, 24);
- nchars = fwrite(pd, 1, 4, to_stream);
- if (nchars != 4)
- goto copy_file_err;
- /* total length; it is permitted to set this to 0xffffffff */
- phton32(pd, 0xffffffff);
- nchars = fwrite(pd, 1, 4, to_stream);
- if (nchars != 4)
- goto copy_file_err;
- /* encoding format == 16-bit linear PCM */
- phton32(pd, 3);
- nchars = fwrite(pd, 1, 4, to_stream);
- if (nchars != 4)
- goto copy_file_err;
- /* sample rate == 8000 Hz */
- phton32(pd, 8000);
- nchars = fwrite(pd, 1, 4, to_stream);
- if (nchars != 4)
- goto copy_file_err;
- /* channels == 1 */
- phton32(pd, 1);
- nchars = fwrite(pd, 1, 4, to_stream);
- if (nchars != 4)
- goto copy_file_err;
-
-
- switch (channels) {
- /* only forward direction */
- case SAVE_FORWARD_DIRECTION_MASK: {
- progbar_count = user_data->forward.saveinfo.count;
- progbar_quantum = user_data->forward.saveinfo.count/100;
- while ((f_rawvalue = getc(forw_stream)) != EOF) {
- if (stop_flag)
- break;
- if ((count > progbar_nextstep) && (count <= progbar_count)) {
- update_progress_dlg(progbar,
- (gfloat) count/progbar_count, "Saving");
- progbar_nextstep = progbar_nextstep + progbar_quantum;
- }
- count++;
-
- if (user_data->forward.statinfo.pt == PT_PCMU) {
- sample = ulaw2linear((unsigned char)f_rawvalue);
- phton16(pd, sample);
- }
- else if (user_data->forward.statinfo.pt == PT_PCMA) {
- sample = alaw2linear((unsigned char)f_rawvalue);
- phton16(pd, sample);
- }
- else{
- goto copy_file_err;
- }
-
- fwritten = fwrite(pd, 1, 2, to_stream);
- if (fwritten < 2) {
- goto copy_file_err;
- }
- }
- break;
- }
- /* only reversed direction */
- case SAVE_REVERSE_DIRECTION_MASK: {
- progbar_count = user_data->reversed.saveinfo.count;
- progbar_quantum = user_data->reversed.saveinfo.count/100;
- while ((r_rawvalue = getc(rev_stream)) != EOF) {
- if (stop_flag)
- break;
- if ((count > progbar_nextstep) && (count <= progbar_count)) {
- update_progress_dlg(progbar,
- (gfloat) count/progbar_count, "Saving");
- progbar_nextstep = progbar_nextstep + progbar_quantum;
- }
- count++;
-
- if (user_data->reversed.statinfo.pt == PT_PCMU) {
- sample = ulaw2linear((unsigned char)r_rawvalue);
- phton16(pd, sample);
- }
- else if (user_data->reversed.statinfo.pt == PT_PCMA) {
- sample = alaw2linear((unsigned char)r_rawvalue);
- phton16(pd, sample);
- }
- else{
- goto copy_file_err;
- }
-
- rwritten = fwrite(pd, 1, 2, to_stream);
- if (rwritten < 2) {
- goto copy_file_err;
- }
- }
- break;
- }
- /* both directions */
- case SAVE_BOTH_DIRECTION_MASK: {
- (user_data->forward.saveinfo.count > user_data->reversed.saveinfo.count) ?
- (progbar_count = user_data->forward.saveinfo.count) :
- (progbar_count = user_data->reversed.saveinfo.count);
- progbar_quantum = progbar_count/100;
- /* since conversation in one way can start later than in the other one,
- * we have to write some silence information for one channel */
- if (user_data->forward.statinfo.start_time > user_data->reversed.statinfo.start_time) {
- f_write_silence = (guint32)
- ((user_data->forward.statinfo.start_time
- - user_data->reversed.statinfo.start_time)
- * (8000/1000));
- }
- else if (user_data->forward.statinfo.start_time < user_data->reversed.statinfo.start_time) {
- r_write_silence = (guint32)
- ((user_data->reversed.statinfo.start_time
- - user_data->forward.statinfo.start_time)
- * (8000/1000));
- }
- for (;;) {
- if (stop_flag)
- break;
- if ((count > progbar_nextstep) && (count <= progbar_count)) {
- update_progress_dlg(progbar,
- (gfloat) count/progbar_count, "Saving");
- progbar_nextstep = progbar_nextstep + progbar_quantum;
- }
- count++;
- if (f_write_silence > 0) {
- r_rawvalue = getc(rev_stream);
- switch (user_data->forward.statinfo.reg_pt) {
- case PT_PCMU:
- f_rawvalue = SILENCE_PCMU;
- break;
- case PT_PCMA:
- f_rawvalue = SILENCE_PCMA;
- break;
- default:
- f_rawvalue = 0;
- break;
- }
- f_write_silence--;
- }
- else if (r_write_silence > 0) {
- f_rawvalue = getc(forw_stream);
- switch (user_data->reversed.statinfo.reg_pt) {
- case PT_PCMU:
- r_rawvalue = SILENCE_PCMU;
- break;
- case PT_PCMA:
- r_rawvalue = SILENCE_PCMA;
- break;
- default:
- r_rawvalue = 0;
- break;
- }
- r_write_silence--;
- }
- else {
- f_rawvalue = getc(forw_stream);
- r_rawvalue = getc(rev_stream);
- }
- if ((r_rawvalue == EOF) && (f_rawvalue == EOF))
- break;
- if ((user_data->forward.statinfo.pt == PT_PCMU)
- && (user_data->reversed.statinfo.pt == PT_PCMU)) {
- sample = (ulaw2linear((unsigned char)r_rawvalue)
- + ulaw2linear((unsigned char)f_rawvalue)) / 2;
- phton16(pd, sample);
- }
- else if ((user_data->forward.statinfo.pt == PT_PCMA)
- && (user_data->reversed.statinfo.pt == PT_PCMA)) {
- sample = (alaw2linear((unsigned char)r_rawvalue)
- + alaw2linear((unsigned char)f_rawvalue)) / 2;
- phton16(pd, sample);
- }
- else
- {
- goto copy_file_err;
- }
-
-
- rwritten = fwrite(pd, 1, 2, to_stream);
- if (rwritten < 2) {
- goto copy_file_err;
- }
- }
- }
- }
- }
- else if (format == SAVE_RAW_FORMAT) /* raw format */
- {
- FILE *stream;
- switch (channels) {
- /* only forward direction */
- case SAVE_FORWARD_DIRECTION_MASK: {
- progbar_count = user_data->forward.saveinfo.count;
- progbar_quantum = user_data->forward.saveinfo.count/100;
- stream = forw_stream;
- break;
- }
- /* only reversed direction */
- case SAVE_REVERSE_DIRECTION_MASK: {
- progbar_count = user_data->reversed.saveinfo.count;
- progbar_quantum = user_data->reversed.saveinfo.count/100;
- stream = rev_stream;
- break;
- }
- default: {
- goto copy_file_err;
- }
- }
-
-
-
- /* XXX how do you just copy the file? */
- while ((rawvalue = getc(stream)) != EOF) {
- if (stop_flag)
- break;
- if ((count > progbar_nextstep) && (count <= progbar_count)) {
- update_progress_dlg(progbar,
- (gfloat) count/progbar_count, "Saving");
- progbar_nextstep = progbar_nextstep + progbar_quantum;
- }
- count++;
-
- if (putc(rawvalue, to_stream) == EOF) {
- goto copy_file_err;
- }
- }
- }
-
- ret_val = TRUE;
- goto copy_file_xit;
-
-copy_file_err:
- ret_val = FALSE;
- goto copy_file_xit;
-
-copy_file_xit:
- destroy_progress_dlg(progbar);
- fclose(forw_stream);
- fclose(rev_stream);
- fclose(to_stream);
- return ret_val;
-}
-
-
-/****************************************************************************/
-/* the user wants to save in a file */
-/* XXX support for different formats is currently commented out */
-static gboolean
-save_voice_as_ok_cb(GtkWidget *w _U_, gpointer fc)
-{
- gchar *g_dest;
- /*GtkWidget *wav, *sw;*/
- GtkWidget *au, *raw;
- GtkWidget *rev, *forw, *both;
- user_data_t *user_data;
- gint channels, format;
-
- g_dest = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fc));
-
- /* Perhaps the user specified a directory instead of a file.
- * Check whether they did.
- */
- if (test_for_directory(g_dest) == EISDIR) {
- /* It's a directory - set the file selection box to display it. */
- set_last_open_dir(g_dest);
- g_free(g_dest);
- file_selection_set_current_folder((GtkWidget *)fc, get_last_open_dir());
- gtk_file_chooser_set_current_name((GtkFileChooser *)fc, "");
- return FALSE; /* run the dialog again */
- }
-
-#if 0
- wav = (GtkWidget *)g_object_get_data(G_OBJECT(fc), "wav_rb");
- sw = (GtkWidget *)g_object_get_data(G_OBJECT(fc), "sw_rb");
-#endif
- au = (GtkWidget *)g_object_get_data(G_OBJECT(fc), "au_rb");
- raw = (GtkWidget *)g_object_get_data(G_OBJECT(fc), "raw_rb");
- rev = (GtkWidget *)g_object_get_data(G_OBJECT(fc), "reversed_rb");
- forw = (GtkWidget *)g_object_get_data(G_OBJECT(fc), "forward_rb");
- both = (GtkWidget *)g_object_get_data(G_OBJECT(fc), "both_rb");
- user_data = (user_data_t *)g_object_get_data(G_OBJECT(fc), "user_data");
-
- /* XXX user clicks the ok button, but we know we can't save the voice info because f.e.
- * we don't support that codec. So we pop up a warning. Maybe it would be better to
- * disable the ok button or disable the buttons for direction if only one is not ok. The
- * problem is if we open the save voice dialog and then click the refresh button and maybe
- * the state changes, so we can't save anymore. In this case we should be able to update
- * the buttons. For now it is easier if we put the warning when the ok button is pressed.
- */
-
- /* we can not save in both directions */
- if ((user_data->forward.saveinfo.saved == FALSE)
- && (user_data->reversed.saveinfo.saved == FALSE)
- && (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (both)))) {
- /* there are many combinations here, we just exit when first matches */
- if ((user_data->forward.saveinfo.error_type == TAP_RTP_WRONG_CODEC)
- || (user_data->reversed.saveinfo.error_type == TAP_RTP_WRONG_CODEC))
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save in a file: Unsupported codec.");
- else if ((user_data->forward.saveinfo.error_type == TAP_RTP_WRONG_LENGTH)
- || (user_data->reversed.saveinfo.error_type == TAP_RTP_WRONG_LENGTH))
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save in a file: Wrong length of captured packets.");
- else if ((user_data->forward.saveinfo.error_type == TAP_RTP_PADDING_ERROR)
- || (user_data->reversed.saveinfo.error_type == TAP_RTP_PADDING_ERROR))
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save in a file: RTP data with padding.");
- else if ((user_data->forward.saveinfo.error_type == TAP_RTP_SHORT_FRAME)
- || (user_data->reversed.saveinfo.error_type == TAP_RTP_SHORT_FRAME))
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save in a file: Not all data in all packets was captured.");
- else
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save in a file: File I/O problem.");
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- /* we can not save forward direction */
- else if ((user_data->forward.saveinfo.saved == FALSE)
- && ((gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (forw)))
- || (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (both))))) {
- if (user_data->forward.saveinfo.error_type == TAP_RTP_WRONG_CODEC)
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save forward direction in a file: Unsupported codec.");
- else if (user_data->forward.saveinfo.error_type == TAP_RTP_WRONG_LENGTH)
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save forward direction in a file: Wrong length of captured packets.");
- else if (user_data->forward.saveinfo.error_type == TAP_RTP_PADDING_ERROR)
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save forward direction in a file: RTP data with padding.");
- else if (user_data->forward.saveinfo.error_type == TAP_RTP_SHORT_FRAME)
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save forward direction in a file: Not all data in all packets was captured.");
- else
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save forward direction in a file: File I/O problem.");
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- /* we can not save reversed direction */
- else if ((user_data->reversed.saveinfo.saved == FALSE)
- && ((gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (rev)))
- || (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (both))))) {
- if (user_data->reversed.saveinfo.error_type == TAP_RTP_WRONG_CODEC)
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save reversed direction in a file: Unsupported codec.");
- else if (user_data->reversed.saveinfo.error_type == TAP_RTP_WRONG_LENGTH)
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save reversed direction in a file: Wrong length of captured packets.");
- else if (user_data->reversed.saveinfo.error_type == TAP_RTP_PADDING_ERROR)
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save reversed direction in a file: RTP data with padding.");
- else if (user_data->reversed.saveinfo.error_type == TAP_RTP_SHORT_FRAME)
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save reversed direction in a file: Not all data in all packets was captured.");
- else if (user_data->reversed.saveinfo.error_type == TAP_RTP_NO_DATA)
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save reversed direction in a file: No RTP data.");
- else
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save reversed direction in a file: File I/O problem.");
- g_free(g_dest);
- return TRUE; /* we're done */
- }
-
-#if 0
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (wav)))
- format = SAVE_WAV_FORMAT;
- else
-#endif
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (au)))
- format = SAVE_AU_FORMAT;
-#if 0
- else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (sw)))
- format = SAVE_SW_FORMAT;
-#endif
- else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (raw)))
- format = SAVE_RAW_FORMAT;
- else
- format = SAVE_NONE_FORMAT;
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (rev)))
- channels = SAVE_REVERSE_DIRECTION_MASK;
- else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (both)))
- channels = SAVE_BOTH_DIRECTION_MASK;
- else
- channels = SAVE_FORWARD_DIRECTION_MASK;
-
- /* direction/format validity*/
- if (format == SAVE_AU_FORMAT)
- {
- /* make sure streams are alaw/ulaw */
- if ((channels & SAVE_FORWARD_DIRECTION_MASK)
- && (user_data->forward.statinfo.pt != PT_PCMA)
- && (user_data->forward.statinfo.pt != PT_PCMU)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save in a file: saving in au format supported only for alaw/ulaw streams");
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- if ((channels & SAVE_REVERSE_DIRECTION_MASK)
- && (user_data->reversed.statinfo.pt != PT_PCMA)
- && (user_data->reversed.statinfo.pt != PT_PCMU)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save in a file: saving in au format supported only for alaw/ulaw streams");
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- /* make sure pt's don't differ */
- if ((channels == SAVE_BOTH_DIRECTION_MASK)
- && (user_data->forward.statinfo.pt != user_data->reversed.statinfo.pt)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save in a file: Forward and reverse direction differ in type");
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- }
- else if (format == SAVE_RAW_FORMAT)
- {
- /* can't save raw in both directions */
- if (channels == SAVE_BOTH_DIRECTION_MASK) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save in a file: Unable to save raw data in both directions");
- g_free(g_dest);
- return TRUE; /* we're done */
- }
- }
- else
- {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't save in a file: Invalid save format");
- g_free(g_dest);
- return TRUE; /* we're done */
- }
-
- if (!copy_file(g_dest, channels, format, user_data)) {
- /* XXX - report the error type! */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "An error occurred while saving voice in a file.");
- g_free(g_dest);
- return TRUE; /* we're done */
- }
-
- g_free(g_dest);
- return TRUE; /* we're done */
-}
-
-/****************************************************************************/
-/* when the user wants to save the voice information in a file */
-/* XXX support for different formats is currently commented out */
-static void
-on_save_bt_clicked(GtkWidget *bt _U_, user_data_t *user_data)
-{
- GtkWidget *vertb;
- GtkWidget *grid1;
- GtkWidget *label_format;
- GtkWidget *channels_label;
- GtkWidget *forward_rb;
- GtkWidget *reversed_rb;
- GtkWidget *both_rb;
- /*GtkWidget *wav_rb; GtkWidget *sw_rb;*/
- GtkWidget *au_rb;
- GtkWidget *raw_rb;
-
- /* if we can't save in a file: wrong codec, cut packets or other errors */
- /* Should the error arise here or later when you click ok button ?
- * if we do it here, then we must disable the refresh button, so we don't do it here
- */
-
-#if 0 /* XXX: GtkFileChooserDialog/gtk_dialog_run currently being used is effectively modal so this is not req'd */
- if (user_data->dlg.save_voice_as_w != NULL) {
- /* There's already a Save voice info dialog box; reactivate it. */
- reactivate_window(user_data->dlg.save_voice_as_w);
- return;
- }
-#endif
- /* XXX - use file_selection from dlg_utils instead! */
- user_data->dlg.save_voice_as_w = gtk_file_chooser_dialog_new("Wireshark: Save Payload As ...",
- GTK_WINDOW(user_data->dlg.notebook),
- GTK_FILE_CHOOSER_ACTION_SAVE,
- GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- NULL);
- gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(user_data->dlg.save_voice_as_w), TRUE);
-
- /* Container for each row of widgets */
- vertb =ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(vertb), 5);
- gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(user_data->dlg.save_voice_as_w), vertb);
- gtk_widget_show (vertb);
-
- grid1 = ws_gtk_grid_new ();
- gtk_widget_show (grid1);
- gtk_box_pack_start (GTK_BOX (vertb), grid1, FALSE, FALSE, 0);
- gtk_container_set_border_width (GTK_CONTAINER (grid1), 10);
- ws_gtk_grid_set_row_spacing (GTK_GRID (grid1), 20);
-
-#if 0
- label_format = gtk_label_new ("Format: .au (ulaw, 8 bit, 8000 Hz, mono) ");
- gtk_widget_show (label_format);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), label_format, 0, 0, 3, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-#endif
-
- label_format = gtk_label_new ("Format: ");
- gtk_widget_show (label_format);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), label_format, 0, 0, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-
- gtk_misc_set_alignment (GTK_MISC (label_format), 0, 0.5f);
-
- raw_rb = gtk_radio_button_new_with_label (NULL, ".raw");
- gtk_widget_show (raw_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), raw_rb, 1, 0, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-
-
- au_rb = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(raw_rb), ".au");
- gtk_widget_show (au_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), au_rb, 3, 0, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-
-#if 0
- /* we support .au - ulaw*/
- wav_rb = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(raw_rb), ".wav");
- gtk_widget_show (wav_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), wav_rb, 1, 0, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-
- sw_rb = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(raw_rb), "8 kHz, 16 bit ");
- gtk_widget_show (sw_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), sw_rb, 2, 0, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- au_rb = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(raw_rb), ".au");
- gtk_widget_show (au_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), au_rb, 3, 0, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-#endif
-
- channels_label = gtk_label_new ("Channels: ");
- gtk_widget_show (channels_label);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), channels_label, 0, 1, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (channels_label), 0, 0.5f);
-
- forward_rb = gtk_radio_button_new_with_label (NULL, "forward ");
- gtk_widget_show (forward_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), forward_rb, 1, 1, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-
- reversed_rb = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(forward_rb), "reversed ");
- gtk_widget_show (reversed_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), reversed_rb, 2, 1, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-
- both_rb = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(forward_rb), "both");
- gtk_widget_show (both_rb);
- ws_gtk_grid_attach_extended (GTK_GRID (grid1), both_rb, 3, 1, 1, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
-
-
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(forward_rb), TRUE);
-
-#if 0
- /* if one direction is nok we don't allow saving
- XXX this is not ok since the user can click the refresh button and cause changes
- but we can not update this window. So we move all the decision on the time the ok
- button is clicked
- */
- if (user_data->forward.saved == FALSE) {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(reversed_rb), TRUE);
- gtk_widget_set_sensitive(forward_rb, FALSE);
- gtk_widget_set_sensitive(both_rb, FALSE);
- }
- else if (user_data->reversed.saved == FALSE) {
- gtk_widget_set_sensitive(reversed_rb, FALSE);
- gtk_widget_set_sensitive(both_rb, FALSE);
- }
- #endif
-
- /*g_object_set_data(G_OBJECT(user_data->dlg.save_voice_as_w), "wav_rb", wav_rb);*/
- g_object_set_data(G_OBJECT(user_data->dlg.save_voice_as_w), "au_rb", au_rb);
- /*g_object_set_data(G_OBJECT(user_data->dlg.save_voice_as_w), "sw_rb", sw_rb);*/
- g_object_set_data(G_OBJECT(user_data->dlg.save_voice_as_w), "raw_rb", raw_rb);
- g_object_set_data(G_OBJECT(user_data->dlg.save_voice_as_w), "forward_rb", forward_rb);
- g_object_set_data(G_OBJECT(user_data->dlg.save_voice_as_w), "reversed_rb", reversed_rb);
- g_object_set_data(G_OBJECT(user_data->dlg.save_voice_as_w), "both_rb", both_rb);
- g_object_set_data(G_OBJECT(user_data->dlg.save_voice_as_w), "user_data", user_data);
-
- g_signal_connect(user_data->dlg.save_voice_as_w, "delete_event",
- G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(user_data->dlg.save_voice_as_w, "destroy",
- G_CALLBACK(save_voice_as_destroy_cb), user_data);
-
- gtk_widget_show(user_data->dlg.save_voice_as_w);
- window_present(user_data->dlg.save_voice_as_w);
-
- /* "Run" the GtkFileChooserDialog. */
- /* Upon exit: If "Accept" run the OK callback. */
- /* If the OK callback returns with a FALSE status, re-run the dialog.*/
- /* Destroy the window. */
- /* XXX: If the OK callback pops up an alert box (eg: for an error) it *must* */
- /* return with a TRUE status so that the dialog window will be destroyed. */
- /* Trying to re-run the dialog after popping up an alert box will not work */
- /* since the user will not be able to dismiss the alert box. */
- /* The (somewhat unfriendly) effect: the user must re-invoke the */
- /* GtkFileChooserDialog whenever the OK callback pops up an alert box. */
- /* */
- /* ToDo: use GtkFileChooserWidget in a dialog window instead of */
- /* GtkFileChooserDialog. */
- while (gtk_dialog_run(GTK_DIALOG(user_data->dlg.save_voice_as_w)) == GTK_RESPONSE_ACCEPT) {
- if (save_voice_as_ok_cb(NULL, user_data->dlg.save_voice_as_w)) {
- break; /* we're done */
- }
- }
- window_destroy(user_data->dlg.save_voice_as_w);
-
-}
-
-
-/****************************************************************************/
-/* when we are finished with redisection, we add the label for the statistic */
-static void
-draw_stat(user_data_t *user_data)
-{
- gchar label_max[300];
- guint32 f_expected = (user_data->forward.statinfo.stop_seq_nr + user_data->forward.statinfo.cycles*65536)
- - user_data->forward.statinfo.start_seq_nr + 1;
- guint32 r_expected = (user_data->reversed.statinfo.stop_seq_nr + user_data->reversed.statinfo.cycles*65536)
- - user_data->reversed.statinfo.start_seq_nr + 1;
- guint32 f_total_nr = user_data->forward.statinfo.total_nr;
- guint32 r_total_nr = user_data->reversed.statinfo.total_nr;
- gint32 f_lost = f_expected - f_total_nr;
- gint32 r_lost = r_expected - r_total_nr;
- double f_sumt = user_data->forward.statinfo.sumt;
- double f_sumTS = user_data->forward.statinfo.sumTS;
- double f_sumt2 = user_data->forward.statinfo.sumt2;
- double f_sumtTS = user_data->forward.statinfo.sumtTS;
-
- double r_sumt = user_data->reversed.statinfo.sumt;
- double r_sumTS = user_data->reversed.statinfo.sumTS;
- double r_sumt2 = user_data->reversed.statinfo.sumt2;
- double r_sumtTS = user_data->reversed.statinfo.sumtTS;
- double f_perc, r_perc;
- double f_clock_drift = 1.0;
- double r_clock_drift = 1.0;
- double f_duration = user_data->forward.statinfo.time - user_data->forward.statinfo.start_time;
- double r_duration = user_data->reversed.statinfo.time - user_data->reversed.statinfo.start_time;
- guint32 f_clock_rate = user_data->forward.statinfo.clock_rate;
- guint32 r_clock_rate = user_data->reversed.statinfo.clock_rate;
-
- if (f_clock_rate == 0) {
- f_clock_rate = 1;
- }
-
- if (r_clock_rate == 0) {
- r_clock_rate = 1;
- }
-
- if (f_expected) {
- f_perc = (double)(f_lost*100)/(double)f_expected;
- } else {
- f_perc = 0;
- }
- if (r_expected) {
- r_perc = (double)(r_lost*100)/(double)r_expected;
- } else {
- r_perc = 0;
- }
-
- if ((f_total_nr >0) && (f_sumt2 > 0)) {
- f_clock_drift = (f_total_nr * f_sumtTS - f_sumt * f_sumTS) / (f_total_nr * f_sumt2 - f_sumt * f_sumt);
- }
- if ((r_total_nr >0) && (r_sumt2 > 0)) {
- r_clock_drift = (r_total_nr * r_sumtTS - r_sumt * r_sumTS) / (r_total_nr * r_sumt2 - r_sumt * r_sumt);
- }
- g_snprintf(label_max, sizeof(label_max), "Max delta = %.2f ms at packet no. %u \n"
- "Max jitter = %.2f ms. Mean jitter = %.2f ms.\n"
- "Max skew = %.2f ms.\n"
- "Total RTP packets = %u (expected %u) Lost RTP packets = %d (%.2f%%)"
- " Sequence errors = %u \n"
- "Duration %.2f s (%.0f ms clock drift, corresponding to %.0f Hz (%+.2f%%)",
- user_data->forward.statinfo.max_delta, user_data->forward.statinfo.max_nr,
- user_data->forward.statinfo.max_jitter, user_data->forward.statinfo.mean_jitter,
- user_data->forward.statinfo.max_skew,
- f_total_nr, f_expected, f_lost, f_perc,
- user_data->forward.statinfo.sequence,
- f_duration / 1000,
- f_duration * (f_clock_drift - 1.0),
- f_clock_drift * f_clock_rate,
- 100.0 * (f_clock_drift - 1.0));
-
- gtk_label_set_text(GTK_LABEL(user_data->dlg.label_stats_fwd), label_max);
- gtk_label_set_selectable (GTK_LABEL(user_data->dlg.label_stats_fwd), TRUE);
-
- g_snprintf(label_max, sizeof(label_max), "Max delta = %.2f ms at packet no. %u \n"
- "Max jitter = %.2f ms. Mean jitter = %.2f ms.\n"
- "Max skew = %.2f ms.\n"
- "Total RTP packets = %u (expected %u) Lost RTP packets = %d (%.2f%%)"
- " Sequence errors = %u \n"
- "Duration %.2f s (%.0f ms clock drift, corresponding to %.0f Hz (%+.2f%%)",
- user_data->reversed.statinfo.max_delta, user_data->reversed.statinfo.max_nr,
- user_data->reversed.statinfo.max_jitter, user_data->reversed.statinfo.mean_jitter,
- user_data->reversed.statinfo.max_skew,
- r_total_nr, r_expected, r_lost, r_perc,
- user_data->reversed.statinfo.sequence,
- r_duration / 1000,
- r_duration * (r_clock_drift - 1.0),
- r_clock_drift * r_clock_rate,
- 100.0 * (r_clock_drift - 1.0));
-
- gtk_label_set_text(GTK_LABEL(user_data->dlg.label_stats_rev), label_max);
- gtk_label_set_selectable (GTK_LABEL(user_data->dlg.label_stats_rev), TRUE);
-
- return ;
-}
-
-
-
-/****************************************************************************/
-/* append a line to list */
-static void
-add_to_list(GtkWidget *list, user_data_t * user_data, guint32 number, guint16 seq_num, guint32 timestamp,
- double delta, double jitter, double skew, double bandwidth, gchar *status, gboolean marker,
- gchar *timeStr, guint32 pkt_len, gchar *color_str, guint32 flags)
-{
- GtkListStore *list_store;
-
- if (strcmp(status, OK_TEXT) != 0) {
- user_data->dlg.number_of_nok++;
- }
-
- list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (list))); /* Get store */
-
- /* Creates a new row at position. iter will be changed to point to this new row.
- * If position is larger than the number of rows on the list, then the new row will be appended to the list.
- * The row will be filled with the values given to this function.
- * :
- * should generally be preferred when inserting rows in a sorted list store.
- */
- gtk_list_store_insert_with_values( list_store , &user_data->dlg.iter, G_MAXINT,
- PACKET_COLUMN, number,
- SEQUENCE_COLUMN, seq_num,
- TIMESTAMP_COLUMN, timestamp,
- DELTA_COLUMN, delta,
- JITTER_COLUMN, jitter,
- SKEW_COLUMN, skew,
- IPBW_COLUMN, bandwidth,
- MARKER_COLUMN, marker,
- STATUS_COLUMN, (char *)status,
- DATE_COLUMN, (char *)timeStr,
- LENGTH_COLUMN, pkt_len,
- FOREGROUND_COLOR_COL, NULL,
- BACKGROUND_COLOR_COL, (char *)color_str,
- -1);
-
- if (flags & STAT_FLAG_FIRST) {
- /* Set first row as active */
- gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(list)), &user_data->dlg.iter);
- }
-}
-
-/****************************************************************************
-* Functions needed to present values from the list
-*/
-
-
-/* Present boolean value */
-static void
-rtp_boolean_data_func (GtkTreeViewColumn *column _U_,
- GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer user_data)
-{
- gboolean bool_val;
- gchar buf[20];
- /* the col to get data from is in userdata */
- gint bool_col = GPOINTER_TO_INT(user_data);
-
- gtk_tree_model_get(model, iter, bool_col, &bool_val, -1);
-
- switch(bool_col) {
- case MARKER_COLUMN:
- g_strlcpy(buf, bool_val ? "SET" : "", sizeof(buf));
- break;
- default:
- g_assert_not_reached();
- break;
- }
- g_object_set(renderer, "text", buf, NULL);
-}
-
-/* Create list */
-static GtkWidget *
-create_list(user_data_t* user_data)
-{
-
- GtkListStore *list_store;
- GtkWidget *list;
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
- GtkTreeSortable *sortable;
- GtkTreeView *list_view;
- GtkTreeSelection *selection;
-
- /* Create the store */
- list_store = gtk_list_store_new(N_COLUMN, /* Total number of columns XXX */
- G_TYPE_UINT, /* Packet */
- G_TYPE_UINT, /* Sequence */
- G_TYPE_UINT, /* Time stamp */
- G_TYPE_FLOAT, /* Delta(ms) */
- G_TYPE_FLOAT, /* Filtered Jitter(ms) */
- G_TYPE_FLOAT, /* Skew(ms) */
- G_TYPE_FLOAT, /* IP BW(kbps) */
- G_TYPE_BOOLEAN, /* Marker */
- G_TYPE_STRING, /* Status */
- G_TYPE_STRING, /* Date */
- G_TYPE_UINT, /* Length */
- G_TYPE_STRING, /* Foreground color */
- G_TYPE_STRING); /* Background color */
-
- /* Create a view */
- list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
-
- list_view = GTK_TREE_VIEW(list);
- sortable = GTK_TREE_SORTABLE(list_store);
-
- /* Speed up the list display */
- gtk_tree_view_set_fixed_height_mode(list_view, TRUE);
-
- /* Setup the sortable columns */
- gtk_tree_sortable_set_sort_column_id(sortable, PACKET_COLUMN, GTK_SORT_ASCENDING);
- gtk_tree_view_set_headers_clickable(list_view, FALSE);
-
- /* The view now holds a reference. We can get rid of our own reference */
- g_object_unref (G_OBJECT (list_store));
-
- /*
- * Create the first column packet, associating the "text" attribute of the
- * cell_renderer to the first column of the model
- */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Packet", renderer,
- "text", PACKET_COLUMN,
- "foreground", FOREGROUND_COLOR_COL,
- "background", BACKGROUND_COLOR_COL,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, PACKET_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 55);
-
- /* Add the column to the view. */
- gtk_tree_view_append_column (list_view, column);
-
- /* Sequence. */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Sequence", renderer,
- "text", SEQUENCE_COLUMN,
- "foreground", FOREGROUND_COLOR_COL,
- "background", BACKGROUND_COLOR_COL,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, SEQUENCE_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 75);
- gtk_tree_view_append_column (list_view, column);
-
-#if 0
- Currently not visible
- /* Time stamp. */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Time stamp", renderer,
- "text", TIMESTAMP_COLUMN,
- "foreground", FOREGROUND_COLOR_COL,
- "background", BACKGROUND_COLOR_COL,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, TIMESTAMP_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 75);
- gtk_tree_view_append_column (list_view, column);
-#endif
- /* Delta(ms). */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Delta(ms)", renderer,
- "text", DELTA_COLUMN,
- "foreground", FOREGROUND_COLOR_COL,
- "background", BACKGROUND_COLOR_COL,
- NULL);
-
- gtk_tree_view_column_set_cell_data_func(column, renderer, float_data_func,
- GINT_TO_POINTER(DELTA_COLUMN), NULL);
-
- gtk_tree_view_column_set_sort_column_id(column, DELTA_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 75);
- gtk_tree_view_append_column (list_view, column);
-
- /* Jitter(ms). */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Filtered Jitter(ms)", renderer,
- "text", JITTER_COLUMN,
- "foreground", FOREGROUND_COLOR_COL,
- "background", BACKGROUND_COLOR_COL,
- NULL);
-
- gtk_tree_view_column_set_cell_data_func(column, renderer, float_data_func,
- GINT_TO_POINTER(JITTER_COLUMN), NULL);
-
- gtk_tree_view_column_set_sort_column_id(column, JITTER_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 110);
- gtk_tree_view_append_column (list_view, column);
-
- /* Skew(ms). */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Skew(ms)", renderer,
- "text", SKEW_COLUMN,
- "foreground", FOREGROUND_COLOR_COL,
- "background", BACKGROUND_COLOR_COL,
- NULL);
-
- gtk_tree_view_column_set_cell_data_func(column, renderer, float_data_func,
- GINT_TO_POINTER(SKEW_COLUMN), NULL);
-
- gtk_tree_view_column_set_sort_column_id(column, SKEW_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 110);
- gtk_tree_view_append_column (list_view, column);
-
- /* IP BW(kbps). */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("IP BW(kbps)", renderer,
- "text", IPBW_COLUMN,
- "foreground", FOREGROUND_COLOR_COL,
- "background", BACKGROUND_COLOR_COL,
- NULL);
-
- gtk_tree_view_column_set_cell_data_func(column, renderer, float_data_func,
- GINT_TO_POINTER(IPBW_COLUMN), NULL);
-
- gtk_tree_view_column_set_sort_column_id(column, IPBW_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 80);
- gtk_tree_view_append_column (list_view, column);
-
- /* Marker. */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Marker", renderer,
- "text", MARKER_COLUMN,
- "foreground", FOREGROUND_COLOR_COL,
- "background", BACKGROUND_COLOR_COL,
- NULL);
-
- gtk_tree_view_column_set_cell_data_func(column, renderer, rtp_boolean_data_func,
- GINT_TO_POINTER(MARKER_COLUMN), NULL);
-
- gtk_tree_view_column_set_sort_column_id(column, MARKER_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 60);
- gtk_tree_view_append_column (list_view, column);
-
- /* Status. */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ( "Status", renderer,
- "text", STATUS_COLUMN,
- "foreground", FOREGROUND_COLOR_COL,
- "background", BACKGROUND_COLOR_COL,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, STATUS_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 100);
- gtk_tree_view_append_column (list_view, column);
-
- /* Now enable the sorting of each column */
- gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(list_view), TRUE);
- gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(list_view), TRUE);
-
- /* Setup the selection handler */
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
-
- g_signal_connect (G_OBJECT (selection), "changed", /* select_row */
- G_CALLBACK (on_list_select_row),
- user_data);
- return list;
-}
-
-/****************************************************************************/
-/* Create the dialog box with all widgets */
-static void
-create_rtp_dialog(user_data_t* user_data)
-{
- GtkWidget *window;
- GtkWidget *list_fwd;
- GtkWidget *list_rev;
- GtkWidget *label_stats_fwd;
- GtkWidget *label_stats_rev;
- GtkWidget *notebook;
-
- GtkWidget *main_vb, *page, *page_r;
- GtkWidget *label;
- GtkWidget *scrolled_window, *scrolled_window_r/*, *frame, *text, *label4, *page_help*/;
- GtkWidget *box4, *voice_bt, *refresh_bt, *goto_bt, *close_bt, *csv_bt, *next_bt;
-#ifdef HAVE_LIBPORTAUDIO
- GtkWidget *player_bt;
-#endif /* HAVE_LIBPORTAUDIO */
- GtkWidget *graph_bt;
- gchar label_forward[200];
- gchar label_forward_tree[200];
- gchar label_reverse[200];
- char *src_addr, *dst_addr;
-
- window = dlg_window_new("Wireshark: RTP Stream Analysis"); /* transient_for top_level */
- gtk_window_set_default_size(GTK_WINDOW(window), 700, 400);
-
- /* Container for each row of widgets */
- main_vb =ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 2, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 2);
- gtk_container_add(GTK_CONTAINER(window), main_vb);
- gtk_widget_show(main_vb);
-
- /* Notebooks... */
- src_addr = address_to_display(NULL, &(user_data->src_fwd));
- dst_addr = address_to_display(NULL, &(user_data->dst_fwd));
- g_snprintf(label_forward, sizeof(label_forward),
- "Analysing stream from %s port %u to %s port %u SSRC = 0x%X",
- src_addr, user_data->port_src_fwd, dst_addr, user_data->port_dst_fwd, user_data->ssrc_fwd);
-
- g_snprintf(label_forward_tree, sizeof(label_forward_tree),
- "Analysing stream from %s port %u to %s port %u SSRC = 0x%X \n"
- "Note many things affects the accuracy of the analysis, use with caution",
- src_addr, user_data->port_src_fwd, dst_addr, user_data->port_dst_fwd, user_data->ssrc_fwd);
- wmem_free(NULL, src_addr);
- wmem_free(NULL, dst_addr);
-
- src_addr = address_to_display(NULL, &(user_data->src_rev));
- dst_addr = address_to_display(NULL, &(user_data->dst_rev));
- g_snprintf(label_reverse, sizeof(label_reverse),
- "Analysing stream from %s port %u to %s port %u SSRC = 0x%X \n"
- "Note many things affects the accuracy of the analysis, use with caution",
- src_addr, user_data->port_src_rev, dst_addr, user_data->port_dst_rev, user_data->ssrc_rev);
- wmem_free(NULL, src_addr);
- wmem_free(NULL, dst_addr);
-
- /* Start a notebook for flipping between sets of changes */
- notebook = gtk_notebook_new();
- gtk_box_pack_start(GTK_BOX(main_vb), notebook, TRUE, TRUE, 0);
- g_object_set_data(G_OBJECT(window), "notebook", notebook);
-
- user_data->dlg.notebook_signal_id =
- g_signal_connect(notebook, "switch_page", G_CALLBACK(on_notebook_switch_page), user_data);
-
- /* page for forward connection */
- page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 8, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(page), 8);
-
- /* direction label */
- label = gtk_label_new(label_forward);
- gtk_box_pack_start(GTK_BOX(page), label, FALSE, FALSE, 0);
-
- /* place for some statistics */
- label_stats_fwd = gtk_label_new("\n");
- gtk_box_pack_end(GTK_BOX(page), label_stats_fwd, FALSE, FALSE, 0);
-
- /* scrolled window */
- scrolled_window = scrolled_window_new(NULL, NULL);
-
- /* packet list */
- list_fwd = create_list(user_data);
- gtk_widget_show(list_fwd);
- gtk_container_add(GTK_CONTAINER(scrolled_window), list_fwd);
- gtk_box_pack_start(GTK_BOX(page), scrolled_window, TRUE, TRUE, 0);
- gtk_widget_show(scrolled_window);
-
- /* tab */
- label = gtk_label_new(" Forward Direction ");
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page, label);
-
- /* same page for reversed connection */
- page_r = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 8, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(page_r), 8);
- label = gtk_label_new(label_reverse);
- gtk_box_pack_start(GTK_BOX(page_r), label, FALSE, FALSE, 0);
- label_stats_rev = gtk_label_new("\n");
- gtk_box_pack_end(GTK_BOX(page_r), label_stats_rev, FALSE, FALSE, 0);
-
- scrolled_window_r = scrolled_window_new(NULL, NULL);
-
- list_rev = create_list(user_data);
- gtk_widget_show(list_rev);
- gtk_container_add(GTK_CONTAINER(scrolled_window_r), list_rev);
- gtk_box_pack_start(GTK_BOX(page_r), scrolled_window_r, TRUE, TRUE, 0);
- gtk_widget_show(scrolled_window_r);
-
- label = gtk_label_new(" Reversed Direction ");
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_r, label);
-
- /* page for help&about or future */
-#if 0
- page_help = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5, FALSE);
- label = gtk_label_new(" Future ");
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_help, label);
- frame = gtk_frame_new("");
- text = gtk_label_new("\n\nMaybe some more statistics: delta and jitter distribution, ...");
- gtk_label_set_justify(GTK_LABEL(text), GTK_JUSTIFY_LEFT);
- gtk_container_add(GTK_CONTAINER(frame), text);
- gtk_container_set_border_width(GTK_CONTAINER(frame), 20);
- gtk_box_pack_start(GTK_BOX(page_help), frame, TRUE, TRUE, 0);
-#endif
-
- /* show all notebooks */
- gtk_widget_show_all(notebook);
-
- /* buttons */
- box4 = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_start(GTK_BOX(main_vb), box4, FALSE, FALSE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(box4), 10);
- gtk_button_box_set_layout(GTK_BUTTON_BOX (box4), GTK_BUTTONBOX_EDGE);
- gtk_box_set_spacing(GTK_BOX (box4), 0);
- gtk_widget_show(box4);
-
- voice_bt = gtk_button_new_with_label("Save payload...");
- gtk_container_add(GTK_CONTAINER(box4), voice_bt);
- gtk_widget_show(voice_bt);
- g_signal_connect(voice_bt, "clicked", G_CALLBACK(on_save_bt_clicked), user_data);
-
- csv_bt = gtk_button_new_with_label("Save as CSV...");
- gtk_container_add(GTK_CONTAINER(box4), csv_bt);
- gtk_widget_show(csv_bt);
- g_signal_connect(csv_bt, "clicked", G_CALLBACK(save_csv_as_cb), user_data);
-
- refresh_bt = ws_gtk_button_new_from_stock(GTK_STOCK_REFRESH);
- gtk_container_add(GTK_CONTAINER(box4), refresh_bt);
- gtk_widget_show(refresh_bt);
- g_signal_connect(refresh_bt, "clicked", G_CALLBACK(on_refresh_bt_clicked), user_data);
-
- goto_bt = ws_gtk_button_new_from_stock(GTK_STOCK_JUMP_TO);
- gtk_container_add(GTK_CONTAINER(box4), goto_bt);
- gtk_widget_show(goto_bt);
- g_signal_connect(goto_bt, "clicked", G_CALLBACK(on_goto_bt_clicked_lst), user_data);
-
- graph_bt = gtk_button_new_with_label("Graph");
- gtk_container_add(GTK_CONTAINER(box4), graph_bt);
- gtk_widget_show(graph_bt);
- g_signal_connect(graph_bt, "clicked", G_CALLBACK(on_graph_bt_clicked), user_data);
-
-#ifdef HAVE_LIBPORTAUDIO
- player_bt = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_AUDIO_PLAYER);
- gtk_container_add(GTK_CONTAINER(box4), player_bt);
- gtk_widget_show(player_bt);
- g_signal_connect(player_bt, "clicked", G_CALLBACK(on_player_bt_clicked), NULL);
- /*gtk_widget_set_tooltip_text (player_bt, "Launch the RTP player to listen the audio stream");*/
-#endif /* HAVE_LIBPORTAUDIO */
-
- next_bt = gtk_button_new_with_label("Next non-Ok");
- gtk_container_add(GTK_CONTAINER(box4), next_bt);
- gtk_widget_show(next_bt);
- g_signal_connect(next_bt, "clicked", G_CALLBACK(on_next_bt_clicked_list), user_data);
-
- close_bt = ws_gtk_button_new_from_stock(GTK_STOCK_CLOSE);
- gtk_container_add(GTK_CONTAINER(box4), close_bt);
- gtk_widget_set_can_default(close_bt, TRUE);
- gtk_widget_show(close_bt);
- window_set_cancel_button(window, close_bt, window_cancel_button_cb);
-
- g_signal_connect(window, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(window, "destroy", G_CALLBACK(on_destroy), user_data);
-
- gtk_widget_show(window);
- window_present(window);
-
-
- /* some widget references need to be saved for outside use */
- user_data->dlg.window = window;
- user_data->dlg.list_fwd = list_fwd;
- user_data->dlg.list_rev = list_rev;
- user_data->dlg.label_stats_fwd = label_stats_fwd;
- user_data->dlg.label_stats_rev = label_stats_rev;
- user_data->dlg.notebook = notebook;
- user_data->dlg.selected_list = list_fwd;
- user_data->dlg.number_of_nok = 0;
-
- /*
- * select the initial row
- */
- gtk_widget_grab_focus(list_fwd);
-
-}
-
-
-/****************************************************************************/
-void
-rtp_analysis(address *src_fwd,
- guint32 port_src_fwd,
- address *dst_fwd,
- guint32 port_dst_fwd,
- guint32 ssrc_fwd,
- address *src_rev,
- guint32 port_src_rev,
- address *dst_rev,
- guint32 port_dst_rev,
- guint32 ssrc_rev)
-{
- user_data_t *user_data;
- int fd;
- int i;
- static GdkColor col[MAX_GRAPHS] = {
- {0, 0x0000, 0x0000, 0x0000}, /* Black */
- {0, 0xffff, 0x0000, 0x0000}, /* Red */
- {0, 0x0000, 0xffff, 0x0000}, /* Green */
- {0, 0xdddd, 0xcccc, 0x6666}, /* Light amber yellow */
- {0, 0x6666, 0xcccc, 0xdddd}, /* Light bluish cyan */
- {0, 0x0000, 0x0000, 0xffff} /* Blue */
- };
- static GdkRGBA rgba_col[MAX_GRAPHS] = {
- {0.0, 0.0, 0.0, 1.0}, /* Black */
- {1.0, 0.0, 0.1, 1.0}, /* Red */
- {0.0, 1.0, 0.0, 1.0}, /* Green */
- {0.867, 0.800, 0.400, 1.0}, /* Light amber yellow */
- {0.400, 0.800, 0.867, 1.0}, /* Light bluish cyan */
- {0.0, 0.0, 1.0, 1.0}, /* Blue */
- };
-
- char *tempname;
-
- /* init */
- user_data = (user_data_t *)g_malloc(sizeof(user_data_t));
-
- copy_address(&(user_data->src_fwd), src_fwd);
- user_data->port_src_fwd = port_src_fwd;
- copy_address(&(user_data->dst_fwd), dst_fwd);
- user_data->port_dst_fwd = port_dst_fwd;
- user_data->ssrc_fwd = ssrc_fwd;
- copy_address(&(user_data->src_rev), src_rev);
- user_data->port_src_rev = port_src_rev;
- copy_address(&(user_data->dst_rev), dst_rev);
- user_data->port_dst_rev = port_dst_rev;
- user_data->ssrc_rev = ssrc_rev;
-
-
- /* file names for storing sound data */
- fd = create_tempfile(&tempname, "wireshark_rtp_f", NULL);
- if (fd < 0) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't create temporary file for RTP analysis:\n%s.",
- g_strerror(errno));
- g_free(user_data);
- return;
- }
- user_data->f_tempname = g_strdup(tempname);
- ws_close(fd);
- fd = create_tempfile(&tempname, "wireshark_rtp_r", NULL);
- if (fd < 0) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't create temporary file for RTP analysis:\n%s.",
- g_strerror(errno));
- g_free(user_data->f_tempname);
- g_free(user_data);
- return;
- }
- user_data->r_tempname = g_strdup(tempname);
- ws_close(fd);
- user_data->forward.saveinfo.fp = NULL;
- user_data->reversed.saveinfo.fp = NULL;
- user_data->dlg.save_voice_as_w = NULL;
- user_data->dlg.save_csv_as_w = NULL;
- user_data->dlg.dialog_graph.window = NULL;
-
- /* init dialog_graph */
- user_data->dlg.dialog_graph.needs_redraw = TRUE;
- user_data->dlg.dialog_graph.interval = tick_interval_values[DEFAULT_TICK_VALUE_INDEX];
- user_data->dlg.dialog_graph.draw_area = NULL;
-#if GTK_CHECK_VERSION(2,22,0)
- user_data->dlg.dialog_graph.surface = NULL;
-#else
- user_data->dlg.dialog_graph.pixmap = NULL;
-#endif
- user_data->dlg.dialog_graph.scrollbar = NULL;
- user_data->dlg.dialog_graph.scrollbar_adjustment = NULL;
- user_data->dlg.dialog_graph.surface_width = 500;
- user_data->dlg.dialog_graph.surface_height = 200;
- user_data->dlg.dialog_graph.pixels_per_tick = pixels_per_tick[DEFAULT_PIXELS_PER_TICK_INDEX];
- user_data->dlg.dialog_graph.max_y_units = AUTO_MAX_YSCALE;
- user_data->dlg.dialog_graph.last_interval = 0xffffffff;
- user_data->dlg.dialog_graph.max_interval = 0;
- user_data->dlg.dialog_graph.num_items = 0;
- user_data->dlg.dialog_graph.start_time = -1;
-
- for (i = 0; i < MAX_GRAPHS; i++) {
- user_data->dlg.dialog_graph.graph[i].color.pixel = 0;
- user_data->dlg.dialog_graph.graph[i].color.red = col[i].red;
- user_data->dlg.dialog_graph.graph[i].color.green = col[i].green;
- user_data->dlg.dialog_graph.graph[i].color.blue = col[i].blue;
- user_data->dlg.dialog_graph.graph[i].rgba_color.red = rgba_col[i].red;
- user_data->dlg.dialog_graph.graph[i].rgba_color.green = rgba_col[i].green;
- user_data->dlg.dialog_graph.graph[i].rgba_color.blue = rgba_col[i].blue;
- user_data->dlg.dialog_graph.graph[i].rgba_color.alpha = rgba_col[i].alpha;
- user_data->dlg.dialog_graph.graph[i].display = TRUE;
- user_data->dlg.dialog_graph.graph[i].display_button = NULL;
- user_data->dlg.dialog_graph.graph[i].ud = user_data;
- }
-
- /* create the dialog box */
- create_rtp_dialog(user_data);
-
- /* proceed as if the Refresh button would have been pressed */
- on_refresh_bt_clicked(NULL, user_data);
-}
-
-/****************************************************************************/
-/* entry point from main menu */
-void
-rtp_analysis_cb(GtkAction *action _U_, gpointer user_data _U_)
-{
- address src_fwd;
- guint32 port_src_fwd;
- address dst_fwd;
- guint32 port_dst_fwd;
- guint32 ssrc_fwd = 0;
- address src_rev;
- guint32 port_src_rev;
- address dst_rev;
- guint32 port_dst_rev;
- guint32 ssrc_rev = 0;
- GPtrArray *gp;
-
- const gchar filter_text[] = "rtp && rtp.version == 2 && rtp.ssrc && (ip || ipv6)";
- dfilter_t *sfcode;
- gchar *err_msg;
- capture_file *cf;
- frame_data *fdata;
- GList *strinfo_list;
- GList *filtered_list = NULL;
- guint nfound;
- epan_dissect_t edt;
- int hfid_rtp_ssrc;
- rtp_stream_info_t *strinfo;
-
- /* Try to get the hfid for "rtp.ssrc". */
- hfid_rtp_ssrc = proto_registrar_get_id_byname("rtp.ssrc");
- if (hfid_rtp_ssrc == -1) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "There is no \"rtp.ssrc\" field in this version of Wireshark.");
- return;
- }
-
- /* Try to compile the filter. */
- if (!dfilter_compile(filter_text, &sfcode, &err_msg)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg);
- g_free(err_msg);
- return;
- }
- /* we load the current file into cf variable */
- cf = &cfile;
- fdata = cf->current_frame;
-
- /* we are on the selected frame now */
- if (fdata == NULL)
- return; /* if we exit here it's an error */
-
- /* dissect the current record */
- if (!cf_read_record(cf, fdata))
- return; /* error reading the record */
- epan_dissect_init(&edt, cf->epan, TRUE, FALSE);
- epan_dissect_prime_with_dfilter(&edt, sfcode);
- epan_dissect_prime_with_hfid(&edt, hfid_rtp_ssrc);
- epan_dissect_run(&edt, cf->cd_t, &cf->rec,
- frame_tvbuff_new_buffer(&cf->provider, fdata, &cf->buf),
- fdata, NULL);
-
- /*
- * Packet must be an RTPv2 packet with an SSRC; we use the filter to
- * check.
- */
- if (!dfilter_apply_edt(sfcode, &edt)) {
- epan_dissect_cleanup(&edt);
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Please select an RTPv2 packet with an SSID.");
- return;
- }
-
- /* ok, it is a RTP frame, so let's get the ip and port values */
- copy_address(&(src_fwd), &(edt.pi.src));
- copy_address(&(dst_fwd), &(edt.pi.dst));
- port_src_fwd = edt.pi.srcport;
- port_dst_fwd = edt.pi.destport;
-
- /* assume the inverse ip/port combination for the reverse direction */
- copy_address(&(src_rev), &(edt.pi.dst));
- copy_address(&(dst_rev), &(edt.pi.src));
- port_src_rev = edt.pi.destport;
- port_dst_rev = edt.pi.srcport;
-
- /* now we need the SSRC value of the current frame */
- gp = proto_get_finfo_ptr_array(edt.tree, hfid_rtp_ssrc);
- if (gp == NULL || gp->len == 0) {
- /* XXX - should not happen, as the filter inculdes rtp.ssrc */
- epan_dissect_cleanup(&edt);
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "SSRC value not found.");
- return;
- }
- ssrc_fwd = fvalue_get_uinteger(&((field_info *)gp->pdata[0])->value);
-
- /* Scan for rtpstream */
- rtpstream_scan(rtpstream_dlg_get_tapinfo(), &cfile, NULL);
- /* search for reversed direction in the global rtp streams list */
- nfound = 0;
- strinfo_list = g_list_first(rtpstream_dlg_get_tapinfo()->strinfo_list);
- while (strinfo_list)
- {
- strinfo = (rtp_stream_info_t*)(strinfo_list->data);
- if (addresses_equal(&(strinfo->src_addr), &(src_fwd))
- && (strinfo->src_port == port_src_fwd)
- && (addresses_equal(&(strinfo->dest_addr), &(dst_fwd)))
- && (strinfo->dest_port == port_dst_fwd))
- {
- filtered_list = g_list_prepend(filtered_list, strinfo);
- }
-
- if (addresses_equal(&(strinfo->src_addr), &(src_rev))
- && (strinfo->src_port == port_src_rev)
- && (addresses_equal(&(strinfo->dest_addr), &(dst_rev)))
- && (strinfo->dest_port == port_dst_rev))
- {
- ++nfound;
- filtered_list = g_list_append(filtered_list, strinfo);
- if (ssrc_rev == 0)
- ssrc_rev = strinfo->ssrc;
- }
-
- strinfo_list = g_list_next(strinfo_list);
- }
-
- /* if more than one reverse streams found, we let the user choose the right one */
- if (nfound>1) {
- rtpstream_dlg_show(filtered_list);
- return;
- }
- else {
- rtp_analysis(
- &src_fwd,
- port_src_fwd,
- &dst_fwd,
- port_dst_fwd,
- ssrc_fwd,
- &src_rev,
- port_src_rev,
- &dst_rev,
- port_dst_rev,
- ssrc_rev
- );
- }
-}
-
-/****************************************************************************/
-static void
-rtp_analysis_init(const char *dummy _U_, void *userdata _U_)
-{
- rtp_analysis_cb(NULL, NULL);
-}
-
-/****************************************************************************/
-static stat_tap_ui rtp_analysis_ui = {
- REGISTER_STAT_GROUP_GENERIC,
- NULL,
- "rtp",
- rtp_analysis_init,
- 0,
- NULL
-};
-
-void
-register_tap_listener_rtp_analysis(void)
-{
- register_stat_tap_ui(&rtp_analysis_ui, NULL);
-}
-
-/*
- * Editor modelines - http://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/gtk/rtp_player.c b/ui/gtk/rtp_player.c
deleted file mode 100644
index 7b89901b90..0000000000
--- a/ui/gtk/rtp_player.c
+++ /dev/null
@@ -1,2516 +0,0 @@
- /* rtp_player.c
- *
- * Copyright 2006, Alejandro Vaquero <alejandrovaquero@yahoo.com>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1999 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/*
- * Here is a summary on how this works:
- * - The VoipCalls will call add_rtp_packet() every time there is an RTP
- * packet
- * - add_rtp_packet() will add the RTP packet in a RTP stream struct, and
- * create the RTP stream if it is the first RTP packet in the stream.
- * - Each new RTP stream will be added to a list of RTP streams, called
- * rtp_streams_list
- * - When the user clicks "Player" in the VoipCall dialogue,
- * rtp_player_init() is called.
- * - rtp_player_init() creates the main dialog, and it calls:
- * + mark_rtp_stream_to_play() to mark the RTP streams that needs to be
- * displayed. These are the RTP streams that match the selected calls in
- * the VoipCall dlg.
- * + decode_rtp_stream() this will decode the RTP packets in each RTP
- * stream, and will also create the RTP channels. An RTP channel is a
- * group of RTP streams that have in common the source and destination
- * IP and UDP ports. The RTP channels is what the user will listen in
- * one of the two Audio channels.
- * The RTP channels are stored in the hash table rtp_channels_hash
- * + add_channel_to_window() will create and add the Audio graphic
- * representation in the main window
- * - When the user clicks the check box to listen one of the Audio channels,
- * the structure rtp_channels is filled to play one or two RTP channels
- * (a max of two channels can be listened at a given moment)
- */
-
-
-#include "config.h"
-
-#ifdef HAVE_LIBPORTAUDIO
-#include <math.h>
-#include <string.h>
-#include <portaudio.h>
-#include <assert.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/stats_tree.h>
-#include <epan/addr_resolv.h>
-#include <epan/dissectors/packet-rtp.h>
-#include <epan/rtp_pt.h>
-#include <epan/prefs.h>
-#include <wsutil/report_message.h>
-
-#include "globals.h"
-
-#include "ui/rtp_media.h"
-#include "ui/rtp_stream.h"
-#include "ui/simple_dialog.h"
-#include "ui/voip_calls.h"
-
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/graph_analysis.h"
-#include "ui/gtk/voip_calls_dlg.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/rtp_player.h"
-#include "ui/gtk/stock_icons.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-static gboolean initialized = FALSE;
-
-static voip_calls_tapinfo_t *voip_calls = NULL;
-
-/* Hash table with all the RTP streams */
-static GHashTable* rtp_streams_hash = NULL;
-
-/* List with all the RTP streams (this is used to decode them as it is sorted)*/
-static GList* rtp_streams_list = NULL;
-
-/* the window */
-static GtkWidget *rtp_player_dlg_w;
-static GtkWidget *channels_vb;
-static GtkWidget *main_scrolled_window = NULL;
-static GtkWidget *jitter_spinner;
-static GtkWidget *cb_use_jitter_buffer;
-static GtkWidget *cb_use_rtp_timestamp;
-static GtkWidget *cb_use_uninterrupted_mode;
-static GtkWidget *cb_view_as_time_of_day;
-static GtkWidget *bt_decode;
-static GtkWidget *bt_play;
-static GtkWidget *bt_pause;
-static GtkWidget *bt_stop;
-static GtkWidget *progress_bar;
-static GtkWidget *info_bar;
-static GtkWidget *stat_hbox;
-
-static guint32 total_packets;
-static guint32 total_frames;
-static guint32 progbar_count;
-
-static int new_jitter_buff;
-
-/* a hash table with the RTP streams to play per audio channel */
-static GHashTable *rtp_channels_hash = NULL;
-
-static unsigned sample_rate = 8000;
-static unsigned channels = 1;
-
-/* Port Audio stuff */
-static unsigned output_channels = 2;
-
-#define PA_SAMPLE_TYPE paInt16
-#define SAMPLE_SILENCE (0)
-#define FRAMES_PER_BUFFER (512)
-
-typedef struct _sample_t {
- SAMPLE val;
- guint8 status;
-} sample_t;
-
-#define S_NORMAL 0
-#define S_DROP_BY_JITT 1
-#define S_WRONG_SEQ 2
-#define S_WRONG_TIMESTAMP 3 /* The timestamp does not reflect the number of samples - samples have been dropped or silence inserted to match timestamp */
-#define S_SILENCE 4 /* Silence inserted by Wireshark, rather than contained in a packet */
-
-/* Display channels constants */
-#define MULT 80
-#define CHANNEL_WIDTH 500
-#define CHANNEL_HEIGHT 100
-#define MAX_TIME_LABEL 10
-#define HEIGHT_TIME_LABEL 18
-#define MAX_NUM_COL_CONV 10
-
-#if PORTAUDIO_API_1
-static PortAudioStream *pa_stream;
-#else /* PORTAUDIO_API_1 */
-static PaStream *pa_stream;
-#endif /* PORTAUDIO_API_1 */
-
-/* defines the RTP streams to be played in an audio channel */
-typedef struct _rtp_channel_info {
- nstime_t start_time_abs;
- nstime_t stop_time_abs;
- GArray *samples; /* Array of sample_t (decoded audio) */
- guint16 call_num;
- gboolean selected;
- unsigned long frame_index;
- guint32 drop_by_jitter_buff;
- guint32 out_of_seq;
- guint32 wrong_timestamp;
- guint32 max_frame_index;
- GtkWidget *check_bt;
- GtkWidget *separator;
- GtkWidget *scroll_window;
- GtkWidget *draw_area;
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_surface_t *surface;
-#else
- GdkPixmap *pixmap;
-#endif
- GtkAdjustment *h_scrollbar_adjustment;
- GdkPixbuf* cursor_pixbuf;
-#if PORTAUDIO_API_1
- PaTimestamp cursor_prev;
-#else /* PORTAUDIO_API_1 */
- PaTime cursor_prev;
-#endif /* PORTAUDIO_API_1 */
- GdkRGBA bg_color[MAX_NUM_COL_CONV+1];
- gboolean cursor_catch;
- rtp_stream_info_t *first_stream; /* This is the first RTP stream in the channel */
- guint32 num_packets;
-} rtp_channel_info_t;
-
-/* defines the two RTP channels to be played */
-typedef struct _rtp_play_channels {
- rtp_channel_info_t* rci[2]; /* Channels to be played */
- guint32 start_index[2];
- guint32 end_index[2];
- int channel;
- guint32 max_frame_index;
- unsigned long frame_index;
- gboolean pause;
- gboolean stop;
- unsigned long pause_duration;
-#if PORTAUDIO_API_1
- PaTimestamp out_diff_time;
-#else /* PORTAUDIO_API_1 */
- PaTime out_diff_time;
- PaTime pa_start_time;
-#endif /* PORTAUDIO_API_1 */
-} rtp_play_channels_t;
-
-/* The two RTP channels to play */
-static rtp_play_channels_t *rtp_channels = NULL;
-
-
-typedef struct _data_info {
- int current_channel;
-} data_info;
-
-/****************************************************************************/
-static void
-rtp_key_destroy(gpointer key)
-{
- g_free(key);
- key = NULL;
-}
-
-/****************************************************************************/
-static void
-rtp_channel_value_destroy(gpointer rci_arg)
-{
- rtp_channel_info_t *rci = (rtp_channel_info_t *)rci_arg;
-
- g_array_free(rci->samples, TRUE);
- g_free(rci);
- rci = NULL;
-}
-
-/****************************************************************************/
-static void
-rtp_stream_value_destroy(gpointer rsi_arg)
-{
- rtp_stream_info_t *rsi = (rtp_stream_info_t *)rsi_arg;
- GList* rtp_packet_list;
- rtp_packet_t *rp;
-
- rtp_packet_list = g_list_first(rsi->rtp_packet_list);
- while (rtp_packet_list)
- {
- rp = (rtp_packet_t *)rtp_packet_list->data;
-
- g_free(rp->info);
- g_free(rp->payload_data);
- g_free(rp);
- rp = NULL;
-
- rtp_packet_list = g_list_next(rtp_packet_list);
- }
- free_address(&rsi->src_addr);
- free_address(&rsi->dest_addr);
- g_free(rsi);
- rsi = NULL;
-}
-
-/****************************************************************************/
-static void
-set_sensitive_check_bt(gchar *key _U_ , rtp_channel_info_t *rci, guint *stop_p )
-{
- gtk_widget_set_sensitive(rci->check_bt, !(*stop_p));
-}
-
-/****************************************************************************/
-static void
-bt_state(gboolean decode, gboolean play_state, gboolean pause_state, gboolean stop_state)
-{
- gboolean new_jitter_value = FALSE;
- gboolean false_val = FALSE;
-
- gtk_widget_set_sensitive(bt_decode, decode);
- gtk_widget_set_sensitive(cb_use_jitter_buffer, decode);
- gtk_widget_set_sensitive(cb_use_rtp_timestamp, decode);
- gtk_widget_set_sensitive(cb_use_uninterrupted_mode, decode);
- gtk_widget_set_sensitive(cb_view_as_time_of_day, decode);
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cb_use_jitter_buffer))) {
- gtk_widget_set_sensitive(jitter_spinner, decode);
- } else {
- gtk_widget_set_sensitive(jitter_spinner, FALSE);
- }
-
- if (new_jitter_buff != (int) gtk_spin_button_get_value((GtkSpinButton * )jitter_spinner)) {
- new_jitter_value = TRUE;
- }
-
- /* set the sensitive state of play only if there is a channel selected */
- if ( play_state && (rtp_channels->rci[0] || rtp_channels->rci[1]) && !new_jitter_value) {
- gtk_widget_set_sensitive(bt_play, TRUE);
- } else {
- gtk_widget_set_sensitive(bt_play, FALSE);
- }
-
- if (!new_jitter_value) {
- gtk_widget_set_sensitive(bt_pause, pause_state);
- gtk_widget_set_sensitive(bt_stop, stop_state);
-
- /* Set sensitive to the check buttons based on the STOP state */
- if (rtp_channels_hash)
- g_hash_table_foreach( rtp_channels_hash, (GHFunc)set_sensitive_check_bt, &stop_state);
- } else {
- gtk_widget_set_sensitive(bt_pause, FALSE);
- gtk_widget_set_sensitive(bt_stop, FALSE);
-
- if (rtp_channels_hash)
- g_hash_table_foreach( rtp_channels_hash, (GHFunc)set_sensitive_check_bt, &false_val);
- }
-}
-
-/****************************************************************************/
-void
-add_rtp_packet(const struct _rtp_info *rtp_info, packet_info *pinfo)
-{
- rtp_stream_info_t *stream_info = NULL;
- rtp_packet_t *new_rtp_packet;
- GString *key_str = NULL;
-
- /* create the streams hash if it doen't exist */
- if (!rtp_streams_hash)
- rtp_streams_hash = g_hash_table_new_full( g_str_hash, g_str_equal, rtp_key_destroy, rtp_stream_value_destroy);
-
- /* Create a hash key to lookup in the RTP streams hash table
- * uses: src_ip:src_port dst_ip:dst_port ssrc
- */
- key_str = g_string_new("");
- g_string_printf(key_str, "%s:%d %s:%d %d", address_to_display(pinfo->pool, &(pinfo->src)),
- pinfo->srcport, address_to_display(pinfo->pool, &(pinfo->dst)),
- pinfo->destport, rtp_info->info_sync_src );
-
- /* lookup for this RTP packet in the stream hash table */
- stream_info = (rtp_stream_info_t *)g_hash_table_lookup( rtp_streams_hash, key_str->str);
-
- /* if it is not in the hash table, create a new stream */
- if (stream_info==NULL) {
- stream_info = g_new0(rtp_stream_info_t, 1);
- copy_address(&(stream_info->src_addr), &(pinfo->src));
- stream_info->src_port = pinfo->srcport;
- copy_address(&(stream_info->dest_addr), &(pinfo->dst));
- stream_info->dest_port = pinfo->destport;
- stream_info->ssrc = rtp_info->info_sync_src;
- stream_info->start_fd = pinfo->fd;
- stream_info->start_rel_time = pinfo->rel_ts;
-
- g_hash_table_insert(rtp_streams_hash, g_strdup(key_str->str), stream_info);
-
- /* Add the element to the List too. The List is used to decode the packets because it is sorted */
- rtp_streams_list = g_list_append(rtp_streams_list, stream_info);
- }
-
- /* increment the number of packets in this stream, this is used for the progress bar and statistics */
- stream_info->packet_count++;
-
- /* Add the RTP packet to the list */
- new_rtp_packet = g_new0(rtp_packet_t, 1);
- new_rtp_packet->info = (struct _rtp_info *)g_malloc(sizeof(struct _rtp_info));
-
- memcpy(new_rtp_packet->info, rtp_info, sizeof(struct _rtp_info));
- new_rtp_packet->arrive_offset = nstime_to_msec(&pinfo->rel_ts) - nstime_to_msec(&stream_info->start_rel_time);
- /* copy the RTP payload to the rtp_packet to be decoded later */
- if (rtp_info->info_all_data_present && (rtp_info->info_payload_len != 0)) {
- new_rtp_packet->payload_data = (guint8 *)g_malloc(rtp_info->info_payload_len);
- memcpy(new_rtp_packet->payload_data, &(rtp_info->info_data[rtp_info->info_payload_offset]), rtp_info->info_payload_len);
- } else {
- new_rtp_packet->payload_data = NULL;
- }
-
- stream_info->rtp_packet_list = g_list_append(stream_info->rtp_packet_list, new_rtp_packet);
-
- g_string_free(key_str, TRUE);
-}
-
-/****************************************************************************/
-/* Mark the RTP stream to be played. Use the voip_calls graph to see if the
- * setup_frame is there and then if the associated voip_call is selected.
- */
-static void
-mark_rtp_stream_to_play(gchar *key _U_ , rtp_stream_info_t *rsi, gpointer ptr _U_)
-{
- GList* graph_list;
- seq_analysis_item_t *graph_item;
- GList* voip_calls_list;
- voip_calls_info_t *tmp_voip_call;
-
- /* Reset the "to be play" value because the user can close and reopen the RTP Player window
- * and the streams are not reset in that case
- */
- rsi->decode = FALSE;
-
- /* RTP_STREAM_DEBUG("call num: %u, start frame: %u, ssrc: 0x%x, packets: %u, %d voip calls", rsi->call_num, rsi->start_fd->num, rsi->ssrc, rsi->packet_count, voip_calls->ncalls); */
-
- /* and associate the RTP stream with a call using the first RTP packet in the stream */
- graph_list = g_queue_peek_nth_link(voip_calls->graph_analysis->items, 0);
- while (graph_list)
- {
- graph_item = (seq_analysis_item_t *)graph_list->data;
- if (rsi->start_fd->num == graph_item->frame_number) {
- rsi->call_num = graph_item->conv_num;
- /* if it is in the graph list, then check if the voip_call is selected */
- voip_calls_list = g_queue_peek_nth_link(voip_calls->callsinfos, 0);
- while (voip_calls_list)
- {
- tmp_voip_call = (voip_calls_info_t *)voip_calls_list->data;
- if ( (tmp_voip_call->call_num == rsi->call_num) && (tmp_voip_call->selected == TRUE) ) {
- /* RTP_STREAM_DEBUG("decoding call %u", rsi->call_num); */
- rsi->decode = TRUE;
- total_packets += rsi->packet_count;
- break;
- }
- voip_calls_list = g_list_next(voip_calls_list);
- }
- break;
- }
- graph_list = g_list_next(graph_list);
- }
-}
-
-/****************************************************************************/
-/* Mark the ALL RTP stream to be played. This is called when calling the
- * RTP player from the "RTP Analysis" window
- */
-static void
-mark_all_rtp_stream_to_decode(gchar *key _U_ , rtp_stream_info_t *rsi, gpointer ptr _U_)
-{
- rsi->decode = TRUE;
- total_packets += rsi->packet_count;
-}
-
-/****************************************************************************/
-static void
-update_progress_bar(gfloat fraction)
-{
-
- if (GTK_IS_PROGRESS_BAR(progress_bar))
- gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress_bar), fraction);
-
- /* Force gtk to redraw the window before starting decoding the packet */
- while (gtk_events_pending())
- gtk_main_iteration();
-}
-
-/****************************************************************************/
-/* Decode the RTP streams and add them to the RTP channels struct
- */
-static void
-decode_rtp_stream(rtp_stream_info_t *rsi, gpointer ptr)
-{
- GString *key_str = NULL;
- rtp_channel_info_t *rci;
- gboolean first = TRUE;
- GList* rtp_packet_list;
- rtp_packet_t *rp;
-
- size_t i;
- gint32 j;
- double rtp_time;
- double rtp_time_prev;
- double arrive_time;
- double arrive_time_prev;
- double start_time;
- double start_rtp_time = 0;
- double diff;
- double pack_period;
- gint32 silence_frames;
- int seq;
-#ifdef DEBUG /* XXX: "mean_delay" and "variation" are always zero */
- double total_time;
- double mean_delay;
- double variation;
-#endif
- char *src_addr, *dst_addr;
-
- size_t decoded_bytes;
- size_t decoded_bytes_prev;
- int jitter_buff;
- SAMPLE *out_buff = NULL;
- sample_t silence;
- sample_t sample;
- nstime_t sample_delta;
- guint8 status;
- guint32 start_timestamp;
- GHashTable *decoders_hash = NULL;
-
- guint32 progbar_nextstep;
- int progbar_quantum;
- gfloat progbar_val;
- data_info *info = (data_info *) ptr;
-
- silence.val = 0;
- silence.status = S_NORMAL;
-
- /* skip it if we are not going to play it */
- if (rsi->decode == FALSE) {
- return;
- }
-
- /* get the static jitter buffer from the spinner gui */
- jitter_buff = (int) gtk_spin_button_get_value((GtkSpinButton * )jitter_spinner);
-
- /* Create a hash key to lookup in the RTP channels hash
- * uses: src_ip:src_port dst_ip:dst_port call_num
- */
- key_str = g_string_new("");
- src_addr = address_to_display(NULL, &(rsi->src_addr));
- dst_addr = address_to_display(NULL, &(rsi->dest_addr));
- g_string_printf(key_str, "%s:%d %s:%d %d %u", src_addr,
- rsi->src_port, dst_addr,
- rsi->dest_port, rsi->call_num, info->current_channel);
- wmem_free(NULL, src_addr);
- wmem_free(NULL, dst_addr);
- /* RTP_STREAM_DEBUG("decoding stream %s, ssrc 0x%x, %d packets", key_str->str, rsi->ssrc, rsi->packet_count); */
-
- /* create the rtp_channels_hash table if it doesn't exist */
- if (!rtp_channels_hash) {
- rtp_channels_hash = g_hash_table_new_full( g_str_hash, g_str_equal, rtp_key_destroy, rtp_channel_value_destroy);
- }
-
- /* lookup for this stream in the channel hash table */
- rci = (rtp_channel_info_t *)g_hash_table_lookup( rtp_channels_hash, key_str->str);
-
- /* ..if it is not in the hash, create an entry */
- if (rci == NULL) {
- rci = g_new0(rtp_channel_info_t, 1);
- rci->call_num = rsi->call_num;
- rci->start_time_abs = rsi->start_fd->abs_ts;
- rci->stop_time_abs = rsi->start_fd->abs_ts;
- rci->samples = g_array_new (FALSE, FALSE, sizeof(sample_t));
- rci->first_stream = rsi;
- rci->num_packets = rsi->packet_count;
- g_hash_table_insert(rtp_channels_hash, g_strdup(key_str->str), rci);
- } else {
- /* Add silence between the two streams if needed */
- silence_frames = (gint32)((nstime_to_msec(&rsi->start_fd->abs_ts) - nstime_to_msec(&rci->stop_time_abs)) * sample_rate);
- for (j = 0; j < silence_frames; j++) {
- g_array_append_val(rci->samples, silence);
- }
- rci->num_packets += rsi->packet_count;
- }
-
- /* decode the RTP stream */
- first = TRUE;
- rtp_time_prev = 0;
- decoded_bytes_prev = 0;
- start_time = 0;
- arrive_time_prev = 0;
- pack_period = 0;
-#ifdef DEBUG /* ?? */
- total_time = 0;
- mean_delay = 0;
- variation = 0;
-#endif
- seq = 0;
- start_timestamp = 0;
- decoders_hash = rtp_decoder_hash_table_new();
-
- /* we update the progress bar 100 times */
-
- /* Update the progress bar when it gets to this value. */
- progbar_nextstep = 0;
- /* When we reach the value that triggers a progress bar update,
- bump that value by this amount. */
- progbar_quantum = total_packets/100;
-
- status = S_NORMAL;
-
- rtp_packet_list = g_list_first(rsi->rtp_packet_list);
- while (rtp_packet_list)
- {
-
- if (progbar_count >= progbar_nextstep) {
- g_assert(total_packets > 0);
-
- progbar_val = (gfloat) progbar_count / total_packets;
-
- update_progress_bar(progbar_val);
-
- progbar_nextstep += progbar_quantum;
- }
-
-
- rp = (rtp_packet_t *)rtp_packet_list->data;
- if (first == TRUE) {
-/* defined start_timestmp to avoid overflow in timestamp. TODO: handle the timestamp correctly */
-/* XXX: if timestamps (RTP) are missing/ignored try use packet arrive time only (see also "rtp_time") */
- start_timestamp = rp->info->info_timestamp;
- start_rtp_time = 0;
- rtp_time_prev = start_rtp_time;
- first = FALSE;
- seq = rp->info->info_seq_num - 1;
- }
-
- decoded_bytes = decode_rtp_packet(rp, &out_buff, decoders_hash, &channels, &sample_rate);
- if (decoded_bytes == 0) {
- seq = rp->info->info_seq_num;
- }
-
- unsigned rtp_clock_rate = sample_rate;
- if (rp->info->info_payload_type == PT_G722) {
- // G.722 sample rate is 16kHz, but RTP clock rate is 8kHz for historic reasons.
- rtp_clock_rate = 8000;
- }
-
- rtp_time = (double)(rp->info->info_timestamp-start_timestamp)/rtp_clock_rate - start_rtp_time;
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cb_use_rtp_timestamp))) {
- arrive_time = rtp_time;
- } else {
- arrive_time = (double)rp->arrive_offset/1000 - start_time;
- }
-
- if (rp->info->info_seq_num != seq+1){
- rci->out_of_seq++;
- status = S_WRONG_SEQ;
- }
- seq = rp->info->info_seq_num;
-
- diff = arrive_time - rtp_time;
-
- if (diff<0) diff = -diff;
-
-#ifdef DEBUG
- total_time = (double)rp->arrive_offset/1000;
- printf("seq = %d arr = %f abs_diff = %f index = %d tim = %f ji=%d jb=%f\n",rp->info->info_seq_num,
- total_time, diff, rci->samples->len, ((double)rci->samples->len / sample_rate - total_time) * 1000, 0,
- (mean_delay + 4 * variation) * 1000);
- fflush(stdout);
-#endif
- /* if the jitter buffer was exceeded */
- if ( diff*1000 > jitter_buff && !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cb_use_uninterrupted_mode))) {
-#ifdef DEBUG
- printf("Packet drop by jitter buffer exceeded\n");
-#endif
- rci->drop_by_jitter_buff++;
- status = S_DROP_BY_JITT;
-
- /* if there was a silence period (more than two packetization period) resync the source */
- if ( (rtp_time - rtp_time_prev) > pack_period*2 ){
-#ifdef DEBUG
- printf("Resync...\n");
-#endif
- silence_frames = (gint32)((arrive_time - arrive_time_prev)*sample_rate - decoded_bytes_prev / sizeof(SAMPLE));
- /* Fix for bug 4119/5902: don't insert too many silence frames.
- * XXX - is there a better thing to do here?
- */
- if (silence_frames > MAX_SILENCE_FRAMES)
- silence_frames = MAX_SILENCE_FRAMES;
-
- for (j = 0; j < silence_frames; j++) {
- silence.status = status;
- g_array_append_val(rci->samples, silence);
-
- /* only mark the first in the silence that has the previous problem (S_DROP_BY_JITT or S_WRONG_SEQ) */
- status = S_NORMAL;
- }
-
- decoded_bytes_prev = 0;
-/* defined start_timestmp to avoid overflow in timestamp. TODO: handle the timestamp correctly */
-/* XXX: if timestamps (RTP) are missing/ignored try use packet arrive time only (see also "rtp_time") */
- start_timestamp = rp->info->info_timestamp;
- start_rtp_time = 0;
- start_time = (double)rp->arrive_offset/1000;
- rtp_time_prev = 0;
- }
- } else {
- /* Add silence if it is necessary */
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cb_use_uninterrupted_mode))) {
- silence_frames = 0;
- } else {
- silence_frames = (gint32)((rtp_time - rtp_time_prev)*sample_rate - decoded_bytes_prev / sizeof(SAMPLE));
- }
-
- if (silence_frames != 0) {
- rci->wrong_timestamp++;
- status = S_WRONG_TIMESTAMP;
- }
-
- /* Fix for bug 4119/5902: don't insert too many silence frames.
- * XXX - is there a better thing to do here?
- */
- if (silence_frames > MAX_SILENCE_FRAMES)
- silence_frames = MAX_SILENCE_FRAMES;
-
- for (j = 0; j < silence_frames; j++) {
- silence.status = status;
- g_array_append_val(rci->samples, silence);
-
- /* only mark the first in the silence that has the previous problem (S_DROP_BY_JITT or S_WRONG_SEQ) */
- status = S_NORMAL;
- }
-
- if (silence_frames > 0) {
- silence_frames = 0;
- }
-
- /* Add the audio */
- for (i = -silence_frames + ((info->current_channel) ? 1 : 0); i < decoded_bytes / (int) sizeof(SAMPLE); i += channels) {
- if(out_buff)
- sample.val = out_buff[i];
- sample.status = status;
- g_array_append_val(rci->samples, sample);
- status = S_NORMAL;
- }
- rtp_time_prev = rtp_time;
- pack_period = (double) decoded_bytes / sizeof(SAMPLE) / sample_rate;
- decoded_bytes_prev = decoded_bytes;
- arrive_time_prev = arrive_time;
- }
-
- if (out_buff) {
- g_free(out_buff);
- out_buff = NULL;
- }
- rtp_packet_list = g_list_next (rtp_packet_list);
- progbar_count++;
- }
- rci->max_frame_index = rci->samples->len;
- sample_delta.secs = rci->samples->len / sample_rate;
- sample_delta.nsecs = (rci->samples->len % sample_rate) * 1000000000;
- nstime_sum(&rci->stop_time_abs, &rci->start_time_abs, &sample_delta);
-
- g_string_free(key_str, TRUE);
- g_hash_table_destroy(decoders_hash);
-}
-
-#if !PORTAUDIO_API_1
-/* returns monotonically increasing clock in seconds */
-static PaTime
-getMonoTime(PaStream *stream _U_)
-{
-#if GLIB_CHECK_VERSION(2, 28, 0)
- return g_get_monotonic_time() * 1e-6;
-#else
- /* TODO: this is broken for sure, but maybe such old glibs do not even
- * use pulseaudio so we do not have to care? */
- return Pa_GetStreamTime(stream);
-#endif
-}
-
-static PaTime (*getCurrentTime)(PaStream *stream);
-#endif
-
-/****************************************************************************/
-static gint
-h_scrollbar_changed(GtkWidget *widget _U_, gpointer user_data)
-{
- rtp_channel_info_t *rci = (rtp_channel_info_t *)user_data;
- rci->cursor_catch = TRUE;
- return TRUE;
-}
-
-static gboolean draw_cursors(gpointer data);
-
-/****************************************************************************/
-static void
-stop_channels(void)
-{
- PaError err;
- GtkWidget *dialog;
-
- /* we should never be here if we are already in STOP */
- g_assert(rtp_channels->stop == FALSE);
-
- rtp_channels->stop = TRUE;
- /* force a draw_cursor to stop it */
- draw_cursors(NULL);
-
- err = Pa_StopStream(pa_stream);
-
- if( err != paNoError ) {
- dialog = gtk_message_dialog_new ((GtkWindow *) rtp_player_dlg_w,
- GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE,
- "Can not Stop Stream in PortAudio Library.\n Error: %s", Pa_GetErrorText( err ));
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
- return;
- }
-
- err = Pa_CloseStream(pa_stream);
- if( err != paNoError ) {
- dialog = gtk_message_dialog_new ((GtkWindow *) rtp_player_dlg_w,
- GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE,
- "Can not Close Stream in PortAudio Library.\n Error: %s", Pa_GetErrorText( err ));
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
- return;
- }
- pa_stream = NULL; /* to catch errors better */
-
- rtp_channels->start_index[0] = 0;
- rtp_channels->start_index[1] = 0;
- rtp_channels->end_index[0] = 0;
- rtp_channels->end_index[1] = 0;
- rtp_channels->max_frame_index = 0;
- rtp_channels->frame_index = 0;
- rtp_channels->pause = FALSE;
- rtp_channels->pause_duration = 0;
- rtp_channels->stop = TRUE;
- rtp_channels->out_diff_time = 10000;
-
- if (rtp_channels->rci[0]) rtp_channels->rci[0]->frame_index = 0;
- if (rtp_channels->rci[1]) rtp_channels->rci[1]->frame_index = 0;
-
- /* set the sensitive state of the buttons (decode, play, pause, stop) */
- bt_state(TRUE, TRUE, FALSE, FALSE);
-
-}
-
-/****************************************************************************/
-/* Draw a cursor in a channel graph
- */
-static void
-draw_channel_cursor(rtp_channel_info_t *rci, guint32 start_index)
-{
-#if PORTAUDIO_API_1
- PaTimestamp idx;
-#else /* PORTAUDIO_API_1 */
- PaTime idx;
-#endif /* PORTAUDIO_API_1 */
- int i;
- GtkAllocation widget_alloc;
- cairo_t *cr;
-
- if (!rci || !pa_stream) return;
-
-#if PORTAUDIO_API_1
- idx = Pa_StreamTime( pa_stream ) - rtp_channels->pause_duration - rtp_channels->out_diff_time - start_index;
-#else /* PORTAUDIO_API_1 */
- /* frames since start button was pressed minus latency, from time */
- idx = (guint32) sample_rate
- * (getCurrentTime(pa_stream) - rtp_channels->pa_start_time
- - rtp_channels->out_diff_time);
- /* frames spent in pause state or seek correction */
- idx -= rtp_channels->pause_duration;
- /* frame where the bar starts getting drawn */
- idx -= start_index;
-#endif /* PORTAUDIO_API_1 */
-
-
- /* If we finished playing both channels, then stop them */
- if ( (rtp_channels && (!rtp_channels->stop) && (!rtp_channels->pause)) && (idx > rtp_channels->max_frame_index) ) {
- stop_channels();
- return;
- }
-
- /* If only this channel finished, then return */
- if (idx > rci->max_frame_index) {
- return;
- }
-
- gtk_widget_get_allocation(rci->draw_area, &widget_alloc);
- /* draw the previous saved pixbuf line */
- if (rci->cursor_pixbuf && (rci->cursor_prev>=0)) {
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (rci->surface);
-#else
- cr = gdk_cairo_create (rci->pixmap);
-#endif
- gdk_cairo_set_source_pixbuf (cr, rci->cursor_pixbuf, 0, 0);
- cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
- cairo_rectangle (cr, rci->cursor_prev/MULT, 0, -1, -1);
- cairo_fill (cr);
-
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, rci->surface, idx/MULT, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, rci->pixmap,idx/MULT, 0);
-#endif
- cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
- cairo_rectangle (cr, rci->cursor_prev/MULT, 0, 1, widget_alloc.height-HEIGHT_TIME_LABEL);
- cairo_fill (cr);
- cairo_destroy (cr);
-
- g_object_unref(rci->cursor_pixbuf);
- rci->cursor_pixbuf = NULL;
- }
-
- if (idx>0 && (rci->cursor_prev>=0)) {
-#if GTK_CHECK_VERSION(2,22,0)
- rci->cursor_pixbuf = gdk_pixbuf_get_from_surface (rci->surface,0, 0, 1, widget_alloc.height-HEIGHT_TIME_LABEL);
- cr = cairo_create (rci->surface);
-#else
- rci->cursor_pixbuf = gdk_pixbuf_get_from_drawable(NULL, rci->pixmap, NULL, (int) (idx/MULT), 0, 0, 0, 1, widget_alloc.height-HEIGHT_TIME_LABEL);
- cr = gdk_cairo_create (rci->pixmap);
-#endif
- if (cr != NULL) {
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr, idx/MULT, 0);
- cairo_line_to(cr, idx/MULT, widget_alloc.height-HEIGHT_TIME_LABEL);
- cairo_stroke(cr);
- cairo_destroy(cr);
- }
-
- cr = gdk_cairo_create (gtk_widget_get_window(rci->draw_area));
- if (cr != NULL) {
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, rci->surface, idx/MULT, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, rci->pixmap, idx/MULT, 0);
-#endif
- cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
- cairo_rectangle (cr, idx/MULT, 0, 1, widget_alloc.height-HEIGHT_TIME_LABEL);
- cairo_fill (cr);
- cairo_destroy (cr);
- }
- }
-
- /* Disconnect the scroll bar "value" signal to not be called */
- g_signal_handlers_disconnect_by_func(rci->h_scrollbar_adjustment, h_scrollbar_changed, rci);
-
- /* Move the horizontal scroll bar */
-#if 0
- if ( (rci->cursor_prev/MULT < (rci->h_scrollbar_adjustment->value+rci->h_scrollbar_adjustment->page_increment)) &&
- (idx/MULT >= (rci->h_scrollbar_adjustment->value+rci->h_scrollbar_adjustment->page_increment)) ){
- for (i=1; i<10; i++) {
- rci->h_scrollbar_adjustment->value += rci->h_scrollbar_adjustment->page_size/10;
- gtk_adjustment_value_changed(rci->h_scrollbar_adjustment);
- }
- }
-#endif
- if (!rci->cursor_catch) {
- if (idx/MULT < gtk_adjustment_get_page_size(rci->h_scrollbar_adjustment)/2) {
- gtk_adjustment_set_value(rci->h_scrollbar_adjustment, gtk_adjustment_get_lower(rci->h_scrollbar_adjustment));
- } else if (idx/MULT > (gtk_adjustment_get_upper(rci->h_scrollbar_adjustment) - gtk_adjustment_get_page_size(rci->h_scrollbar_adjustment)/2)) {
- gtk_adjustment_set_value(rci->h_scrollbar_adjustment, gtk_adjustment_get_upper(rci->h_scrollbar_adjustment) - gtk_adjustment_get_page_size(rci->h_scrollbar_adjustment));
- } else {
- gtk_adjustment_set_value(rci->h_scrollbar_adjustment, idx/MULT - gtk_adjustment_get_page_size(rci->h_scrollbar_adjustment)/2);
- }
-
- gtk_adjustment_value_changed(rci->h_scrollbar_adjustment);
- } else if ( (rci->cursor_prev/MULT < gtk_adjustment_get_value(rci->h_scrollbar_adjustment)+gtk_adjustment_get_page_increment(rci->h_scrollbar_adjustment)) &&
- (idx/MULT >= gtk_adjustment_get_value(rci->h_scrollbar_adjustment) + gtk_adjustment_get_page_increment(rci->h_scrollbar_adjustment)) ){
- rci->cursor_catch = FALSE;
- for (i=1; i<10; i++) {
- gtk_adjustment_set_value(rci->h_scrollbar_adjustment, MIN(gtk_adjustment_get_upper(rci->h_scrollbar_adjustment)-gtk_adjustment_get_page_size(rci->h_scrollbar_adjustment), gtk_adjustment_get_value(rci->h_scrollbar_adjustment) + gtk_adjustment_get_page_size(rci->h_scrollbar_adjustment)/20));
- gtk_adjustment_value_changed(rci->h_scrollbar_adjustment);
- }
- }
-
- /* Connect back the "value" scroll signal */
- g_signal_connect(rci->h_scrollbar_adjustment, "value_changed", G_CALLBACK(h_scrollbar_changed), rci);
-
-#if 0
- if (idx/MULT < rci->h_scrollbar_adjustment->page_increment) {
- rci->h_scrollbar_adjustment->value = rci->h_scrollbar_adjustment->lower;
- } else if (idx/MULT > (rci->h_scrollbar_adjustment->upper - rci->h_scrollbar_adjustment->page_size + rci->h_scrollbar_adjustment->page_increment)) {
- rci->h_scrollbar_adjustment->value = rci->h_scrollbar_adjustment->upper - rci->h_scrollbar_adjustment->page_size;
- } else {
- if ( (idx/MULT < rci->h_scrollbar_adjustment->value) || (idx/MULT > (rci->h_scrollbar_adjustment->value+rci->h_scrollbar_adjustment->page_increment)) ){
- rci->h_scrollbar_adjustment->value = idx/MULT;
- }
- }
-#endif
-
-#if 0
- if (idx/MULT < rci->h_scrollbar_adjustment->page_size/2) {
- rci->h_scrollbar_adjustment->value = rci->h_scrollbar_adjustment->lower;
- } else if (idx/MULT > (rci->h_scrollbar_adjustment->upper - rci->h_scrollbar_adjustment->page_size/2)) {
- rci->h_scrollbar_adjustment->value = rci->h_scrollbar_adjustment->upper - rci->h_scrollbar_adjustment->page_size;
- } else {
- rci->h_scrollbar_adjustment->value = idx/MULT - rci->h_scrollbar_adjustment->page_size/2;
- }
-#endif
-
-#if 0
- gtk_adjustment_value_changed(rci->h_scrollbar_adjustment);
-#endif
- rci->cursor_prev = idx;
-}
-
-/****************************************************************************/
-/* Move and draw the cursor in the graph
- */
-static gboolean
-draw_cursors(gpointer data _U_)
-{
- if (!rtp_channels) return FALSE;
-
- /* Draw and move each of the two channels */
- draw_channel_cursor(rtp_channels->rci[0], rtp_channels->start_index[0]);
- draw_channel_cursor(rtp_channels->rci[1], rtp_channels->start_index[1]);
-
- if ((rtp_channels->stop) || (rtp_channels->pause)) return FALSE;
-
- return TRUE;
-}
-
-/****************************************************************************/
-static void
-init_rtp_channels_vals(void)
-{
- rtp_play_channels_t *rpci = rtp_channels;
-
- /* if we only have one channel to play, we just use the info from that channel */
- if (rpci->rci[0] == NULL) {
- rpci->max_frame_index = rpci->rci[1] ? rpci->rci[1]->max_frame_index: 0;
- rpci->start_index[0] = rpci->max_frame_index;
- rpci->start_index[1] = 0;
- rpci->end_index[0] = rpci->max_frame_index;
- rpci->end_index[1] = rpci->max_frame_index;
- } else if (rpci->rci[1] == NULL) {
- rpci->max_frame_index = rpci->rci[0]->max_frame_index;
- rpci->start_index[1] = rpci->max_frame_index;
- rpci->start_index[0] = 0;
- rpci->end_index[0] = rpci->max_frame_index;
- rpci->end_index[1] = rpci->max_frame_index;
-
- /* if the two channels are to be played, then we need to sync both based on the start/end time of each one */
- } else {
- double start_time_0 = nstime_to_msec(&rpci->rci[0]->start_time_abs);
- double start_time_1 = nstime_to_msec(&rpci->rci[1]->start_time_abs);
- double stop_time_0 = nstime_to_msec(&rpci->rci[0]->stop_time_abs);
- double stop_time_1 = nstime_to_msec(&rpci->rci[1]->stop_time_abs);
- rpci->max_frame_index = (guint32)(sample_rate/1000) * (guint32)(MAX(stop_time_0, stop_time_1) -
- (guint32)MIN(start_time_0, start_time_1));
-
- if (nstime_cmp(&rpci->rci[0]->start_time_abs, &rpci->rci[1]->start_time_abs) < 0) {
- rpci->start_index[0] = 0;
- rpci->start_index[1] = (guint32)(sample_rate/1000) * (guint32)(start_time_1 - start_time_0);
- } else {
- rpci->start_index[1] = 0;
- rpci->start_index[0] = (guint32)(sample_rate/1000) * (guint32)(start_time_0 - start_time_1);
- }
-
- if (nstime_cmp(&rpci->rci[0]->stop_time_abs, &rpci->rci[1]->stop_time_abs) < 0) {
- rpci->end_index[0] = rpci->max_frame_index - ((guint32)(sample_rate/1000) * (guint32)(stop_time_1 - stop_time_0));
- rpci->end_index[1] = rpci->max_frame_index;
- } else {
- rpci->end_index[1] = rpci->max_frame_index - ((guint32)(sample_rate/1000) * (guint32)(stop_time_0 - stop_time_1));
- rpci->end_index[0] = rpci->max_frame_index;
- }
- }
-}
-
-
-/****************************************************************************/
-/* This routine will be called by the PortAudio engine when audio is needed.
- * It may called at interrupt level on some machines so don't do anything
- * that could mess up the system like calling malloc() or free().
- */
-#if PORTAUDIO_API_1
-
-static int paCallback( void *inputBuffer _U_, void *outputBuffer,
- unsigned long framesPerBuffer,
- PaTimestamp outTime, void *userData)
-{
-#else /* PORTAUDIO_API_1 */
-static int paCallback( const void *inputBuffer _U_, void *outputBuffer,
- unsigned long framesPerBuffer,
- const PaStreamCallbackTimeInfo* outTime,
- PaStreamCallbackFlags statusFlags _U_,
- void *userData)
-{
-#endif /* PORTAUDIO_API_1 */
- rtp_play_channels_t *rpci = (rtp_play_channels_t *)userData;
- SAMPLE *wptr = (SAMPLE*)outputBuffer;
- sample_t sample;
- unsigned long i;
- int finished;
- unsigned long framesLeft;
- unsigned long framesToPlay;
-
- /* if it is pasued, we keep the stream running but with silence only */
- if (rtp_channels->pause) {
- for(i=0; i<framesPerBuffer; i++ ) {
- *wptr++ = 0;
- *wptr++ = 0;
- }
- rtp_channels->pause_duration += framesPerBuffer;
- return 0;
- }
-
-#if PORTAUDIO_API_1
- rpci->out_diff_time = outTime - Pa_StreamTime(pa_stream);
-#else /* PORTAUDIO_API_1 */
- rpci->out_diff_time = outTime->outputBufferDacTime - outTime->currentTime;
-#endif /* PORTAUDIO_API_1 */
-
-
- /* set the values if this is the first time */
- if (rpci->max_frame_index == 0) {
- init_rtp_channels_vals();
-
- }
-
- framesLeft = rpci->max_frame_index - rpci->frame_index;
-
- if( framesLeft < framesPerBuffer )
- {
- framesToPlay = framesLeft;
- finished = 1;
- }
- else
- {
- framesToPlay = framesPerBuffer;
- finished = 0;
- }
-
- for( i=0; i<(unsigned int)framesToPlay; i++ )
- {
- if (rpci->rci[0] && ( (rpci->frame_index >= rpci->start_index[0]) && (rpci->frame_index <= rpci->end_index[0]) )) {
- sample = g_array_index(rpci->rci[0]->samples, sample_t, rpci->rci[0]->frame_index++);
- *wptr++ = sample.val;
- } else {
- *wptr++ = 0;
- }
-
- if (rpci->rci[1] && ( (rpci->frame_index >= rpci->start_index[1]) && (rpci->frame_index <= rpci->end_index[1]) )) {
- sample = g_array_index(rpci->rci[1]->samples, sample_t, rpci->rci[1]->frame_index++);
- *wptr++ = sample.val;
- } else {
- *wptr++ = 0;
- }
- }
- for( ; i<framesPerBuffer; i++ )
- {
- *wptr++ = 0;
- *wptr++ = 0;
- }
- rpci->frame_index += framesToPlay;
-
- return finished;
-}
-
-/****************************************************************************/
-static void
-on_bt_check_clicked(GtkButton *button _U_, gpointer user_data)
-{
- rtp_channel_info_t *rci = (rtp_channel_info_t *)user_data;
-
- if (rci->selected) {
- if (rtp_channels->rci[0] == rci) {
- rtp_channels->rci[0] = NULL;
- rtp_channels->channel = 0;
- } else {
- rtp_channels->rci[1] = NULL;
- rtp_channels->channel = 1;
- }
- } else {
- /* if there are already both channels selected, unselect the old one */
- if (rtp_channels->rci[rtp_channels->channel]) {
- /* we disconnect the signal temporarly to avoid been called back */
- g_signal_handlers_disconnect_by_func(rtp_channels->rci[rtp_channels->channel]->check_bt, on_bt_check_clicked, rtp_channels->rci[rtp_channels->channel]);
- gtk_toggle_button_set_active((GtkToggleButton *)rtp_channels->rci[rtp_channels->channel]->check_bt, FALSE);
- g_signal_connect(rtp_channels->rci[rtp_channels->channel]->check_bt, "clicked", G_CALLBACK(on_bt_check_clicked), rtp_channels->rci[rtp_channels->channel]);
- rtp_channels->rci[rtp_channels->channel]->selected = FALSE;
- }
-
- rtp_channels->rci[rtp_channels->channel] = rci;
- rtp_channels->channel = !(rtp_channels->channel);
- }
-
- rci->selected = !(rci->selected);
-
- /* set the sensitive state of the buttons (decode, play, pause, stop) */
- bt_state(TRUE, TRUE, FALSE, FALSE);
-}
-
-/****************************************************************************/
-static void
-channel_draw(rtp_channel_info_t *rci)
-{
- int i, imax;
- int j;
- sample_t sample;
- SAMPLE min, max;
- PangoLayout *small_layout;
- guint32 label_width, label_height;
- char label_string[MAX_TIME_LABEL];
- double offset;
- guint32 progbar_nextstep;
- int progbar_quantum;
- gfloat progbar_val;
- guint status;
- GdkRGBA red_color = {1.0, 0.0, 0.1, 1.0}; /* Red */
- /*GdkColor amber_color = {0, 65535, 49152, 0};*/
- GdkRGBA amber_color = {1.0, 0.75, 0.0, 1.0};
- GdkRGBA white_color = {1.0, 1.0, 1.0, 1.0 };
- GdkRGBA black_color = {0.0, 0.0, 0.0, 1.0}; /* Black */
-
- GdkRGBA *draw_color_p;
- time_t seconds;
- struct tm *timestamp;
- GtkAllocation widget_alloc;
- cairo_t *cr;
-
-#if GTK_CHECK_VERSION(2,22,0)
- gtk_widget_get_allocation(rci->draw_area, &widget_alloc);
- /* Clear out old plot */
- cr = cairo_create (rci->surface);
- gdk_cairo_set_source_rgba (cr, &rci->bg_color[1+rci->call_num%MAX_NUM_COL_CONV]);
- cairo_rectangle (cr, 0, 0, widget_alloc.width,widget_alloc.height);
- cairo_fill (cr);
- cairo_destroy (cr);
- cr = NULL;
-
- small_layout = gtk_widget_create_pango_layout(rci->draw_area, NULL);
- pango_layout_set_font_description(small_layout, pango_font_description_from_string("Helvetica,Sans,Bold 7"));
-
- /* calculated the pixel offset to display integer seconds */
- offset = (nstime_to_sec(&rci->start_time_abs) - floor(nstime_to_sec(&rci->start_time_abs)))*sample_rate/MULT;
-
- cr = cairo_create (rci->surface);
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr, 0, widget_alloc.height-HEIGHT_TIME_LABEL+0.5);
- cairo_line_to(cr, widget_alloc.width, widget_alloc.height-HEIGHT_TIME_LABEL+0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
- cr = NULL;
-
- imax = MIN(widget_alloc.width,(gint)(rci->samples->len/MULT));
-
- /* we update the progress bar 100 times */
-
- /* Update the progress bar when it gets to this value. */
- progbar_nextstep = 0;
- /* When we reach the value that triggers a progress bar update,
- bump that value by this amount. */
- progbar_quantum = imax/100;
-
- for (i=0; i< imax; i++) {
- sample.val = 0;
- status = S_NORMAL;
- max=(SAMPLE)0xFFFF;
- min=(SAMPLE)0x7FFF;
-
- if (progbar_count >= progbar_nextstep) {
- g_assert(total_frames > 0);
-
- progbar_val = (gfloat) i / imax;
-
- update_progress_bar(progbar_val);
-
- progbar_nextstep += progbar_quantum;
- }
-
- for (j=0; j<MULT; j++) {
- sample = g_array_index(rci->samples, sample_t, i*MULT+j);
- max = MAX(max, sample.val);
- min = MIN(min, sample.val);
- if (sample.status == S_DROP_BY_JITT) status = S_DROP_BY_JITT;
- if (sample.status == S_WRONG_TIMESTAMP) status = S_WRONG_TIMESTAMP;
- if (sample.status == S_SILENCE) status = S_SILENCE;
- }
-
- /* Set the line color, default is black */
- if (status == S_DROP_BY_JITT) {
- draw_color_p = &red_color;
- } else if (status == S_WRONG_TIMESTAMP) {
- draw_color_p = &amber_color;
- } else if (status == S_SILENCE) {
- draw_color_p = &white_color;
- } else {
- draw_color_p = &black_color;
- }
-
- /* if silence added by Wireshark, graphically show it with letter to indicate why */
- if ((status == S_DROP_BY_JITT) || (status == S_WRONG_TIMESTAMP) || (status == S_SILENCE)) {
- cr = cairo_create (rci->surface);
- cairo_set_line_width (cr, 1.0);
- gdk_cairo_set_source_rgba (cr, draw_color_p);
- cairo_move_to(cr, i+0.5, 0);
- cairo_line_to(cr, i+0.5, (widget_alloc.height-HEIGHT_TIME_LABEL)-1);
- cairo_stroke(cr);
- cairo_destroy(cr);
- cr=NULL;
-
- if (status == S_DROP_BY_JITT) g_snprintf(label_string, MAX_TIME_LABEL,"D");
- if (status == S_WRONG_TIMESTAMP) g_snprintf(label_string, MAX_TIME_LABEL, "W");
- if (status == S_SILENCE) g_snprintf(label_string, MAX_TIME_LABEL, "S");
-
- pango_layout_set_text(small_layout, label_string, -1);
- pango_layout_get_pixel_size(small_layout, &label_width, &label_height);
- cr = cairo_create (rci->surface);
- gdk_cairo_set_source_rgba (cr, draw_color_p);
- cairo_move_to (cr, i, 0);
- pango_cairo_show_layout (cr, small_layout);
- cairo_destroy (cr);
- cr = NULL;
- } else {
- /* Draw a graphical representation of the sample */
- cr = cairo_create (rci->surface);
- cairo_set_line_width (cr, 1.0);
- gdk_cairo_set_source_rgba (cr, draw_color_p);
- cairo_move_to(cr, i+0.5, ( (0x7FFF+min) * (widget_alloc.height-HEIGHT_TIME_LABEL))/0xFFFF);
- cairo_line_to(cr, i+0.5, ( (0x7FFF+max) * (widget_alloc.height-HEIGHT_TIME_LABEL))/0xFFFF);
- cairo_stroke(cr);
- cairo_destroy(cr);
- }
-
- /* Draw the x-axis (seconds since beginning of packet flow for this call) */
-
- /* Draw tick mark and put a number for each whole second */
- if ( !((i*MULT)%(sample_rate)) ) {
- cr = cairo_create (rci->surface);
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr, i - offset+0.5, widget_alloc.height-HEIGHT_TIME_LABEL);
- cairo_line_to(cr, i+0.5, widget_alloc.height-HEIGHT_TIME_LABEL+4);
- cairo_stroke(cr);
- cairo_destroy(cr);
- cr=NULL;
-
- if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cb_view_as_time_of_day))) {
- seconds = rci->start_time_abs.secs + i * MULT / sample_rate;
- timestamp = localtime(&seconds);
- if (timestamp != NULL)
- g_snprintf(label_string, MAX_TIME_LABEL, "%02d:%02d:%02d", timestamp->tm_hour, timestamp->tm_min, timestamp->tm_sec);
- else
- g_snprintf(label_string, MAX_TIME_LABEL, "XX:XX:XX");
- } else {
- g_snprintf(label_string, MAX_TIME_LABEL, "%.0f s", floor(nstime_to_sec(&rci->start_time_abs)) + i*MULT/sample_rate);
- }
-
- pango_layout_set_text(small_layout, label_string, -1);
- pango_layout_get_pixel_size(small_layout, &label_width, &label_height);
- cr = cairo_create (rci->surface);
- cairo_move_to (cr, i - offset - label_width/2, widget_alloc.height - label_height);
- pango_cairo_show_layout (cr, small_layout);
- cairo_destroy (cr);
- cr = NULL;
-
-
- /* Draw only a tick mark for half second intervals */
- } else if ( !((i*MULT)%(sample_rate/2)) ) {
- cr = cairo_create (rci->surface);
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr,i - offset+0.5, widget_alloc.height-HEIGHT_TIME_LABEL);
- cairo_line_to(cr, (i - offset)+0.5, widget_alloc.height-HEIGHT_TIME_LABEL+2);
- cairo_stroke(cr);
- cairo_destroy(cr);
- cr=NULL;
- }
-
- progbar_count++;
- }
- g_object_unref(G_OBJECT(small_layout));
-#else
- if (GDK_IS_DRAWABLE(rci->pixmap)) {
- gtk_widget_get_allocation(rci->draw_area, &widget_alloc);
- /* Clear out old plot */
- cr = gdk_cairo_create (rci->pixmap);
- gdk_cairo_set_source_rgba (cr, &rci->bg_color[1+rci->call_num%MAX_NUM_COL_CONV]);
- cairo_rectangle (cr, 0, 0, widget_alloc.width,widget_alloc.height);
- cairo_fill (cr);
- cairo_destroy (cr);
- cr = NULL;
-
- small_layout = gtk_widget_create_pango_layout(rci->draw_area, NULL);
- pango_layout_set_font_description(small_layout, pango_font_description_from_string("Helvetica,Sans,Bold 7"));
-
- /* calculated the pixel offset to display integer seconds */
- offset = (nstime_to_sec(&rci->start_time_abs) - floor(nstime_to_sec(&rci->start_time_abs)))*sample_rate/MULT;
-
- cr = gdk_cairo_create (rci->pixmap);
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr, 0, widget_alloc.height-HEIGHT_TIME_LABEL+0.5);
- cairo_line_to(cr, widget_alloc.width, widget_alloc.height-HEIGHT_TIME_LABEL+0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
- cr = NULL;
-
- imax = MIN(widget_alloc.width,(gint)(rci->samples->len/MULT));
-
- /* we update the progress bar 100 times */
-
- /* Update the progress bar when it gets to this value. */
- progbar_nextstep = 0;
- /* When we reach the value that triggers a progress bar update,
- bump that value by this amount. */
- progbar_quantum = imax/100;
-
- for (i=0; i< imax; i++) {
- sample.val = 0;
- status = S_NORMAL;
- max=(SAMPLE)0xFFFF;
- min=(SAMPLE)0x7FFF;
-
- if (progbar_count >= progbar_nextstep) {
- g_assert(total_frames > 0);
-
- progbar_val = (gfloat) i / imax;
-
- update_progress_bar(progbar_val);
-
- progbar_nextstep += progbar_quantum;
- }
-
- for (j=0; j<MULT; j++) {
- sample = g_array_index(rci->samples, sample_t, i*MULT+j);
- max = MAX(max, sample.val);
- min = MIN(min, sample.val);
- if (sample.status == S_DROP_BY_JITT) status = S_DROP_BY_JITT;
- if (sample.status == S_WRONG_TIMESTAMP) status = S_WRONG_TIMESTAMP;
- if (sample.status == S_SILENCE) status = S_SILENCE;
- }
-
- /* Set the line color, default is black */
- if (status == S_DROP_BY_JITT) {
- draw_color_p = &red_color;
- } else if (status == S_WRONG_TIMESTAMP) {
- draw_color_p = &amber_color;
- } else if (status == S_SILENCE) {
- draw_color_p = &white_color;
- } else {
- draw_color_p = &black_color;
- }
-
- /* if silence added by Wireshark, graphically show it with letter to indicate why */
- if ((status == S_DROP_BY_JITT) || (status == S_WRONG_TIMESTAMP) || (status == S_SILENCE)) {
- cr = gdk_cairo_create (rci->pixmap);
- cairo_set_line_width (cr, 1.0);
- gdk_cairo_set_source_rgba (cr, draw_color_p);
- cairo_move_to(cr, i+0.5, 0);
- cairo_line_to(cr, i+0.5, (widget_alloc.height-HEIGHT_TIME_LABEL)-1);
- cairo_stroke(cr);
- cairo_destroy(cr);
- cr=NULL;
-
- if (status == S_DROP_BY_JITT) g_snprintf(label_string, MAX_TIME_LABEL,"D");
- if (status == S_WRONG_TIMESTAMP) g_snprintf(label_string, MAX_TIME_LABEL, "W");
- if (status == S_SILENCE) g_snprintf(label_string, MAX_TIME_LABEL, "S");
-
- pango_layout_set_text(small_layout, label_string, -1);
- pango_layout_get_pixel_size(small_layout, &label_width, &label_height);
- cr = gdk_cairo_create (rci->pixmap);
- gdk_cairo_set_source_rgba (cr, draw_color_p);
- cairo_move_to (cr, i, 0);
- pango_cairo_show_layout (cr, small_layout);
- cairo_destroy (cr);
- cr = NULL;
- } else {
- /* Draw a graphical representation of the sample */
- cr = gdk_cairo_create (rci->pixmap);
- cairo_set_line_width (cr, 1.0);
- gdk_cairo_set_source_rgba (cr, draw_color_p);
- cairo_move_to(cr, i+0.5, ( (0x7FFF+min) * (widget_alloc.height-HEIGHT_TIME_LABEL))/0xFFFF);
- cairo_line_to(cr, i+0.5, ( (0x7FFF+max) * (widget_alloc.height-HEIGHT_TIME_LABEL))/0xFFFF);
- cairo_stroke(cr);
- cairo_destroy(cr);
- }
-
- /* Draw the x-axis (seconds since beginning of packet flow for this call) */
-
- /* Draw tick mark and put a number for each whole second */
- if ( !((i*MULT)%(sample_rate)) ) {
- cr = gdk_cairo_create (rci->pixmap);
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr, i - offset+0.5, widget_alloc.height-HEIGHT_TIME_LABEL);
- cairo_line_to(cr, i+0.5, widget_alloc.height-HEIGHT_TIME_LABEL+4);
- cairo_stroke(cr);
- cairo_destroy(cr);
- cr=NULL;
-
- if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cb_view_as_time_of_day))) {
- seconds = rci->start_time_abs.secs + i * MULT / sample_rate;
- timestamp = localtime(&seconds);
- if (timestamp != NULL)
- g_snprintf(label_string, MAX_TIME_LABEL, "%02d:%02d:%02d", timestamp->tm_hour, timestamp->tm_min, timestamp->tm_sec);
- else
- g_snprintf(label_string, MAX_TIME_LABEL, "XX:XX:XX");
- } else {
- g_snprintf(label_string, MAX_TIME_LABEL, "%.0f s", floor(nstime_to_sec(&rci->start_time_abs)) + i*MULT/sample_rate);
- }
-
- pango_layout_set_text(small_layout, label_string, -1);
- pango_layout_get_pixel_size(small_layout, &label_width, &label_height);
- cr = gdk_cairo_create (rci->pixmap);
- cairo_move_to (cr, i - offset - label_width/2, widget_alloc.height - label_height);
- pango_cairo_show_layout (cr, small_layout);
- cairo_destroy (cr);
- cr = NULL;
-
-
- /* Draw only a tick mark for half second intervals */
- } else if ( !((i*MULT)%(sample_rate/2)) ) {
- cr = gdk_cairo_create (rci->pixmap);
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr,i - offset+0.5, widget_alloc.height-HEIGHT_TIME_LABEL);
- cairo_line_to(cr, (i - offset)+0.5, widget_alloc.height-HEIGHT_TIME_LABEL+2);
- cairo_stroke(cr);
- cairo_destroy(cr);
- cr=NULL;
- }
-
- progbar_count++;
- }
- g_object_unref(G_OBJECT(small_layout));
- }
-#endif
-
-}
-/****************************************************************************/
-#if GTK_CHECK_VERSION(3,0,0)
-static gboolean draw_channels(GtkWidget *widget, cairo_t *cr, gpointer user_data)
-{
- rtp_channel_info_t *rci = (rtp_channel_info_t *)user_data;
- GtkAllocation allocation;
-
- gtk_widget_get_allocation (widget, &allocation);
- cairo_set_source_surface (cr, rci->surface, 0, 0);
- cairo_rectangle (cr, 0, 0, allocation.width, allocation.width);
- cairo_fill (cr);
-
- return FALSE;
-}
-#else
-static gboolean expose_event_channels(GtkWidget *widget, GdkEventExpose *event, gpointer user_data)
-{
- rtp_channel_info_t *rci = (rtp_channel_info_t *)user_data;
- cairo_t *cr;
-
- if (gtk_widget_is_drawable(widget)){
- cr = gdk_cairo_create (gtk_widget_get_window(widget));
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, rci->surface, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, rci->pixmap, event->area.x, event->area.y);
-#endif
- cairo_rectangle (cr, event->area.x,event->area.y, event->area.width, event->area.height);
- cairo_fill (cr);
- cairo_destroy(cr);
- cr = NULL;
- }
-
- return FALSE;
-}
-#endif
-
-/****************************************************************************/
-static gboolean
-configure_event_channels(GtkWidget *widget, GdkEventConfigure *event _U_, gpointer user_data)
-{
- rtp_channel_info_t *rci = (rtp_channel_info_t *)user_data;
- int i;
- GtkAllocation widget_alloc;
- cairo_t *cr;
-
- /* the first color is blue to highlight the selected item
- * the other collors are the same as in the Voip Graph analysys
- * to match the same calls
- */
-#if 0
- static GdkColor col[MAX_NUM_COL_CONV+1] = {
- {0, 0x00FF, 0x00FF, 0xFFFF},
- {0, 0x90FF, 0xEEFF, 0x90FF},
- {0, 0xFFFF, 0xA0FF, 0x7AFF},
- {0, 0xFFFF, 0xB6FF, 0xC1FF},
- {0, 0xFAFF, 0xFAFF, 0xD2FF},
- {0, 0xFFFF, 0xFFFF, 0x33FF},
- {0, 0x66FF, 0xCDFF, 0xAAFF},
- {0, 0xE0FF, 0xFFFF, 0xFFFF},
- {0, 0xB0FF, 0xC4FF, 0xDEFF},
- {0, 0x87FF, 0xCEFF, 0xFAFF},
- {0, 0xD3FF, 0xD3FF, 0xD3FF}
- };
-#endif
-
- static GdkRGBA col[MAX_NUM_COL_CONV+1] = {
- /* Red, Green, Blue Alpha */
- {0.0039, 0.0039, 1.0000, 1.0},
- {0.5664, 0.6289, 0.5664, 1.0},
- {1.0000, 0.6289, 0.4805, 1.0},
- {1.0000, 0.7148, 0.7578, 1.0},
- {0.9805, 0.9805, 0.8242, 1.0},
- {1.0000, 1.0000, 0.2031, 1.0},
- {0.4023, 0.8046, 0.6680, 1.0},
- {0.8789, 1.0000, 1.0000, 1.0},
- {0.6914, 0.7695, 0.8710, 1.0},
- {0.8281, 0.8281, 0.8281, 1.0},
- };
-
-#if GTK_CHECK_VERSION(2,22,0)
- if(rci->surface){
- cairo_surface_destroy (rci->surface);
- rci->surface=NULL;
- }
- gtk_widget_get_allocation(widget, &widget_alloc);
-
-#if !defined(_WIN32)
- /* Bug 2630: X11 can't handle pixmaps larger than 32k. Just truncate
- * the graph for now (to avoid the crash).
- */
- if (widget_alloc.width > G_MAXINT16-1) {
- widget_alloc.width = G_MAXINT16-1;
- report_failure("Channel graph truncated to 32k samples");
- }
-#endif
-
- rci->surface = gdk_window_create_similar_surface (gtk_widget_get_window(widget),
- CAIRO_CONTENT_COLOR,
- widget_alloc.width,
- widget_alloc.height);
-
- cr = cairo_create (rci->surface);
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_rectangle (cr, 0, 0, widget_alloc.width,widget_alloc.height);
- cairo_fill (cr);
- cairo_destroy (cr);
-#else
- if(rci->pixmap){
- g_object_unref(rci->pixmap);
- rci->pixmap=NULL;
- }
- gtk_widget_get_allocation(widget, &widget_alloc);
-
-#if !defined(_WIN32)
- /* Bug 2630: X11 can't handle pixmaps larger than 32k. Just truncate
- * the graph for now (to avoid the crash).
- */
- if (widget_alloc.width > G_MAXINT16-1) {
- widget_alloc.width = G_MAXINT16-1;
- report_failure("Channel graph truncated to 32k samples");
- }
-#endif
-
- rci->pixmap = gdk_pixmap_new(gtk_widget_get_window(widget),
- widget_alloc.width,
- widget_alloc.height,
- -1);
- if ( GDK_IS_DRAWABLE(rci->pixmap) ){
- cr = gdk_cairo_create (rci->pixmap);
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_rectangle (cr, 0, 0, widget_alloc.width,widget_alloc.height);
- cairo_fill (cr);
- cairo_destroy (cr);
- }
-#endif
-
- /* create gc's for the background color of each channel */
- for (i=0; i<MAX_NUM_COL_CONV+1; i++){
- rci->bg_color[i].alpha=col[i].alpha;
- rci->bg_color[i].red=col[i].red;
- rci->bg_color[i].green=col[i].green;
- rci->bg_color[i].blue=col[i].blue;
- }
-
- channel_draw(rci);
-
- return TRUE;
-}
-
-/****************************************************************************/
-static gboolean
-button_press_event_channel(GtkWidget *widget _U_, GdkEventButton *event _U_, gpointer user_data)
-{
- rtp_channel_info_t *rci = (rtp_channel_info_t *)user_data;
- int this_channel;
- unsigned long prev_index;
-
- if (!rci->selected) {
-
- /* only select a new channels if we are in STOP */
- if (!rtp_channels->stop) return 0;
-
- /* if there are already both channels selected, unselect the old one */
- if (rtp_channels->rci[rtp_channels->channel]) {
- /* we disconnect the signal temporarly to avoid been called back */
- g_signal_handlers_disconnect_by_func(rtp_channels->rci[rtp_channels->channel]->check_bt, on_bt_check_clicked, rtp_channels->rci[rtp_channels->channel]);
- gtk_toggle_button_set_active((GtkToggleButton *) rtp_channels->rci[rtp_channels->channel]->check_bt, FALSE);
- g_signal_connect(rtp_channels->rci[rtp_channels->channel]->check_bt, "clicked", G_CALLBACK(on_bt_check_clicked), rtp_channels->rci[rtp_channels->channel]);
- rtp_channels->rci[rtp_channels->channel]->selected = FALSE;
- }
-
- /* we disconnect the signal temporarly to avoid been called back */
- g_signal_handlers_disconnect_by_func(rci->check_bt, on_bt_check_clicked, rci);
- gtk_toggle_button_set_active((GtkToggleButton *) rci->check_bt, TRUE);
- g_signal_connect(rci->check_bt, "clicked", G_CALLBACK(on_bt_check_clicked), rci);
-
- rtp_channels->rci[rtp_channels->channel] = rci;
- rtp_channels->channel = !(rtp_channels->channel);
- rci->selected = TRUE;
-
- /* set the sensitive state of the buttons (decode, play, pause, stop) */
- bt_state(TRUE, TRUE, FALSE, FALSE);
- }
-
- if (rci == rtp_channels->rci[0]) {
- this_channel = 0;
- } else {
- this_channel = 1;
- }
-
- rci->frame_index = (unsigned int) (event->x * MULT);
-
- prev_index = rtp_channels->frame_index;
- rtp_channels->frame_index = rtp_channels->start_index[this_channel] + rci->frame_index;
- rtp_channels->pause_duration += prev_index - rtp_channels->frame_index;
-
-
-
- /* change the index in the other channel if selected, according with the index position */
- if (rtp_channels->rci[!this_channel]) {
- init_rtp_channels_vals();
-
- if (rtp_channels->frame_index < rtp_channels->start_index[!this_channel]) {
- rtp_channels->rci[!this_channel]->frame_index = 0;
- } else if (rtp_channels->frame_index > rtp_channels->end_index[!this_channel]) {
- rtp_channels->rci[!this_channel]->frame_index = rtp_channels->rci[!this_channel]->max_frame_index;
- } else {
- rtp_channels->rci[!this_channel]->frame_index = rtp_channels->frame_index - rtp_channels->start_index[!this_channel];
- }
- } else {
- init_rtp_channels_vals();
- }
-
- rtp_channels->out_diff_time = 0;
-
- rci->cursor_catch = TRUE;
-
- /* redraw the cusrsor */
- draw_cursors(NULL);
-
- return TRUE;
-}
-
-/****************************************************************************/
-static void
-add_channel_to_window(gchar *key _U_ , rtp_channel_info_t *rci, guint *counter)
-{
- GString *label;
- GtkWidget *viewport;
- char *src_addr, *dst_addr;
-
- /* create the channel draw area */
- rci->draw_area=gtk_drawing_area_new();
-
- rci->scroll_window=gtk_scrolled_window_new(NULL, NULL);
-
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (rci->scroll_window), GTK_POLICY_ALWAYS, GTK_POLICY_NEVER);
- rci->h_scrollbar_adjustment = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(rci->scroll_window));
-
-
- gtk_widget_set_size_request(rci->draw_area, (gint)(rci->samples->len/MULT), CHANNEL_HEIGHT);
-
-
- viewport = gtk_viewport_new(rci->h_scrollbar_adjustment, gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(rci->scroll_window)));
- gtk_container_add(GTK_CONTAINER(viewport), rci->draw_area);
- gtk_container_add(GTK_CONTAINER(rci->scroll_window), viewport);
- gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE);
- gtk_widget_add_events (rci->draw_area, GDK_BUTTON_PRESS_MASK);
- gtk_widget_set_can_focus(rci->draw_area, TRUE);
- gtk_widget_grab_focus(rci->draw_area);
-
- gtk_box_pack_start(GTK_BOX (channels_vb), rci->scroll_window, FALSE, FALSE, 0);
-
- /* signals needed to handle backing pixmap */
-#if GTK_CHECK_VERSION(3,0,0)
- g_signal_connect(rci->draw_area, "draw", G_CALLBACK(draw_channels), rci);
-#else
- g_signal_connect(rci->draw_area, "expose_event", G_CALLBACK(expose_event_channels), rci);
-#endif
- g_signal_connect(rci->draw_area, "configure_event", G_CALLBACK(configure_event_channels), rci);
- gtk_widget_add_events (rci->draw_area, GDK_BUTTON_PRESS_MASK);
- g_signal_connect(rci->draw_area, "button_press_event", G_CALLBACK(button_press_event_channel), rci);
- g_signal_connect(rci->h_scrollbar_adjustment, "value_changed", G_CALLBACK(h_scrollbar_changed), rci);
-
-
- label = g_string_new("");
- src_addr = address_to_display(NULL, &(rci->first_stream->src_addr));
- dst_addr = address_to_display(NULL, &(rci->first_stream->dest_addr));
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cb_use_rtp_timestamp))) {
- g_string_printf(label, "From %s:%d to %s:%d Duration:%.2f Out of Seq: %d(%.1f%%) Wrong Timestamp: %d(%.1f%%)",
- src_addr, rci->first_stream->src_port,
- dst_addr, rci->first_stream->dest_port,
- (double)rci->samples->len/sample_rate,
- rci->out_of_seq, (double)rci->out_of_seq * 100 / (double)rci->num_packets,
- rci->wrong_timestamp, (double)rci->wrong_timestamp * 100 / (double)rci->num_packets);
- } else {
- g_string_printf(label, "From %s:%d to %s:%d Duration:%.2f Drop by Jitter Buff:%d(%.1f%%) Out of Seq: %d(%.1f%%) Wrong Timestamp: %d(%.1f%%)",
- src_addr, rci->first_stream->src_port,
- dst_addr, rci->first_stream->dest_port,
- (double)rci->samples->len/sample_rate,
- rci->drop_by_jitter_buff, (double)rci->drop_by_jitter_buff * 100 / (double)rci->num_packets,
- rci->out_of_seq, (double)rci->out_of_seq * 100 / (double)rci->num_packets,
- rci->wrong_timestamp, (double)rci->wrong_timestamp * 100 / (double)rci->num_packets);
- }
- wmem_free(NULL, src_addr);
- wmem_free(NULL, dst_addr);
-
- rci->check_bt = gtk_check_button_new_with_label(label->str);
- gtk_box_pack_start(GTK_BOX (channels_vb), rci->check_bt, FALSE, FALSE, 1);
-
- /* Create the Separator if it is not the last one */
- (*counter)++;
- if (*counter < g_hash_table_size(rtp_channels_hash)) {
- rci->separator = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_start(GTK_BOX (channels_vb), rci->separator, FALSE, FALSE, 5);
- }
-
- g_signal_connect(rci->check_bt, "clicked", G_CALLBACK(on_bt_check_clicked), rci);
-
- g_string_free(label, TRUE);
-}
-
-/****************************************************************************/
-static void
-count_channel_frames(gchar *key _U_ , rtp_channel_info_t *rci, gpointer ptr _U_ )
-{
- total_frames += rci->samples->len;
-}
-
-/****************************************************************************/
-static void
-play_channels(void)
-{
- PaError err;
- GtkWidget *dialog;
-
- /* we should never be here if we are in PLAY and !PAUSE */
- g_assert(rtp_channels->stop || rtp_channels->pause);
-
- /* if we are in PAUSE change the state */
- if (rtp_channels->pause) {
- rtp_channels->pause = FALSE;
- /* set the sensitive state of the buttons (decode, play, pause, stop) */
- bt_state(FALSE, FALSE, TRUE, TRUE);
-
- /* if not PAUSE, then start to PLAY */
- } else {
-#if PORTAUDIO_API_1
- assert(output_channels <= INT_MAX);
- err = Pa_OpenStream(
- &pa_stream,
- paNoDevice, /* default input device */
- 0, /* no input */
- PA_SAMPLE_TYPE,
- NULL,
- Pa_GetDefaultOutputDeviceID(),
- (int)output_channels,
- PA_SAMPLE_TYPE,
- NULL,
- sample_rate,
- FRAMES_PER_BUFFER,
- 0, /* number of buffers, if zero then use default minimum */
- paClipOff, /* we won't output out of range samples so don't bother clipping them */
- paCallback,
- rtp_channels );
-
- if( err != paNoError ) {
- const char *deviceName = "No Device";
-
- PaDeviceID device = Pa_GetDefaultOutputDeviceID();
-
- if (device != paNoDevice)
- {
- const PaDeviceInfo* deviceInfo = Pa_GetDeviceInfo( device );
- if (deviceInfo)
- deviceName = deviceInfo->name;
- else
- deviceName = "(No device info)";
- }
-
- dialog = gtk_message_dialog_new ((GtkWindow *) rtp_player_dlg_w,
- GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE,
- "Got this info from PortAudio Library:\n"
- " Default deviceName: %s (%d)", deviceName, device);
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
-
- dialog = gtk_message_dialog_new ((GtkWindow *) rtp_player_dlg_w,
- GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE,
- "Can not Open Stream in PortAudio Library.\n Error: %s", Pa_GetErrorText( err ));
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
- return;
- }
-#else /* PORTAUDIO_API_1 */
- if (Pa_GetDefaultOutputDevice() != paNoDevice) {
- assert(output_channels <= INT_MAX);
- err = Pa_OpenDefaultStream(
- &pa_stream,
- 0,
- (int)output_channels,
- PA_SAMPLE_TYPE,
- sample_rate,
- FRAMES_PER_BUFFER,
- paCallback,
- rtp_channels );
- } else {
- /* If the Default Host API doesn't even provide a device
- * we might as well go look for another.
- */
- PaHostApiIndex host_api_count = Pa_GetHostApiCount();
- PaHostApiIndex default_host_api_index = Pa_GetDefaultHostApi();
-
- PaHostApiIndex host_api_index;
- const PaHostApiInfo *host_api_info = NULL;
-
- for (host_api_index=0; host_api_index<host_api_count; host_api_index++)
- {
- /* Skip the default host API, that didn't work before */
- if (host_api_index == default_host_api_index)
- continue;
-
- /* If we find a host API with a device, then take it. */
- host_api_info = Pa_GetHostApiInfo(host_api_index);
- if (host_api_info->deviceCount > 0)
- break;
- }
-
- if (host_api_index<host_api_count)
- {
- PaStreamParameters stream_parameters;
- stream_parameters.device = host_api_info->defaultOutputDevice;
- stream_parameters.channelCount = channels;
- stream_parameters.sampleFormat = PA_SAMPLE_TYPE;
- stream_parameters.suggestedLatency = 0;
- stream_parameters.hostApiSpecificStreamInfo = NULL;
-#ifdef DEBUG
- g_print("Trying Host API: %s\n", host_api_info->name);
-#endif
- err = Pa_OpenStream(
- &pa_stream,
- NULL, /* no input */
- &stream_parameters,
- sample_rate,
- FRAMES_PER_BUFFER,
- paClipOff, /* we won't output out of range samples so don't bother clipping them */
- paCallback,
- rtp_channels );
- }
- else
- {
- err = paNoDevice;
- }
- }
-
- if( err != paNoError ) {
- PaHostApiIndex hostApi = Pa_GetDefaultHostApi();
- if (hostApi < 0)
- {
- dialog = gtk_message_dialog_new ((GtkWindow *) rtp_player_dlg_w,
- GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE,
- "Can not even get the default host API from PortAudio Library.\n Error: %s",
- Pa_GetErrorText( hostApi ));
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
- }
- else
- {
- const PaHostApiInfo *hostApiInfo = Pa_GetHostApiInfo( hostApi );
-
- if ( !hostApiInfo )
- {
- dialog = gtk_message_dialog_new ((GtkWindow *) rtp_player_dlg_w,
- GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE,
- "Can not even get the host API info from PortAudio Library.");
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
- }
- else
- {
- const char *hostApiName = hostApiInfo->name;
- const char *deviceName = "No Device";
-
- PaDeviceIndex device = hostApiInfo->defaultOutputDevice;
-
- if (device != paNoDevice)
- {
- const PaDeviceInfo* deviceInfo = Pa_GetDeviceInfo( device );
- if (deviceInfo)
- deviceName = deviceInfo->name;
- else
- deviceName = "(No device info)";
- }
-
- dialog = gtk_message_dialog_new ((GtkWindow *) rtp_player_dlg_w,
- GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE,
- "Got this info from PortAudio Library:\n"
- " Default hostApiName: %s\n"
- " Default deviceName: %s (%d)", hostApiName, deviceName, device);
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
- }
- }
-
- dialog = gtk_message_dialog_new ((GtkWindow *) rtp_player_dlg_w,
- GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE,
- "Can not Open Stream in PortAudio Library.\n Error: %s", Pa_GetErrorText( err ));
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
- return;
- }
-#endif
-
- err = Pa_StartStream( pa_stream );
- if( err != paNoError ) {
- dialog = gtk_message_dialog_new ((GtkWindow *) rtp_player_dlg_w,
- GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE,
- "Can not Start Stream in PortAudio Library.\n Error: %s", Pa_GetErrorText( err ));
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
- return;
- }
-#if !PORTAUDIO_API_1
- rtp_channels->pa_start_time = Pa_GetStreamTime(pa_stream);
- if (rtp_channels->pa_start_time == 0) {
- /* PortAudio has a broken Pa_GetStreamTime
- * implementation for ALSA on top of PulseAudio.
- * https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=10307
- */
- getCurrentTime = getMonoTime;
- rtp_channels->pa_start_time = getCurrentTime(pa_stream);
- } else {
- getCurrentTime = Pa_GetStreamTime;
- }
-#endif /* PORTAUDIO_API_1 */
-
- rtp_channels->stop = FALSE;
-
- /* set the sensitive state of the buttons (decode, play, pause, stop) */
- bt_state(FALSE, FALSE, TRUE, TRUE);
- }
-
- /* Draw the cursor in the graph */
- g_timeout_add_full(G_PRIORITY_DEFAULT_IDLE, MULT*1000/sample_rate, draw_cursors, NULL, NULL);
-
-}
-
-/****************************************************************************/
-static void
-pause_channels(void)
-{
- rtp_channels->pause = !(rtp_channels->pause);
-
- /* reactivate the cusrosr display if no in pause */
- if (!rtp_channels->pause) {
- /* Draw the cursor in the graph */
- g_timeout_add_full(G_PRIORITY_DEFAULT_IDLE, MULT*1000/sample_rate, draw_cursors, NULL, NULL);
- }
-
- /* set the sensitive state of the buttons (decode, play, pause, stop) */
- bt_state(FALSE, TRUE, FALSE, TRUE);
-}
-
-/****************************************************************************/
-static void
-reset_rtp_channels(void)
-{
- rtp_channels->channel = 0;
- rtp_channels->rci[0] = NULL;
- rtp_channels->rci[1] = NULL;
- rtp_channels->start_index[0] = 0;
- rtp_channels->start_index[1] = 0;
- rtp_channels->end_index[0] = 0;
- rtp_channels->end_index[1] = 0;
- rtp_channels->max_frame_index = 0;
- rtp_channels->frame_index = 0;
- rtp_channels->pause = FALSE;
- rtp_channels->pause_duration = 0;
- rtp_channels->stop = TRUE;
- rtp_channels->out_diff_time = 10000;
-}
-
-/****************************************************************************/
-static void
-remove_channel_to_window(gchar *key _U_ , rtp_channel_info_t *rci, gpointer ptr _U_ )
-{
-#if GTK_CHECK_VERSION(2,22,0)
- if(rci->surface){
- cairo_surface_destroy (rci->surface);
- rci->surface=NULL;
- }
-#else
- g_object_unref(rci->pixmap);
-#endif
- gtk_widget_destroy(rci->draw_area);
- gtk_widget_destroy(rci->scroll_window);
- gtk_widget_destroy(rci->check_bt);
- if (rci->separator)
- gtk_widget_destroy(rci->separator);
-}
-
-/****************************************************************************/
-static void
-reset_channels(void)
-{
-
- if (rtp_channels_hash) {
- /* Remove the channels from the main window if there are there */
- g_hash_table_foreach( rtp_channels_hash, (GHFunc)remove_channel_to_window, NULL);
-
-
- /* destroy the rtp channels hash table */
- g_hash_table_destroy(rtp_channels_hash);
- rtp_channels_hash = NULL;
- }
-
- if (rtp_channels) {
- reset_rtp_channels();
- }
-}
-
-/****************************************************************************/
-void
-reset_rtp_player(void)
-{
- /* Destroy the rtp channels */
- reset_channels();
-
- /* destroy the rtp streams hash table */
- if (rtp_streams_hash) {
- g_hash_table_destroy(rtp_streams_hash);
- rtp_streams_hash = NULL;
- }
-
- /* destroy the rtp streams list */
- if (rtp_streams_list) {
- g_list_free (rtp_streams_list);
- rtp_streams_list = NULL;
- }
-
-}
-
-/****************************************************************************/
-static void
-decode_streams(void)
-{
- guint statusbar_context;
- guint counter;
- data_info info;
-
- /* set the sensitive state of the buttons (decode, play, pause, stop) */
- bt_state(FALSE, FALSE, FALSE, FALSE);
-
- reset_channels();
-
- progress_bar = gtk_progress_bar_new();
- gtk_widget_set_size_request(progress_bar, 100, -1);
- gtk_box_pack_start(GTK_BOX (stat_hbox), progress_bar, FALSE, FALSE, 2);
- gtk_widget_show(progress_bar);
- statusbar_context = gtk_statusbar_get_context_id((GtkStatusbar *) info_bar, "main");
- gtk_statusbar_push((GtkStatusbar *) info_bar, statusbar_context, " Decoding RTP packets...");
-
-#if !GTK_CHECK_VERSION(3,0,0)
- gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(info_bar), FALSE);
-#endif
- /* reset the number of packet to be decoded, this is used for the progress bar */
- total_packets = 0;
- /* reset the Progress Bar count */
- progbar_count = 0;
-
- /* Mark the RTP streams to be played using the selected VoipCalls. If voip_calls is NULL
- then this was called from "RTP Analysis" so mark all streams */
- if (rtp_streams_hash) {
- if (voip_calls)
- g_hash_table_foreach( rtp_streams_hash, (GHFunc)mark_rtp_stream_to_play, NULL);
- else
- g_hash_table_foreach( rtp_streams_hash, (GHFunc)mark_all_rtp_stream_to_decode, NULL);
- }
-
- /* Decode the RTP streams and add them to the RTP channels to be played */
- info.current_channel = 0;
- g_list_foreach(rtp_streams_list, (GFunc) decode_rtp_stream, &info);
- if (channels > 1) {
- info.current_channel = 1;
- g_list_foreach(rtp_streams_list, (GFunc) decode_rtp_stream, &info);
- }
-
- /* RTP_STREAM_DEBUG("decoded %d streams", g_list_length(rtp_streams_list)); */
- /* reset the number of frames to be displayed, this is used for the progress bar */
- total_frames = 0;
- /* Count the frames in all the RTP channels */
- if (rtp_channels_hash)
- g_hash_table_foreach( rtp_channels_hash, (GHFunc)count_channel_frames, NULL);
-
- /* reset the Progress Bar count again for the progress of creating the channels view */
- progbar_count = 0;
- gtk_statusbar_pop((GtkStatusbar *) info_bar, statusbar_context);
- gtk_statusbar_push((GtkStatusbar *) info_bar, statusbar_context, " Creating channels view...");
-
- /* Display the RTP channels in the window */
- counter = 0;
- if (rtp_channels_hash)
- g_hash_table_foreach( rtp_channels_hash, (GHFunc)add_channel_to_window, &counter);
-
- /* Resize the main scroll window to display no more than preferred (or default) max channels, scroll bar will be used if needed */
-
- if (prefs.rtp_player_max_visible < 1 || prefs.rtp_player_max_visible > 10)
- prefs.rtp_player_max_visible = RTP_PLAYER_DEFAULT_VISIBLE;
-
- gtk_widget_set_size_request(main_scrolled_window, CHANNEL_WIDTH,
- MIN(counter, prefs.rtp_player_max_visible) * (CHANNEL_HEIGHT+60));
-
- gtk_widget_show_all(main_scrolled_window);
-
- gtk_widget_destroy(progress_bar);
- progress_bar = NULL;
-#if !GTK_CHECK_VERSION(3,0,0)
- gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(info_bar), TRUE);
-#endif
- gtk_statusbar_pop((GtkStatusbar *) info_bar, statusbar_context);
-
- /* blank the status label */
- gtk_statusbar_pop((GtkStatusbar *) info_bar, statusbar_context);
-
- /* set the sensitive state of the buttons (decode, play, pause, stop) */
- bt_state(TRUE, FALSE, FALSE, FALSE);
-
- /* get the static jitter buffer from the spinner gui */
- new_jitter_buff = (int) gtk_spin_button_get_value((GtkSpinButton * )jitter_spinner);
-
-}
-
-/****************************************************************************/
-static void
-on_cb_view_as_time_of_day_clicked(GtkButton *button _U_, gpointer user_data _U_)
-{
- /* Decode the streams again as if the decode button was pushed to update the time display */
- decode_streams();
-}
-
-/****************************************************************************/
-static void
-on_cb_use_method_group_clicked(GtkToggleButton *button _U_, gpointer user_data _U_)
-{
- /* set the sensitive state of the buttons (decode, play, pause, stop) */
- bt_state(TRUE, FALSE, FALSE, FALSE);
-}
-
-/****************************************************************************/
-static void
-on_bt_decode_clicked(GtkButton *button _U_, gpointer user_data _U_)
-{
- decode_streams();
-}
-
-/****************************************************************************/
-static void
-on_bt_play_clicked(GtkButton *button _U_, gpointer user_data _U_)
-{
- play_channels();
-}
-
-/****************************************************************************/
-static void
-on_bt_pause_clicked(GtkButton *button _U_, gpointer user_data _U_)
-{
- pause_channels();
-}
-
-/****************************************************************************/
-static void
-on_bt_stop_clicked(GtkButton *button _U_, gpointer user_data _U_)
-{
- stop_channels();
-}
-
-/****************************************************************************/
-static void
-rtp_player_on_destroy(GObject *object _U_, gpointer user_data _U_)
-{
- PaError err;
- GtkWidget *dialog;
-
- /* Stop the channels if necessary */
- if(rtp_channels && (!rtp_channels->stop)){
- stop_channels();
- }
-
- /* Destroy the rtp channels */
- reset_channels();
-
- g_free(rtp_channels);
- rtp_channels = NULL;
-
- /* Terminate the use of PortAudio library */
- err = Pa_Terminate();
- initialized = FALSE;
- if( err != paNoError ) {
- dialog = gtk_message_dialog_new ((GtkWindow *) rtp_player_dlg_w,
- GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE,
- "Can not terminate the PortAudio Library.\n Error: %s", Pa_GetErrorText( err ));
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
- }
-
- gtk_widget_destroy(rtp_player_dlg_w);
- main_scrolled_window = NULL;
- rtp_player_dlg_w = NULL;
-}
-
-/****************************************************************************/
-static void
-jitter_spinner_value_changed (GtkSpinButton *spinner _U_, gpointer user_data _U_)
-{
- /* set the sensitive state of the buttons (decode, play, pause, stop) */
- bt_state(TRUE, TRUE, FALSE, FALSE);
-}
-
-/****************************************************************************/
-static void
-rtp_player_dlg_create(void)
-{
- GtkWidget *main_vb;
- GtkWidget *hbuttonbox;
- GtkWidget *timestamp_hb;
- GtkWidget *h_jitter_buttons_box;
- GtkWidget *bt_close;
- GtkAdjustment *jitter_spinner_adj;
- GtkWidget *label;
- gchar *title_name_ptr;
- gchar *win_name;
-
- title_name_ptr = cf_get_display_name(&cfile);
- win_name = g_strdup_printf("%s - RTP Player", title_name_ptr);
- g_free(title_name_ptr);
-
- rtp_player_dlg_w = dlg_window_new(win_name); /* transient_for top_level */
- gtk_window_set_destroy_with_parent (GTK_WINDOW(rtp_player_dlg_w), TRUE);
- gtk_window_set_position(GTK_WINDOW(rtp_player_dlg_w), GTK_WIN_POS_NONE);
-
- gtk_window_set_default_size(GTK_WINDOW(rtp_player_dlg_w), 400, 50);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(rtp_player_dlg_w), main_vb);
- gtk_container_set_border_width (GTK_CONTAINER (main_vb), 2);
-
- main_scrolled_window=gtk_scrolled_window_new(NULL, NULL);
- gtk_container_set_border_width (GTK_CONTAINER (main_scrolled_window), 4);
- gtk_widget_set_size_request(main_scrolled_window, CHANNEL_WIDTH, 0);
-
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (main_scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- gtk_box_pack_start(GTK_BOX(main_vb), main_scrolled_window, TRUE, TRUE, 0);
-
- channels_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width (GTK_CONTAINER (channels_vb), 2);
-#if ! GTK_CHECK_VERSION(3,8,0)
- gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW (main_scrolled_window), channels_vb);
-#else
- gtk_container_add(GTK_CONTAINER (main_scrolled_window), channels_vb);
-#endif
-
- timestamp_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(main_vb), timestamp_hb, FALSE, FALSE, 0);
- cb_view_as_time_of_day = gtk_check_button_new_with_label("View as time of day");
- gtk_box_pack_start(GTK_BOX(timestamp_hb), cb_view_as_time_of_day, TRUE, FALSE, 0); /* Centered */
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_view_as_time_of_day), FALSE);
- gtk_widget_set_tooltip_text(cb_view_as_time_of_day, "View the timestamps as time of day instead of seconds since beginning of capture");
- g_signal_connect(cb_view_as_time_of_day, "toggled", G_CALLBACK(on_cb_view_as_time_of_day_clicked), NULL);
-
- h_jitter_buttons_box = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_container_set_border_width (GTK_CONTAINER (h_jitter_buttons_box), 10);
- gtk_box_pack_start (GTK_BOX(main_vb), h_jitter_buttons_box, FALSE, FALSE, 0);
- label = gtk_label_new("Jitter buffer [ms] ");
- gtk_box_pack_start(GTK_BOX(h_jitter_buttons_box), label, FALSE, FALSE, 0);
-
- jitter_spinner_adj = (GtkAdjustment *) gtk_adjustment_new (50, 0, 500, 5, 10, 0);
- jitter_spinner = gtk_spin_button_new (jitter_spinner_adj, 5, 0);
- gtk_box_pack_start(GTK_BOX(h_jitter_buttons_box), jitter_spinner, FALSE, FALSE, 0);
- gtk_widget_set_tooltip_text (jitter_spinner, "The simulated jitter buffer in [ms]");
- g_signal_connect(G_OBJECT (jitter_spinner_adj), "value_changed", G_CALLBACK(jitter_spinner_value_changed), NULL);
-
- cb_use_jitter_buffer = gtk_radio_button_new_with_label(NULL, "Jitter buffer");
- gtk_box_pack_start(GTK_BOX(h_jitter_buttons_box), cb_use_jitter_buffer, FALSE, FALSE, 10);
- g_signal_connect(cb_use_jitter_buffer, "toggled", G_CALLBACK(on_cb_use_method_group_clicked), NULL);
- gtk_widget_set_tooltip_text(cb_use_jitter_buffer, "Use jitter buffer to heard RTP stream as end user");
-
- cb_use_rtp_timestamp = gtk_radio_button_new_with_label(gtk_radio_button_get_group(GTK_RADIO_BUTTON(cb_use_jitter_buffer)), "Use RTP timestamp");
- gtk_box_pack_start(GTK_BOX(h_jitter_buttons_box), cb_use_rtp_timestamp, FALSE, FALSE, 10);
- g_signal_connect(cb_use_rtp_timestamp, "toggled", G_CALLBACK(on_cb_use_method_group_clicked), NULL);
- gtk_widget_set_tooltip_text(cb_use_rtp_timestamp, "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");
-
- cb_use_uninterrupted_mode = gtk_radio_button_new_with_label(gtk_radio_button_get_group(GTK_RADIO_BUTTON(cb_use_jitter_buffer)), "Uninterrupted mode");
- gtk_box_pack_start(GTK_BOX(h_jitter_buttons_box), cb_use_uninterrupted_mode, FALSE, FALSE, 10);
- g_signal_connect(cb_use_uninterrupted_mode, "toggled", G_CALLBACK(on_cb_use_method_group_clicked), NULL);
- gtk_widget_set_tooltip_text(cb_use_uninterrupted_mode, "Ignore RTP Timestamp. Play stream as it is completed. It is useful when the RTP timestamp is missing.");
-
- /* button row */
- hbuttonbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_start (GTK_BOX (h_jitter_buttons_box), hbuttonbox, TRUE, TRUE, 0);
- gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox), GTK_BUTTONBOX_SPREAD);
- gtk_box_set_spacing (GTK_BOX (hbuttonbox), 10);
-
- bt_decode = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_DECODE);
- gtk_container_add(GTK_CONTAINER(hbuttonbox), bt_decode);
- g_signal_connect(bt_decode, "clicked", G_CALLBACK(on_bt_decode_clicked), NULL);
- gtk_widget_set_tooltip_text (bt_decode, "Decode the RTP stream(s)");
-
- bt_play = ws_gtk_button_new_from_stock(GTK_STOCK_MEDIA_PLAY);
- gtk_container_add(GTK_CONTAINER(hbuttonbox), bt_play);
- g_signal_connect(bt_play, "clicked", G_CALLBACK(on_bt_play_clicked), NULL);
- gtk_widget_set_tooltip_text (bt_play, "Play the RTP channel(s)");
-
- bt_pause = ws_gtk_button_new_from_stock(GTK_STOCK_MEDIA_PAUSE);
- gtk_container_add(GTK_CONTAINER(hbuttonbox), bt_pause);
- g_signal_connect(bt_pause, "clicked", G_CALLBACK(on_bt_pause_clicked), NULL);
- gtk_widget_set_tooltip_text (bt_pause, "Pause the RTP channel(s)");
-
- bt_stop = ws_gtk_button_new_from_stock(GTK_STOCK_MEDIA_STOP);
- gtk_container_add(GTK_CONTAINER(hbuttonbox), bt_stop);
- g_signal_connect(bt_stop, "clicked", G_CALLBACK(on_bt_stop_clicked), NULL);
- gtk_widget_set_tooltip_text (bt_stop, "Stop the RTP channel(s)");
-
- bt_close = ws_gtk_button_new_from_stock(GTK_STOCK_CLOSE);
- gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_close);
- gtk_widget_set_can_default(bt_close, TRUE);
- gtk_widget_set_tooltip_text (bt_close, "Close this dialog");
- window_set_cancel_button(rtp_player_dlg_w, bt_close, window_cancel_button_cb);
-
- g_signal_connect(rtp_player_dlg_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(rtp_player_dlg_w, "destroy", G_CALLBACK(rtp_player_on_destroy), NULL);
-
- /* button row */
- /* ?? hbuttonbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);*/
-
- /* Filter/status hbox */
- stat_hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(stat_hbox), 0);
-
- /* statusbar */
- info_bar = gtk_statusbar_new();
-#if !GTK_CHECK_VERSION(3,0,0)
- gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(info_bar), TRUE);
-#endif
- gtk_box_pack_start(GTK_BOX(stat_hbox), info_bar, TRUE, TRUE, 0);
-
- /* statusbar hbox */
- gtk_box_pack_start(GTK_BOX(main_vb), stat_hbox, FALSE, TRUE, 0);
-
- /* set the sensitive state of the buttons (decode, play, pause, stop) */
- bt_state(TRUE, FALSE, FALSE, FALSE);
-
- gtk_widget_show_all(rtp_player_dlg_w);
-
- /* Force gtk to redraw the window before starting decoding the packet */
- while (g_main_context_iteration(NULL, FALSE));
-
- g_free(win_name);
-}
-
-/****************************************************************************/
-void
-rtp_player_init(voip_calls_tapinfo_t *voip_calls_tap)
-{
- PaError err;
- GtkWidget *dialog;
-
- if (initialized) return;
- initialized = TRUE;
-
- voip_calls = voip_calls_tap;
- err = Pa_Initialize();
- if( err != paNoError ) {
- dialog = gtk_message_dialog_new ((GtkWindow *) rtp_player_dlg_w,
- GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE,
- "Can not Initialize the PortAudio Library.\n Error: %s", Pa_GetErrorText( err ));
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
- initialized = FALSE;
- return;
- }
-
- new_jitter_buff = -1;
-
- if (!rtp_channels) {
- rtp_channels = g_new(rtp_play_channels_t,1);
- }
-
- reset_rtp_channels();
-
-#ifdef DEBUG
- g_print("Pa_GetHostApiCount() = %d\n", Pa_GetHostApiCount());
- g_print("Pa_GetDefaultHostApi() = %d\n", Pa_GetDefaultHostApi());
-
- if ((Pa_GetHostApiCount() >= 0) && (Pa_GetDefaultHostApi() >= 0))
- {
- unsigned int i;
- PaHostApiIndex api_index;
- const PaHostApiInfo *api_info = Pa_GetHostApiInfo( (unsigned int)Pa_GetDefaultHostApi() );
- g_print("Default PaHostApiInfo.type = %d (%s)\n", api_info->type, api_info->name);
-
- for (i=0; i<(unsigned int)Pa_GetHostApiCount(); i++)
- {
- api_info = Pa_GetHostApiInfo( i );
- g_print("PaHostApiInfo[%u].type = %d (%s)\n", i, api_info->type, api_info->name);
- }
-
- api_index = Pa_HostApiTypeIdToHostApiIndex( paALSA );
- if (api_index < 0)
- {
- g_print("api_index for paALSA not found (%d)\n", api_index);
- }
- else
- {
- api_info = Pa_GetHostApiInfo( (unsigned int)api_index );
- g_print("This should be ALSA: %s\n", api_info->name);
- }
- }
-#endif
-
- /* create the dialog window */
- rtp_player_dlg_create();
-
-}
-
-#endif /* HAVE_LIBPORTAUDIO */
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 8
- * tab-width: 8
- * indent-tabs-mode: t
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 noexpandtab:
- * :indentSize=4:tabSize=8:noTabs=false:
- */
diff --git a/ui/gtk/rtp_player.h b/ui/gtk/rtp_player.h
deleted file mode 100644
index ee6c433d74..0000000000
--- a/ui/gtk/rtp_player.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* player_rtp.h
- * RTP Player for Wireshark
- *
- * Copyright 2006, Alejandro Vaquero
- * By Alejandro Vaquero <alejandro.vaquero@yahoo.com>
- *
- * based on h323_calls.h
- * Copyright 2004, Iskratel, Ltd, Kranj
- * By Miha Jemec <m.jemec@iskratel.si>
- *
- * H323, RTP and Graph Support
- * By Alejandro Vaquero, alejandro.vaquero@verso.com
- * Copyright 2005, Verso Technologies Inc.
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __RTP_PLAYER_H__
-#define __RTP_PLAYER_H__
-
-#ifdef HAVE_LIBPORTAUDIO
-
-void rtp_player_init(voip_calls_tapinfo_t *voip_calls_tap);
-void add_rtp_packet(const struct _rtp_info *rtp_info, packet_info *pinfo);
-void reset_rtp_player(void);
-
-#endif /* HAVE_LIBPORTAUDIO */
-
-#endif /* __RTP_PLAYER_H__ */
diff --git a/ui/gtk/rtp_stream_dlg.c b/ui/gtk/rtp_stream_dlg.c
deleted file mode 100644
index 6894354a56..0000000000
--- a/ui/gtk/rtp_stream_dlg.c
+++ /dev/null
@@ -1,1200 +0,0 @@
-/* rtp_stream_dlg.c
- * RTP streams summary addition for Wireshark
- *
- * Copyright 2003, Alcatel Business Systems
- * By Lars Ruoff <lars.ruoff@gmx.net>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-#include <locale.h>
-
-#include <epan/rtp_pt.h>
-#include <epan/addr_resolv.h>
-#include "wsutil/filesystem.h"
-
-#include "../../globals.h"
-#include <epan/stat_groups.h>
-
-#include "ui/last_open_dir.h"
-#include "ui/simple_dialog.h"
-#include "ui/util.h"
-
-#include "ui/gtk/rtp_stream_dlg.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/file_dlg.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/old-gtk-compat.h"
-#include "ui/gtk/gui_stat_menu.h"
-
-static const gchar FWD_LABEL_TEXT[] = "Select a forward stream with left mouse button, and then";
-static const gchar FWD_ONLY_LABEL_TEXT[] = "Select a forward stream with Ctrl + left mouse button";
-static const gchar REV_LABEL_TEXT[] = "Select a reverse stream with Ctrl + left mouse button";
-
-static void rtpstream_tap_reset(rtpstream_tapinfo_t *ti_ptr);
-static void rtpstream_tap_draw(rtpstream_tapinfo_t *ti_ptr);
-static void rtpstream_dlg_mark_packet(rtpstream_tapinfo_t *tapinfo, frame_data *fd);
-void register_tap_listener_rtp_stream_dlg(void);
-
-/* The one and only global rtpstream_tapinfo_t structure for tshark and wireshark.
- */
-static rtpstream_tapinfo_t the_tapinfo_struct =
- { rtpstream_tap_reset, rtpstream_tap_draw, rtpstream_dlg_mark_packet,
- NULL, 0, NULL, 0, TAP_ANALYSE, NULL, NULL, NULL, FALSE
- };
-
-/****************************************************************************/
-/* pointer to the one and only dialog window */
-static GtkWidget *rtp_stream_dlg = NULL;
-
-/* save as dialog box */
-static GtkWidget *rtpstream_save_dlg = NULL;
-static GtkListStore *list_store = NULL;
-static GtkTreeIter list_iter;
-static GtkWidget *list = NULL;
-static GtkWidget *top_label = NULL;
-static GtkWidget *label_fwd = NULL;
-static GtkWidget *label_rev = NULL;
-
-static rtp_stream_info_t* selected_stream_fwd = NULL; /* current selection */
-static rtp_stream_info_t* selected_stream_rev = NULL; /* current selection for reversed */
-static GList *last_list = NULL;
-
-static guint32 streams_nb = 0; /* number of displayed streams */
-
-enum
-{
- RTP_COL_SRC_ADDR,
- RTP_COL_SRC_PORT,
- RTP_COL_DST_ADDR,
- RTP_COL_DST_PORT,
- RTP_COL_SSRC,
- RTP_COL_PAYLOAD,
- RTP_COL_PACKETS,
- RTP_COL_LOST,
- RTP_COL_MAX_DELTA,
- RTP_COL_MAX_JITTER,
- RTP_COL_MEAN_JITTER,
- RTP_COL_PROBLEM,
- RTP_COL_DATA,
- NUM_COLS /* The number of columns */
-};
-
-/****************************************************************************/
-static void save_stream_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
-{
- /* Note that we no longer have a Save voice info dialog box. */
- rtpstream_save_dlg = NULL;
-}
-
-/****************************************************************************/
-/* save in a file */
-static gboolean save_stream_ok_cb(GtkWidget *ok_bt _U_, gpointer fs)
-{
- gchar *g_dest;
-
- if (!selected_stream_fwd) {
- return TRUE;
- }
-
- g_dest = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fs));
-
- /* Perhaps the user specified a directory instead of a file.
- Check whether they did. */
- if (test_for_directory(g_dest) == EISDIR) {
- /* It's a directory - set the file selection box to display it. */
- set_last_open_dir(g_dest);
- g_free(g_dest);
- file_selection_set_current_folder((GtkWidget *)fs, get_last_open_dir());
- gtk_file_chooser_set_current_name((GtkFileChooser *)fs, "");
- return FALSE;
- }
-
-#if 0 /* GtkFileChooser/gtk_dialog_run currently being used. */
- /* So: Leaving the dialog box displayed after popping-up an */
- /* alert box won't work. */
- /*
- * Don't dismiss the dialog box if the save operation fails.
- */
- if (!rtpstream_save(&the_tapinfo_struct, &cfile, selected_stream_fwd, g_dest)) {
- g_free(g_dest);
- return;
- }
- g_free(g_dest);
- window_destroy(GTK_WIDGET(rtpstream_save_dlg));
- return;
-#else
- /* Dialog box needs to be always destroyed. Return TRUE */
- /* so that caller will destroy the dialog box. */
- /* See comment under rtpstream_on_save. */
- rtpstream_save(&the_tapinfo_struct, &cfile, selected_stream_fwd, g_dest);
- g_free(g_dest);
- return TRUE;
-#endif
-}
-
-
-/****************************************************************************/
-/* CALLBACKS */
-/****************************************************************************/
-static void
-rtpstream_on_destroy(GObject *object _U_, gpointer user_data _U_)
-{
- /* Remove the stream tap listener */
- remove_tap_listener_rtp_stream(&the_tapinfo_struct);
-
- /* Is there a save voice window open? */
- if (rtpstream_save_dlg != NULL)
- window_destroy(rtpstream_save_dlg);
-
- /* Clean up memory used by stream tap */
- rtpstream_reset(rtpstream_dlg_get_tapinfo());
-
- /* Note that we no longer have a "RTP Streams" dialog box. */
- rtp_stream_dlg = NULL;
-}
-
-
-/****************************************************************************/
-static void
-rtpstream_on_unselect(GtkButton *button _U_, gpointer user_data _U_)
-{
- GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
- gtk_tree_selection_unselect_all(selection);
-
- selected_stream_fwd = NULL;
- selected_stream_rev = NULL;
- gtk_label_set_text(GTK_LABEL(label_fwd), FWD_LABEL_TEXT);
- gtk_label_set_text(GTK_LABEL(label_rev), REV_LABEL_TEXT);
-}
-
-/****************************************************************************/
-static void
-rtpstream_on_findrev(GtkButton *button _U_, gpointer user_data _U_)
-{
- GtkTreeSelection *selection;
- GList *path_list;
- GList *path_list_item = NULL;
- GtkTreePath *path = NULL;
- GtkTreePath *path_fwd = NULL;
- GtkTreePath *path_rev = NULL;
- GtkTreeIter iter;
- rtp_stream_info_t *stream = NULL;
- gboolean found_it = FALSE;
-
- if (selected_stream_fwd==NULL)
- return;
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
- path_list = gtk_tree_selection_get_selected_rows(selection, NULL);
-
- if (path_list) {
- path_list_item = g_list_first(path_list);
- path = (GtkTreePath *)(path_list_item->data);
- }
-
- if (path && gtk_tree_model_get_iter(GTK_TREE_MODEL(list_store), &iter, path)) {
- gtk_tree_model_get(GTK_TREE_MODEL(list_store), &iter, RTP_COL_DATA, &stream, -1);
- if (stream == selected_stream_fwd) {
- path_fwd = path;
- }
- if (stream == selected_stream_rev) {
- path_rev = path;
- }
- }
-
- path = NULL;
- if (path_list_item) {
- path_list_item = g_list_next(path_list_item);
- if (path_list_item)
- path = (GtkTreePath *)(path_list_item->data);
- }
-
- if (path && gtk_tree_model_get_iter(GTK_TREE_MODEL(list_store), &iter, path)) {
- gtk_tree_model_get(GTK_TREE_MODEL(list_store), &iter, RTP_COL_DATA, &stream, -1);
- if (stream == selected_stream_fwd) {
- path_fwd = path;
- }
- if (stream == selected_stream_rev) {
- path_rev = path;
- }
- }
-
- /* Find it from the forward stream on */
- gtk_tree_model_get_iter(GTK_TREE_MODEL(list_store), &iter, path_fwd);
- while (gtk_tree_model_iter_next(GTK_TREE_MODEL(list_store), &iter)) {
- gtk_tree_model_get(GTK_TREE_MODEL(list_store), &iter, RTP_COL_DATA, &stream, -1);
- if (rtp_stream_info_is_reverse(selected_stream_fwd, stream)) {
- found_it = TRUE;
- break;
- }
- };
-
- if (!found_it) {
- /* If we're not done yet, restart at the beginning */
- gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list_store), &iter);
- do {
- gtk_tree_model_get(GTK_TREE_MODEL(list_store), &iter, RTP_COL_DATA, &stream, -1);
- if (rtp_stream_info_is_reverse(selected_stream_fwd, stream)) {
- found_it = TRUE;
- break;
- }
- if (stream == selected_stream_fwd)
- break;
- } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(list_store), &iter));
- }
-
- if (found_it) {
- if (path_rev)
- gtk_tree_selection_unselect_path(selection, path_rev);
- gtk_tree_selection_select_iter(selection, &iter);
- }
-
- g_list_foreach(path_list, (GFunc)gtk_tree_path_free, NULL);
- g_list_free(path_list);
-}
-
-
-/****************************************************************************/
-/*
-static void
-rtpstream_on_goto (GtkButton *button _U_,
- gpointer user_data _U_)
-{
- if (selected_stream_fwd)
- {
- cf_goto_frame(&cfile, selected_stream_fwd->first_frame_num);
- }
-}
-*/
-
-
-/****************************************************************************/
-static void
-rtpstream_on_save(GtkButton *button _U_, gpointer data _U_)
-{
-/* XX - not needed?
- rtpstream_tapinfo_t* tapinfo = data;
-*/
-
- if (!selected_stream_fwd) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Please select a forward stream");
- return;
- }
-
-#if 0 /* XXX: GtkFileChooserDialog/gtk_dialog_run currently being used is effectively modal so this is not req'd */
- if (rtpstream_save_dlg != NULL) {
- /* There's already a Save dialog box; reactivate it. */
- reactivate_window(rtpstream_save_dlg);
- return;
- }
-#endif
-
- rtpstream_save_dlg = gtk_file_chooser_dialog_new(
- "Wireshark: Save selected stream in rtpdump ('-F dump') format",
- GTK_WINDOW(rtp_stream_dlg), GTK_FILE_CHOOSER_ACTION_SAVE,
- GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- NULL);
- gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(rtpstream_save_dlg), TRUE);
-
- g_signal_connect(rtpstream_save_dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(rtpstream_save_dlg, "destroy", G_CALLBACK(save_stream_destroy_cb), NULL);
-
- gtk_widget_show(rtpstream_save_dlg);
- window_present(rtpstream_save_dlg);
-#if 0
- if (gtk_dialog_run(GTK_DIALOG(rtpstream_save_dlg)) == GTK_RESPONSE_ACCEPT){
- save_stream_ok_cb(rtpstream_save_dlg, rtpstream_save_dlg);
- }else{
- window_destroy(rtpstream_save_dlg);
- }
-#endif
- /* "Run" the GtkFileChooserDialog. */
- /* Upon exit: If "Accept" run the OK callback. */
- /* If the OK callback returns with a FALSE status, re-run the dialog.*/
- /* If not accept (ie: cancel) destroy the window. */
- /* XXX: If the OK callback pops up an alert box (eg: for an error) it *must* */
- /* return with a TRUE status so that the dialog window will be destroyed. */
- /* Trying to re-run the dialog after popping up an alert box will not work */
- /* since the user will not be able to dismiss the alert box. */
- /* The (somewhat unfriendly) effect: the user must re-invoke the */
- /* GtkFileChooserDialog whenever the OK callback pops up an alert box. */
- /* */
- /* ToDo: use GtkFileChooserWidget in a dialog window instead of */
- /* GtkFileChooserDialog. */
- while (gtk_dialog_run(GTK_DIALOG(rtpstream_save_dlg)) == GTK_RESPONSE_ACCEPT) {
- if (save_stream_ok_cb(NULL, rtpstream_save_dlg)) {
- break; /* we're done */
- }
- }
- window_destroy(rtpstream_save_dlg);
-}
-
-
-/****************************************************************************/
-static void
-rtpstream_on_mark(GtkButton *button _U_, gpointer user_data _U_)
-{
- if (selected_stream_fwd==NULL && selected_stream_rev==NULL)
- return;
- rtpstream_mark(&the_tapinfo_struct, &cfile, selected_stream_fwd, selected_stream_rev);
-}
-
-
-/****************************************************************************/
-static void
-rtpstream_on_filter(GtkButton *button _U_, gpointer user_data _U_)
-{
- gchar *filter_string = NULL;
- gchar *filter_string_fwd = NULL;
- gchar *filter_string_rev = NULL;
- gchar ip_version[3];
- char *src_addr, *dst_addr;
-
- if (selected_stream_fwd==NULL && selected_stream_rev==NULL)
- return;
-
- if (selected_stream_fwd)
- {
- if (selected_stream_fwd->src_addr.type==AT_IPv6) {
- g_strlcpy(ip_version,"v6",sizeof(ip_version));
- } else {
- ip_version[0] = '\0';
- }
- src_addr = (char*)address_to_str(NULL, &(selected_stream_fwd->src_addr));
- dst_addr = (char*)address_to_str(NULL, &(selected_stream_fwd->dest_addr));
- filter_string_fwd = g_strdup_printf(
- "(ip%s.src==%s && udp.srcport==%u && ip%s.dst==%s && udp.dstport==%u && rtp.ssrc==0x%X)",
- ip_version,
- src_addr,
- selected_stream_fwd->src_port,
- ip_version,
- dst_addr,
- selected_stream_fwd->dest_port,
- selected_stream_fwd->ssrc);
-
- filter_string = filter_string_fwd;
- wmem_free(NULL, src_addr);
- wmem_free(NULL, dst_addr);
- }
-
- if (selected_stream_rev)
- {
- if (selected_stream_rev->src_addr.type==AT_IPv6) {
- g_strlcpy(ip_version,"v6",sizeof(ip_version));
- } else {
- ip_version[0] = '\0';
- }
- src_addr = (char*)address_to_str(NULL, &(selected_stream_rev->src_addr));
- dst_addr = (char*)address_to_str(NULL, &(selected_stream_rev->dest_addr));
- filter_string_rev = g_strdup_printf(
- "(ip%s.src==%s && udp.srcport==%u && ip%s.dst==%s && udp.dstport==%u && rtp.ssrc==0x%X)",
- ip_version,
- src_addr,
- selected_stream_rev->src_port,
- ip_version,
- dst_addr,
- selected_stream_rev->dest_port,
- selected_stream_rev->ssrc);
-
- filter_string = filter_string_rev;
- wmem_free(NULL, src_addr);
- wmem_free(NULL, dst_addr);
- }
-
- if ((selected_stream_fwd) && (selected_stream_rev))
- {
- filter_string = g_strdup_printf("%s || %s", filter_string_fwd, filter_string_rev);
- g_free(filter_string_fwd);
- g_free(filter_string_rev);
- }
-
- gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), filter_string);
- g_free(filter_string);
-
-/*
- main_filter_packets(&cfile, filter_string, FALSE);
- rtpstream_dlg_update(rtpstream_dlg_get_tapinfo()->strinfo_list);
-*/
-}
-
-
-/****************************************************************************/
-static void
-rtpstream_on_copy_as_csv(GtkWindow *win _U_, gpointer data _U_)
-{
- GtkTreeViewColumn *column;
- const gchar *title;
- GtkTreeIter iter;
- guint i,j;
- gchar *table_entry;
- guint table_entry_uint;
- gdouble table_entry_double;
-
- GString *CSV_str;
- GtkClipboard *cb;
-
- CSV_str = g_string_sized_new(240*(1+streams_nb));
- /* Add the column headers to the CSV data */
- for (j=0; j<NUM_COLS-1; j++) {
- column = gtk_tree_view_get_column(GTK_TREE_VIEW(list), j);
- title = gtk_tree_view_column_get_title(column);
- g_string_append_printf(CSV_str, "\"%s\"", title);
- if (j<NUM_COLS-2) g_string_append(CSV_str, ",");
- }
- g_string_append(CSV_str,"\n");
-
- /* Add the column values to the CSV data */
- if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list_store), &iter)) {
- for (i=0; i<streams_nb; i++) {
- for (j=0; j<NUM_COLS-1; j++) {
- if (gtk_tree_model_get_column_type(GTK_TREE_MODEL(list_store), j) == G_TYPE_UINT) {
- gtk_tree_model_get(GTK_TREE_MODEL(list_store), &iter, j, &table_entry_uint, -1);
- g_string_append_printf(CSV_str, "\"%u\"", table_entry_uint);
- } else if (gtk_tree_model_get_column_type(GTK_TREE_MODEL(list_store), j) == G_TYPE_DOUBLE) {
- gtk_tree_model_get(GTK_TREE_MODEL(list_store), &iter, j, &table_entry_double, -1);
- g_string_append_printf(CSV_str, "\"%f\"", table_entry_double);
- } else if (gtk_tree_model_get_column_type(GTK_TREE_MODEL(list_store), j) == G_TYPE_STRING) {
- gtk_tree_model_get(GTK_TREE_MODEL(list_store), &iter, j, &table_entry, -1);
- g_string_append_printf(CSV_str, "\"%s\"", table_entry);
- g_free(table_entry);
- } else {
- g_assert_not_reached();
- }
- if (j<NUM_COLS-2) g_string_append(CSV_str,",");
- }
- g_string_append(CSV_str,"\n");
- gtk_tree_model_iter_next (GTK_TREE_MODEL(list_store),&iter);
- }
- }
-
- /* Now that we have the CSV data, copy it into the default clipboard */
- cb = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
- gtk_clipboard_set_text(cb, CSV_str->str, (gint)CSV_str->len);
- g_string_free(CSV_str, TRUE);
-}
-
-/****************************************************************************/
-static void
-rtpstream_on_analyse(GtkButton *button _U_, gpointer user_data _U_)
-{
- address src_fwd;
- guint32 port_src_fwd = 0;
- address dst_fwd;
- guint32 port_dst_fwd = 0;
- guint32 ssrc_fwd = 0;
- address src_rev;
- guint32 port_src_rev = 0;
- address dst_rev;
- guint32 port_dst_rev = 0;
- guint32 ssrc_rev = 0;
-
- if (!(selected_stream_fwd || selected_stream_rev))
- {
- return;
- }
-
- clear_address(&src_fwd);
- clear_address(&dst_fwd);
- clear_address(&src_rev);
- clear_address(&dst_rev);
-
- if (selected_stream_fwd) {
- copy_address(&(src_fwd), &(selected_stream_fwd->src_addr));
- port_src_fwd = selected_stream_fwd->src_port;
- copy_address(&(dst_fwd), &(selected_stream_fwd->dest_addr));
- port_dst_fwd = selected_stream_fwd->dest_port;
- ssrc_fwd = selected_stream_fwd->ssrc;
- }
-
- if (selected_stream_rev) {
- copy_address(&(src_rev), &(selected_stream_rev->src_addr));
- port_src_rev = selected_stream_rev->src_port;
- copy_address(&(dst_rev), &(selected_stream_rev->dest_addr));
- port_dst_rev = selected_stream_rev->dest_port;
- ssrc_rev = selected_stream_rev->ssrc;
- }
-
- rtp_analysis(
- &src_fwd,
- port_src_fwd,
- &dst_fwd,
- port_dst_fwd,
- ssrc_fwd,
- &src_rev,
- port_src_rev,
- &dst_rev,
- port_dst_rev,
- ssrc_rev
- );
-
-}
-
-
-/****************************************************************************/
-/* when the user selects a row in the stream list */
-static gboolean
-rtpstream_view_selection_func(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, gpointer userdata _U_)
-{
- GtkTreeIter iter;
- gint nb_selected;
- rtp_stream_info_t* selected_stream;
- gboolean result = TRUE;
- gchar label_text[80];
- char *src_addr, *dst_addr;
-
- /* Logic
- * nb_selected path_currently_selected forward reverse action result
- * 0 must be false any any assign forward true
- * 1 true match any delete forward true
- * 1 true other any delete reverse true
- * 1 false match any invalid true
- * 1 false other none assign reverse true
- * 1 false other any assign forward true
- * 2 true match any delete forward path_currently_selected
- * 2 true other match delete reverse path_currently_selected
- * 2 true other other invalid path_currently_selected
- * 2 false match any invalid path_currently_selected
- * 2 false any match invalid path_currently_selected
- * 2 false other other assign reverse path_currently_selected
- * >2 any any any invalid path_currently_selected
- */
-
- nb_selected = gtk_tree_selection_count_selected_rows(selection);
- if (gtk_tree_model_get_iter(model, &iter, path)) {
- gtk_tree_model_get(GTK_TREE_MODEL(list_store), &iter, RTP_COL_DATA, &selected_stream, -1);
-
- switch (nb_selected)
- {
- case 0:
- {
- if (path_currently_selected)
- g_print("Select: He, we've got a selected path while none is selected?\n");
- else
- selected_stream_fwd = selected_stream;
- break;
- }
- case 1:
- {
- if (path_currently_selected)
- if (selected_stream == selected_stream_fwd)
- selected_stream_fwd = NULL;
- else
- selected_stream_rev = NULL;
- else
- if (selected_stream == selected_stream_fwd)
- g_print("Select: He, this can't be. 1 not selected but equal to fwd\n");
- else
- if (selected_stream_rev)
- selected_stream_fwd = selected_stream;
- else
- selected_stream_rev = selected_stream;
- break;
- }
- case 2:
- {
- if (path_currently_selected) {
- if (selected_stream == selected_stream_fwd)
- selected_stream_fwd = NULL;
- else if (selected_stream == selected_stream_rev)
- selected_stream_rev = NULL;
- else
- g_print("Select: He, this can't be. 2 selected but not equal to fwd or rev\n");
- }
- result = path_currently_selected;
- break;
- }
- default:
- {
- g_print("Select: He, we're getting a too high selection count\n");
- result = path_currently_selected;
- }
- }
- }
-
- if (selected_stream_fwd) {
- src_addr = address_to_display(NULL, &(selected_stream_fwd->src_addr));
- dst_addr = address_to_display(NULL, &(selected_stream_fwd->dest_addr));
-
- g_snprintf(label_text, sizeof(label_text), "Forward: %s:%u -> %s:%u, SSRC=0x%X",
- src_addr,
- selected_stream_fwd->src_port,
- dst_addr,
- selected_stream_fwd->dest_port,
- selected_stream_fwd->ssrc
- );
- gtk_label_set_text(GTK_LABEL(label_fwd), label_text);
-
- wmem_free(NULL, src_addr);
- wmem_free(NULL, dst_addr);
- } else {
- if (selected_stream_rev)
- gtk_label_set_text(GTK_LABEL(label_fwd), FWD_ONLY_LABEL_TEXT);
- else
- gtk_label_set_text(GTK_LABEL(label_fwd), FWD_LABEL_TEXT);
- }
-
- if (selected_stream_rev) {
- src_addr = address_to_display(NULL, &(selected_stream_rev->src_addr));
- dst_addr = address_to_display(NULL, &(selected_stream_rev->dest_addr));
-
- g_snprintf(label_text, sizeof(label_text), "Reverse: %s:%u -> %s:%u, SSRC=0x%X",
- src_addr,
- selected_stream_rev->src_port,
- dst_addr,
- selected_stream_rev->dest_port,
- selected_stream_rev->ssrc
- );
- gtk_label_set_text(GTK_LABEL(label_rev), label_text);
-
- wmem_free(NULL, src_addr);
- wmem_free(NULL, dst_addr);
- } else {
- gtk_label_set_text(GTK_LABEL(label_rev), REV_LABEL_TEXT);
- }
-
- return result;
-}
-
-/****************************************************************************/
-/* INTERFACE */
-/****************************************************************************/
-/* append a line to list */
-static void
-add_to_list_store(rtp_stream_info_t* strinfo)
-{
- gchar label_text[256];
- gchar *data[NUM_COLS];
- guint32 expected;
- gint32 lost;
- double perc;
- int i;
- char *savelocale;
- gchar *tmp_str;
-
- /* save the current locale */
- savelocale = g_strdup(setlocale(LC_NUMERIC, NULL));
- /* switch to "C" locale to avoid problems with localized decimal separators
- in g_snprintf("%f") functions */
- setlocale(LC_NUMERIC, "C");
-
- data[0] = address_to_display(NULL, &(strinfo->src_addr));
- data[1] = NULL;
- data[2] = address_to_display(NULL, &(strinfo->dest_addr));
- data[3] = NULL;
- data[4] = wmem_strdup_printf(NULL, "0x%X", strinfo->ssrc);
- if (strinfo->payload_type_name != NULL) {
- data[5] = wmem_strdup(NULL, strinfo->payload_type_name);
- } else {
- tmp_str = val_to_str_ext_wmem(NULL, strinfo->payload_type, &rtp_payload_type_short_vals_ext, "Unknown (%u)");
- data[5] = wmem_strdup(NULL, tmp_str);
- wmem_free(NULL, tmp_str);
- }
- data[6] = NULL;
-
- expected = (strinfo->rtp_stats.stop_seq_nr + strinfo->rtp_stats.cycles*65536)
- - strinfo->rtp_stats.start_seq_nr + 1;
- lost = expected - strinfo->rtp_stats.total_nr;
- if (expected) {
- perc = (double)(lost*100)/(double)expected;
- } else {
- perc = 0;
- }
- data[7] = wmem_strdup_printf(NULL, "%d (%.1f%%)", lost, perc);
- data[8] = NULL;
- data[9] = NULL;
- data[10] = NULL;
- if (strinfo->problem)
- data[11] = wmem_strdup(NULL, "X");
- else
- data[11] = wmem_strdup(NULL, "");
-
- /* restore previous locale setting */
- setlocale(LC_NUMERIC, savelocale);
- g_free(savelocale);
-
- /* Acquire an iterator */
- gtk_list_store_append(list_store, &list_iter);
-
- /* Fill the new row */
- gtk_list_store_set(list_store, &list_iter,
- RTP_COL_SRC_ADDR, data[0],
- RTP_COL_SRC_PORT, strinfo->src_port,
- RTP_COL_DST_ADDR, data[2],
- RTP_COL_DST_PORT, strinfo->dest_port,
- RTP_COL_SSRC, data[4],
- RTP_COL_PAYLOAD, data[5],
- RTP_COL_PACKETS, strinfo->packet_count,
- RTP_COL_LOST, data[7],
- RTP_COL_MAX_DELTA, strinfo->rtp_stats.max_delta,
- RTP_COL_MAX_JITTER, strinfo->rtp_stats.max_jitter,
- RTP_COL_MEAN_JITTER, strinfo->rtp_stats.mean_jitter,
- RTP_COL_PROBLEM, data[11],
- RTP_COL_DATA, strinfo,
- -1);
-
- for (i = 0; i < NUM_COLS-1; i++)
- wmem_free(NULL, data[i]);
-
- /* Update the top label with the number of detected streams */
- g_snprintf(label_text, sizeof(label_text),
- "Detected %d RTP streams. Choose one for forward and reverse direction for analysis",
- ++streams_nb);
- gtk_label_set_text(GTK_LABEL(top_label), label_text);
-}
-
-/****************************************************************************/
-/* Create list view */
-static void
-create_list_view(void)
-{
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
- GtkTreeSortable *sortable;
- GtkTreeView *list_view;
- GtkTreeSelection *selection;
-
- /* Create the store */
- list_store = gtk_list_store_new(NUM_COLS, /* Total number of columns */
- G_TYPE_STRING, /* Source address */
- G_TYPE_UINT, /* Source port */
- G_TYPE_STRING, /* Destination address */
- G_TYPE_UINT, /* Destination port */
- G_TYPE_STRING, /* SSRC */
- G_TYPE_STRING, /* Payload */
- G_TYPE_UINT, /* Packets */
- G_TYPE_STRING, /* Lost */
- G_TYPE_DOUBLE, /* Max. delta */
- G_TYPE_DOUBLE, /* Max. jitter */
- G_TYPE_DOUBLE, /* Mean jitter */
- G_TYPE_STRING, /* Problem */
- G_TYPE_POINTER /* Data */
- );
-
- /* Create a view */
- list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store));
-
- list_view = GTK_TREE_VIEW(list);
- sortable = GTK_TREE_SORTABLE(list_store);
-
- /* Speed up the list display */
- gtk_tree_view_set_fixed_height_mode(list_view, TRUE);
-
- /* Setup the sortable columns */
- gtk_tree_sortable_set_sort_column_id(sortable, RTP_COL_SRC_ADDR, GTK_SORT_ASCENDING);
- gtk_tree_view_set_headers_clickable(list_view, FALSE);
-
- /* The view now holds a reference. We can get rid of our own reference */
- g_object_unref(G_OBJECT(list_store));
-
- /*
- * Create the first column packet, associating the "text" attribute of the
- * cell_renderer to the first column of the model
- */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Src addr", renderer,
- "text", RTP_COL_SRC_ADDR,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, RTP_COL_SRC_ADDR);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 60);
- gtk_tree_view_column_set_fixed_width(column, 100);
- /* Add the column to the view. */
- gtk_tree_view_append_column(list_view, column);
-
- /* Source port */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Src port", renderer,
- "text", RTP_COL_SRC_PORT,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, RTP_COL_SRC_PORT);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 60);
- gtk_tree_view_column_set_fixed_width(column, 80);
- gtk_tree_view_append_column(list_view, column);
-
- /* Destination address */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Dst addr", renderer,
- "text", RTP_COL_DST_ADDR,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, RTP_COL_DST_ADDR);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 60);
- gtk_tree_view_column_set_fixed_width(column, 100);
- gtk_tree_view_append_column(list_view, column);
-
- /* Destination port */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Dst port", renderer,
- "text", RTP_COL_DST_PORT,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, RTP_COL_DST_PORT);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 60);
- gtk_tree_view_column_set_fixed_width(column, 80);
- gtk_tree_view_append_column(list_view, column);
-
- /* SSRC */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("SSRC", renderer,
- "text", RTP_COL_SSRC,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, RTP_COL_SSRC);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 70);
- gtk_tree_view_column_set_fixed_width(column, 90);
- gtk_tree_view_append_column(list_view, column);
-
- /* Payload */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Payload", renderer,
- "text", RTP_COL_PAYLOAD,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, RTP_COL_PAYLOAD);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 80);
- gtk_tree_view_column_set_fixed_width(column, 100);
- gtk_tree_view_append_column(list_view, column);
-
- /* Packets */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Packets", renderer,
- "text", RTP_COL_PACKETS,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, RTP_COL_PACKETS);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 60);
- gtk_tree_view_column_set_fixed_width(column, 70);
- gtk_tree_view_append_column(list_view, column);
-
- /* Lost */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Lost", renderer,
- "text", RTP_COL_LOST,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, RTP_COL_LOST);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 60);
- gtk_tree_view_column_set_fixed_width(column, 90);
- gtk_tree_view_append_column(list_view, column);
-
- /* Max Delta (ms) */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Max Delta (ms)", renderer,
- "text", RTP_COL_MAX_DELTA,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, RTP_COL_MAX_DELTA);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 90);
- gtk_tree_view_column_set_fixed_width(column, 130);
- gtk_tree_view_append_column(list_view, column);
-
- /* Max Jitter (ms) */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Max Jitter (ms)", renderer,
- "text", RTP_COL_MAX_JITTER,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, RTP_COL_MAX_JITTER);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 50);
- gtk_tree_view_column_set_fixed_width(column, 120);
- gtk_tree_view_append_column(list_view, column);
-
- /* Mean Jitter (ms) */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Mean Jitter (ms)", renderer,
- "text", RTP_COL_MEAN_JITTER,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, RTP_COL_MEAN_JITTER);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 50);
- gtk_tree_view_column_set_fixed_width(column, 130);
- gtk_tree_view_append_column(list_view, column);
-
- /* Problems? */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Pb?", renderer,
- "text", RTP_COL_PROBLEM,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, RTP_COL_PROBLEM);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 30);
- gtk_tree_view_column_set_fixed_width(column, 50);
- gtk_tree_view_append_column(list_view, column);
-
- /* Now enable the sorting of each column */
- gtk_tree_view_set_rules_hint(list_view, TRUE);
- gtk_tree_view_set_headers_clickable(list_view, TRUE);
-
- /* Setup the selection handler */
- selection = gtk_tree_view_get_selection(list_view);
-
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
- gtk_tree_selection_set_select_function(selection, rtpstream_view_selection_func, NULL, NULL);
-}
-
-
-/****************************************************************************/
-/* Create dialog */
-static void
-rtpstream_dlg_create (void)
-{
- GtkWidget *rtpstream_dlg_w;
- GtkWidget *main_vb;
- GtkWidget *scrolledwindow;
- GtkWidget *hbuttonbox;
-/* GtkWidget *bt_goto;*/
- GtkWidget *bt_unselect;
- GtkWidget *bt_findrev;
- GtkWidget *bt_save;
- GtkWidget *bt_mark;
- GtkWidget *bt_filter;
- GtkWidget *bt_analyze;
- GtkWidget *bt_close;
- GtkWidget *bt_copy;
-
- rtpstream_dlg_w = dlg_window_new("Wireshark: RTP Streams");
- gtk_window_set_default_size(GTK_WINDOW(rtpstream_dlg_w), 620, 400);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(rtpstream_dlg_w), main_vb);
- gtk_container_set_border_width (GTK_CONTAINER (main_vb), 12);
-
- top_label = gtk_label_new ("Detected 0 RTP streams. Choose one for forward and reverse direction for analysis");
- gtk_box_pack_start (GTK_BOX (main_vb), top_label, FALSE, FALSE, 8);
-
- scrolledwindow = scrolled_window_new (NULL, NULL);
- gtk_box_pack_start (GTK_BOX (main_vb), scrolledwindow, TRUE, TRUE, 0);
-
- create_list_view();
- gtk_container_add(GTK_CONTAINER(scrolledwindow), list);
-
- gtk_widget_show(rtpstream_dlg_w);
-
- label_fwd = gtk_label_new (FWD_LABEL_TEXT);
- gtk_box_pack_start (GTK_BOX (main_vb), label_fwd, FALSE, FALSE, 0);
-
- label_rev = gtk_label_new (REV_LABEL_TEXT);
- gtk_box_pack_start (GTK_BOX (main_vb), label_rev, FALSE, FALSE, 0);
-
- /* button row */
- hbuttonbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_start (GTK_BOX (main_vb), hbuttonbox, FALSE, FALSE, 0);
- gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox), GTK_BUTTONBOX_END);
- gtk_box_set_spacing (GTK_BOX (hbuttonbox), 0);
-
- bt_unselect = gtk_button_new_with_label ("Unselect");
- gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_unselect);
- gtk_widget_set_tooltip_text (bt_unselect, "Undo stream selection");
-
- bt_findrev = gtk_button_new_with_label ("Find Reverse");
- gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_findrev);
- gtk_widget_set_tooltip_text (bt_findrev, "Find the reverse stream matching the selected forward stream");
-/*
- bt_goto = ws_gtk_button_new_from_stock(GTK_STOCK_JUMP_TO);
- gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_goto);
-*/
- bt_save = ws_gtk_button_new_from_stock(GTK_STOCK_SAVE_AS);
- gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_save);
- gtk_widget_set_tooltip_text (bt_save, "Save stream payload in rtpdump format");
-
- bt_mark = gtk_button_new_with_label ("Mark Packets");
- gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_mark);
- gtk_widget_set_tooltip_text (bt_mark, "Mark packets of the selected stream(s)");
-
- bt_filter = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_PREPARE_FILTER);
- gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_filter);
- gtk_widget_set_tooltip_text (bt_filter, "Prepare a display filter of the selected stream(s)");
-
- /* XXX - maybe we want to have a "Copy as CSV" stock button here? */
- /*bt_copy = gtk_button_new_with_label ("Copy content to clipboard as CSV");*/
- bt_copy = ws_gtk_button_new_from_stock(GTK_STOCK_COPY);
- gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_copy);
- gtk_widget_set_tooltip_text(bt_copy,
- "Copy all statistical values of this page to the clipboard in CSV (Comma Separated Values) format.");
-
- bt_analyze = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_ANALYZE);
- gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_analyze);
- gtk_widget_set_tooltip_text (bt_analyze, "Open an analyze window of the selected stream(s)");
-
- bt_close = ws_gtk_button_new_from_stock(GTK_STOCK_CLOSE);
- gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_close);
- gtk_widget_set_tooltip_text (bt_close, "Close this dialog");
- gtk_widget_set_can_default(bt_close, TRUE);
-
- g_signal_connect(bt_unselect, "clicked", G_CALLBACK(rtpstream_on_unselect), NULL);
- g_signal_connect(bt_findrev, "clicked", G_CALLBACK(rtpstream_on_findrev), NULL);
-/*
- g_signal_connect(bt_goto, "clicked", G_CALLBACK(rtpstream_on_goto), NULL);
-*/
- g_signal_connect(bt_save, "clicked", G_CALLBACK(rtpstream_on_save), NULL);
- g_signal_connect(bt_mark, "clicked", G_CALLBACK(rtpstream_on_mark), NULL);
- g_signal_connect(bt_filter, "clicked", G_CALLBACK(rtpstream_on_filter), NULL);
- g_signal_connect(bt_copy, "clicked", G_CALLBACK(rtpstream_on_copy_as_csv), NULL);
- g_signal_connect(bt_analyze, "clicked", G_CALLBACK(rtpstream_on_analyse), NULL);
-
- window_set_cancel_button(rtpstream_dlg_w, bt_close, window_cancel_button_cb);
-
- g_signal_connect(rtpstream_dlg_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(rtpstream_dlg_w, "destroy", G_CALLBACK(rtpstream_on_destroy), NULL);
-
- gtk_widget_show_all(rtpstream_dlg_w);
- window_present(rtpstream_dlg_w);
-
- rtpstream_on_unselect(NULL, NULL);
-
- rtp_stream_dlg = rtpstream_dlg_w;
-}
-
-
-/****************************************************************************/
-/* update the contents of the dialog box list_store */
-/* list: pointer to list of rtp_stream_info_t* */
-static void
-rtpstream_dlg_update(GList *list_lcl)
-{
- if (rtp_stream_dlg != NULL) {
- gtk_list_store_clear(list_store);
- streams_nb = 0;
-
- list_lcl = g_list_first(list_lcl);
- while (list_lcl)
- {
- add_to_list_store((rtp_stream_info_t*)(list_lcl->data));
- list_lcl = g_list_next(list_lcl);
- }
-
- rtpstream_on_unselect(NULL, NULL);
- }
-
- last_list = list_lcl;
-}
-
-static void
-rtpstream_tap_reset(rtpstream_tapinfo_t *tapinfo _U_)
-{
- if (rtp_stream_dlg != NULL) {
- gtk_list_store_clear(list_store);
- streams_nb = 0;
- }
-}
-
-static void
-rtpstream_tap_draw(rtpstream_tapinfo_t *tapinfo)
-{
- if (tapinfo) {
- rtpstream_dlg_update(tapinfo->strinfo_list);
- }
-}
-
-
-static void
-rtpstream_dlg_mark_packet(rtpstream_tapinfo_t *tapinfo _U_, frame_data *fd) {
- if (!fd) return;
-
- cf_mark_frame(&cfile, fd);
-}
-
-/****************************************************************************/
-/* PUBLIC */
-/****************************************************************************/
-
-/****************************************************************************/
-/* update the contents of the dialog box list_store */
-/* list: pointer to list of rtp_stream_info_t* */
-void rtpstream_dlg_show(GList *list_lcl)
-{
- if (rtp_stream_dlg != NULL) {
- /* There's already a dialog box; reactivate it. */
- reactivate_window(rtp_stream_dlg);
- /* Another list since last call? */
- if (list_lcl != last_list) {
- rtpstream_dlg_update(list_lcl);
- }
- }
- else {
- /* Create and show the dialog box */
- rtpstream_dlg_create();
- rtpstream_dlg_update(list_lcl);
- }
-}
-
-
-/****************************************************************************/
-/* entry point when called via the GTK menu */
-void rtpstream_launch(GtkAction *action _U_, gpointer user_data _U_)
-{
- const char *filter = gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget));
-
- /* Register the tap listener */
- register_tap_listener_rtp_stream(&the_tapinfo_struct, filter);
-
- /* Scan for RTP streams (redissect all packets) */
- rtpstream_scan(&the_tapinfo_struct, &cfile, filter);
-
- /* Show the dialog box with the list of streams */
- rtpstream_dlg_show(the_tapinfo_struct.strinfo_list);
-
- /* Tap listener will be removed and cleaned up in rtpstream_on_destroy */
-}
-
-/****************************************************************************/
-void
-register_tap_listener_rtp_stream_dlg(void)
-{
-}
-
-/****************************************************************************/
-/* Needed by iax2_analysis.c */
-rtpstream_tapinfo_t *rtpstream_dlg_get_tapinfo(void) {
- return &the_tapinfo_struct;
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/rtp_stream_dlg.h b/ui/gtk/rtp_stream_dlg.h
deleted file mode 100644
index 8c8fc6408f..0000000000
--- a/ui/gtk/rtp_stream_dlg.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* rtp_stream_dlg.h
- * RTP streams summary addition for Wireshark
- *
- * Copyright 2003, Alcatel Business Systems
- * By Lars Ruoff <lars.ruoff@gmx.net>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __RTP_STREAM_DLG_H__
-#define __RTP_STREAM_DLG_H__
-
-#include <gtk/gtk.h>
-
-#include "ui/rtp_stream.h"
-
-/** @file
- * "RTP Stream Analysis" dialog box.
- * @ingroup dialog_group
- */
-
-/**
- * Create or reactivate the rtp streams dialog box.
- *
- * @param list pointer to list of rtp_stream_info_t*
- */
-void rtpstream_dlg_show(GList *list);
-
-/**
- * Retrieves a constant reference to the unique info structure of the
- * rtp_streams tap listener.
- * The user should not modify the data pointed to.
- *
- * @return Pointer to an rtpstream_tapinfo_t
- */
-rtpstream_tapinfo_t *rtpstream_dlg_get_tapinfo(void);
-
-#endif /* __RTP_STREAM_DLG_H__ */
diff --git a/ui/gtk/sctp_assoc_analyse.c b/ui/gtk/sctp_assoc_analyse.c
deleted file mode 100644
index 949b3d676f..0000000000
--- a/ui/gtk/sctp_assoc_analyse.c
+++ /dev/null
@@ -1,1120 +0,0 @@
-/*
- * Copyright 2004, Irene Ruengeler <i.ruengeler [AT] fh-muenster.de>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <gtk/gtk.h>
-
-#include <epan/epan_dissect.h>
-#include <epan/to_str.h>
-
-#include "ui/simple_dialog.h"
-#include <epan/stat_groups.h>
-
-#include "ui/gtk/gui_stat_menu.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/sctp_stat_gtk.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/stock_icons.h"
-
-#include "frame_tvbuff.h"
-
-#include "globals.h"
-
-static sctp_assoc_info_t static_assoc;
-
-void
-decrease_childcount(struct sctp_analyse *parent)
-{
- if (parent->num_children > 0)
- parent->num_children--;
-}
-
-void
-increase_childcount(struct sctp_analyse *parent)
-{
- parent->num_children++;
-}
-
-void
-set_child(struct sctp_udata *child, struct sctp_analyse *parent)
-{
- parent->children = g_list_append(parent->children, child);
-}
-
-void
-remove_child(struct sctp_udata *child, struct sctp_analyse *parent)
-{
- parent->children = g_list_remove(parent->children, child);
-}
-
-static void
-on_destroy(GObject *object _U_, gpointer user_data)
-{
- struct sctp_analyse *u_data;
- struct sctp_udata *child_data;
- guint16 i, j;
- GList *list;
-
- u_data = (struct sctp_analyse*)user_data;
-
- if (u_data->window)
- {
- gtk_grab_remove(GTK_WIDGET(u_data->window));
- gtk_widget_destroy(GTK_WIDGET(u_data->window));
- }
- if (u_data->num_children > 0)
- {
- j = u_data->num_children;
- for (i=0; i<j; i++)
- {
- list = g_list_last(u_data->children);
- child_data = (struct sctp_udata *)list->data;
- gtk_grab_remove(GTK_WIDGET(child_data->io->window));
- gtk_widget_destroy(GTK_WIDGET(child_data->io->window));
- }
- g_list_free(u_data->children);
- u_data->children = NULL;
- }
-
- g_free(u_data->analyse_nb->page2);
- g_free(u_data->analyse_nb->page3);
- g_free(u_data->analyse_nb);
- if (sctp_stat_get_info()->children != NULL)
- {
- remove_analyse_child(u_data);
- decrease_analyse_childcount();
- }
- g_free(u_data);
-}
-
-static void
-on_notebook_switch_page(void)
-{
-}
-
-static void
-on_chunk_stat_bt(GtkWidget *widget _U_, struct sctp_analyse *u_data)
-{
- sctp_assoc_info_t *assinfo;
- int i;
-
- assinfo = &static_assoc;
- assinfo->addr_chunk_count = static_assoc.addr_chunk_count;
- for (i=0; i<NUM_CHUNKS; i++)
- {
- assinfo->chunk_count[i] = static_assoc.chunk_count[i];
- assinfo->ep1_chunk_count[i] = static_assoc.ep1_chunk_count[i];
- assinfo->ep2_chunk_count[i] = static_assoc.ep2_chunk_count[i];
- }
- u_data->assoc = assinfo;
- sctp_chunk_dlg_show(u_data);
-}
-
-static void
-on_close_dlg(GtkWidget *widget _U_, struct sctp_analyse *u_data)
-{
-
- if (u_data->window)
- {
- gtk_grab_remove(GTK_WIDGET(u_data->window));
- gtk_widget_destroy(GTK_WIDGET(u_data->window));
- }
-}
-
-static void
-on_chunk1_dlg(GtkWidget *widget _U_, struct sctp_analyse *u_data)
-{
- sctp_assoc_info_t *assinfo;
-
- assinfo = &static_assoc;
- assinfo->addr_chunk_count = static_assoc.addr_chunk_count;
- u_data->assoc = assinfo;
- sctp_chunk_stat_dlg_show(1, u_data);
-}
-
-static void on_chunk2_dlg(GtkWidget *widget _U_, struct sctp_analyse *u_data)
-{
- sctp_assoc_info_t *assinfo;
-
- assinfo = &static_assoc;
- assinfo->addr_chunk_count = static_assoc.addr_chunk_count;
- u_data->assoc = assinfo;
- sctp_chunk_stat_dlg_show(2, u_data);
-}
-
-static void
-on_graph1_dlg(GtkWidget *widget _U_, struct sctp_analyse *u_data)
-{
- create_graph(1, u_data);
-}
-
-static void
-on_graph2_dlg(GtkWidget *widget _U_, struct sctp_analyse *u_data)
-{
- create_graph(2, u_data);
-}
-
-static void
-on_graph_byte1_dlg(GtkWidget *widget _U_, struct sctp_analyse *u_data)
-{
- create_byte_graph(1, u_data);
-}
-
-static void
-on_graph_byte2_dlg(GtkWidget *widget _U_, struct sctp_analyse *u_data)
-{
- create_byte_graph(2, u_data);
-}
-
-void
-update_analyse_dlg(struct sctp_analyse *u_data)
-{
- gchar label_txt[50];
-
- if (u_data->assoc == NULL)
- return;
-
- if (u_data->window != NULL)
- {
- gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW
- (u_data->analyse_nb->page2->clist))));
- gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW
- (u_data->analyse_nb->page3->clist))));
- }
-
-
- g_snprintf(label_txt, sizeof(label_txt),
- "Checksum Type: %s",
- u_data->assoc->checksum_type);
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->checktype), label_txt);
- g_snprintf(label_txt, sizeof(label_txt),
- "Checksum Errors: %u",
- u_data->assoc->n_checksum_errors);
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->checksum), label_txt);
- g_snprintf(label_txt, sizeof(label_txt),
- "Bundling Errors: %u",
- u_data->assoc->n_bundling_errors);
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->bundling), label_txt);
- g_snprintf(label_txt, sizeof(label_txt),
- "Padding Errors: %u",
- u_data->assoc->n_padding_errors);
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->padding), label_txt);
- g_snprintf(label_txt, sizeof(label_txt),
- "Length Errors: %u",
- u_data->assoc->n_length_errors);
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->length), label_txt);
- g_snprintf(label_txt, sizeof(label_txt),
- "Value Errors: %u",
- u_data->assoc->n_value_errors);
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->value), label_txt);
- g_snprintf(label_txt, sizeof(label_txt),
- "No of Data Chunks from EP1 to EP2: %u",
- u_data->assoc->n_data_chunks_ep1);
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->chunks_ep1), label_txt);
- g_snprintf(label_txt, sizeof(label_txt),
- "No of Data Bytes from EP1 to EP2: %u",
- u_data->assoc->n_data_bytes_ep1);
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->bytes_ep1), label_txt);
- g_snprintf(label_txt, sizeof(label_txt),
- "No of Data Chunks from EP2 to EP1: %u",
- u_data->assoc->n_data_chunks_ep2);
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->chunks_ep2), label_txt);
- g_snprintf(label_txt, sizeof(label_txt),
- "No of Data Bytes from EP2 to EP1: %u",
- u_data->assoc->n_data_bytes_ep2);
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->bytes_ep2), label_txt);
-
- if (u_data->assoc->init == TRUE)
- gtk_frame_set_label(GTK_FRAME(u_data->analyse_nb->page2->addr_frame),
- "Complete list of IP-Addresses as provided in the INIT-Chunk");
- else if ((u_data->assoc->initack == TRUE) && (u_data->assoc->initack_dir == 1))
- gtk_frame_set_label(GTK_FRAME(u_data->analyse_nb->page2->addr_frame),
- "Complete list of IP-Addresses as provided in the INITACK-Chunk");
- else
- gtk_frame_set_label(GTK_FRAME(u_data->analyse_nb->page2->addr_frame),
- "List of used IP-Addresses");
-
-
-
- if (u_data->assoc->addr1 != NULL)
- {
- GList *list;
-
- list = g_list_first(u_data->assoc->addr1);
- while (list)
- {
- gchar *field;
- address *store;
- GtkListStore *list_store;
-
- store = (address *)(list->data);
- if (store->type != AT_NONE) {
- if ((store->type == AT_IPv4) || (store->type == AT_IPv6))
- {
- field = (gchar*)address_to_str(NULL, store);
- }
- else
- {
- field = NULL;
- }
-
- list_store = GTK_LIST_STORE(
- gtk_tree_view_get_model(GTK_TREE_VIEW(u_data->analyse_nb->page2->clist))); /* Get store */
-
- gtk_list_store_insert_with_values( list_store , NULL, G_MAXINT,
- 0, field, -1);
- wmem_free(NULL, field);
- }
- list = g_list_next(list);
- }
- }
- else
- {
- return;
- }
- g_snprintf(label_txt, sizeof(label_txt), "Port: %u", u_data->assoc->port1);
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page2->port), label_txt);
- g_snprintf(label_txt, sizeof(label_txt), "Sent Verification Tag: 0x%x", u_data->assoc->verification_tag1);
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page2->veritag), label_txt);
-
- if ((u_data->assoc->init == TRUE) ||
- ((u_data->assoc->initack == TRUE) && (u_data->assoc->initack_dir == 1)))
- {
- g_snprintf(label_txt, sizeof(label_txt),
- "Requested Number of Inbound Streams: %u",
- u_data->assoc->instream1);
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page2->max_in), label_txt);
- g_snprintf(label_txt, sizeof(label_txt),
- "Minimum Number of Inbound Streams: %u",
- ((u_data->assoc->instream1 > u_data->assoc->outstream2) ?
- u_data->assoc->outstream2 : u_data->assoc->instream1));
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page2->min_in), label_txt);
-
- g_snprintf(label_txt, sizeof(label_txt),
- "Provided Number of Outbound Streams: %u",
- u_data->assoc->outstream1);
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page2->max_out), label_txt);
- g_snprintf(label_txt, sizeof(label_txt),
- "Minimum Number of Outbound Streams: %u",
- ((u_data->assoc->outstream1 > u_data->assoc->instream2) ?
- u_data->assoc->instream2 : u_data->assoc->outstream1));
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page2->min_out), label_txt);
- }
- else
- {
- g_snprintf(label_txt, sizeof(label_txt),
- "Used Number of Inbound Streams: %u",
- u_data->assoc->instream1);
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page2->max_in), label_txt);
- g_snprintf(label_txt, sizeof(label_txt),
- "Used Number of Outbound Streams: %u",
- u_data->assoc->outstream1);
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page2->max_out), label_txt);
- }
-
- if ((u_data->assoc->initack == TRUE) && (u_data->assoc->initack_dir == 2))
- gtk_frame_set_label(GTK_FRAME(u_data->analyse_nb->page3->addr_frame),
- "Complete list of IP-Addresses as provided in the INITACK-Chunk");
- else
- gtk_frame_set_label(GTK_FRAME(u_data->analyse_nb->page3->addr_frame),
- "List of used IP-Addresses");
-
-
- if (u_data->assoc->addr2 != NULL)
- {
- GList *list;
-
- list = g_list_first(u_data->assoc->addr2);
- while (list)
- {
- gchar *field;
- address *store;
- GtkListStore *list_store;
-
- store = (address *)(list->data);
- if (store->type != AT_NONE) {
- if ((store->type == AT_IPv4) || (store->type == AT_IPv6))
- {
- field = (gchar*)address_to_str(NULL, store);
- }
- else
- {
- field = NULL;
- }
-
- list_store = GTK_LIST_STORE(
- gtk_tree_view_get_model(GTK_TREE_VIEW(u_data->analyse_nb->page3->clist))); /* Get store */
-
- gtk_list_store_insert_with_values( list_store , NULL, G_MAXINT,
- 0, field, -1);
- wmem_free(NULL, field);
- }
- list = g_list_next(list);
- }
- }
- else
- {
- return;
- }
-
- g_snprintf(label_txt, sizeof(label_txt), "Port: %u", u_data->assoc->port2);
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page3->port), label_txt);
- g_snprintf(label_txt, sizeof(label_txt), "Sent Verification Tag: 0x%x", u_data->assoc->verification_tag2);
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page3->veritag), label_txt);
-
- if (u_data->assoc->initack == TRUE)
- {
- g_snprintf(label_txt, sizeof(label_txt),
- "Requested Number of Inbound Streams: %u",
- u_data->assoc->instream2);
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page3->max_in), label_txt);
- g_snprintf(label_txt, sizeof(label_txt),
- "Minimum Number of Inbound Streams: %u",
- ((u_data->assoc->instream2 > u_data->assoc->outstream1) ?
- u_data->assoc->outstream1 : u_data->assoc->instream2));
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page3->min_in), label_txt);
-
- g_snprintf(label_txt, sizeof(label_txt),
- "Provided Number of Outbound Streams: %u",
- u_data->assoc->outstream2);
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page3->max_out), label_txt);
- g_snprintf(label_txt, sizeof(label_txt),
- "Minimum Number of Outbound Streams: %u",
- ((u_data->assoc->outstream2 > u_data->assoc->instream1) ?
- u_data->assoc->instream1 : u_data->assoc->outstream2));
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page3->min_out), label_txt);
- }
- else
- {
- g_snprintf(label_txt, sizeof(label_txt),
- "Used Number of Inbound Streams: %u",
- u_data->assoc->instream2);
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page3->max_in), label_txt);
- g_snprintf(label_txt, sizeof(label_txt),
- "Used Number of Outbound Streams: %u",
- u_data->assoc->outstream2);
- gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page3->min_out), label_txt);
- }
-}
-
-
-static void
-sctp_set_filter(GtkButton *button _U_, struct sctp_analyse *u_data)
-{
- sctp_assoc_info_t *selected_stream;
- gchar *filter_string = NULL;
-
- selected_stream = u_data->assoc;
- if (selected_stream == NULL)
- return;
-
- if (selected_stream->check_address == FALSE)
- {
- gchar *f_string;
-
- f_string = g_strdup_printf(
- "((sctp.srcport==%u && sctp.dstport==%u &&"
- " ((sctp.verification_tag==0x%x && sctp.verification_tag!=0x0) ||"
- " (sctp.verification_tag==0x0 && sctp.initiate_tag==0x%x) ||"
- " (sctp.verification_tag==0x%x &&"
- " (sctp.abort_t_bit==1 || sctp.shutdown_complete_t_bit==1)))) ||"
- " (sctp.srcport==%u && sctp.dstport==%u &&"
- " ((sctp.verification_tag==0x%x && sctp.verification_tag!=0x0) ||"
- " (sctp.verification_tag==0x0 && sctp.initiate_tag==0x%x) ||"
- " (sctp.verification_tag==0x%x &&"
- " (sctp.abort_t_bit==1 || sctp.shutdown_complete_t_bit==1)))))",
- selected_stream->port1,
- selected_stream->port2,
- selected_stream->verification_tag1,
- selected_stream->initiate_tag,
- selected_stream->verification_tag2,
- selected_stream->port2,
- selected_stream->port1,
- selected_stream->verification_tag2,
- selected_stream->initiate_tag,
- selected_stream->verification_tag1);
- filter_string = f_string;
- }
- else
- {
- GList *srclist, *dstlist;
- gchar *str;
- GString *gstring;
- struct sockaddr_in *infosrc;
- struct sockaddr_in *infodst;
- address addr;
- char *addr_str;
-
- srclist = g_list_first(selected_stream->addr1);
- infosrc = (struct sockaddr_in *)(srclist->data);
- set_address(&addr, AT_IPv4, 4, &(infosrc->sin_addr.s_addr));
- addr_str = (char*)address_to_str(NULL, &addr);
- gstring = g_string_new(g_strdup_printf(
- "((sctp.srcport==%u && sctp.dstport==%u && (ip.src==%s",
- selected_stream->port1,
- selected_stream->port2,
- addr_str));
- srclist = g_list_next(srclist);
- wmem_free(NULL, addr_str);
-
- while (srclist)
- {
- infosrc = (struct sockaddr_in *)(srclist->data);
- set_address(&addr, AT_IPv4, 4, &(infosrc->sin_addr.s_addr));
- addr_str = (char*)address_to_str(NULL, &addr);
- str = g_strdup_printf("|| ip.src==%s", addr_str);
- g_string_append(gstring, str);
- srclist = g_list_next(srclist);
- wmem_free(NULL, addr_str);
- }
-
- dstlist = g_list_first(selected_stream->addr2);
- infodst = (struct sockaddr_in *)(dstlist->data);
- set_address(&addr, AT_IPv4, 4, &(infodst->sin_addr.s_addr));
- addr_str = (char*)address_to_str(NULL, &addr);
- str = g_strdup_printf(") && (ip.dst==%s", addr_str);
- g_string_append(gstring, str);
- dstlist = g_list_next(dstlist);
- wmem_free(NULL, addr_str);
-
- while (dstlist)
- {
- infodst = (struct sockaddr_in *)(dstlist->data);
- set_address(&addr, AT_IPv4, 4, &(infodst->sin_addr.s_addr));
- addr_str = (char*)address_to_str(NULL, &addr);
- str = g_strdup_printf("|| ip.dst==%s", addr_str);
- g_string_append(gstring, str);
- dstlist = g_list_next(dstlist);
- wmem_free(NULL, addr_str);
- }
-
- srclist = g_list_first(selected_stream->addr1);
- infosrc = (struct sockaddr_in *)(srclist->data);
- set_address(&addr, AT_IPv4, 4, &(infosrc->sin_addr.s_addr));
- addr_str = (char*)address_to_str(NULL, &addr);
- str = g_strdup_printf(")) || (sctp.dstport==%u && sctp.srcport==%u && (ip.dst==%s",
- selected_stream->port1,
- selected_stream->port2,
- addr_str);
- g_string_append(gstring, str);
- srclist = g_list_next(srclist);
- wmem_free(NULL, addr_str);
-
- while (srclist)
- {
- infosrc = (struct sockaddr_in *)(srclist->data);
- set_address(&addr, AT_IPv4, 4, &(infosrc->sin_addr.s_addr));
- addr_str = (char*)address_to_str(NULL, &addr);
- str = g_strdup_printf("|| ip.dst==%s", addr_str);
- g_string_append(gstring, str);
- srclist = g_list_next(srclist);
- wmem_free(NULL, addr_str);
- }
-
- dstlist = g_list_first(selected_stream->addr2);
- infodst = (struct sockaddr_in *)(dstlist->data);
- set_address(&addr, AT_IPv4, 4, &(infodst->sin_addr.s_addr));
- addr_str = (char*)address_to_str(NULL, &addr);
- str = g_strdup_printf(") && (ip.src==%s", addr_str);
- g_string_append(gstring, str);
- dstlist = g_list_next(dstlist);
- wmem_free(NULL, addr_str);
- while (dstlist)
- {
- infodst = (struct sockaddr_in *)(dstlist->data);
- set_address(&addr, AT_IPv4, 4, &(infodst->sin_addr.s_addr));
- addr_str = (char*)address_to_str(NULL, &addr);
- str = g_strdup_printf("|| ip.src==%s", addr_str);
- g_string_append(gstring, str);
- dstlist = g_list_next(dstlist);
- wmem_free(NULL, addr_str);
- }
- str = g_strdup(")))");
- g_string_append(gstring, str);
- filter_string = g_string_free(gstring, FALSE);
- }
-
- if (filter_string != NULL) {
- gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), filter_string);
- } else {
- g_assert_not_reached();
- }
-}
-
-static void
-analyse_window_set_title(struct sctp_analyse *u_data)
-{
- char *display_name;
- char *title;
-
- if (!u_data->window) {
- return;
- }
- display_name = cf_get_display_name(&cfile);
- title = g_strdup_printf("SCTP Analyse Association: %s Port1 %u Port2 %u",
- display_name, u_data->assoc->port1, u_data->assoc->port2);
- g_free(display_name);
- gtk_window_set_title(GTK_WINDOW(u_data->window), title);
- g_free(title);
-}
-
-static GtkWidget *
-create_list(void)
-{
- GtkListStore *list_store;
- GtkWidget *list;
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
- GtkTreeView *list_view;
-
- list_store = gtk_list_store_new(1,
- G_TYPE_STRING /* IP address */
- );
-
- /* Create a view */
- list = gtk_tree_view_new_with_model (GTK_TREE_MODEL(list_store));
-
- list_view = GTK_TREE_VIEW(list);
-
- /* Speed up the list display */
- gtk_tree_view_set_fixed_height_mode(list_view, TRUE);
-
- /* The view now holds a reference. We can get rid of our own reference */
- g_object_unref (G_OBJECT(list_store));
-
- /*
- * Create the first column packet, associating the "text" attribute of the
- * cell_renderer to the first column of the model
- */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Address", renderer,
- "text", 0,
- NULL);
-
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 300);
-
- /* Add the column to the view. */
- gtk_tree_view_append_column (list_view, column);
-
- gtk_tree_view_set_headers_visible(list_view, FALSE);
- return list;
-}
-
-static void
-create_analyse_window(struct sctp_analyse *u_data)
-{
- GtkWidget *window;
- GtkWidget *notebook;
- GtkWidget *main_vb, *page1, *page2, *page3, *hbox, *vbox_l, *vbox_r, *addr_hb, *stat_fr;
- GtkWidget *hbox_l1, *hbox_l2, *label, *h_button_box;
- GtkWidget *chunk_stat_bt, *close_bt, *graph_bt1, *graph_bt2, *chunk_bt1, *bt_filter;
-
- u_data->analyse_nb = (struct notes *)g_malloc(sizeof(struct notes));
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_position (GTK_WINDOW(window), GTK_WIN_POS_CENTER);
- g_signal_connect(window, "destroy", G_CALLBACK(on_destroy), u_data);
-
- /* Container for each row of widgets */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 2, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 2);
- gtk_container_add(GTK_CONTAINER(window), main_vb);
- gtk_widget_show(main_vb);
-
- /* Start a notebook for flipping between sets of changes */
- notebook = gtk_notebook_new();
- gtk_box_pack_start(GTK_BOX(main_vb), notebook, TRUE, TRUE, 0);
- g_object_set_data(G_OBJECT(window), "notebook", notebook);
- g_signal_connect(notebook, "switch_page", G_CALLBACK(on_notebook_switch_page), NULL);
-
- page1 = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 8, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(page1), 8);
-
- u_data->analyse_nb->checktype = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(page1), u_data->analyse_nb->checktype, TRUE, TRUE, 0);
-
- gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->checktype), 0, 0);
-
- u_data->analyse_nb->checksum = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(page1), u_data->analyse_nb->checksum, TRUE, TRUE, 0);
- gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->checksum), 0, 0);
-
- u_data->analyse_nb->bundling = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(page1), u_data->analyse_nb->bundling, TRUE, TRUE, 0);
- gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->bundling), 0, 0);
-
- u_data->analyse_nb->padding = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(page1), u_data->analyse_nb->padding, TRUE, TRUE, 0);
- gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->padding), 0, 0);
-
- u_data->analyse_nb->length = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(page1), u_data->analyse_nb->length, TRUE, TRUE, 0);
- gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->length), 0, 0);
-
- u_data->analyse_nb->value = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(page1), u_data->analyse_nb->value, TRUE, TRUE, 0);
- gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->value), 0, 0);
-
-
- u_data->analyse_nb->chunks_ep1 = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(page1), u_data->analyse_nb->chunks_ep1, TRUE, TRUE, 0);
- gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->chunks_ep1), 0, 0);
- u_data->analyse_nb->bytes_ep1 = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(page1), u_data->analyse_nb->bytes_ep1, TRUE, TRUE, 0);
- gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->bytes_ep1), 0, 0);
- u_data->analyse_nb->chunks_ep2 = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(page1), u_data->analyse_nb->chunks_ep2, TRUE, TRUE, 0);
- gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->chunks_ep2), 0, 0);
- u_data->analyse_nb->bytes_ep2 = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(page1), u_data->analyse_nb->bytes_ep2, TRUE, TRUE, 0);
- gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->bytes_ep2), 0, 0);
-
- hbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_start(GTK_BOX(page1), hbox, FALSE, FALSE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(hbox), 10);
- gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_SPREAD);
- gtk_box_set_spacing(GTK_BOX(hbox), 0);
- gtk_widget_show(hbox);
-
- chunk_stat_bt = gtk_button_new_with_label ("Chunk Statistics");
- gtk_box_pack_start(GTK_BOX(hbox), chunk_stat_bt, FALSE, FALSE, 0);
- gtk_widget_show(chunk_stat_bt);
- g_signal_connect(chunk_stat_bt, "clicked", G_CALLBACK(on_chunk_stat_bt), u_data);
-
- bt_filter = gtk_button_new_with_label ("Set filter");
- gtk_box_pack_start(GTK_BOX(hbox), bt_filter, FALSE, FALSE, 0);
- gtk_widget_show (bt_filter);
- g_signal_connect(bt_filter, "clicked", G_CALLBACK(sctp_set_filter), u_data);
-
- close_bt = ws_gtk_button_new_from_stock(GTK_STOCK_CLOSE);
- gtk_box_pack_start(GTK_BOX(hbox), close_bt, FALSE, FALSE, 0);
- gtk_widget_show(close_bt);
- g_signal_connect(close_bt, "clicked", G_CALLBACK(on_close_dlg), u_data);
-
- /* tab */
- label = gtk_label_new(" Statistics ");
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page1, label);
-
-
- /* page for endpoint 1 */
- page2 = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 8, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(page2), 8);
-
- u_data->analyse_nb->page2 = (struct page *)g_malloc(sizeof(struct page));
-
- u_data->analyse_nb->page2->addr_frame = gtk_frame_new(NULL);
- gtk_box_pack_start(GTK_BOX(page2), u_data->analyse_nb->page2->addr_frame, TRUE, TRUE, 0);
-
- addr_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(addr_hb), 5);
- gtk_container_add(GTK_CONTAINER(u_data->analyse_nb->page2->addr_frame), addr_hb);
-
- u_data->analyse_nb->page2->scrolled_window = scrolled_window_new(NULL, NULL);
- gtk_widget_set_size_request(u_data->analyse_nb->page2->scrolled_window, 560, 100);
-
- u_data->analyse_nb->page2->clist = create_list();
- gtk_widget_show(u_data->analyse_nb->page2->clist);
-
- gtk_container_add(GTK_CONTAINER(u_data->analyse_nb->page2->scrolled_window), u_data->analyse_nb->page2->clist);
-
- gtk_box_pack_start(GTK_BOX(addr_hb), u_data->analyse_nb->page2->scrolled_window, TRUE, TRUE, 0);
- gtk_widget_show(u_data->analyse_nb->page2->scrolled_window);
-
- stat_fr = gtk_frame_new(NULL);
- gtk_box_pack_start(GTK_BOX(page2), stat_fr, TRUE, TRUE, 0);
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(hbox), 5);
- gtk_container_add(GTK_CONTAINER(stat_fr), hbox);
-
- vbox_l = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(hbox), vbox_l, TRUE, TRUE, 0);
-
-
-
- hbox_l1 = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(vbox_l), hbox_l1, TRUE, TRUE, 0);
-
- u_data->analyse_nb->page2->port = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(hbox_l1), u_data->analyse_nb->page2->port, TRUE, TRUE, 0);
- gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page2->port), 0, 0);
-
- hbox_l2 = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(vbox_l), hbox_l2, TRUE, TRUE, 0);
-
-
- u_data->analyse_nb->page2->veritag = gtk_label_new("");
-
- gtk_box_pack_start(GTK_BOX(hbox_l2), u_data->analyse_nb->page2->veritag, TRUE, TRUE, 0);
- gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page2->veritag), 0, 0);
- gtk_widget_show(vbox_l);
-
- vbox_r = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(hbox), vbox_r, TRUE, TRUE, 0);
-
- u_data->analyse_nb->page2->max_in = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(vbox_r), u_data->analyse_nb->page2->max_in, TRUE, TRUE, 0);
- gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page2->max_in), 0, 0);
- u_data->analyse_nb->page2->min_in = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(vbox_r), u_data->analyse_nb->page2->min_in, TRUE, TRUE, 0);
- gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page2->min_in), 0, 0);
-
- u_data->analyse_nb->page2->max_out = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(vbox_r), u_data->analyse_nb->page2->max_out, TRUE, TRUE, 0);
- gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page2->max_out), 0, 0);
- u_data->analyse_nb->page2->min_out = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(vbox_r), u_data->analyse_nb->page2->min_out, TRUE, TRUE, 0);
- gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page2->min_out), 0, 0);
-
-
- gtk_widget_show(vbox_r);
-
- h_button_box = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_start(GTK_BOX(page2), h_button_box, FALSE, FALSE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(h_button_box), 10);
- gtk_button_box_set_layout(GTK_BUTTON_BOX(h_button_box), GTK_BUTTONBOX_SPREAD);
- gtk_box_set_spacing(GTK_BOX(h_button_box), 0);
- gtk_widget_show(h_button_box);
-
- chunk_bt1 = gtk_button_new_with_label("Chunk Statistics");
- gtk_box_pack_start(GTK_BOX(h_button_box), chunk_bt1, FALSE, FALSE, 0);
- gtk_widget_show(chunk_bt1);
- g_signal_connect(chunk_bt1, "clicked", G_CALLBACK(on_chunk1_dlg), u_data);
-
- graph_bt1 = gtk_button_new_with_label("Graph TSN");
- gtk_box_pack_start(GTK_BOX(h_button_box), graph_bt1, FALSE, FALSE, 0);
- gtk_widget_show(graph_bt1);
- g_signal_connect(graph_bt1, "clicked", G_CALLBACK(on_graph1_dlg), u_data);
-
- graph_bt2 = gtk_button_new_with_label("Graph Bytes");
- gtk_box_pack_start(GTK_BOX(h_button_box), graph_bt2, FALSE, FALSE, 0);
- gtk_widget_show(graph_bt2);
- g_signal_connect(graph_bt2, "clicked", G_CALLBACK(on_graph_byte1_dlg), u_data);
- if (u_data->assoc->n_array_tsn1 == 0)
- {
- gtk_widget_set_sensitive(graph_bt1, FALSE);
- gtk_widget_set_sensitive(graph_bt2, FALSE);
- }
- close_bt = ws_gtk_button_new_from_stock(GTK_STOCK_CLOSE);
- gtk_box_pack_start(GTK_BOX(h_button_box), close_bt, FALSE, FALSE, 0);
- gtk_widget_show(close_bt);
- g_signal_connect(close_bt, "clicked", G_CALLBACK(on_close_dlg), u_data);
-
- label = gtk_label_new(" Endpoint 1 ");
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page2, label);
-
- /* same page for endpoint 2*/
-
- page3 = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 8, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(page3), 8);
-
- u_data->analyse_nb->page3 = (struct page *)g_malloc(sizeof(struct page));
-
- u_data->analyse_nb->page3->addr_frame = gtk_frame_new(NULL);
- gtk_box_pack_start(GTK_BOX(page3), u_data->analyse_nb->page3->addr_frame, TRUE, TRUE, 0);
-
- addr_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(addr_hb), 5);
- gtk_container_add(GTK_CONTAINER(u_data->analyse_nb->page3->addr_frame), addr_hb);
-
- u_data->analyse_nb->page3->scrolled_window = scrolled_window_new(NULL, NULL);
- gtk_widget_set_size_request(u_data->analyse_nb->page3->scrolled_window, 560, 100);
-
- u_data->analyse_nb->page3->clist = create_list();
- gtk_widget_show(u_data->analyse_nb->page3->clist);
-
- gtk_container_add(GTK_CONTAINER(u_data->analyse_nb->page3->scrolled_window),
- u_data->analyse_nb->page3->clist);
-
- gtk_box_pack_start(GTK_BOX(addr_hb), u_data->analyse_nb->page3->scrolled_window, TRUE, TRUE, 0);
- gtk_widget_show(u_data->analyse_nb->page3->scrolled_window);
-
- stat_fr = gtk_frame_new(NULL);
- gtk_box_pack_start(GTK_BOX(page3), stat_fr, TRUE, TRUE, 0);
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(hbox), 5);
- gtk_container_add(GTK_CONTAINER(stat_fr), hbox);
-
- vbox_l = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(hbox), vbox_l, TRUE, TRUE, 0);
-
- hbox_l1 = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(vbox_l), hbox_l1, TRUE, TRUE, 0);
-
- u_data->analyse_nb->page3->port = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(hbox_l1), u_data->analyse_nb->page3->port, TRUE, TRUE, 0);
- gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page3->port), 0, 0);
-
- hbox_l2 = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(vbox_l), hbox_l2, TRUE, TRUE, 0);
-
-
- u_data->analyse_nb->page3->veritag = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(hbox_l2), u_data->analyse_nb->page3->veritag, TRUE, TRUE, 0);
- gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page3->veritag), 0, 0);
- gtk_widget_show(vbox_l);
-
- vbox_r = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(hbox), vbox_r, TRUE, TRUE, 0);
-
- u_data->analyse_nb->page3->max_in = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(vbox_r), u_data->analyse_nb->page3->max_in, TRUE, TRUE, 0);
- gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page3->max_in), 0, 0);
- u_data->analyse_nb->page3->min_in = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(vbox_r), u_data->analyse_nb->page3->min_in, TRUE, TRUE, 0);
- gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page3->min_in), 0, 0);
-
- u_data->analyse_nb->page3->max_out = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(vbox_r), u_data->analyse_nb->page3->max_out, TRUE, TRUE, 0);
- gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page3->max_out), 0, 0);
- u_data->analyse_nb->page3->min_out = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(vbox_r), u_data->analyse_nb->page3->min_out, TRUE, TRUE, 0);
- gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page3->min_out), 0, 0);
-
- gtk_widget_show(vbox_r);
-
- h_button_box = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_start(GTK_BOX(page3), h_button_box, FALSE, FALSE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(h_button_box), 10);
- gtk_button_box_set_layout(GTK_BUTTON_BOX(h_button_box), GTK_BUTTONBOX_SPREAD);
- gtk_box_set_spacing(GTK_BOX(h_button_box), 0);
- gtk_widget_show(h_button_box);
-
- chunk_bt1 = gtk_button_new_with_label("Chunk Statistics");
- gtk_box_pack_start(GTK_BOX(h_button_box), chunk_bt1, FALSE, FALSE, 0);
- gtk_widget_show(chunk_bt1);
- g_signal_connect(chunk_bt1, "clicked", G_CALLBACK(on_chunk2_dlg), u_data);
-
- graph_bt1 = gtk_button_new_with_label("Graph TSN");
- gtk_box_pack_start(GTK_BOX(h_button_box), graph_bt1, FALSE, FALSE, 0);
- gtk_widget_show(graph_bt1);
- g_signal_connect(graph_bt1, "clicked", G_CALLBACK(on_graph2_dlg), u_data);
- graph_bt2 = gtk_button_new_with_label("Graph Bytes");
- gtk_box_pack_start(GTK_BOX(h_button_box), graph_bt2, FALSE, FALSE, 0);
- gtk_widget_show(graph_bt2);
- g_signal_connect(graph_bt2, "clicked", G_CALLBACK(on_graph_byte2_dlg), u_data);
- if (u_data->assoc->n_array_tsn2 == 0)
- {
- gtk_widget_set_sensitive(graph_bt1, FALSE);
- gtk_widget_set_sensitive(graph_bt2, FALSE);
- }
- close_bt = ws_gtk_button_new_from_stock(GTK_STOCK_CLOSE);
- gtk_box_pack_start(GTK_BOX(h_button_box), close_bt, FALSE, FALSE, 0);
- gtk_widget_show(close_bt);
- g_signal_connect(close_bt, "clicked", G_CALLBACK(on_close_dlg), u_data);
-
- label = gtk_label_new(" Endpoint 2 ");
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page3, label);
-
- /* show all notebooks */
- gtk_widget_show_all(notebook);
-
- gtk_widget_show(window);
-
- u_data->window = window;
- analyse_window_set_title(u_data);
-
- update_analyse_dlg(u_data);
-}
-
-
-
-void
-assoc_analyse(sctp_assoc_info_t* assoc)
-{
- struct sctp_analyse *u_data;
- int i;
-
- u_data = (struct sctp_analyse *)g_malloc(sizeof(struct sctp_analyse));
- u_data->assoc = assoc;
- u_data->assoc->addr_chunk_count = assoc->addr_chunk_count;
- u_data->window = NULL;
- u_data->analyse_nb = NULL;
- u_data->children = NULL;
- u_data->num_children = 0;
- static_assoc.addr_chunk_count = assoc->addr_chunk_count;
- static_assoc.port1 = assoc->port1;
- static_assoc.port2 = assoc->port2;
- for (i=0; i<NUM_CHUNKS; i++)
- {
- static_assoc.chunk_count[i] = assoc->chunk_count[i];
- static_assoc.ep1_chunk_count[i] = assoc->ep1_chunk_count[i];
- static_assoc.ep2_chunk_count[i] = assoc->ep2_chunk_count[i];
- }
- set_analyse_child(u_data);
- increase_analyse_childcount();
- static_assoc.addr_chunk_count = assoc->addr_chunk_count;
- create_analyse_window(u_data);
-}
-
-
-static void
-sctp_analyse_cb(struct sctp_analyse *u_data, gboolean ext)
-{
- GList *list;
- dfilter_t *sfcode;
- gchar *err_msg;
- capture_file *cf;
- epan_dissect_t edt;
- gboolean frame_found = FALSE;
- frame_data *fdata;
- gchar filter_text[256];
-
- g_strlcpy(filter_text, "sctp", 250);
- if (!dfilter_compile(filter_text, &sfcode, &err_msg)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg);
- g_free(err_msg);
- return;
- }
-
- cf = &cfile;
- fdata = cf->current_frame;
-
- /* we are on the selected frame now */
- if (fdata == NULL)
- return; /* if we exit here it's an error */
-
- /* dissect the current record */
- if (!cf_read_record(cf, fdata))
- return; /* error reading the record */
-
- epan_dissect_init(&edt, cf->epan, TRUE, FALSE);
- epan_dissect_prime_with_dfilter(&edt, sfcode);
- epan_dissect_run(&edt, cf->cd_t, &cf->rec,
- frame_tvbuff_new_buffer(&cf->provider, fdata, &cf->buf),
- fdata, NULL);
-
- /* if it is not an sctp packet, show the dialog */
- if (!dfilter_apply_edt(sfcode, &edt)) {
- epan_dissect_cleanup(&edt);
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Please choose an SCTP packet.");
- return;
- }
-
- list = g_list_first(sctp_stat_get_info()->assoc_info_list);
-
- while (list)
- {
- sctp_assoc_info_t *assoc;
- GList *framelist;
-
- assoc = (sctp_assoc_info_t*)(list->data);
- framelist = g_list_first(assoc->frame_numbers);
- while (framelist)
- {
- guint32 *fn;
- fn = (guint32 *)framelist->data;
- if (*fn == fdata->num)
- {
- frame_found = TRUE;
- break;
- }
- framelist = g_list_next(framelist);
- }
- if (frame_found)
- {
- int i;
- u_data->assoc = assoc;
- u_data->assoc->addr_chunk_count = assoc->addr_chunk_count;
- static_assoc.addr_chunk_count = assoc->addr_chunk_count;
- static_assoc.port1 = assoc->port1;
- static_assoc.port2 = assoc->port2;
- for (i=0; i<NUM_CHUNKS; i++)
- {
- static_assoc.chunk_count[i] = assoc->chunk_count[i];
- static_assoc.ep1_chunk_count[i] = assoc->ep1_chunk_count[i];
- static_assoc.ep2_chunk_count[i] = assoc->ep2_chunk_count[i];
- }
- if (ext == FALSE)
- create_analyse_window(u_data);
- return;
- }
- else
- list = g_list_next(list);
-
- }
- if (!frame_found)
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Assoc not found.");
-}
-
-void
-sctp_set_assoc_filter(void)
-{
-struct sctp_analyse *u_data;
-
- /* Register the tap listener */
- if (sctp_stat_get_info()->is_registered == FALSE)
- register_tap_listener_sctp_stat();
- /* (redissect all packets) */
-
- u_data = (struct sctp_analyse *)g_malloc(sizeof(struct sctp_analyse));
- u_data->assoc = NULL;
- u_data->children = NULL;
- u_data->analyse_nb = NULL;
- u_data->window = NULL;
- u_data->num_children = 0;
- cf_retap_packets(&cfile);
- sctp_analyse_cb(u_data, TRUE);
- sctp_set_filter(NULL, u_data);
-}
-
-void
-sctp_analyse_start(GtkAction *action _U_, gpointer user_data _U_)
-{
- struct sctp_analyse *u_data;
-
- /* Register the tap listener */
- if (sctp_stat_get_info()->is_registered == FALSE)
- register_tap_listener_sctp_stat();
- /* (redissect all packets) */
-
-
- u_data = (struct sctp_analyse *)g_malloc(sizeof(struct sctp_analyse));
- u_data->assoc = NULL;
- u_data->children = NULL;
- u_data->analyse_nb = NULL;
- u_data->window = NULL;
- u_data->num_children = 0;
-
- cf_retap_packets(&cfile);
- sctp_analyse_cb(u_data, FALSE);
-}
-
-
-
-/*
- * Editor modelines - http://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/gtk/sctp_byte_graph_dlg.c b/ui/gtk/sctp_byte_graph_dlg.c
deleted file mode 100644
index 8970e011c8..0000000000
--- a/ui/gtk/sctp_byte_graph_dlg.c
+++ /dev/null
@@ -1,1551 +0,0 @@
-/*
- * Copyright 2004, Irene Ruengeler <i.ruengeler [AT] fh-muenster.de>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <math.h>
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-
-#include "ui/simple_dialog.h"
-
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/sctp_stat_gtk.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/old-gtk-compat.h"
-
-#include "globals.h"
-
-#define DEFAULT_PIXELS_PER_TICK 2
-#define MAX_PIXELS_PER_TICK 4
-#define AUTO_MAX_YSCALE 0
-#define MAX_TICK_VALUES 5
-#define DEFAULT_TICK_VALUE 3
-#define MAX_YSCALE 22
-#define MAX_COUNT_TYPES 3
-
-#define COUNT_TYPE_FRAMES 0
-#define COUNT_TYPE_BYTES 1
-#define COUNT_TYPE_ADVANCED 2
-
-#define LEFT_BORDER 80
-#define RIGHT_BORDER 20
-#define TOP_BORDER 20
-#define BOTTOM_BORDER 50
-
-#define SUB_32(a, b) a-b
-
-struct chunk_header {
- guint8 type;
- guint8 flags;
- guint16 length;
-};
-
-struct data_chunk_header {
- guint8 type;
- guint8 flags;
- guint16 length;
- guint32 tsn;
- guint16 sid;
- guint16 ssn;
- guint32 ppi;
-};
-
-struct init_chunk_header {
- guint8 type;
- guint8 flags;
- guint16 length;
- guint32 initiate_tag;
- guint32 a_rwnd;
- guint16 mos;
- guint16 mis;
- guint32 initial_tsn;
-};
-
-struct sack_chunk_header {
- guint8 type;
- guint8 flags;
- guint16 length;
- guint32 cum_tsn_ack;
- guint32 a_rwnd;
- guint16 nr_of_gaps;
- guint16 nr_of_dups;
- guint8 *tsns;
-};
-
-struct gaps {
- guint16 start;
- guint16 end;
-};
-
-static gboolean label_set = FALSE;
-static guint32 max_tsn=0, min_tsn=0;
-
-
-static void sctp_graph_set_title(struct sctp_udata *u_data);
-static void create_draw_area(GtkWidget *box, struct sctp_udata *u_data);
-static GtkWidget *zoomout_bt;
-
-static void draw_sack_graph(struct sctp_udata *u_data)
-{
- GdkRGBA red_color = {1.0, 0.0, 0.0, 1.0};
- GdkRGBA green_color = {0.0, 1.0, 0.0, 1.0};
- gint diff;
- GPtrArray *array = NULL;
- guint32 i, size = 0, start=0, end;
- gboolean more = FALSE;
- gint width;
- cairo_t *cr;
-
- if (u_data->dir == 1)
- {
- array = u_data->assoc->sort_sack1;
- size=u_data->assoc->n_sack_chunks_ep1;
- if (u_data->io->tmp == FALSE)
- {
- min_tsn = 0;
- max_tsn = u_data->assoc->max_bytes1;
- }
- else
- {
- min_tsn = u_data->io->tmp_min_tsn1;
- max_tsn = u_data->io->tmp_max_tsn1;
- }
- }
- else if (u_data->dir == 2)
- {
- array = u_data->assoc->sort_sack2;
- size = u_data->assoc->n_sack_chunks_ep2;
- if (u_data->io->tmp == FALSE)
- {
- min_tsn = 0;
- max_tsn = u_data->assoc->max_bytes2;
- }
- else
- {
- min_tsn = u_data->io->tmp_min_tsn2;
- max_tsn = u_data->io->tmp_max_tsn2;
- }
- }
-
- width = u_data->io->max_x - u_data->io->min_x;
-
- for (i=0; i<size; i++)
- {
- if (u_data->io->uoff)
- diff = (gint)((struct tsn_sort*)(g_ptr_array_index(array, i)))->secs - u_data->io->min_x;
- else
- diff = (gint)((struct tsn_sort*)(g_ptr_array_index(array, i)))->secs * 1000000 + ((struct tsn_sort*)(g_ptr_array_index(array, i)))->usecs - u_data->io->min_x;
- end = start + ((struct tsn_sort*)(g_ptr_array_index(array, i)))->length;
- if (end>max_tsn)
- {
- end = max_tsn;
- more = TRUE;
- }
-
- if (start >= min_tsn && diff > 0 && diff <= width)
- {
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- gdk_cairo_set_source_rgba (cr, &red_color);
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr,
- LEFT_BORDER+u_data->io->offset+u_data->io->x_interval*diff+0.5,
- u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset-((SUB_32(start,min_tsn))*u_data->io->y_interval)+0.5);
- cairo_line_to(cr,
- LEFT_BORDER+u_data->io->offset+u_data->io->x_interval*diff+0.5,
- u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset-((SUB_32(end,min_tsn))*u_data->io->y_interval)+0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
- if (more == TRUE)
- {
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- gdk_cairo_set_source_rgba (cr, &green_color);
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr,
- LEFT_BORDER+u_data->io->offset+u_data->io->x_interval*diff+0.5,
- u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset-((SUB_32(end,min_tsn))*u_data->io->y_interval)+0.5);
- cairo_line_to(cr,
- LEFT_BORDER+u_data->io->offset+u_data->io->x_interval*diff,
- u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset-((SUB_32(end+10,min_tsn))*u_data->io->y_interval)+0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
- more = FALSE;
- }
- }
-
- }
-}
-
-
-static void draw_tsn_graph(struct sctp_udata *u_data)
-{
-GPtrArray *array = NULL;
-guint32 i, size = 0, start, end;
-gint diff, width;
-cairo_t *cr;
-
- if (u_data->dir == 1)
- {
- array = u_data->assoc->sort_tsn1;
- size = u_data->assoc->n_data_chunks_ep1;
- if (u_data->io->tmp == FALSE)
- {
- min_tsn = 0;
- max_tsn = u_data->assoc->max_bytes1;
- }
- else
- {
- min_tsn = u_data->io->tmp_min_tsn1;
- max_tsn = u_data->io->tmp_max_tsn1;
- }
- }
- else if (u_data->dir == 2)
- {
- array = u_data->assoc->sort_tsn2;
- size = u_data->assoc->n_data_chunks_ep2;
- if (u_data->io->tmp == FALSE)
- {
- min_tsn = 0;
- max_tsn = u_data->assoc->max_bytes2;
- }
- else
- {
- min_tsn = u_data->io->tmp_min_tsn2;
- max_tsn = u_data->io->tmp_max_tsn2;
- }
- }
- width = u_data->io->max_x - u_data->io->min_x;
-
- for (i=0; i<size; i++)
- {
- if (u_data->io->uoff)
- diff = (gint)((struct tsn_sort*)(g_ptr_array_index(array, i)))->secs -u_data->io->min_x;
- else
- diff = (gint)((struct tsn_sort*)(g_ptr_array_index(array, i)))->secs*1000000 + ((struct tsn_sort*)(g_ptr_array_index(array, i)))->usecs-u_data->io->min_x;
- start = ((struct tsn_sort*)(g_ptr_array_index(array, i)))->offset;
- end = start + ((struct tsn_sort*)(g_ptr_array_index(array, i)))->length;
- if (start >= min_tsn && diff > 0 && diff <= width){
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr,
- (LEFT_BORDER+u_data->io->offset+u_data->io->x_interval*diff)+0.5,
- (u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset-((SUB_32(start,min_tsn))*u_data->io->y_interval))+0.5);
- cairo_line_to(cr,
- (LEFT_BORDER+u_data->io->offset+u_data->io->x_interval*diff)+0.5,
- (u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset-((SUB_32(end,min_tsn))*u_data->io->y_interval))+0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
- }
- }
-
-}
-
-
-static void sctp_graph_draw(struct sctp_udata *u_data)
-{
- int length, lwidth;
- guint32 distance=5, i, e, sec, w, start, a, j, b;
- gint label_width, label_height;
- char label_string[15];
- gfloat dis;
- gboolean write_label = FALSE;
- PangoLayout *layout;
- GtkAllocation widget_alloc;
- cairo_t *cr;
-
- if (u_data->io->x1_tmp_sec == 0 && u_data->io->x1_tmp_usec == 0)
- u_data->io->offset = 0;
- else
- u_data->io->offset = 5;
-
- if (u_data->io->x2_tmp_sec - u_data->io->x1_tmp_sec > 1500)
- {
- u_data->io->min_x=u_data->io->x1_tmp_sec;
- u_data->io->max_x=u_data->io->x2_tmp_sec;
- u_data->io->uoff = TRUE;
- }
- else
- {
- u_data->io->min_x=((guint32) (u_data->io->x1_tmp_sec*1000000.0))+u_data->io->x1_tmp_usec;
- u_data->io->max_x=((guint32) (u_data->io->x2_tmp_sec*1000000.0))+u_data->io->x2_tmp_usec;
- u_data->io->uoff = FALSE;
- }
-
- u_data->io->tmp_width = u_data->io->max_x - u_data->io->min_x;
-
- if (u_data->dir == 1)
- {
- if (u_data->io->tmp == FALSE)
- {
- if (u_data->assoc->sort_tsn1 != NULL)
- u_data->io->max_y = u_data->io->tmp_max_tsn1 - u_data->io->tmp_min_tsn1;
- else
- u_data->io->max_y = 0;
- u_data->io->min_y = 0;
- }
- else
- {
- u_data->io->max_y = u_data->io->tmp_max_tsn1;
- u_data->io->min_y = u_data->io->tmp_min_tsn1;
- }
- }
- else if (u_data->dir == 2)
- {
- if (u_data->io->tmp == FALSE)
- {
- if (u_data->assoc->tsn2 != NULL)
- u_data->io->max_y = u_data->io->tmp_max_tsn2 - u_data->io->tmp_min_tsn2;
- else
- u_data->io->max_y = 0;
- u_data->io->min_y = 0;
- }
- else
- {
- u_data->io->max_y = u_data->io->tmp_max_tsn2;
- u_data->io->min_y = u_data->io->tmp_min_tsn2;
- }
- }
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_set_source_rgb (cr, 1, 1, 1);
- gtk_widget_get_allocation(u_data->io->draw_area, &widget_alloc);
- cairo_rectangle (cr,
- 0,
- 0,
- widget_alloc.width,
- widget_alloc.height);
- cairo_fill (cr);
- cairo_destroy (cr);
-
- /* x_axis */
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr, LEFT_BORDER+u_data->io->offset+0.5, u_data->io->surface_height - BOTTOM_BORDER+0.5);
- cairo_line_to(cr, u_data->io->surface_width - RIGHT_BORDER + u_data->io->offset+0.5, u_data->io->surface_height - BOTTOM_BORDER+0.5);
-
- cairo_move_to(cr, u_data->io->surface_width - RIGHT_BORDER + u_data->io->offset+0.5, u_data->io->surface_height - BOTTOM_BORDER+0.5);
- cairo_line_to(cr, u_data->io->surface_width - RIGHT_BORDER + u_data->io->offset - 5+0.5, u_data->io->surface_height - BOTTOM_BORDER - 5+0.5);
-
- cairo_move_to(cr, u_data->io->surface_width - RIGHT_BORDER + u_data->io->offset + 0.5, u_data->io->surface_height - BOTTOM_BORDER + 0.5);
- cairo_line_to(cr, u_data->io->surface_width - RIGHT_BORDER + u_data->io->offset - 5.5, u_data->io->surface_height - BOTTOM_BORDER + 5.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
-
- u_data->io->axis_width = u_data->io->surface_width - LEFT_BORDER - RIGHT_BORDER - u_data->io->offset;
-
- if(u_data->io->tmp_width>0){
- u_data->io->x_interval = (float)((u_data->io->axis_width*1.0)/u_data->io->tmp_width); /*distance in pixels between 2 data points*/
- } else {
- u_data->io->x_interval = (float)(u_data->io->axis_width);
- }
-
- e=0;
- if (u_data->io->x_interval < 1)
- {
- dis = 1 / u_data->io->x_interval;
- while (dis >1)
- {
- dis /= 10;
- e++;
- }
- distance = 1;
- for (i=0; i<=e+1; i++)
- distance *= 10;
- }
- else
- distance = 5;
-
- g_snprintf(label_string, sizeof(label_string), "%d", 0);
- memcpy(label_string,(gchar *)g_locale_to_utf8(label_string, -1 , NULL, NULL, NULL), 15);
- layout = gtk_widget_create_pango_layout(u_data->io->draw_area, label_string);
- pango_layout_get_pixel_size(layout, &label_width, &label_height);
-
- if (u_data->io->x1_tmp_usec == 0)
- sec = u_data->io->x1_tmp_sec;
- else
- sec = u_data->io->x1_tmp_sec+1;
-
- if (u_data->io->offset != 0)
- {
- g_snprintf(label_string, sizeof(label_string), "%u", u_data->io->x1_tmp_sec);
- memcpy(label_string,(gchar *)g_locale_to_utf8(label_string, -1 , NULL, NULL, NULL), sizeof(label_string));
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_move_to (cr, LEFT_BORDER - 25, u_data->io->surface_height - BOTTOM_BORDER + 20);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
-
- }
- w = (guint32)(500 / (guint32)(distance * u_data->io->x_interval));
- if (w == 0)
- w = 1;
- if (w == 4 || w==3 || w==2)
- {
- w = 5;
- a = distance / 10;
- b = (guint32)((u_data->io->min_x/100000))%10; /* start for labels*/
- }
- else
- {
- a = distance / 5;
- b = 0;
- }
-
- if (!u_data->io->uoff)
- {
- if (a>=1000000)
- {
- start=u_data->io->min_x/1000000*1000000;
- if (a==1000000)
- b = 0;
- }
- else
- {
- start=u_data->io->min_x/100000;
- if (start%2!=0)
- start--;
- start*=100000;
- b = (guint32)((start/100000))%10;
- }
- }
- else
- {
- start = u_data->io->min_x;
- if (start%2!=0)
- start--;
- b = 0;
-
- }
-
- for (i=start, j=b; i<=u_data->io->max_x; i+=a, j++)
- {
- if (!u_data->io->uoff)
- if (i >= u_data->io->min_x && i % 1000000 != 0)
- {
- length = 5;
- g_snprintf(label_string, sizeof(label_string), "%d", i%1000000);
-
- if (j % w == 0)
- {
- length = 10;
-
- memcpy(label_string,(gchar *)g_locale_to_utf8(label_string, -1 , NULL, NULL, NULL), sizeof(label_string));
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_move_to (cr,
- LEFT_BORDER + u_data->io->offset + (i - u_data->io->min_x) * u_data->io->x_interval - lwidth / 2,
- u_data->io->surface_height - BOTTOM_BORDER + 10);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
- }
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr,
- LEFT_BORDER + u_data->io->offset + (i - u_data->io->min_x) * u_data->io->x_interval + 0.5,
- u_data->io->surface_height - BOTTOM_BORDER + 0.5);
- cairo_line_to(cr,
- LEFT_BORDER + u_data->io->offset + (i - u_data->io->min_x) * u_data->io->x_interval + 0.5,
- u_data->io->surface_height - BOTTOM_BORDER + length + 0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
- }
-
- if (!u_data->io->uoff)
- {
- if (i%1000000==0 && j%w==0)
- {
- sec=i/1000000;
- write_label = TRUE;
- }
- }
- else
- {
- if (j%w == 0)
- {
- sec = i;
- write_label = TRUE;
- }
- }
- if (write_label)
- {
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr,
- LEFT_BORDER + u_data->io->offset + (i - u_data->io->min_x) * u_data->io->x_interval + 0.5,
- u_data->io->surface_height - BOTTOM_BORDER + 0.5);
- cairo_line_to(cr,
- LEFT_BORDER + u_data->io->offset + (i - u_data->io->min_x) * u_data->io->x_interval + 0.5,
- u_data->io->surface_height - BOTTOM_BORDER + 10 + 0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
-
- g_snprintf(label_string, sizeof(label_string), "%d", sec);
- memcpy(label_string,(gchar *)g_locale_to_utf8(label_string, -1 , NULL, NULL, NULL), sizeof(label_string));
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_move_to (cr,
- (LEFT_BORDER + u_data->io->offset + (i - u_data->io->min_x) * u_data->io->x_interval-10),
- u_data->io->surface_height - BOTTOM_BORDER + 20);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
-
- write_label = FALSE;
- }
- }
-
- g_strlcpy(label_string, "sec", sizeof(label_string));
-
- memcpy(label_string,(gchar *)g_locale_to_utf8(label_string, -1 , NULL, NULL, NULL), sizeof(label_string));
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_move_to (cr,
- u_data->io->surface_width - RIGHT_BORDER - 10,
- u_data->io->surface_height - BOTTOM_BORDER + 30);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
-
- distance = 5;
-
- /* y-axis */
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr, LEFT_BORDER + 0.5, TOP_BORDER - u_data->io->offset + 0.5);
- cairo_line_to(cr, LEFT_BORDER + 0.5, u_data->io->surface_height - BOTTOM_BORDER - u_data->io->offset + 0.5);
-
- cairo_move_to(cr, LEFT_BORDER + 0.5, TOP_BORDER - u_data->io->offset + 0.5);
- cairo_line_to(cr, LEFT_BORDER - 5 + 0.5, TOP_BORDER - u_data->io->offset + 5 + 0.5);
-
- cairo_move_to(cr, LEFT_BORDER + 0.5, TOP_BORDER - u_data->io->offset + 0.5);
- cairo_line_to(cr, LEFT_BORDER +5 + 0.5, TOP_BORDER - u_data->io->offset + 5 + 0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
-
- u_data->io->y_interval = (float)(((u_data->io->surface_height - TOP_BORDER - BOTTOM_BORDER) * 1.0)/(u_data->io->max_y - u_data->io->min_y));
-
- e = 0;
- if (u_data->io->y_interval < 1)
- {
- dis = 1 / u_data->io->y_interval;
- while (dis > 1)
- {
- dis /= 10;
- e++;
- }
- distance = 1;
- for (i=0; i<=e; i++)
- distance = distance * 10;
- }
- else if (u_data->io->y_interval<2)
- distance = 10;
-
- if (u_data->io->max_y > 0)
- {
- for (i=u_data->io->min_y/distance*distance; i<=u_data->io->max_y; i+=distance/5)
- {
- if (i >= u_data->io->min_y)
- {
- length = 5;
- g_snprintf(label_string, sizeof(label_string), "%d", i);
-
- if (i%distance == 0 || (distance <= 5 && u_data->io->y_interval > 10))
- {
- length = 10;
-
- memcpy(label_string,(gchar *)g_locale_to_utf8(label_string, -1 , NULL, NULL, NULL), sizeof(label_string));
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_move_to (cr,
- LEFT_BORDER - length - lwidth - 5,
- u_data->io->surface_height - BOTTOM_BORDER - u_data->io->offset - (i - u_data->io->min_y) * u_data->io->y_interval - 3);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
- }
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr,
- LEFT_BORDER - length + 0.5,
- u_data->io->surface_height - BOTTOM_BORDER - u_data->io->offset - (i - u_data->io->min_y) * u_data->io->y_interval + 0.5);
- cairo_line_to(cr,
- LEFT_BORDER + 0.5,
- u_data->io->surface_height - BOTTOM_BORDER - u_data->io->offset - (i - u_data->io->min_y) * u_data->io->y_interval + 0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
- }
- }
- }
- else
- simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK, "No Data Chunks sent");
-
- g_object_unref(G_OBJECT(layout));
-}
-
-
-static void sctp_graph_redraw(struct sctp_udata *u_data)
-{
- sctp_graph_t *ios;
- GtkAllocation widget_alloc;
- cairo_t *cr;
-
- u_data->io->needs_redraw = TRUE;
-
- sctp_graph_draw(u_data);
- switch (u_data->io->graph_type)
- {
- case 0:
- draw_sack_graph(u_data);
- draw_tsn_graph(u_data);
- break;
- case 1:
- draw_tsn_graph(u_data);
- break;
- case 2:
- draw_sack_graph(u_data);
- break;
- }
-
- ios=(sctp_graph_t *)g_object_get_data(G_OBJECT(u_data->io->draw_area), "sctp_graph_t");
- g_assert(ios != NULL);
-
- cr = gdk_cairo_create (gtk_widget_get_window(u_data->io->draw_area));
-
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, ios->surface, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, ios->pixmap, 0, 0);
-#endif
- gtk_widget_get_allocation(u_data->io->draw_area, &widget_alloc);
- cairo_rectangle (cr, 0, 0, widget_alloc.width, widget_alloc.height);
- cairo_fill (cr);
-
- cairo_destroy (cr);
-}
-
-
-static void on_sack_bt(GtkWidget *widget _U_, struct sctp_udata *u_data)
-{
- u_data->io->graph_type = 2;
- sctp_graph_redraw(u_data);
-}
-
-static void on_tsn_bt(GtkWidget *widget _U_, struct sctp_udata *u_data)
-{
- u_data->io->graph_type = 1;
- sctp_graph_redraw(u_data);
-}
-
-static void on_both_bt(GtkWidget *widget _U_, struct sctp_udata *u_data)
-{
- u_data->io->graph_type = 0;
- sctp_graph_redraw(u_data);
-}
-
-static void
-sctp_graph_close_cb(GtkWidget* widget _U_, gpointer u_data)
-{
- struct sctp_udata *udata;
-
- udata = (struct sctp_udata *)u_data;
- gtk_grab_remove(GTK_WIDGET(udata->io->window));
- gtk_widget_destroy(GTK_WIDGET(udata->io->window));
-}
-
-
-
-static gboolean
-on_configure_event(GtkWidget *widget, GdkEventConfigure *event _U_, gpointer user_data)
-{
- struct sctp_udata *u_data = (struct sctp_udata *)user_data;
- GtkAllocation widget_alloc;
- cairo_t *cr;
-
- g_assert(u_data->io != NULL);
-
-#if GTK_CHECK_VERSION(2,22,0)
- if(u_data->io->surface){
- cairo_surface_destroy (u_data->io->surface);
- u_data->io->surface=NULL;
- }
- gtk_widget_get_allocation(widget, &widget_alloc);
- u_data->io->surface = gdk_window_create_similar_surface (gtk_widget_get_window(widget),
- CAIRO_CONTENT_COLOR,
- widget_alloc.width,
- widget_alloc.height);
-#else
- if(u_data->io->pixmap){
- g_object_unref(u_data->io->pixmap);
- u_data->io->pixmap = NULL;
- }
- gtk_widget_get_allocation(widget, &widget_alloc);
- u_data->io->pixmap = gdk_pixmap_new(gtk_widget_get_window(widget),
- widget_alloc.width,
- widget_alloc.height,
- -1);
-#endif
- u_data->io->surface_width = widget_alloc.width;
- u_data->io->surface_height = widget_alloc.height;
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_rectangle (cr, 0, 0, widget_alloc.width, widget_alloc.height);
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_fill (cr);
- cairo_destroy (cr);
-
- sctp_graph_redraw(u_data);
- return TRUE;
-}
-
-#if GTK_CHECK_VERSION(3,0,0)
-static gboolean
-on_draw_area_draw_event(GtkWidget *widget, cairo_t *cr, gpointer user_data)
-{
- sctp_graph_t *ios = (sctp_graph_t *)user_data;
- GtkAllocation allocation;
-
- gtk_widget_get_allocation (widget, &allocation);
- cairo_set_source_surface (cr, ios->surface, 0, 0);
- cairo_rectangle (cr, 0, 0, allocation.width, allocation.width);
- cairo_fill (cr);
-
- return FALSE;
-}
-#else
-static gboolean
-on_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer user_data)
-{
- sctp_graph_t *ios = (sctp_graph_t *)user_data;
- cairo_t *cr;
-
- g_assert(ios != NULL);
-
- cr = gdk_cairo_create (gtk_widget_get_window(widget));
-
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, ios->surface, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, ios->pixmap, 0, 0);
-#endif
- cairo_rectangle (cr, event->area.x, event->area.y, event->area.width, event->area.height);
- cairo_fill (cr);
-
- cairo_destroy (cr);
-
- return FALSE;
-}
-#endif
-
-static void
-on_zoomin_bt (GtkWidget *widget _U_, struct sctp_udata *u_data)
-{
- sctp_min_max_t *tmp_minmax;
-
- if (u_data->io->rectangle==TRUE)
- {
- tmp_minmax = (sctp_min_max_t *)g_malloc(sizeof(sctp_min_max_t));
-
- u_data->io->tmp_min_tsn1=u_data->io->y1_tmp+u_data->io->min_y;
- u_data->io->tmp_max_tsn1=u_data->io->y2_tmp+1+u_data->io->min_y;
-
- u_data->io->tmp_min_tsn2=u_data->io->tmp_min_tsn1;
- u_data->io->tmp_max_tsn2=u_data->io->tmp_max_tsn1;
- tmp_minmax->tmp_min_secs=u_data->io->x1_tmp_sec;
- tmp_minmax->tmp_min_usecs= u_data->io->x1_tmp_usec;
- tmp_minmax->tmp_max_secs= u_data->io->x2_tmp_sec;
- tmp_minmax->tmp_max_usecs= u_data->io->x2_tmp_usec;
- tmp_minmax->tmp_min_tsn1=u_data->io->tmp_min_tsn1;
- tmp_minmax->tmp_max_tsn1=u_data->io->tmp_max_tsn1;
- tmp_minmax->tmp_min_tsn2=u_data->io->tmp_min_tsn2;
- tmp_minmax->tmp_max_tsn2=u_data->io->tmp_max_tsn2;
- u_data->assoc->min_max = g_slist_prepend(u_data->assoc->min_max, tmp_minmax);
- u_data->io->length = g_slist_length(u_data->assoc->min_max);
- u_data->io->tmp=TRUE;
- u_data->io->rectangle=FALSE;
- gtk_widget_set_sensitive(zoomout_bt, TRUE);
- sctp_graph_redraw(u_data);
- }
- else
- {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Please draw a rectangle around the area you want to zoom in.");
- }
-}
-
-static void
-zoomin_bt_fcn (struct sctp_udata *u_data)
-{
- sctp_min_max_t *tmp_minmax;
-
- tmp_minmax = (sctp_min_max_t *)g_malloc(sizeof(sctp_min_max_t));
-
- u_data->io->tmp_min_tsn1=u_data->io->y1_tmp+u_data->io->min_y;
- u_data->io->tmp_max_tsn1=u_data->io->y2_tmp+1+u_data->io->min_y;
-
- u_data->io->tmp_min_tsn2=u_data->io->tmp_min_tsn1;
- u_data->io->tmp_max_tsn2=u_data->io->tmp_max_tsn1;
- tmp_minmax->tmp_min_secs=u_data->io->x1_tmp_sec;
- tmp_minmax->tmp_min_usecs=u_data->io->x1_tmp_usec;
- tmp_minmax->tmp_max_secs=u_data->io->x2_tmp_sec;
- tmp_minmax->tmp_max_usecs=u_data->io->x2_tmp_usec;
- tmp_minmax->tmp_min_tsn1=u_data->io->tmp_min_tsn1;
- tmp_minmax->tmp_max_tsn1=u_data->io->tmp_max_tsn1;
- tmp_minmax->tmp_min_tsn2=u_data->io->tmp_min_tsn2;
- tmp_minmax->tmp_max_tsn2=u_data->io->tmp_max_tsn2;
- u_data->assoc->min_max = g_slist_prepend(u_data->assoc->min_max, tmp_minmax);
- u_data->io->length = g_slist_length(u_data->assoc->min_max);
- u_data->io->tmp=TRUE;
- u_data->io->rectangle=FALSE;
- gtk_widget_set_sensitive(zoomout_bt, TRUE);
- sctp_graph_redraw(u_data);
-}
-
-static void
-on_zoomout_bt (GtkWidget *widget _U_, struct sctp_udata *u_data)
-{
- sctp_min_max_t *tmp_minmax, *mm;
- gint l;
-
- l = g_slist_length(u_data->assoc->min_max);
-
- if (u_data->assoc->min_max!=NULL)
- {
- mm=(sctp_min_max_t *)((u_data->assoc->min_max)->data);
- u_data->assoc->min_max=g_slist_remove(u_data->assoc->min_max, mm);
- g_free(mm);
-
- if (l>2)
- {
- tmp_minmax = (sctp_min_max_t *)u_data->assoc->min_max->data;
- u_data->io->x1_tmp_sec=tmp_minmax->tmp_min_secs;
- u_data->io->x1_tmp_usec=tmp_minmax->tmp_min_usecs;
- u_data->io->x2_tmp_sec=tmp_minmax->tmp_max_secs;
- u_data->io->x2_tmp_usec=tmp_minmax->tmp_max_usecs;
- u_data->io->tmp_min_tsn1=tmp_minmax->tmp_min_tsn1;
- u_data->io->tmp_max_tsn1=tmp_minmax->tmp_max_tsn1;
- u_data->io->tmp_min_tsn2=tmp_minmax->tmp_min_tsn2;
- u_data->io->tmp_max_tsn2=tmp_minmax->tmp_max_tsn2;
- u_data->io->tmp=TRUE;
- }
- else
- {
- u_data->io->x1_tmp_sec=u_data->assoc->min_secs;
- u_data->io->x1_tmp_usec=u_data->assoc->min_usecs;
- u_data->io->x2_tmp_sec=u_data->assoc->max_secs;
- u_data->io->x2_tmp_usec=u_data->assoc->max_usecs;
- u_data->io->tmp_min_tsn1=0;
- u_data->io->tmp_max_tsn1=u_data->assoc->max_bytes1;
- u_data->io->tmp_min_tsn2=0;
- u_data->io->tmp_max_tsn2=u_data->assoc->max_bytes2;
- u_data->io->tmp=FALSE;
- }
- }
- else
- {
- u_data->io->x1_tmp_sec=u_data->assoc->min_secs;
- u_data->io->x1_tmp_usec=u_data->assoc->min_usecs;
- u_data->io->x2_tmp_sec=u_data->assoc->max_secs;
- u_data->io->x2_tmp_usec=u_data->assoc->max_usecs;
- u_data->io->tmp_min_tsn1=0;
- u_data->io->tmp_max_tsn1=u_data->assoc->max_bytes1;
- u_data->io->tmp_min_tsn2=0;
- u_data->io->tmp_max_tsn2=u_data->assoc->max_bytes2;
- u_data->io->tmp=FALSE;
- }
- if (g_slist_length(u_data->assoc->min_max)==1)
- gtk_widget_set_sensitive(zoomout_bt, FALSE);
- sctp_graph_redraw(u_data);
-}
-
-
-static gboolean
-on_button_press_event (GtkWidget *widget _U_, GdkEventButton *event, gpointer user_data)
-{
- struct sctp_udata *u_data = (struct sctp_udata *)user_data;
- sctp_graph_t *ios;
- cairo_t *cr;
-
- if (u_data->io->rectangle==TRUE)
- {
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_rectangle (cr,
- floor(MIN(u_data->io->x_old,u_data->io->x_new)),
- floor(MIN(u_data->io->y_old,u_data->io->y_new)),
- abs((int)(u_data->io->x_new-u_data->io->x_old)),
- abs((int)(u_data->io->y_new-u_data->io->y_old)));
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_stroke (cr);
- cairo_destroy (cr);
-
-
- ios=(sctp_graph_t *)g_object_get_data(G_OBJECT(u_data->io->draw_area), "sctp_graph_t");
- g_assert(ios != NULL);
-
- cr = gdk_cairo_create (gtk_widget_get_window(u_data->io->draw_area));
-
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, ios->surface, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, ios->pixmap, 0, 0);
-#endif
- cairo_rectangle (cr, 0, 0, abs((int)(u_data->io->x_new-u_data->io->x_old)), abs((int)(u_data->io->y_new-u_data->io->y_old)));
- cairo_fill (cr);
-
- cairo_destroy (cr);
-
- sctp_graph_redraw(u_data);
- }
-
- u_data->io->x_old=event->x;
- u_data->io->y_old=event->y;
- if (u_data->io->y_old>u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset)
- u_data->io->y_old=u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset;
- if (u_data->io->x_old<LEFT_BORDER+u_data->io->offset)
- u_data->io->x_old=LEFT_BORDER+u_data->io->offset;
- u_data->io->rectangle=FALSE;
-
- return TRUE;
-}
-
-
-static gboolean
-on_button_release_event (GtkWidget *widget _U_, GdkEventButton *event, gpointer user_data)
-{
- struct sctp_udata *u_data = (struct sctp_udata *)user_data;
- sctp_graph_t *ios;
- guint32 helpx, helpy, x1_tmp, x2_tmp, y_value;
- gint label_width, label_height;
- gdouble x_value, position, tfirst;
- gint lwidth;
- char label_string[30];
- GList *tsnlist=NULL;
- tsn_t *tsn, *tmptsn;
- PangoLayout *layout;
- GtkAllocation widget_alloc;
- cairo_t *cr;
-
- g_snprintf(label_string, sizeof(label_string), "%d", 0);
- memcpy(label_string,(gchar *)g_locale_to_utf8(label_string, -1 , NULL, NULL, NULL), sizeof(label_string));
- layout = gtk_widget_create_pango_layout(u_data->io->draw_area, label_string);
- pango_layout_get_pixel_size(layout, &label_width, &label_height);
-
- if (event->y > u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset)
- event->y = u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset;
- if (event->x < LEFT_BORDER+u_data->io->offset)
- event->x = LEFT_BORDER+u_data->io->offset;
-
- if (abs((int)(event->x-u_data->io->x_old))>10 || abs((int)(event->y-u_data->io->y_old))>10)
- {
- u_data->io->rect_x_min = (guint32) floor(MIN(u_data->io->x_old,event->x));
- u_data->io->rect_x_max = (guint32) ceil(MAX(u_data->io->x_old,event->x));
- u_data->io->rect_y_min = (guint32) floor(MIN(u_data->io->y_old,event->y));
- u_data->io->rect_y_max = (guint32) ceil(MAX(u_data->io->y_old,event->y));
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_rectangle (cr,
- u_data->io->rect_x_min+0.5,
- u_data->io->rect_y_min+0.5,
- u_data->io->rect_x_max - u_data->io->rect_x_min,
- u_data->io->rect_y_max - u_data->io->rect_y_min);
- cairo_set_line_width (cr, 1.0);
- cairo_stroke (cr);
- cairo_destroy (cr);
-
- ios=(sctp_graph_t *)g_object_get_data(G_OBJECT(u_data->io->draw_area), "sctp_graph_t");
- g_assert(ios != NULL);
-
- cr = gdk_cairo_create (gtk_widget_get_window(u_data->io->draw_area));
-
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, ios->surface, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, ios->pixmap, 0, 0);
-#endif
- gtk_widget_get_allocation(u_data->io->draw_area, &widget_alloc);
- cairo_rectangle (cr, 0, 0, widget_alloc.width, widget_alloc.height);
- cairo_fill (cr);
-
- cairo_destroy (cr);
-
- x1_tmp=(guint32) floor(u_data->io->min_x+((u_data->io->x_old-LEFT_BORDER-u_data->io->offset)*u_data->io->tmp_width/u_data->io->axis_width));
- x2_tmp=(guint32) floor(u_data->io->min_x+((event->x-LEFT_BORDER-u_data->io->offset)*u_data->io->tmp_width/u_data->io->axis_width));
- helpx=MIN(x1_tmp, x2_tmp);
- if (helpx==x2_tmp)
- {
- x2_tmp=x1_tmp;
- x1_tmp=helpx;
- }
- if (u_data->io->uoff)
- {
- if (x2_tmp - x1_tmp <= 1500)
- u_data->io->uoff = FALSE;
- u_data->io->x1_tmp_sec=(guint32)x1_tmp;
- u_data->io->x1_tmp_usec=0;
- u_data->io->x2_tmp_sec=(guint32)x2_tmp;
- u_data->io->x2_tmp_usec=0;
- }
- else
- {
- u_data->io->x1_tmp_sec=(guint32)x1_tmp/1000000;
- u_data->io->x1_tmp_usec=x1_tmp%1000000;
- u_data->io->x2_tmp_sec=(guint32)x2_tmp/1000000;
- u_data->io->x2_tmp_usec=x2_tmp%1000000;
- }
- u_data->io->x1_akt_sec = u_data->io->x1_tmp_sec;
- u_data->io->x1_akt_usec = u_data->io->x1_tmp_usec;
- u_data->io->x2_akt_sec = u_data->io->x2_tmp_sec;
- u_data->io->x2_akt_usec = u_data->io->x2_tmp_usec;
-
- u_data->io->y1_tmp=(guint32)((u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset-u_data->io->y_old)/u_data->io->y_interval);
- u_data->io->y2_tmp=(guint32)((u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset-event->y)/u_data->io->y_interval);
- helpy = MIN(u_data->io->y1_tmp, u_data->io->y2_tmp);
- u_data->io->y2_tmp = MAX(u_data->io->y1_tmp, u_data->io->y2_tmp);
- u_data->io->y1_tmp = helpy;
- u_data->io->x_new=event->x;
- u_data->io->y_new=event->y;
- u_data->io->rectangle=TRUE;
- u_data->io->rectangle_present=TRUE;
- }
- else
- {
- if (u_data->io->rectangle_present==TRUE)
- {
- u_data->io->rectangle_present=FALSE;
- if (event->x >= u_data->io->rect_x_min && event->x <= u_data->io->rect_x_max &&
- event->y >= u_data->io->rect_y_min && event->y <= u_data->io->rect_y_max)
- zoomin_bt_fcn(u_data);
- else
- {
- u_data->io->x1_tmp_sec = u_data->io->x1_akt_sec;
- u_data->io->x1_tmp_usec = u_data->io->x1_akt_usec;
- u_data->io->x2_tmp_sec = u_data->io->x2_akt_sec;
- u_data->io->x2_tmp_usec = u_data->io->x2_akt_usec;
- sctp_graph_redraw(u_data);
- }
- }
- else if (label_set)
- {
- label_set = FALSE;
- sctp_graph_redraw(u_data);
- }
- else
- {
- x_value = ((event->x-LEFT_BORDER-u_data->io->offset) * ((u_data->io->x2_tmp_sec+u_data->io->x2_tmp_usec/1000000.0)-(u_data->io->x1_tmp_sec+u_data->io->x1_tmp_usec/1000000.0)) / (u_data->io->surface_width-LEFT_BORDER-RIGHT_BORDER-u_data->io->offset))+u_data->io->x1_tmp_sec+u_data->io->x1_tmp_usec/1000000.0;
- y_value = (guint32) floor((u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset-event->y) * (max_tsn - min_tsn) / (u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset)) + min_tsn;
-
- if (u_data->dir == 1)
- tsnlist = g_list_last(u_data->assoc->tsn1);
- else
- tsnlist = g_list_last(u_data->assoc->tsn2);
-
- tsn = (tsn_t*) (tsnlist->data);
- tmptsn =(tsn_t*)(tsnlist->data);
- tfirst = tsn->secs + tsn->usecs/1000000.0;
-
- for (tsnlist = g_list_previous(tsnlist); tsnlist; tsnlist = g_list_previous(tsnlist))
- {
- tsn = (tsn_t*) (tsnlist->data);
- if (tsn->secs+tsn->usecs/1000000.0<x_value)
- {
- tfirst = tsn->secs+tsn->usecs/1000000.0;
- tmptsn =tsn;
- }
- else
- {
- if ((tfirst+tsn->secs+tsn->usecs/1000000.0)/2.0<x_value)
- {
- x_value = tsn->secs+tsn->usecs/1000000.0;
- tmptsn = tsn;
- }
- else
- x_value = tmptsn->secs+tmptsn->usecs/1000000.0;
- break;
- }
- }
- cf_goto_frame(&cfile, tmptsn->frame_number);
- g_snprintf(label_string, sizeof(label_string), "(%.6f, %u)", x_value, y_value);
- label_set = TRUE;
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr,
- (event->x-2)+0.5,
- (event->y)+0.5);
- cairo_line_to(cr,
- (event->x+2)+0.5,
- (event->y)+0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr,
- (event->x)+0.5,
- (event->y-2)+0.5);
- cairo_line_to(cr,
- (event->x)+0.5,
- (event->y+2)+0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
- if (event->x+150>=u_data->io->surface_width)
- position = event->x - 150;
- else
- position = event->x + 5;
-
- memcpy(label_string,(gchar *)g_locale_to_utf8(label_string, -1 , NULL, NULL, NULL), sizeof(label_string));
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_move_to (cr,
- position,
- event->y-10);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
-
- ios=(sctp_graph_t *)g_object_get_data(G_OBJECT(u_data->io->draw_area), "sctp_graph_t");
- g_assert(ios != NULL);
-
- cr = gdk_cairo_create (gtk_widget_get_window(u_data->io->draw_area));
-
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, ios->surface, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, ios->pixmap, 0, 0);
-#endif
- gtk_widget_get_allocation(u_data->io->draw_area, &widget_alloc);
- cairo_rectangle (cr, 0, 0, widget_alloc.width, widget_alloc.height);
- cairo_fill (cr);
-
- cairo_destroy (cr);
-
- }
- }
- g_object_unref(G_OBJECT(layout));
- return TRUE;
-}
-
-static void init_sctp_graph_window(struct sctp_udata *u_data)
-{
- GtkWidget *vbox;
- GtkWidget *hbox;
- GtkWidget *bt_close, *sack_bt, *tsn_bt, *both_bt, *zoomin_bt;
-
- /* create the main window */
-
- u_data->io->window = dlg_window_new("SCTP Graphics"); /* transient_for top_level */
- gtk_window_set_destroy_with_parent (GTK_WINDOW(u_data->io->window), TRUE);
-
- vbox=ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(u_data->io->window), vbox);
- gtk_widget_show(vbox);
-
- create_draw_area(vbox, u_data);
-
- sctp_graph_set_title(u_data);
-
- hbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(hbox), 10);
- gtk_button_box_set_layout(GTK_BUTTON_BOX (hbox), GTK_BUTTONBOX_SPREAD);
- gtk_box_set_spacing(GTK_BOX (hbox), 0);
- gtk_widget_show(hbox);
-
- sack_bt = gtk_button_new_with_label ("Adv. Rec. Window");
- gtk_box_pack_start(GTK_BOX(hbox), sack_bt, FALSE, FALSE, 0);
- gtk_widget_show(sack_bt);
-
- g_signal_connect(sack_bt, "clicked", G_CALLBACK(on_sack_bt), u_data);
-
- tsn_bt = gtk_button_new_with_label ("Data bytes sent");
- gtk_box_pack_start(GTK_BOX(hbox), tsn_bt, FALSE, FALSE, 0);
- gtk_widget_show(tsn_bt);
- g_signal_connect(tsn_bt, "clicked", G_CALLBACK(on_tsn_bt), u_data);
-
- both_bt = gtk_button_new_with_label ("Show both");
- gtk_box_pack_start(GTK_BOX(hbox), both_bt, FALSE, FALSE, 0);
- gtk_widget_show(both_bt);
- g_signal_connect(both_bt, "clicked", G_CALLBACK(on_both_bt), u_data);
-
- zoomin_bt = gtk_button_new_with_label ("Zoom in");
- gtk_box_pack_start(GTK_BOX(hbox), zoomin_bt, FALSE, FALSE, 0);
- gtk_widget_show(zoomin_bt);
- g_signal_connect(zoomin_bt, "clicked", G_CALLBACK(on_zoomin_bt), u_data);
- gtk_widget_set_tooltip_text(zoomin_bt, "Zoom in the area you have selected");
-
- zoomout_bt = gtk_button_new_with_label ("Zoom out");
- gtk_box_pack_start(GTK_BOX(hbox), zoomout_bt, FALSE, FALSE, 0);
- gtk_widget_show(zoomout_bt);
- g_signal_connect(zoomout_bt, "clicked", G_CALLBACK(on_zoomout_bt), u_data);
- gtk_widget_set_tooltip_text(zoomout_bt, "Zoom out one step");
- gtk_widget_set_sensitive(zoomout_bt, FALSE);
-
- bt_close = ws_gtk_button_new_from_stock(GTK_STOCK_CLOSE);
- gtk_box_pack_start(GTK_BOX(hbox), bt_close, FALSE, FALSE, 0);
- gtk_widget_show(bt_close);
- g_signal_connect(bt_close, "clicked", G_CALLBACK(sctp_graph_close_cb), u_data);
-
- g_signal_connect(u_data->io->draw_area,"button_press_event",G_CALLBACK(on_button_press_event), u_data);
- g_signal_connect(u_data->io->draw_area,"button_release_event",G_CALLBACK(on_button_release_event), u_data);
- gtk_widget_set_events(u_data->io->draw_area, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_EXPOSURE_MASK);
- /* dlg_set_cancel(u_data->io->window, bt_close); */
-
- gtk_widget_show(u_data->io->window);
-}
-
-static void sctp_graph_set_title(struct sctp_udata *u_data)
-{
- char *display_name;
- char *title;
-
- if(!u_data->io->window)
- {
- return;
- }
- display_name = cf_get_display_name(&cfile);
- title = g_strdup_printf("SCTP Data and Adv.Rcv.Window over Time: %s Port1 %u Port2 %u Endpoint %u",
- display_name, u_data->parent->assoc->port1, u_data->parent->assoc->port2, u_data->dir);
- g_free(display_name);
- gtk_window_set_title(GTK_WINDOW(u_data->io->window), title);
- g_free(title);
-}
-
-
-static void
-gtk_sctpgraph_init(struct sctp_udata *u_data)
-{
- sctp_graph_t *io;
- sctp_min_max_t* tmp_minmax;
-
- io=(sctp_graph_t *)g_malloc(sizeof(sctp_graph_t));
- io->needs_redraw=TRUE;
- io->x_interval=1000;
- io->window=NULL;
- io->draw_area=NULL;
-#if GTK_CHECK_VERSION(2,22,0)
- io->surface=NULL;
-#else
- io->pixmap=NULL;
-#endif
- io->surface_width=800;
- io->surface_height=600;
- io->graph_type=0;
- u_data->io=io;
-
-
- u_data->io->x1_tmp_sec=u_data->assoc->min_secs;
- u_data->io->x1_tmp_usec=u_data->assoc->min_usecs;
- u_data->io->x2_tmp_sec=u_data->assoc->max_secs;
- u_data->io->x2_tmp_usec=u_data->assoc->max_usecs;
- u_data->io->tmp_min_tsn1=0;
- u_data->io->tmp_max_tsn1=u_data->assoc->max_bytes1;
- u_data->io->tmp_min_tsn2=0;
- u_data->io->tmp_max_tsn2=u_data->assoc->max_bytes2;
- u_data->io->tmp=FALSE;
- tmp_minmax = (sctp_min_max_t *)g_malloc(sizeof(sctp_min_max_t));
- tmp_minmax->tmp_min_secs = u_data->assoc->min_secs;
- tmp_minmax->tmp_min_usecs=u_data->assoc->min_usecs;
- tmp_minmax->tmp_max_secs=u_data->assoc->max_secs;
- tmp_minmax->tmp_max_usecs=u_data->assoc->max_usecs;
- tmp_minmax->tmp_min_tsn2=u_data->io->tmp_min_tsn2;
- tmp_minmax->tmp_min_tsn1=u_data->io->tmp_min_tsn1;
- tmp_minmax->tmp_max_tsn1=u_data->io->tmp_max_tsn1;
- tmp_minmax->tmp_max_tsn2=u_data->io->tmp_max_tsn2;
- u_data->assoc->min_max = g_slist_prepend(u_data->assoc->min_max, tmp_minmax);
-
- /* build the GUI */
- init_sctp_graph_window(u_data);
- sctp_graph_redraw(u_data);
-}
-
-
-static void
-quit(GObject *object _U_, gpointer user_data)
-{
- struct sctp_udata *u_data=(struct sctp_udata *)user_data;
-
- decrease_childcount(u_data->parent);
- remove_child(u_data, u_data->parent);
- g_free(u_data->io);
- u_data->assoc->min_max = NULL;
- g_free(u_data);
-}
-
-
-static void create_draw_area(GtkWidget *box, struct sctp_udata *u_data)
-{
- u_data->io->draw_area=gtk_drawing_area_new();
- g_object_set_data(G_OBJECT(u_data->io->draw_area), "sctp_graph_t", u_data->io);
- g_signal_connect(u_data->io->draw_area, "destroy", G_CALLBACK(quit), u_data);
-
- gtk_widget_set_size_request(u_data->io->draw_area, u_data->io->surface_width, u_data->io->surface_height);
-
- /* signals needed to handle backing pixmap */
-#if GTK_CHECK_VERSION(3,0,0)
- g_signal_connect(u_data->io->draw_area, "draw", G_CALLBACK(on_draw_area_draw_event), u_data->io);
-#else
- g_signal_connect(u_data->io->draw_area, "expose_event", G_CALLBACK(on_expose_event), u_data->io);
-#endif
- g_signal_connect(u_data->io->draw_area, "configure_event", G_CALLBACK(on_configure_event), u_data);
-
- gtk_widget_show(u_data->io->draw_area);
- gtk_box_pack_start(GTK_BOX(box), u_data->io->draw_area, TRUE, TRUE, 0);
-}
-
-static void insertion(GPtrArray *array, guint32 N)
-{
- guint32 i, j;
- guint32 v;
- struct tsn_sort *help=NULL;
-
- for (i=1; i<N; i++)
- {
- v = ((struct tsn_sort*)(g_ptr_array_index(array,i)))->tsnumber;
- j=i;
- while (j>=1 && ((struct tsn_sort*)(g_ptr_array_index(array, j-1)))->tsnumber > v)
- {
- help=(struct tsn_sort *)g_ptr_array_index(array, j);
- g_ptr_array_index(array, j)=g_ptr_array_index(array, j-1);
- g_ptr_array_index(array, j-1)=help;
- j--;
- }
- ((struct tsn_sort*)(g_ptr_array_index(array, j)))->tsnumber=v;
- }
-}
-
-static void set_arw_offsets(struct sctp_udata *u_data)
-{
- GPtrArray *s_array=NULL, *t_array=NULL;
- guint32 i, j=0;
-
- if (u_data->dir==1 && u_data->assoc->n_sack_chunks_ep1>0)
- {
- s_array=u_data->assoc->sort_sack1;
- t_array=u_data->assoc->sort_tsn1;
- insertion(s_array,u_data->assoc->n_sack_chunks_ep1);
-
- for (i=0; i<u_data->assoc->n_sack_chunks_ep1; i++)
- {
- while (((struct tsn_sort*)(g_ptr_array_index(s_array, i)))->tsnumber > ((struct tsn_sort*)(g_ptr_array_index(t_array, j)))->tsnumber)
- {
- j++;
- }
- ((struct tsn_sort*)(g_ptr_array_index(s_array,i)))->offset = ((struct tsn_sort*)(g_ptr_array_index(t_array, j)))->offset
- + ((struct tsn_sort*)(g_ptr_array_index(t_array, j)))->length;
- }
-
- u_data->assoc->sort_sack1=s_array;
- }
-
- if (u_data->dir==2 && u_data->assoc->n_sack_chunks_ep2>0)
- {
- s_array=u_data->assoc->sort_sack2;
- t_array=u_data->assoc->sort_tsn2;
- insertion(s_array,u_data->assoc->n_sack_chunks_ep2);
- j=0;
- for (i=0; i<u_data->assoc->n_sack_chunks_ep2; i++)
- {
- while (((struct tsn_sort*)(g_ptr_array_index(s_array, i)))->tsnumber > ((struct tsn_sort*)(g_ptr_array_index(t_array,j)))->tsnumber)
- {
- j++;
- }
- ((struct tsn_sort*)(g_ptr_array_index(s_array, i)))->offset = ((struct tsn_sort*)(g_ptr_array_index(t_array, j)))->offset
- + ((struct tsn_sort*)(g_ptr_array_index(t_array, j)))->length;
- }
- u_data->assoc->sort_sack2=s_array;
- }
-}
-
-static void compute_offsets(struct sctp_udata *u_data)
-{
- struct tsn_sort t_sort;
- GPtrArray *array=NULL;
- guint32 i;
- guint32 sum=0;
- guint32 tsntmp=0;
-
- if (u_data->dir==1 && u_data->assoc->n_array_tsn1>0)
- {
- array=u_data->assoc->sort_tsn1;
- insertion(array,u_data->assoc->n_array_tsn1);
-
- for (i=0; i<u_data->assoc->n_array_tsn1; i++)
- {
- ((struct tsn_sort*)(g_ptr_array_index(array, i)))->offset=sum;
- t_sort.tsnumber=((struct tsn_sort*)(g_ptr_array_index(array, i)))->tsnumber;
- if (t_sort.tsnumber>tsntmp)
- sum+=((struct tsn_sort*)(g_ptr_array_index(array, i)))->length;
- tsntmp=t_sort.tsnumber;
- }
- u_data->assoc->max_bytes1= ((struct tsn_sort*)(g_ptr_array_index(array, i-1)))->offset + ((struct tsn_sort*)(g_ptr_array_index(array, i-1)))->length;
- u_data->assoc->sort_tsn1=array;
- }
- if (u_data->dir==2 && u_data->assoc->n_array_tsn2>0)
- {
- sum=0;
- array=u_data->assoc->sort_tsn2;
- insertion(array,u_data->assoc->n_array_tsn2);
-
- for (i=0; i<u_data->assoc->n_array_tsn2; i++)
- {
- ((struct tsn_sort*)(g_ptr_array_index(array,i)))->offset=sum;
- t_sort.tsnumber=((struct tsn_sort*)(g_ptr_array_index(array, i)))->tsnumber;
- if (t_sort.tsnumber>tsntmp)
- sum+=((struct tsn_sort*)(g_ptr_array_index(array, i)))->length;
- tsntmp=t_sort.tsnumber;
- }
-
- u_data->assoc->max_bytes2= ((struct tsn_sort*)(g_ptr_array_index(array, u_data->assoc->n_data_chunks_ep2-1)))->offset + ((struct tsn_sort*)(g_ptr_array_index(array, u_data->assoc->n_data_chunks_ep2-1)))->length;
- u_data->assoc->sort_tsn2=array;
- }
-}
-
-void create_byte_graph(guint16 dir, struct sctp_analyse* userdata)
-{
- struct sctp_udata *u_data;
-
- u_data=(struct sctp_udata *)g_malloc(sizeof(struct sctp_udata));
- u_data->assoc=userdata->assoc;
- u_data->io=NULL;
- u_data->dir = dir;
- u_data->parent = userdata;
- if ((u_data->dir==1 && (u_data->assoc->n_array_tsn1==0))|| (u_data->dir==2 && (u_data->assoc->n_array_tsn2==0)))
- simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK, "No Data Chunks sent");
- else
- {
- set_child(u_data, u_data->parent);
- increase_childcount(u_data->parent);
- compute_offsets(u_data);
- set_arw_offsets(u_data);
- gtk_sctpgraph_init(u_data);
- }
-
-}
-
-
-/*
- * Editor modelines - http://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/gtk/sctp_chunk_stat.c b/ui/gtk/sctp_chunk_stat.c
deleted file mode 100644
index 54b2b1af5d..0000000000
--- a/ui/gtk/sctp_chunk_stat.c
+++ /dev/null
@@ -1,341 +0,0 @@
-/* sctp_chunk_stat.c
- * SCTP chunk counter for Wireshark
- * Copyright 2005 Oleg Terletsky <oleg.terletsky [AT] comverse.com>
- * Copyright 2009 Varun Notibala <nbvarun [AT] gmail.com>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-
-#include "config.h"
-
-#include <string.h>
-
-#include <epan/to_str.h>
-#include <epan/value_string.h>
-#include <epan/tap.h>
-
-#include "ui/simple_dialog.h"
-
-#include "ui/gtk/gui_stat_util.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/tap_param_dlg.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/sctp_stat_gtk.h"
-
-#include "globals.h"
-
-void register_tap_listener_sctpstat(void);
-static void sctpstat_init(const char *opt_arg, void *userdata);
-
-static tap_param sctp_stat_params[] = {
- { PARAM_FILTER, "filter", "Filter", NULL, TRUE }
-};
-
-static tap_param_dlg sctp_stat_dlg = {
- "SCTP Statistics",
- "sctp,stat",
- sctpstat_init,
- -1,
- G_N_ELEMENTS(sctp_stat_params),
- sctp_stat_params,
- NULL
-};
-
-typedef struct sctp_ep {
- struct sctp_ep* next;
- address src;
- address dst;
- guint16 sport;
- guint16 dport;
- guint32 chunk_count[256];
-} sctp_ep_t;
-
-/* used to keep track of the statistics for an entire program interface */
-typedef struct _sctp_stat_t {
- GtkWidget *win;
- GtkWidget *vbox;
- char *filter;
- GtkWidget *scrolled_window;
- GtkTreeView *table;
- guint32 number_of_packets;
- sctp_ep_t* ep_list;
-} sctpstat_t;
-
-typedef struct _sctp_info sctp_into_t;
-
-#define CHUNK_TYPE(x)(tvb_get_guint8((x), CHUNK_TYPE_OFFSET))
-
-static void
-sctpstat_reset(void *phs)
-{
- sctpstat_t* sctp_stat = (sctpstat_t *)phs;
- sctp_ep_t* list = (sctp_ep_t*)sctp_stat->ep_list;
- sctp_ep_t* tmp = NULL;
- guint16 chunk_type;
-
- if(!list)
- return;
-
- for(tmp = list; tmp ; tmp=tmp->next)
- for(chunk_type = 0; chunk_type < 256; chunk_type++)
- tmp->chunk_count[chunk_type] = 0;
-
- sctp_stat->number_of_packets = 0;
-}
-
-static sctp_ep_t* alloc_sctp_ep(struct _sctp_info *si)
-{
- sctp_ep_t* ep;
- guint16 chunk_type;
-
- if(!si)
- return NULL;
-
- if (!(ep = (sctp_ep_t *)g_malloc(sizeof(sctp_ep_t))))
- return NULL;
-
- copy_address(&ep->src,&si->ip_src);
- copy_address(&ep->dst,&si->ip_dst);
- ep->sport = si->sport;
- ep->dport = si->dport;
- ep->next = NULL;
- for(chunk_type = 0; chunk_type < 256; chunk_type++)
- ep->chunk_count[chunk_type] = 0;
- return ep;
-}
-
-static int
-sctpstat_packet(void *phs, packet_info *pinfo _U_, epan_dissect_t *edt _U_, const void *phi)
-{
-
- sctpstat_t *hs=(sctpstat_t *)phs;
- sctp_ep_t *tmp = NULL, *te = NULL;
- struct _sctp_info *si = (struct _sctp_info *) phi;
- guint32 tvb_number;
-
- if (!hs)
- return (0);
-
- hs->number_of_packets++;
- if(!hs->ep_list) {
- hs->ep_list = alloc_sctp_ep(si);
- te = hs->ep_list;
- } else {
- for(tmp=hs->ep_list ; tmp ; tmp=tmp->next) {
- if((!cmp_address(&tmp->src,&si->ip_src)) &&
- (!cmp_address(&tmp->dst,&si->ip_dst)) &&
- (tmp->sport == si->sport) &&
- (tmp->dport == si->dport)) {
- te = tmp;
- break;
- }
- }
- if(!te) {
- if ((te = alloc_sctp_ep(si))) {
- te->next = hs->ep_list;
- hs->ep_list = te;
- }
- }
- }
-
- if(!te)
- return (0);
-
-
- if (si->number_of_tvbs > 0) {
- for(tvb_number = 0; tvb_number < si->number_of_tvbs; tvb_number++) {
- if (IS_SCTP_CHUNK_TYPE(CHUNK_TYPE(si->tvb[tvb_number])))
- (te->chunk_count[CHUNK_TYPE(si->tvb[tvb_number])])++;
- else
- (te->chunk_count[OTHER_CHUNKS_INDEX])++;
- }
- }
- return (1);
-}
-
-
-static void
-sctpstat_draw(void *phs)
-{
- sctpstat_t *hs=(sctpstat_t *)phs;
- sctp_ep_t* list = hs->ep_list, *tmp;
- GtkListStore *store;
- GtkTreeIter iter;
- char *src_addr, *dst_addr;
-
- /* Now print Message and Reason Counter Table */
- /* clear list before printing */
- /* XXX use an iter for new/modified ? */
- store = GTK_LIST_STORE(gtk_tree_view_get_model(hs->table));
- gtk_list_store_clear(store);
-
- for(tmp = list ; tmp ; tmp=tmp->next) {
- src_addr = (char*)address_to_str(NULL, &tmp->src);
- dst_addr = (char*)address_to_str(NULL, &tmp->dst);
-
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter,
- 0, src_addr,
- 1, tmp->sport,
- 2, dst_addr,
- 3, tmp->dport,
- 4, tmp->chunk_count[SCTP_DATA_CHUNK_ID],
- 5, tmp->chunk_count[SCTP_SACK_CHUNK_ID],
- 6, tmp->chunk_count[SCTP_HEARTBEAT_CHUNK_ID],
- 7, tmp->chunk_count[SCTP_HEARTBEAT_ACK_CHUNK_ID],
- 8, tmp->chunk_count[SCTP_INIT_CHUNK_ID],
- 9, tmp->chunk_count[SCTP_INIT_ACK_CHUNK_ID],
- 10, tmp->chunk_count[SCTP_COOKIE_ECHO_CHUNK_ID],
- 11, tmp->chunk_count[SCTP_COOKIE_ACK_CHUNK_ID],
- 12, tmp->chunk_count[SCTP_ABORT_CHUNK_ID],
- 13, tmp->chunk_count[SCTP_ERROR_CHUNK_ID],
- 14, tmp->chunk_count[SCTP_NR_SACK_CHUNK_ID],
- 15, tmp->chunk_count[SCTP_I_DATA_CHUNK_ID],
- 16, tmp->chunk_count[SCTP_ASCONF_ACK_CHUNK_ID],
- 17, tmp->chunk_count[SCTP_PKTDROP_CHUNK_ID],
- 18, tmp->chunk_count[SCTP_FORWARD_TSN_CHUNK_ID],
- 19, tmp->chunk_count[SCTP_ASCONF_CHUNK_ID],
- 20, tmp->chunk_count[OTHER_CHUNKS_INDEX],
- -1
- );
- wmem_free(NULL, src_addr);
- wmem_free(NULL, dst_addr);
- }
-}
-
-static void
-win_destroy_cb(GtkWindow *win _U_, gpointer data)
-{
- sctpstat_t *hs=(sctpstat_t *)data;
-
- remove_tap_listener(hs);
-
- if(hs->filter){
- g_free(hs->filter);
- hs->filter=NULL;
- }
- g_free(hs);
-}
-
-
-static const stat_column titles[]={
- {G_TYPE_STRING, TAP_ALIGN_LEFT, "Source IP" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "Source Port" },
- {G_TYPE_STRING, TAP_ALIGN_LEFT, "Dest IP" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "Dest Port" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "DATA" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "SACK" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "HBEAT" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "HBEAT-ACK" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "INIT" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "INIT-ACK" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "COOKIE" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "COOKIE-ACK" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "ABORT" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "ERROR" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "NR-SACK" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "I-DATA" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "ASCONF-ACK" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "PKTDROP" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "FORWARD-TSN" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "ASCONF" },
- {G_TYPE_UINT, TAP_ALIGN_RIGHT, "Others" }
-};
-
-static void
-sctpstat_init(const char *opt_arg, void *userdata _U_)
-{
- sctpstat_t *hs;
- GString *error_string;
- GtkWidget *bbox;
- GtkWidget *close_bt;
-
- hs=(sctpstat_t *)g_malloc(sizeof(sctpstat_t));
- if(strncmp(opt_arg,"sctp,stat,",10) == 0){
- hs->filter=g_strdup(opt_arg+10);
- } else {
- hs->filter=NULL;
- }
- hs->ep_list = NULL;
- hs->number_of_packets = 0;
- sctpstat_reset(hs);
-
- hs->win = dlg_window_new("Wireshark: SCTP Chunk Statistics"); /* transient_for top_level */
- gtk_window_set_destroy_with_parent (GTK_WINDOW(hs->win), TRUE);
- gtk_window_set_default_size(GTK_WINDOW(hs->win), 700, 250);
-
- hs->vbox=ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(hs->vbox), 12);
-
- init_main_stat_window(hs->win, hs->vbox, "SCTP Chunk Counter", hs->filter);
-
- /* init a scrolled window*/
- hs->scrolled_window = scrolled_window_new(NULL, NULL);
-
- hs->table = create_stat_table(hs->scrolled_window, hs->vbox, 20, titles);
-
- error_string=register_tap_listener("sctp", hs, hs->filter, 0,
- sctpstat_reset,
- sctpstat_packet,
- sctpstat_draw);
- if(error_string){
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
- g_string_free(error_string, TRUE);
- g_free(hs->filter);
- g_free(hs);
- return;
- }
-
- /* Button row. */
- bbox = dlg_button_row_new(GTK_STOCK_CLOSE, NULL);
- gtk_box_pack_end(GTK_BOX(hs->vbox), bbox, FALSE, FALSE, 0);
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(hs->win, close_bt, window_cancel_button_cb);
-
- g_signal_connect(hs->win, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(hs->win, "destroy", G_CALLBACK(win_destroy_cb), hs);
-
- gtk_widget_show_all(hs->win);
- window_present(hs->win);
-
- cf_retap_packets(&cfile);
-}
-
-void
-register_tap_listener_sctpstat(void)
-{
- register_param_stat(&sctp_stat_dlg, "Chunk Counter",
- REGISTER_STAT_GROUP_TELEPHONY_SCTP);
-}
-
-/*
- * Editor modelines - http://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/gtk/sctp_chunk_stat_dlg.c b/ui/gtk/sctp_chunk_stat_dlg.c
deleted file mode 100644
index 8acf310d03..0000000000
--- a/ui/gtk/sctp_chunk_stat_dlg.c
+++ /dev/null
@@ -1,822 +0,0 @@
-/*
- * Copyright 2004, Irene Ruengeler <i.ruengeler [AT] fh-muenster.de>
- * Copyright 2009, Varun Notibala <nbvarun [AT] gmail.com>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include "epan/to_str.h"
-
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/sctp_stat_gtk.h"
-#include "ui/gtk/stock_icons.h"
-
-#include "globals.h"
-
-static GtkWidget *clist = NULL;
-static GList *last_list = NULL;
-static sctp_assoc_info_t *selected_stream = NULL; /* current selection */
-
-enum chunk_types {
- DATA = 0,
- INIT = 1,
- INIT_ACK = 2,
- SACK = 3,
- HEARTBEAT = 4,
- HEARTBEAT_ACK = 5,
- ABORT = 6,
- SHUTDOWN = 7,
- SHUTDOWN_ACK = 8,
- SCTP_ERROR = 9,
- COOKIE_ECHO = 10,
- COOKIE_ACK = 11,
- ECNE = 12,
- CWR = 13,
- SHUT_COMPLETE = 14,
- AUTH = 15,
- NR_SACK = 16,
- I_DATA = 0x40,
- ASCONF_ACK = 0x80,
- PKTDROP = 0x81,
- FORWARD_TSN = 0xC0,
- ASCONF = 0xC1
-};
-enum
-{
- IP_ADDR_COLUMN,
- DATA_COLUMN,
- INIT_COLUMN,
- INIT_ACK_COLUMN,
- SACK_COLUMN,
- HEARTBEAT_COLUMN,
- HEARTBEAT_ACK_COLUMN,
- ABORT_COLUMN,
- SHUTDOWN_COLUMN,
- SHUTDOWN_ACK_COLUMN,
- ERROR_COLUMN,
- COOKIE_ECHO_COLUMN,
- COOKIE_ACK_COLUMN,
- ECNE_COLUMN,
- CWR_COLUMN,
- SHUT_COMPLETE_COLUMN,
- AUTH_COLUMN,
- NR_SACK_COLUMN,
- I_DATA_COLUMN,
- ASCONF_ACK_COLUMN,
- PKTDROP_COLUMN,
- FORWARD_TSN_COLUMN,
- ASCONF_COLUMN,
- OTHERS_COLUMN,
- N_COLUMN /* The number of columns */
-};
-
-/* Create list */
-static
-GtkWidget* create_list(void)
-{
-
- GtkListStore *list_store;
- GtkWidget *list;
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
- GtkTreeSortable *sortable;
- GtkTreeView *list_view;
- GtkTreeSelection *selection;
-
- /* Create the store */
- list_store = gtk_list_store_new(N_COLUMN, /* Total number of columns XXX */
- G_TYPE_STRING, /* IP Address */
- G_TYPE_INT, /* DATA */
- G_TYPE_INT, /* INIT */
- G_TYPE_INT, /* INIT_ACK */
- G_TYPE_INT, /* SACK */
- G_TYPE_INT, /* HEARTBEAT */
- G_TYPE_INT, /* HEARTBEAT_ACK */
- G_TYPE_INT, /* ABORT */
- G_TYPE_INT, /* SHUTDOWN */
- G_TYPE_INT, /* SHUTDOWN_ACK */
- G_TYPE_INT, /* ERROR */
- G_TYPE_INT, /* COOKIE_ECHO */
- G_TYPE_INT, /* COOKIE_ACK */
- G_TYPE_INT, /* ECNE */
- G_TYPE_INT, /* CWR */
- G_TYPE_INT, /* SHUT_COMPLETE */
- G_TYPE_INT, /* AUTH */
- G_TYPE_INT, /* NR_SACK */
- G_TYPE_INT, /* I_DATA */
- G_TYPE_INT, /* ASCONF_ACK */
- G_TYPE_INT, /* PKTDROP */
- G_TYPE_INT, /* FORWARD_TSN */
- G_TYPE_INT, /* ASCONF */
- G_TYPE_INT); /* Others */
- /* Create a view */
- list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
-
- list_view = GTK_TREE_VIEW(list);
- sortable = GTK_TREE_SORTABLE(list_store);
-
- /* Speed up the list display */
- gtk_tree_view_set_fixed_height_mode(list_view, TRUE);
-
- /* Setup the sortable columns */
- gtk_tree_sortable_set_sort_column_id(sortable, IP_ADDR_COLUMN, GTK_SORT_ASCENDING);
- gtk_tree_view_set_headers_clickable(list_view, FALSE);
-
- /* The view now holds a reference. We can get rid of our own reference */
- g_object_unref (G_OBJECT (list_store));
-
- /*
- * Create the first column packet, associating the "text" attribute of the
- * cell_renderer to the first column of the model
- */
- /* 1:st column */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("IP Address", renderer,
- "text", IP_ADDR_COLUMN,
- NULL);
-
- gtk_tree_view_column_set_sort_column_id(column, IP_ADDR_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 135);
-
- /* Add the column to the view. */
- gtk_tree_view_append_column (list_view, column);
-
- /* 2:nd column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("DATA", renderer,
- "text", DATA_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, DATA_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 70);
- gtk_tree_view_append_column (list_view, column);
-
- /* 3:d column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("INIT", renderer,
- "text", INIT_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, INIT_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 70);
- gtk_tree_view_append_column (list_view, column);
-
- /* 4:th column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("INIT-ACK", renderer,
- "text", INIT_ACK_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, INIT_ACK_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 90);
- gtk_tree_view_append_column (list_view, column);
-
- /* 5:th column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("SACK", renderer,
- "text", SACK_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, SACK_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 70);
- gtk_tree_view_append_column (list_view, column);
-
- /* 6:th column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("HEARTBEAT", renderer,
- "text", HEARTBEAT_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, HEARTBEAT_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 110);
- gtk_tree_view_append_column (list_view, column);
-
- /* 7:th column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("HEARTBEAT-ACK", renderer,
- "text", HEARTBEAT_ACK_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, HEARTBEAT_ACK_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 140);
- gtk_tree_view_append_column (list_view, column);
-
- /* 8:th column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("ABORT", renderer,
- "text", ABORT_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, ABORT_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 80);
- gtk_tree_view_append_column (list_view, column);
-
-
- /* 9:th column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("SHUTDOWN", renderer,
- "text", SHUTDOWN_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, SHUTDOWN_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 120);
- gtk_tree_view_append_column (list_view, column);
-
- /* 10:th column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("SHUTDOWN-ACK", renderer,
- "text", SHUTDOWN_ACK_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, SHUTDOWN_ACK_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 150);
- gtk_tree_view_append_column (list_view, column);
-
- /* 11:th column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("ERROR", renderer,
- "text", ERROR_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, ERROR_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 80);
- gtk_tree_view_append_column (list_view, column);
-
- /* 12:th column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("COOKIE-ECHO", renderer,
- "text", COOKIE_ECHO_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, COOKIE_ECHO_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 130);
- gtk_tree_view_append_column (list_view, column);
-
- /* 13:th column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("COOKIE-ACK", renderer,
- "text", COOKIE_ACK_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, COOKIE_ACK_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 130);
- gtk_tree_view_append_column (list_view, column);
-
- /* 14:th column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("ECNE", renderer,
- "text", ECNE_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, ECNE_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 70);
- gtk_tree_view_append_column (list_view, column);
-
- /* 15:th column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("CWR", renderer,
- "text", CWR_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, CWR_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 70);
- gtk_tree_view_append_column (list_view, column);
-
- /* 16:th column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("SHUT-COMPLETE", renderer,
- "text", SHUT_COMPLETE_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, SHUT_COMPLETE_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 150);
- gtk_tree_view_append_column (list_view, column);
-
- /* 17:th column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("AUTH", renderer,
- "text", AUTH_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, AUTH_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 80);
- gtk_tree_view_append_column (list_view, column);
-
- /* 18:th column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("NR-SACK", renderer,
- "text", NR_SACK_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, NR_SACK_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 100);
- gtk_tree_view_append_column (list_view, column);
-
- /* 19:th column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("I-DATA", renderer,
- "text", I_DATA_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, I_DATA_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 100);
- gtk_tree_view_append_column (list_view, column);
-
- /* 20:th column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("ASCONF-ACK", renderer,
- "text", ASCONF_ACK_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, ASCONF_ACK_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 120);
- gtk_tree_view_append_column (list_view, column);
-
- /* 21:th column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("PKTDROP", renderer,
- "text", PKTDROP_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, PKTDROP_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 100);
- gtk_tree_view_append_column (list_view, column);
-
- /* 22:st column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("FORWARD-TSN", renderer,
- "text", FORWARD_TSN_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, FORWARD_TSN_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 140);
- gtk_tree_view_append_column (list_view, column);
-
- /* 23:nd column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("ASCONF", renderer,
- "text", ASCONF_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, ASCONF_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 90);
- gtk_tree_view_append_column (list_view, column);
-
- /* 24:rd column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Others", renderer,
- "text", OTHERS_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, OTHERS_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 80);
- gtk_tree_view_append_column (list_view, column);
-
- /* Now enable the sorting of each column */
- gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(list_view), TRUE);
- gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(list_view), TRUE);
-
- /* Setup the selection handler */
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
-
- return list;
-
-}
-
-static const char *
-chunk_name(int type)
-{
-#define CASE(x) case x: s = #x; break
- const char *s = "unknown";
- switch (type)
- {
- CASE(DATA);
- CASE(INIT);
- CASE(INIT_ACK);
- CASE(SACK);
- CASE(HEARTBEAT);
- CASE(HEARTBEAT_ACK);
- CASE(ABORT);
- CASE(SHUTDOWN);
- CASE(SHUTDOWN_ACK);
- CASE(SCTP_ERROR);
- CASE(COOKIE_ECHO);
- CASE(COOKIE_ACK);
- CASE(ECNE);
- CASE(CWR);
- CASE(SHUT_COMPLETE);
- CASE(AUTH);
- CASE(NR_SACK);
- CASE(I_DATA);
- CASE(ASCONF_ACK);
- CASE(PKTDROP);
- CASE(FORWARD_TSN);
- CASE(ASCONF);
- }
- return s;
-}
-
-typedef struct column_arrows {
- GtkWidget *grid;
- GtkWidget *ascend_pm;
- GtkWidget *descend_pm;
-} column_arrows;
-
-
-static void
-chunk_dlg_destroy(GObject *object _U_, gpointer user_data)
-{
- struct sctp_udata *u_data = (struct sctp_udata*)user_data;
-
- decrease_childcount(u_data->parent);
- remove_child(u_data, u_data->parent);
- g_free(u_data->io);
- g_free(u_data);
-}
-
-static void
-add_to_clist(sctp_addr_chunk* sac)
-{
- GtkListStore *list_store = NULL;
- GtkTreeIter iter;
- gchar *field;
-
- list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (clist))); /* Get store */
-
- if ((sac->addr->type == AT_IPv4) || (sac->addr->type == AT_IPv6)) {
- field = (gchar*)address_to_str(NULL, sac->addr);
- } else {
- field = wmem_strdup(NULL, "NONE");
- }
-
- gtk_list_store_insert_with_values( list_store , &iter, G_MAXINT,
- IP_ADDR_COLUMN, field,
- DATA_COLUMN, sac->addr_count[SCTP_DATA_CHUNK_ID],
- INIT_COLUMN, sac->addr_count[SCTP_INIT_CHUNK_ID],
- INIT_ACK_COLUMN, sac->addr_count[SCTP_INIT_ACK_CHUNK_ID],
- SACK_COLUMN, sac->addr_count[SCTP_SACK_CHUNK_ID],
- HEARTBEAT_COLUMN, sac->addr_count[SCTP_HEARTBEAT_CHUNK_ID],
- HEARTBEAT_ACK_COLUMN, sac->addr_count[SCTP_HEARTBEAT_ACK_CHUNK_ID],
- ABORT_COLUMN, sac->addr_count[SCTP_ABORT_CHUNK_ID],
- SHUTDOWN_COLUMN, sac->addr_count[SCTP_SHUTDOWN_CHUNK_ID],
- SHUTDOWN_ACK_COLUMN, sac->addr_count[SCTP_SHUTDOWN_ACK_CHUNK_ID],
- ERROR_COLUMN, sac->addr_count[SCTP_ERROR_CHUNK_ID],
- COOKIE_ECHO_COLUMN, sac->addr_count[SCTP_COOKIE_ECHO_CHUNK_ID],
- COOKIE_ACK_COLUMN, sac->addr_count[SCTP_COOKIE_ACK_CHUNK_ID],
- ECNE_COLUMN, sac->addr_count[SCTP_ECNE_CHUNK_ID],
- CWR_COLUMN, sac->addr_count[SCTP_CWR_CHUNK_ID],
- SHUT_COMPLETE_COLUMN, sac->addr_count[SCTP_SHUTDOWN_COMPLETE_CHUNK_ID],
- AUTH_COLUMN, sac->addr_count[SCTP_AUTH_CHUNK_ID],
- NR_SACK_COLUMN, sac->addr_count[SCTP_NR_SACK_CHUNK_ID],
- I_DATA_COLUMN, sac->addr_count[SCTP_I_DATA_CHUNK_ID],
- ASCONF_ACK_COLUMN, sac->addr_count[SCTP_ASCONF_ACK_CHUNK_ID],
- PKTDROP_COLUMN, sac->addr_count[SCTP_PKTDROP_CHUNK_ID],
- FORWARD_TSN_COLUMN, sac->addr_count[SCTP_FORWARD_TSN_CHUNK_ID],
- ASCONF_COLUMN, sac->addr_count[SCTP_ASCONF_CHUNK_ID],
- OTHERS_COLUMN, sac->addr_count[OTHER_CHUNKS_INDEX],
- -1);
-
- wmem_free(NULL, field);
-}
-
-void sctp_chunk_stat_dlg_update(struct sctp_udata* udata, unsigned int direction)
-{
- GList *list = NULL;
- sctp_addr_chunk *sac;
-
- if (udata->io->window != NULL)
- {
- gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(clist))));
- if (udata->assoc->addr_chunk_count != NULL)
- {
- list = g_list_first(udata->assoc->addr_chunk_count);
-
- while (list)
- {
- sac = (sctp_addr_chunk*)(list->data);
- if (sac->direction == direction)
- {
- add_to_clist(sac);
- list = g_list_next(list);
- }
- else
- list = g_list_next(list);
- }
- }
- }
- last_list = list;
-}
-
-
-
-static void
-sctp_chunk_stat_on_close (GtkButton *button _U_, gpointer user_data)
-{
- struct sctp_udata *udata;
-
- udata = (struct sctp_udata *)user_data;
- gtk_grab_remove(udata->io->window);
- gtk_widget_destroy(udata->io->window);
-}
-
-static void
-path_window_set_title(struct sctp_udata *u_data, unsigned int direction)
-{
- char *display_name;
- char *title;
-
- if (!u_data->io->window) {
- return;
- }
- display_name = cf_get_display_name(&cfile);
- title = g_strdup_printf("SCTP Path Chunk Statistics for Endpoint %u: %s Port1 %u Port2 %u",direction,
- display_name, u_data->assoc->port1, u_data->assoc->port2);
- g_free(display_name);
- gtk_window_set_title(GTK_WINDOW(u_data->io->window), title);
- g_free(title);
-}
-
-static void
-gtk_sctpstat_dlg(struct sctp_udata *u_data, unsigned int direction)
-{
- GtkWidget *vbox1;
- GtkWidget *scrolledwindow1;
- GtkWidget *hbuttonbox2;
- GtkWidget *bt_close;
-
-
- sctp_graph_t *io = (sctp_graph_t *)g_malloc(sizeof(sctp_graph_t));
- io->window = NULL;
- u_data->io = io;
- u_data->io->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_default_size(GTK_WINDOW(u_data->io->window), 850, 200);
- gtk_window_set_position (GTK_WINDOW (u_data->io->window), GTK_WIN_POS_CENTER);
- path_window_set_title(u_data, direction);
- g_signal_connect(u_data->io->window, "destroy", G_CALLBACK(chunk_dlg_destroy), u_data);
-
- /* Container for each row of widgets */
- vbox1 = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 2, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(vbox1), 8);
- gtk_container_add(GTK_CONTAINER(u_data->io->window), vbox1);
- gtk_widget_show(vbox1);
-
- scrolledwindow1 = scrolled_window_new (NULL, NULL);
- gtk_widget_show (scrolledwindow1);
- gtk_box_pack_start (GTK_BOX (vbox1), scrolledwindow1, TRUE, TRUE, 0);
-
- clist = create_list();
- gtk_widget_show (clist);
- gtk_container_add (GTK_CONTAINER (scrolledwindow1), clist);
-
- gtk_widget_show(u_data->io->window);
-
-
- hbuttonbox2 = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_start(GTK_BOX(vbox1), hbuttonbox2, FALSE, FALSE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(hbuttonbox2), 10);
- gtk_button_box_set_layout(GTK_BUTTON_BOX (hbuttonbox2), GTK_BUTTONBOX_SPREAD);
- gtk_box_set_spacing(GTK_BOX (hbuttonbox2), 0);
- gtk_widget_show(hbuttonbox2);
-
- bt_close = ws_gtk_button_new_from_stock(GTK_STOCK_CLOSE);
- gtk_container_add (GTK_CONTAINER (hbuttonbox2), bt_close);
- gtk_widget_show (bt_close);
-
- g_signal_connect(bt_close, "clicked", G_CALLBACK(sctp_chunk_stat_on_close), u_data);
-
- cf_retap_packets(&cfile);
-
-}
-
-
-static void
-chunk_window_set_title(struct sctp_udata *u_data)
-{
- char *display_name;
- char *title;
-
- if (!u_data->io->window) {
- return;
- }
- display_name = cf_get_display_name(&cfile);
- title = g_strdup_printf("SCTP Association Chunk Statistics: %s Port1 %u Port2 %u",
- display_name, u_data->assoc->port1, u_data->assoc->port2);
- g_free(display_name);
- gtk_window_set_title(GTK_WINDOW(u_data->io->window), title);
- g_free(title);
-}
-
-static void
-sctp_chunk_dlg(struct sctp_udata *u_data)
-{
- GtkWidget *main_vb, *grid;
- GtkWidget *label, *h_button_box;
- GtkWidget *close_bt;
- gchar label_txt[50];
- int i, row;
-
- sctp_graph_t *io = (sctp_graph_t *)g_malloc(sizeof(sctp_graph_t));
-
- io->window = NULL;
- u_data->io = io;
- u_data->io->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_position (GTK_WINDOW (u_data->io->window), GTK_WIN_POS_CENTER);
- gtk_widget_set_size_request(u_data->io->window, 500, 650);
- g_signal_connect(u_data->io->window, "destroy", G_CALLBACK(chunk_dlg_destroy), u_data);
-
- /* Container for each row of widgets */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 12, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 12);
- gtk_container_add(GTK_CONTAINER(u_data->io->window), main_vb);
-
- /* grid */
- grid = ws_gtk_grid_new();
- ws_gtk_grid_set_column_spacing(GTK_GRID(grid), 6);
- ws_gtk_grid_set_row_spacing(GTK_GRID(grid), 3);
- gtk_box_pack_start(GTK_BOX(main_vb), grid, TRUE, TRUE, 0);
- row = 0;
-
- label = gtk_label_new("ChunkType");
- gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 0, row, 1, 1);
- label = gtk_label_new("Association");
- gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 1, row, 1, 1);
- label = gtk_label_new("Endpoint 1");
- gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 2, row, 1, 1);
- label = gtk_label_new("Endpoint 2");
- gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 3, row, 1, 1);
- row ++;
- label = gtk_label_new("");
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 0, row, 1, 1);
- label = gtk_label_new("");
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 1, row, 1, 1);
- label = gtk_label_new("");
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 2, row, 1, 1);
- label = gtk_label_new("");
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 3, row, 1, 1);
- row ++;
-
- for (i=0; i<NUM_CHUNKS; i++)
- {
- if (IS_SCTP_CHUNK_TYPE(i))
- {
- label = gtk_label_new(chunk_name(i));
- gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 0, row, 1, 1);
- g_snprintf(label_txt, 10, "%u", selected_stream->chunk_count[i]);
- label = gtk_label_new(label_txt);
- gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 1, row, 1, 1);
- g_snprintf(label_txt, 10, "%u", selected_stream->ep1_chunk_count[i]);
- label = gtk_label_new(label_txt);
- gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 2, row, 1, 1);
- g_snprintf(label_txt, 10, "%u", selected_stream->ep2_chunk_count[i]);
- label = gtk_label_new(label_txt);
- gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 3, row, 1, 1);
- row ++;
- }
- }
-
- label = gtk_label_new("Others");
- gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 0, row, 1, 1);
- g_snprintf(label_txt, 10, "%u", selected_stream->chunk_count[OTHER_CHUNKS_INDEX]);
- label = gtk_label_new(label_txt);
- gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 1, row, 1, 1);
- g_snprintf(label_txt, 10, "%u", selected_stream->ep1_chunk_count[OTHER_CHUNKS_INDEX]);
- label = gtk_label_new(label_txt);
- gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 2, row, 1, 1);
- g_snprintf(label_txt, 10, "%u", selected_stream->ep2_chunk_count[OTHER_CHUNKS_INDEX]);
- label = gtk_label_new(label_txt);
- gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 3, row, 1, 1);
-
- h_button_box = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_start(GTK_BOX(main_vb), h_button_box, FALSE, FALSE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(h_button_box), 10);
- gtk_button_box_set_layout(GTK_BUTTON_BOX (h_button_box), GTK_BUTTONBOX_SPREAD);
- gtk_box_set_spacing(GTK_BOX (h_button_box), 0);
- gtk_widget_show(h_button_box);
-
- close_bt = ws_gtk_button_new_from_stock(GTK_STOCK_CLOSE);
- gtk_box_pack_start(GTK_BOX(h_button_box), close_bt, FALSE, FALSE, 0);
- gtk_widget_show(close_bt);
- g_signal_connect(close_bt, "clicked", G_CALLBACK(sctp_chunk_stat_on_close), u_data);
-
- gtk_widget_show_all(u_data->io->window);
- chunk_window_set_title(u_data);
-}
-
-void
-sctp_chunk_dlg_show(struct sctp_analyse* userdata)
-{
- gint i;
- struct sctp_udata *u_data;
-
- u_data = (struct sctp_udata *)g_malloc(sizeof(struct sctp_udata));
- u_data->assoc = userdata->assoc;
- u_data->io = NULL;
- u_data->parent = userdata;
-
- if (selected_stream == NULL)
- selected_stream = (sctp_assoc_info_t *)g_malloc(sizeof(sctp_assoc_info_t));
-
- selected_stream = u_data->assoc;
- for (i=0; i<NUM_CHUNKS; i++)
- {
- if (IS_SCTP_CHUNK_TYPE(i) || (i == OTHER_CHUNKS_INDEX))
- selected_stream->chunk_count[i] = u_data->assoc->chunk_count[i];
- }
- set_child(u_data, u_data->parent);
- increase_childcount(u_data->parent);
- sctp_chunk_dlg(u_data);
-}
-
-void
-sctp_chunk_stat_dlg_show(unsigned int direction, struct sctp_analyse* userdata)
-{
- struct sctp_udata *u_data;
-
- u_data = (struct sctp_udata *)g_malloc(sizeof(struct sctp_udata));
- u_data->assoc = userdata->assoc;
- u_data->io = NULL;
- u_data->parent = userdata;
-
- if (selected_stream == NULL)
- selected_stream = (sctp_assoc_info_t *)g_malloc(sizeof(sctp_assoc_info_t));
- selected_stream = u_data->assoc;
- selected_stream->addr_chunk_count = u_data->assoc->addr_chunk_count;
-
- set_child(u_data, u_data->parent);
- increase_childcount(u_data->parent);
- gtk_sctpstat_dlg(u_data, direction);
- sctp_chunk_stat_dlg_update(u_data,direction);
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/sctp_error_dlg.c b/ui/gtk/sctp_error_dlg.c
deleted file mode 100644
index 1e2df622f4..0000000000
--- a/ui/gtk/sctp_error_dlg.c
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- * Copyright 2004, Irene Ruengeler <i.ruengeler [AT] fh-muenster.de>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <gtk/gtk.h>
-
-
-#include "ui/simple_dialog.h"
-
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/sctp_stat_gtk.h"
-#include "ui/gtk/stock_icons.h"
-
-#include "globals.h"
-
-static GtkWidget *sctp_error_dlg=NULL;
-static GtkWidget *clist = NULL;
-static GList *last_list = NULL;
-static sctp_error_info_t* selected_packet = NULL;/* current selection */
-
-enum
-{
- FRAME_COLUMN,
- INFO_COLUMN,
- TEXT_COLUMN,
- N_COLUMN
-};
-
-
-static void
-dlg_destroy(GtkWidget *w _U_, gpointer user_data _U_)
-{
- sctp_error_dlg=NULL;
-}
-
-static void
-sctp_error_on_select_row(GtkTreeSelection *sel, gpointer user_data _U_)
-{
- GtkTreeModel *model;
- GtkTreeIter iter;
- if (gtk_tree_selection_get_selected (sel, &model, &iter)) {
- gtk_tree_model_get(model, &iter,
- FRAME_COLUMN, &(selected_packet->frame_number),
- TEXT_COLUMN, &(selected_packet->chunk_info),
- INFO_COLUMN, &(selected_packet->info_text),
- -1);
- }
-}
-
-static
-GtkWidget *create_list(void)
-{
- GtkListStore *list_store;
- GtkWidget * list;
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
- GtkTreeView *list_view;
- GtkTreeSelection *selection;
-
- list_store = gtk_list_store_new(N_COLUMN,
- G_TYPE_UINT, /* Frame number*/
- G_TYPE_STRING, /* Chunk type*/
- G_TYPE_STRING );/* Info */
-
- /* Create a view */
- list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
-
- list_view = GTK_TREE_VIEW(list);
-
- /* Speed up the list display */
- gtk_tree_view_set_fixed_height_mode(list_view, TRUE);
-
- gtk_tree_view_set_headers_clickable(list_view, TRUE);
-
- /* The view now holds a reference. We can get rid of our own reference */
- g_object_unref (G_OBJECT (list_store));
-
- /*
- * Create the first column packet, associating the "text" attribute of the
- * cell_renderer to the first column of the model
- */
- /* 1:st column */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Framenumber", renderer,
- "text", FRAME_COLUMN,
- NULL);
-
- gtk_tree_view_column_set_sort_column_id(column, FRAME_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 80);
-
- /* Add the column to the view. */
- gtk_tree_view_append_column (list_view, column);
-
- /* 2:nd column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Chunk Types", renderer,
- "text", TEXT_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, INFO_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 200);
- gtk_tree_view_append_column (list_view, column);
-
- /* 3:d column... */
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Info", renderer,
- "text", INFO_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, TEXT_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 200);
- gtk_tree_view_append_column (list_view, column);
-
-
- /* Now enable the sorting of each column */
- gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(list_view), TRUE);
- gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(list_view), TRUE);
-
- /* Setup the selection handler */
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
- g_signal_connect(selection, "changed", G_CALLBACK(sctp_error_on_select_row), NULL);
- return list;
-}
-
-
-static void add_to_clist(sctp_error_info_t* errinfo)
-{
- GtkListStore *list_store = NULL;
- GtkTreeIter iter;
-
- list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (clist))); /* Get store */
-
- gtk_list_store_insert_with_values( list_store , &iter, G_MAXINT,
- FRAME_COLUMN, errinfo->frame_number,
- TEXT_COLUMN, errinfo->chunk_info,
- INFO_COLUMN, errinfo->info_text,
- -1);
-}
-
-static void
-sctp_error_on_unselect(GtkButton *button _U_, gpointer user_data _U_)
-{
- gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(clist)));
-}
-
-static void sctp_error_dlg_update(GList *list)
-{
- GList *ilist=NULL;
-
- if (sctp_error_dlg != NULL)
- {
- gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(clist))));
- ilist=list;
-
- while (ilist)
- {
- add_to_clist((sctp_error_info_t*)(ilist->data));
- ilist = g_list_next(ilist);
- }
-
- sctp_error_on_unselect(NULL, NULL);
- }
- last_list = ilist;
-}
-
-
-
-static void
-sctp_error_on_frame (GtkButton *button _U_, gpointer user_data _U_)
-{
-
- if (selected_packet==NULL)
- return;
-
- if (selected_packet)
- cf_goto_frame(&cfile, selected_packet->frame_number);
-}
-
-
-static void
-sctp_error_on_close (GtkButton *button _U_, gpointer user_data _U_)
-{
- gtk_grab_remove(sctp_error_dlg);
- gtk_widget_destroy(sctp_error_dlg);
-}
-
-static void
-gtk_sctperror_dlg(void)
-{
- GtkWidget *sctp_error_dlg_w;
- GtkWidget *vbox1;
- GtkWidget *scrolledwindow1;
- GtkWidget *hbuttonbox2;
- GtkWidget *bt_unselect;
- GtkWidget *bt_frame;
- GtkWidget *bt_close;
-
- sctp_error_dlg_w = window_new (GTK_WINDOW_TOPLEVEL, "Wireshark: SCTP Associations");
- gtk_window_set_position (GTK_WINDOW (sctp_error_dlg_w), GTK_WIN_POS_CENTER);
- g_signal_connect(sctp_error_dlg_w, "destroy", G_CALLBACK(dlg_destroy), NULL);
-
- /* Container for each row of widgets */
- vbox1 = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 2, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(vbox1), 8);
- gtk_container_add(GTK_CONTAINER(sctp_error_dlg_w), vbox1);
- gtk_widget_show(vbox1);
-
- scrolledwindow1 = scrolled_window_new (NULL, NULL);
- gtk_widget_show (scrolledwindow1);
- gtk_box_pack_start (GTK_BOX (vbox1), scrolledwindow1, TRUE, TRUE, 0);
-
- clist = create_list();
- gtk_widget_show (clist);
- gtk_container_add (GTK_CONTAINER (scrolledwindow1), clist);
- gtk_widget_set_size_request(clist, 500, 200);
-
- gtk_widget_show(sctp_error_dlg_w);
-
-
- hbuttonbox2 = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_widget_show (hbuttonbox2);
- gtk_box_pack_start (GTK_BOX (vbox1), hbuttonbox2, FALSE, FALSE, 0);
- gtk_box_set_spacing (GTK_BOX (hbuttonbox2), 5);
- gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox2), GTK_BUTTONBOX_SPREAD);
-
-
- bt_unselect = gtk_button_new_with_label ("Unselect");
- gtk_widget_show (bt_unselect);
- gtk_container_add (GTK_CONTAINER (hbuttonbox2), bt_unselect);
-
- bt_frame = gtk_button_new_with_label ("Go to Frame");
- gtk_widget_show (bt_frame);
- gtk_container_add (GTK_CONTAINER (hbuttonbox2), bt_frame);
-
- bt_close = ws_gtk_button_new_from_stock(GTK_STOCK_CLOSE);
- gtk_widget_show (bt_close);
- gtk_container_add (GTK_CONTAINER (hbuttonbox2), bt_close);
-
- g_signal_connect(sctp_error_dlg_w, "destroy", G_CALLBACK(dlg_destroy), NULL);
- g_signal_connect(bt_unselect, "clicked", G_CALLBACK(sctp_error_on_unselect), NULL);
- g_signal_connect(bt_frame, "clicked", G_CALLBACK(sctp_error_on_frame), NULL);
- g_signal_connect(bt_close, "clicked", G_CALLBACK(sctp_error_on_close), NULL);
-
- sctp_error_dlg = sctp_error_dlg_w;
-
-}
-
-
-void sctp_error_dlg_show(sctp_assoc_info_t* assoc)
-{
- GList *list;
-
- list =assoc->error_info_list;
- if (list != NULL)
- {
- if (sctp_error_dlg != NULL) {
- /* There's already a dialog box; reactivate it. */
- reactivate_window(sctp_error_dlg);
- /* Another list since last call? */
- if (list != last_list) {
- sctp_error_dlg_update(list);
- }
- }
- else {
- /* Create and show the dialog box */
- gtk_sctperror_dlg();
- sctp_error_dlg_update(list);
- }
- }
- else
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "No errors found.");
-}
-
-/*
- * Editor modelines - http://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/gtk/sctp_graph_dlg.c b/ui/gtk/sctp_graph_dlg.c
deleted file mode 100644
index 9fde663b14..0000000000
--- a/ui/gtk/sctp_graph_dlg.c
+++ /dev/null
@@ -1,1908 +0,0 @@
-/*
- * Copyright 2004, Irene Ruengeler <i.ruengeler [AT] fh-muenster.de>
- * Copyright 2009, Varun Notibala <nbvarun [AT] gmail.com>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <math.h>
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <wsutil/strtoi.h>
-#include "ui/simple_dialog.h"
-
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/sctp_stat_gtk.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/old-gtk-compat.h"
-
-#include "globals.h"
-
-#define DEFAULT_PIXELS_PER_TICK 2
-#define MAX_PIXELS_PER_TICK 4
-#define AUTO_MAX_YSCALE 0
-#define MAX_TICK_VALUES 5
-#define DEFAULT_TICK_VALUE 3
-#define MAX_YSCALE 22
-#define MAX_COUNT_TYPES 3
-
-#define COUNT_TYPE_FRAMES 0
-#define COUNT_TYPE_BYTES 1
-#define COUNT_TYPE_ADVANCED 2
-
-#define LEFT_BORDER 120
-#define RIGHT_BORDER 10
-#define TOP_BORDER 10
-#define BOTTOM_BORDER 50
-
-#define SUB_32(a, b) ((a)-(b))
-#define POINT_SIZE 1
-
-static GtkWidget * sack_bt;
-
-/*
- * Global variables that help in redrawing graph
- * for SACK and NRSACK
- */
-static guint8 gIsSackChunkPresent = 0;
-static guint8 gIsNRSackChunkPresent = 0;
-
-struct chunk_header {
- guint8 type;
- guint8 flags;
- guint16 length;
-};
-
-struct data_chunk_header {
- guint8 type;
- guint8 flags;
- guint16 length;
- guint32 tsn;
- guint16 sid;
- guint16 ssn;
- guint32 ppi;
-};
-
-struct init_chunk_header {
- guint8 type;
- guint8 flags;
- guint16 length;
- guint32 initiate_tag;
- guint32 a_rwnd;
- guint16 mos;
- guint16 mis;
- guint32 initial_tsn;
-};
-
-struct gaps {
- guint16 start;
- guint16 end;
-};
-
-struct sack_chunk_header {
- guint8 type;
- guint8 flags;
- guint16 length;
- guint32 cum_tsn_ack;
- guint32 a_rwnd;
- guint16 nr_of_gaps;
- guint16 nr_of_dups;
- struct gaps gaps[1];
-};
-
-struct nr_sack_chunk_header {
- guint8 type;
- guint8 flags;
- guint16 length;
- guint32 cum_tsn_ack;
- guint32 a_rwnd;
- guint16 nr_of_gaps;
- guint16 nr_of_nr_gaps;
- guint16 nr_of_dups;
- guint16 reserved;
- struct gaps gaps[1];
-};
-
-static gboolean label_set = FALSE;
-static guint32 max_tsn=0, min_tsn=0;
-static void sctp_graph_set_title(struct sctp_udata *u_data);
-static void create_draw_area(GtkWidget *box, struct sctp_udata *u_data);
-static GtkWidget *zoomout_bt;
-#if defined(_WIN32) && !defined(__MINGW32__) && (_MSC_VER < 1800)
-/* Starting VS2013, rint already defined in math.h. No need to redefine */
-static int rint (double ); /* compiler template for Windows */
-#endif
-
-static void
-draw_sack_graph(struct sctp_udata *u_data)
-{
- tsn_t *sack;
- GList *list=NULL, *tlist;
- guint16 gap_start=0, gap_end=0, i, j, nr, dup_nr;
- guint8 type;
- guint32 tsnumber, dupx;
- gint xvalue, yvalue;
- GdkRGBA red_color = {1.0, 0.0, 0.0, 1.0};
- GdkRGBA green_color = {0.0, 1.0, 0.0, 1.0};
- GdkRGBA cyan_color = {0.0, 1.0, 1.0, 1.0};
-
- struct sack_chunk_header *sack_header;
- struct gaps *gap;
- guint32 /*max_num,*/ diff;
- guint32 *dup_list;
- cairo_t * cr = NULL;
-
- if (u_data->dir==2)
- {
-
- list = g_list_last(u_data->assoc->sack2);
- if (u_data->io->tmp==FALSE)
- {
- min_tsn=u_data->assoc->min_tsn2;
- max_tsn=u_data->assoc->max_tsn2;
- }
- else
- {
- min_tsn=u_data->assoc->min_tsn2+u_data->io->tmp_min_tsn2;
- max_tsn=u_data->assoc->min_tsn2+u_data->io->tmp_max_tsn2;
- }
- }
- else if (u_data->dir==1)
- {
- list = g_list_last(u_data->assoc->sack1);
- if (u_data->io->tmp==FALSE)
- {
- min_tsn=u_data->assoc->min_tsn1;
- max_tsn=u_data->assoc->max_tsn1;
- }
- else
- {
- min_tsn=u_data->assoc->min_tsn1+u_data->io->tmp_min_tsn1;
- max_tsn=u_data->assoc->min_tsn1+u_data->io->tmp_max_tsn1;
- }
- }
-
- if (min_tsn == max_tsn)
- min_tsn = 0;
-
- while (list)
- {
- sack = (tsn_t*) (list->data);
- tlist = g_list_first(sack->tsns);
- while (tlist)
- {
- type = ((struct chunk_header *)tlist->data)->type;
-
- if (type == SCTP_SACK_CHUNK_ID)
- {
- gIsSackChunkPresent = 1;
- sack_header =(struct sack_chunk_header *)tlist->data;
- nr=g_ntohs(sack_header->nr_of_gaps);
- tsnumber = g_ntohl(sack_header->cum_tsn_ack);
- dup_nr=g_ntohs(sack_header->nr_of_dups);
-
- if (sack->secs>=u_data->io->x1_tmp_sec)
- {
- if (nr>0)
- {
- gap = &sack_header->gaps[0];
- for(i=0;i<nr; i++)
- {
- gap_start=g_ntohs(gap->start);
- gap_end = g_ntohs(gap->end);
- /* max_num=gap_end+tsnumber; */
- for (j=gap_start; j<=gap_end; j++)
- {
- if (u_data->io->uoff)
- diff = sack->secs - u_data->io->min_x;
- else
- diff=sack->secs*1000000+sack->usecs-u_data->io->min_x;
- xvalue = (guint32)(LEFT_BORDER+u_data->io->offset+u_data->io->x_interval*diff);
- yvalue = (guint32)(u_data->io->surface_height-BOTTOM_BORDER-POINT_SIZE-u_data->io->offset-((SUB_32(j+tsnumber,min_tsn))*u_data->io->y_interval));
- if (xvalue >= LEFT_BORDER+u_data->io->offset &&
- xvalue <= u_data->io->surface_width-RIGHT_BORDER+u_data->io->offset &&
- yvalue >= TOP_BORDER-u_data->io->offset-POINT_SIZE &&
- yvalue <= u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset) {
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- gdk_cairo_set_source_rgba (cr, &green_color);
- cairo_arc(cr,
- xvalue,
- yvalue,
- POINT_SIZE,
- 0,
- 2 * G_PI);
- cairo_fill(cr);
- cairo_destroy(cr);
- }
- }
- if (i < nr-1)
- gap++;
- }
- }
- /*
- else
- max_num=tsnumber;
- */
- if (tsnumber>=min_tsn)
- {
- if (u_data->io->uoff)
- diff = sack->secs - u_data->io->min_x;
- else
- diff=sack->secs*1000000+sack->usecs-u_data->io->min_x;
- xvalue = (guint32)(LEFT_BORDER+u_data->io->offset+u_data->io->x_interval*diff);
- yvalue = (guint32)(u_data->io->surface_height-BOTTOM_BORDER-POINT_SIZE -u_data->io->offset-((SUB_32(tsnumber,min_tsn))*u_data->io->y_interval));
- if (xvalue >= LEFT_BORDER+u_data->io->offset &&
- xvalue <= u_data->io->surface_width-RIGHT_BORDER+u_data->io->offset &&
- yvalue >= TOP_BORDER-u_data->io->offset-POINT_SIZE &&
- yvalue <= u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset)
- {
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- gdk_cairo_set_source_rgba (cr, &red_color);
- cairo_arc(cr,
- xvalue,
- yvalue,
- POINT_SIZE,
- 0,
- 2 * G_PI);
- cairo_fill(cr);
- cairo_destroy(cr);
-
- }
- }
- if (dup_nr > 0)
- {
- dup_list = &sack_header->a_rwnd + 2 + nr;
- for (i = 0; i < dup_nr; i++)
- {
- dupx = g_ntohl(dup_list[i]);
- if (dupx >= min_tsn)
- {
- if (u_data->io->uoff)
- diff = sack->secs - u_data->io->min_x;
- else
- diff=sack->secs*1000000+sack->usecs-u_data->io->min_x;
- xvalue = (guint32)(LEFT_BORDER+u_data->io->offset+u_data->io->x_interval*diff);
- yvalue = (guint32)(u_data->io->surface_height-BOTTOM_BORDER-POINT_SIZE -u_data->io->offset-((SUB_32(dupx,min_tsn))*u_data->io->y_interval));
- if (xvalue >= LEFT_BORDER+u_data->io->offset &&
- xvalue <= u_data->io->surface_width-RIGHT_BORDER+u_data->io->offset &&
- yvalue >= TOP_BORDER-u_data->io->offset-POINT_SIZE &&
- yvalue <= u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset) {
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- gdk_cairo_set_source_rgba (cr, &cyan_color);
- cairo_arc(cr,
- xvalue,
- yvalue,
- POINT_SIZE,
- 0,
- 2 * G_PI);
- cairo_fill(cr);
- cairo_destroy(cr);
- }
- }
- }
- }
- }
- }
- tlist = g_list_next(tlist);
- }
- list = g_list_previous(list);
- }
-}
-
-/*
- * This function plots the NR_SACK gap ack and
- * nr gap acks.
- * Red dot - Cumulative TSN ack
- * Green dot - Gap ack
- * Blue circle - NR Gap ack
- */
-static void
-draw_nr_sack_graph(struct sctp_udata *u_data)
-{
- tsn_t *sack;
- GList *list=NULL, *tlist;
- guint16 gap_start=0, gap_end=0, i, numberOf_gaps, numberOf_nr_gaps;
- guint8 type;
- guint32 tsnumber, j;
- gint xvalue, yvalue;
- GdkRGBA red_color = {1.0, 0.0, 0.0, 1.0};
- GdkRGBA green_color = {0.0, 1.0, 0.0, 1.0};
- GdkRGBA blue_color = {0.0, 0.0, 1.0, 1.0};
- struct nr_sack_chunk_header *nr_sack_header;
- struct gaps *nr_gap;
- guint32 /*max_num,*/ diff;
- /* This holds the sum of gap acks and nr gap acks */
- guint16 total_gaps = 0;
- cairo_t *cr = NULL;
-
- if (u_data->dir==2)
- {
- list = g_list_last(u_data->assoc->sack2);
- if (u_data->io->tmp==FALSE)
- {
- min_tsn=u_data->assoc->min_tsn2;
- max_tsn=u_data->assoc->max_tsn2;
- }
- else
- {
- min_tsn=u_data->assoc->min_tsn2+u_data->io->tmp_min_tsn2;
- max_tsn=u_data->assoc->min_tsn2+u_data->io->tmp_max_tsn2;
- }
- }
- else if (u_data->dir==1)
- {
- list = g_list_last(u_data->assoc->sack1);
- if (u_data->io->tmp==FALSE)
- {
- min_tsn=u_data->assoc->min_tsn1;
- max_tsn=u_data->assoc->max_tsn1;
- }
- else
- {
- min_tsn=u_data->assoc->min_tsn1+u_data->io->tmp_min_tsn1;
- max_tsn=u_data->assoc->min_tsn1+u_data->io->tmp_max_tsn1;
- }
- }
-
- if (min_tsn == max_tsn)
- min_tsn = 0;
-
- while (list)
- {
- sack = (tsn_t*) (list->data);
- tlist = g_list_first(sack->tsns);
- while (tlist)
- {
- type = ((struct chunk_header *)tlist->data)->type;
- /*
- * The tlist->data is memcpy ied to the appropriate structure
- * They entire raw tvb bytes are copied on to one of the *_chunk_header
- * structures in sctp_stat.c
- */
- if (type == SCTP_NR_SACK_CHUNK_ID)
- {
- gIsNRSackChunkPresent = 1;
- nr_sack_header =(struct nr_sack_chunk_header *)tlist->data;
- numberOf_nr_gaps=g_ntohs(nr_sack_header->nr_of_nr_gaps);
- numberOf_gaps=g_ntohs(nr_sack_header->nr_of_gaps);
- tsnumber = g_ntohl(nr_sack_header->cum_tsn_ack);
- total_gaps = numberOf_gaps + numberOf_nr_gaps;
- if (sack->secs>=u_data->io->x1_tmp_sec)
- {
- /* If the number of nr_gaps is greater than 0 */
- if ( total_gaps > 0 )
- {
- nr_gap = &nr_sack_header->gaps[0];
- for ( i=0; i < total_gaps; i++ )
- {
- gap_start=g_ntohs(nr_gap->start);
- gap_end = g_ntohs(nr_gap->end);
- /* max_num= gap_end + tsnumber; */
- for ( j = gap_start; j <= gap_end; j++)
- {
- if (u_data->io->uoff)
- diff = sack->secs - u_data->io->min_x;
- else
- diff=sack->secs*1000000+sack->usecs-u_data->io->min_x;
- xvalue = (guint32)(LEFT_BORDER+u_data->io->offset+u_data->io->x_interval*diff);
- yvalue = (guint32)(u_data->io->surface_height-BOTTOM_BORDER-POINT_SIZE-u_data->io->offset-((SUB_32(j+tsnumber,min_tsn))*u_data->io->y_interval));
- if (xvalue >= LEFT_BORDER+u_data->io->offset &&
- xvalue <= u_data->io->surface_width-RIGHT_BORDER+u_data->io->offset &&
- yvalue >= TOP_BORDER-u_data->io->offset-POINT_SIZE &&
- yvalue <= u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset)
- {
- /* Check if this is an GAP ACK or NR GAP ACK */
- if ( i >= numberOf_gaps)
- {
- /* This is a nr gap ack */
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- gdk_cairo_set_source_rgba (cr, &blue_color);
- cairo_arc(cr,
- xvalue,
- yvalue,
- POINT_SIZE,
- 0,
- 2 * G_PI);
- cairo_stroke(cr);
- cairo_destroy(cr);
-
-
- /* All NR GAP Acks are also gap acks, so plot these as
- * gap acks - green dot.
- * These will be shown as points with a green dot - GAP ACK
- * surrounded by a blue circle - NR GAP ack
- */
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- gdk_cairo_set_source_rgba (cr, &green_color);
- cairo_arc(cr,
- xvalue,
- yvalue,
- POINT_SIZE,
- 0,
- 2 * G_PI);
- cairo_fill(cr);
- cairo_destroy(cr);
- }
- else
- {
- /* This is just a gap ack */
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- gdk_cairo_set_source_rgba (cr, &green_color);
- cairo_arc(cr,
- xvalue,
- yvalue,
- POINT_SIZE,
- 0,
- 2 * G_PI);
- cairo_fill(cr);
- cairo_destroy(cr);
- }
- }
- }
- if (i < total_gaps-1)
- nr_gap++;
- }
- }
- /*
- else
- max_num=tsnumber;
- */
- if (tsnumber>=min_tsn)
- {
- if (u_data->io->uoff)
- diff = sack->secs - u_data->io->min_x;
- else
- diff=sack->secs*1000000+sack->usecs-u_data->io->min_x;
- xvalue = (guint32)(LEFT_BORDER+u_data->io->offset+u_data->io->x_interval*diff);
- yvalue = (guint32)(u_data->io->surface_height-BOTTOM_BORDER-POINT_SIZE -u_data->io->offset-((SUB_32(tsnumber,min_tsn))*u_data->io->y_interval));
- if (xvalue >= LEFT_BORDER+u_data->io->offset &&
- xvalue <= u_data->io->surface_width-RIGHT_BORDER+u_data->io->offset &&
- yvalue >= TOP_BORDER-u_data->io->offset-POINT_SIZE &&
- yvalue <= u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset) {
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- gdk_cairo_set_source_rgba (cr, &red_color);
- cairo_arc(cr,
- xvalue,
- yvalue,
- POINT_SIZE,
- 0,
- 2 * G_PI);
- cairo_fill(cr);
- cairo_destroy(cr);
- }
- }
- }
- }
- tlist = g_list_next(tlist);
- }
- list = g_list_previous(list);
- }
-}
-
-static void
-draw_tsn_graph(struct sctp_udata *u_data)
-{
- tsn_t *tsn;
- GList *list=NULL, *tlist;
- guint8 type;
- guint32 tsnumber=0;
- guint32 diff;
- gint xvalue, yvalue;
- cairo_t *cr = NULL;
- GdkRGBA black_color = {0.0, 0.0, 0.0, 1.0};
- GdkRGBA pink_color = {1.0, 0.6, 0.8, 1.0};
-
- if (u_data->dir == 1)
- {
- list = g_list_last(u_data->assoc->tsn1);
- if (u_data->io->tmp == FALSE)
- {
- min_tsn = u_data->assoc->min_tsn1;
- max_tsn = u_data->assoc->max_tsn1;
- }
- else
- {
- min_tsn = u_data->assoc->min_tsn1 + u_data->io->tmp_min_tsn1;
- max_tsn = u_data->assoc->min_tsn1 + u_data->io->tmp_max_tsn1;
- }
- }
- else if (u_data->dir == 2)
- {
- list = g_list_last(u_data->assoc->tsn2);
- if (u_data->io->tmp == FALSE)
- {
- min_tsn = u_data->assoc->min_tsn2;
- max_tsn = u_data->assoc->max_tsn2;
- }
- else
- {
- min_tsn = u_data->assoc->min_tsn2 + u_data->io->tmp_min_tsn2;
- max_tsn = u_data->assoc->min_tsn2 + u_data->io->tmp_max_tsn2;
- }
- }
-
- if (min_tsn == max_tsn)
- min_tsn = 0;
-
- while (list)
- {
- tsn = (tsn_t*) (list->data);
- tlist = g_list_first(tsn->tsns);
- while (tlist)
- {
- type = ((struct chunk_header *)tlist->data)->type;
- if (type == SCTP_DATA_CHUNK_ID || type == SCTP_I_DATA_CHUNK_ID || type == SCTP_FORWARD_TSN_CHUNK_ID)
- tsnumber = g_ntohl(((struct data_chunk_header *)tlist->data)->tsn);
- if (tsnumber >= min_tsn && tsnumber <= max_tsn)
- {
- if (u_data->io->uoff) {
- diff = tsn->secs - u_data->io->min_x;
- } else {
- diff = tsn->secs * 1000000 + tsn->usecs - u_data->io->min_x;
- }
- xvalue = (guint32)(LEFT_BORDER + u_data->io->offset + u_data->io->x_interval * diff);
- yvalue = (guint32)(u_data->io->surface_height - BOTTOM_BORDER - POINT_SIZE - u_data->io->offset - ((SUB_32(tsnumber,min_tsn))*u_data->io->y_interval));
- if (xvalue >= LEFT_BORDER+u_data->io->offset &&
- xvalue <= u_data->io->surface_width - RIGHT_BORDER + u_data->io->offset &&
- yvalue >= TOP_BORDER - u_data->io->offset - POINT_SIZE &&
- yvalue <= u_data->io->surface_height - BOTTOM_BORDER - u_data->io->offset) {
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- if ((type == SCTP_DATA_CHUNK_ID) || (type == SCTP_I_DATA_CHUNK_ID))
- gdk_cairo_set_source_rgba (cr, &black_color);
- else
- gdk_cairo_set_source_rgba (cr, &pink_color);
- cairo_arc(cr,
- xvalue,
- yvalue,
- POINT_SIZE,
- 0,
- 2 * G_PI);
- cairo_fill(cr);
- cairo_destroy(cr);
- }
-
- }
- tlist = g_list_next(tlist);
- }
- list = g_list_previous(list);
- }
-}
-
-
-static void
-sctp_graph_draw(struct sctp_udata *u_data)
-{
- int length, lwidth;
- guint32 distance=5, i, e, sec, w, start, a, b, j;
- gint label_width, label_height;
- char label_string[15];
- gfloat dis;
- gboolean write_label = FALSE;
- PangoLayout *layout;
- GtkAllocation widget_alloc;
- cairo_t *cr;
-
- if ((u_data->dir==1 && u_data->assoc->n_array_tsn1==0) || (u_data->dir==2 && u_data->assoc->n_array_tsn2==0)) {
- simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK, "No Data Chunks sent");
- return;
- }
-
- if (u_data->io->x1_tmp_sec==0 && u_data->io->x1_tmp_usec==0)
- u_data->io->offset=0;
- else
- u_data->io->offset=5;
-
- if (u_data->io->x2_tmp_sec - u_data->io->x1_tmp_sec > 1500)
- {
- u_data->io->min_x=u_data->io->x1_tmp_sec;
- u_data->io->max_x=u_data->io->x2_tmp_sec;
- u_data->io->uoff = TRUE;
- }
- else
- {
- u_data->io->min_x=(guint32)(u_data->io->x1_tmp_sec*1000000.0+u_data->io->x1_tmp_usec);
- u_data->io->max_x=(guint32)(u_data->io->x2_tmp_sec*1000000.0+u_data->io->x2_tmp_usec);
- u_data->io->uoff = FALSE;
- }
-
- u_data->io->tmp_width=u_data->io->max_x-u_data->io->min_x;
-
- if (u_data->dir==1)
- {
- if (u_data->io->tmp==FALSE)
- {
- if (u_data->assoc->n_array_tsn1==1)
- u_data->io->max_y = u_data->io->tmp_max_tsn1;
- else if (u_data->assoc->tsn1!=NULL || u_data->assoc->sack1!=NULL)
- u_data->io->max_y=u_data->io->tmp_max_tsn1 - u_data->io->tmp_min_tsn1;
- else
- u_data->io->max_y= 0;
- u_data->io->min_y = 0;
- }
- else
- {
- u_data->io->max_y = u_data->io->tmp_max_tsn1;
- u_data->io->min_y = u_data->io->tmp_min_tsn1;
- }
- }
- else if (u_data->dir==2)
- {
- if (u_data->io->tmp==FALSE)
- {
- if (u_data->assoc->n_array_tsn2==1)
- u_data->io->max_y = u_data->io->tmp_max_tsn2;
- else if (u_data->assoc->tsn2!=NULL || u_data->assoc->sack2!=NULL)
- u_data->io->max_y=u_data->io->tmp_max_tsn2 -u_data->io->tmp_min_tsn2;
- else
- u_data->io->max_y= 0;
- u_data->io->min_y = 0;
- }
- else
- {
- u_data->io->max_y = u_data->io->tmp_max_tsn2;
- u_data->io->min_y = u_data->io->tmp_min_tsn2;
- }
- }
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_set_source_rgb (cr, 1, 1, 1);
- gtk_widget_get_allocation(u_data->io->draw_area, &widget_alloc);
- cairo_rectangle (cr,
- 0,
- 0,
- widget_alloc.width,
- widget_alloc.height);
- cairo_fill (cr);
- cairo_destroy (cr);
-
- /* x_axis */
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr, LEFT_BORDER+u_data->io->offset+0.5, u_data->io->surface_height - BOTTOM_BORDER+0.5);
- cairo_line_to(cr, u_data->io->surface_width - RIGHT_BORDER + u_data->io->offset+0.5, u_data->io->surface_height - BOTTOM_BORDER+0.5);
-
- cairo_move_to(cr, u_data->io->surface_width - RIGHT_BORDER + u_data->io->offset+0.5, u_data->io->surface_height - BOTTOM_BORDER+0.5);
- cairo_line_to(cr, u_data->io->surface_width - RIGHT_BORDER + u_data->io->offset - 5+0.5, u_data->io->surface_height - BOTTOM_BORDER - 5+0.5);
-
- cairo_move_to(cr, u_data->io->surface_width - RIGHT_BORDER + u_data->io->offset + 0.5, u_data->io->surface_height - BOTTOM_BORDER + 0.5);
- cairo_line_to(cr, u_data->io->surface_width - RIGHT_BORDER + u_data->io->offset - 5.5, u_data->io->surface_height - BOTTOM_BORDER + 5.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
-
- u_data->io->axis_width=u_data->io->surface_width-LEFT_BORDER-RIGHT_BORDER-u_data->io->offset;
-
- /* try to avoid dividing by zero */
- if(u_data->io->tmp_width>0){
- u_data->io->x_interval = (float)((u_data->io->axis_width*1.0)/u_data->io->tmp_width); /*distance in pixels between 2 data points*/
- } else {
- u_data->io->x_interval = (float)(u_data->io->axis_width);
- }
-
- e=0; /*number of decimals of x_interval*/
- if (u_data->io->x_interval<1)
- {
- dis=1/u_data->io->x_interval;
- while (dis >1)
- {
- dis/=10;
- e++;
- }
- distance=1;
- for (i=0; i<=e+1; i++)
- distance*=10; /*distance per 100 pixels*/
- }
- else
- distance=5;
-
- g_snprintf(label_string, sizeof(label_string), "%d", 0);
- memcpy(label_string,(gchar *)g_locale_to_utf8(label_string, -1 , NULL, NULL, NULL), sizeof(label_string));
- layout = gtk_widget_create_pango_layout(u_data->io->draw_area, label_string);
- pango_layout_get_pixel_size(layout, &label_width, &label_height);
-
- if (u_data->io->x1_tmp_usec==0)
- sec=u_data->io->x1_tmp_sec;
- else
- sec=u_data->io->x1_tmp_sec+1;
-
-
- if (u_data->io->offset!=0)
- {
- g_snprintf(label_string, sizeof(label_string), "%u", u_data->io->x1_tmp_sec);
-
- memcpy(label_string,(gchar *)g_locale_to_utf8(label_string, -1 , NULL, NULL, NULL), sizeof(label_string));
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_move_to (cr,
- LEFT_BORDER-25,
- u_data->io->surface_height-BOTTOM_BORDER+20);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
-
- }
-
- w=(guint32)(500/(guint32)(distance*u_data->io->x_interval)); /*there will be a label for every w_th tic*/
-
- if (w==0)
- w=1;
-
- if (w==4 || w==3 || w==2)
- {
- w=5;
- a=distance/10; /*distance between two tics*/
- b = (guint32)((u_data->io->min_x/100000))%10; /* start for labels*/
- }
- else
- {
- a=distance/5;
- b=0;
- }
-
-
- if (!u_data->io->uoff)
- {
- if (a>=1000000)
- {
- start=u_data->io->min_x/1000000*1000000;
- if (a==1000000)
- b = 0;
- }
- else
- {
- start=u_data->io->min_x/100000;
- if (start%2!=0)
- start--;
- start*=100000;
- b = (guint32)((start/100000))%10;
- }
- }
- else
- {
- start = u_data->io->min_x;
- if (start%2!=0)
- start--;
- b = 0;
-
- }
-
- for (i=start, j=b; i<=u_data->io->max_x; i+=a, j++)
- {
- if (!u_data->io->uoff)
- if (i>=u_data->io->min_x && i%1000000!=0)
- {
- length=5;
- g_snprintf(label_string, sizeof(label_string), "%d", i%1000000);
- if (j%w==0)
- {
- length=10;
- memcpy(label_string,(gchar *)g_locale_to_utf8(label_string, -1 , NULL, NULL, NULL), sizeof(label_string));
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_move_to (cr,
- LEFT_BORDER+u_data->io->offset+(i-u_data->io->min_x)*u_data->io->x_interval-lwidth/2,
- u_data->io->surface_height-BOTTOM_BORDER+10);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
-
- }
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr,
- LEFT_BORDER + u_data->io->offset + (i - u_data->io->min_x) * u_data->io->x_interval + 0.5,
- u_data->io->surface_height - BOTTOM_BORDER + 0.5);
- cairo_line_to(cr,
- LEFT_BORDER + u_data->io->offset + (i - u_data->io->min_x) * u_data->io->x_interval + 0.5,
- u_data->io->surface_height - BOTTOM_BORDER + length + 0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
- }
-
- if (!u_data->io->uoff)
- {
- if (i%1000000==0 && j%w==0)
- {
- sec=i/1000000;
- write_label = TRUE;
- }
- }
- else
- {
- if (j%w == 0)
- {
- sec = i;
- write_label = TRUE;
- }
- }
- if (write_label)
- {
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr,
- LEFT_BORDER + u_data->io->offset + (i - u_data->io->min_x) * u_data->io->x_interval + 0.5,
- u_data->io->surface_height - BOTTOM_BORDER + 0.5);
- cairo_line_to(cr,
- LEFT_BORDER + u_data->io->offset + (i - u_data->io->min_x) * u_data->io->x_interval + 0.5,
- u_data->io->surface_height - BOTTOM_BORDER + 10 + 0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
-
- g_snprintf(label_string, sizeof(label_string), "%d", sec);
- memcpy(label_string,(gchar *)g_locale_to_utf8(label_string, -1 , NULL, NULL, NULL), sizeof(label_string));
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_move_to (cr,
- LEFT_BORDER+u_data->io->offset+(i-u_data->io->min_x)*u_data->io->x_interval-10,
- u_data->io->surface_height-BOTTOM_BORDER+20);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
-
- write_label = FALSE;
- }
-
- }
-
- g_strlcpy(label_string, "sec", sizeof(label_string));
-
- memcpy(label_string,(gchar *)g_locale_to_utf8(label_string, -1 , NULL, NULL, NULL), sizeof(label_string));
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_move_to (cr,
- u_data->io->surface_width-RIGHT_BORDER-10,
- u_data->io->surface_height-BOTTOM_BORDER+30);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
-
-
- distance=5;
-
- /* y-axis */
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr, LEFT_BORDER + 0.5, TOP_BORDER - u_data->io->offset + 0.5);
- cairo_line_to(cr, LEFT_BORDER + 0.5, u_data->io->surface_height - BOTTOM_BORDER - u_data->io->offset + 0.5);
-
- cairo_move_to(cr, LEFT_BORDER + 0.5, TOP_BORDER - u_data->io->offset + 0.5);
- cairo_line_to(cr, LEFT_BORDER - 5 + 0.5, TOP_BORDER - u_data->io->offset + 5 + 0.5);
-
- cairo_move_to(cr, LEFT_BORDER + 0.5, TOP_BORDER - u_data->io->offset + 0.5);
- cairo_line_to(cr, LEFT_BORDER +5 + 0.5, TOP_BORDER - u_data->io->offset + 5 + 0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
-
- g_assert(u_data->io->max_y > u_data->io->min_y);
- u_data->io->y_interval = (float)(((u_data->io->surface_height-TOP_BORDER-BOTTOM_BORDER)*1.0)/(u_data->io->max_y-u_data->io->min_y));
-
- e=0;
- if (u_data->io->y_interval<1)
- {
- dis=1/u_data->io->y_interval;
- while (dis >1)
- {
- dis/=10;
- e++;
- }
- distance=1;
- for (i=0; i<=e; i++)
- distance=distance*10;
- }
- else if (u_data->io->y_interval<2)
- distance = 10;
-
- if (u_data->io->max_y>0)
- {
- for (i=u_data->io->min_y/distance*distance; i<=u_data->io->max_y; i+=distance/5)
- {
- if (i>=u_data->io->min_y)
- {
- length=5;
-
- g_snprintf(label_string, sizeof(label_string), "%u", i);
- if (i%distance==0 || (distance<=5 && u_data->io->y_interval>10))
- {
- length=10;
-
- memcpy(label_string,(gchar *)g_locale_to_utf8(label_string, -1 , NULL, NULL, NULL), sizeof(label_string));
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_move_to (cr,
- LEFT_BORDER-length-lwidth-5,
- u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset-(i-u_data->io->min_y)*u_data->io->y_interval-POINT_SIZE);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
-
- }
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr,
- LEFT_BORDER - length + 0.5,
- u_data->io->surface_height - BOTTOM_BORDER - u_data->io->offset - (i - u_data->io->min_y) * u_data->io->y_interval + 0.5);
- cairo_line_to(cr,
- LEFT_BORDER + 0.5,
- u_data->io->surface_height - BOTTOM_BORDER - u_data->io->offset - (i - u_data->io->min_y) * u_data->io->y_interval + 0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
-
- }
- }
- }
-
- g_object_unref(G_OBJECT(layout));
-}
-
-/* This function is used to change the title
- * in the graph dialogue to NR_SACK or SACK based on the
- * association
- * If an association has both SAKC and NR_SACK PDU's
- * a warning is popped
- */
-static void
-updateLabels(void)
-{
- if (gIsSackChunkPresent && gIsNRSackChunkPresent)
- {
- simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK, "This data set contains both SACK and NR SACK PDUs.");
- gtk_button_set_label( (GtkButton*) sack_bt, "Show both Sack and NR Sack");
- }
- else if (gIsSackChunkPresent)
- gtk_button_set_label( (GtkButton*) sack_bt, "Show Only Sack");
- else
- /* gIsNRSackChunkPresent will be true here */
- gtk_button_set_label( (GtkButton*) sack_bt, "Show Only NR Sack");
-}
-
-static void
-sctp_graph_redraw(struct sctp_udata *u_data)
-{
- sctp_graph_t *ios;
- GtkAllocation widget_alloc;
- cairo_t *cr;
-
- u_data->io->needs_redraw=TRUE;
-
- sctp_graph_draw(u_data);
- switch (u_data->io->graph_type)
- {
- case 0:
- /* Show both TSN and SACK information
- * Reset the global sack variable
- * for sack and nr sack cases
- */
- gIsSackChunkPresent = 0;
- gIsNRSackChunkPresent = 0;
- draw_sack_graph(u_data);
- draw_nr_sack_graph(u_data);
- draw_tsn_graph(u_data);
- break;
- case 1:
- /* Show only TSN */
- draw_tsn_graph(u_data);
- break;
- case 2:
- /* Show only SACK information
- * Reset the global sack variable
- * for sack and nr sack cases
- */
- gIsSackChunkPresent = 0;
- gIsNRSackChunkPresent = 0;
- draw_sack_graph(u_data);
- draw_nr_sack_graph(u_data);
- break;
- }
-
- /* Updates the sack / nr sack buttons */
- updateLabels();
-
- ios=(sctp_graph_t *)g_object_get_data(G_OBJECT(u_data->io->draw_area), "sctp_graph_t");
- g_assert(ios != NULL);
-
- cr = gdk_cairo_create (gtk_widget_get_window(u_data->io->draw_area));
-
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, ios->surface, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, ios->pixmap, 0, 0);
-#endif
- gtk_widget_get_allocation(u_data->io->draw_area, &widget_alloc);
- cairo_rectangle (cr, 0, 0, widget_alloc.width, widget_alloc.height);
- cairo_fill (cr);
-
- cairo_destroy (cr);
-}
-
-
-static void
-on_sack_bt(GtkWidget *widget _U_, gpointer user_data)
-{
- struct sctp_udata *u_data = (struct sctp_udata *)user_data;
-
- u_data->io->graph_type=2;
- sctp_graph_redraw(u_data);
-}
-
-static void
-on_tsn_bt(GtkWidget *widget _U_, gpointer user_data)
-{
- struct sctp_udata *u_data = (struct sctp_udata *)user_data;
-
- u_data->io->graph_type=1;
- sctp_graph_redraw(u_data);
-}
-
-static void
-on_both_bt(GtkWidget *widget _U_, gpointer user_data)
-{
- struct sctp_udata *u_data = (struct sctp_udata *)user_data;
-
- u_data->io->graph_type=0;
- sctp_graph_redraw(u_data);
-}
-
-static void
-sctp_graph_close_cb(GtkWidget* widget _U_, gpointer user_data)
-{
- struct sctp_udata *u_data = (struct sctp_udata *)user_data;
-
- gtk_grab_remove(GTK_WIDGET(u_data->io->window));
- gtk_widget_destroy(GTK_WIDGET(u_data->io->window));
-
-}
-
-static gboolean
-configure_event(GtkWidget *widget, GdkEventConfigure *event _U_, gpointer user_data)
-{
- struct sctp_udata *u_data = (struct sctp_udata *)user_data;
- GtkAllocation widget_alloc;
- cairo_t *cr;
-
- g_assert(u_data->io != NULL);
-
-#if GTK_CHECK_VERSION(2,22,0)
- if(u_data->io->surface){
- cairo_surface_destroy (u_data->io->surface);
- u_data->io->surface=NULL;
- }
- gtk_widget_get_allocation(widget, &widget_alloc);
- u_data->io->surface = gdk_window_create_similar_surface (gtk_widget_get_window(widget),
- CAIRO_CONTENT_COLOR,
- widget_alloc.width,
- widget_alloc.height);
-#else
- if(u_data->io->pixmap){
- g_object_unref(u_data->io->pixmap);
- u_data->io->pixmap=NULL;
- }
- gtk_widget_get_allocation(widget, &widget_alloc);
- u_data->io->pixmap=gdk_pixmap_new(gtk_widget_get_window(widget),
- widget_alloc.width,
- widget_alloc.height,
- -1);
-#endif
-
- u_data->io->surface_width=widget_alloc.width;
- u_data->io->surface_height=widget_alloc.height;
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_rectangle (cr, 0, 0, widget_alloc.width, widget_alloc.height);
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_fill (cr);
- cairo_destroy (cr);
-
- sctp_graph_redraw(u_data);
- return TRUE;
-}
-
-#if GTK_CHECK_VERSION(3,0,0)
-static gboolean
-draw_event(GtkWidget *widget, cairo_t *cr, gpointer user_data)
-{
- sctp_graph_t *ios = (sctp_graph_t *)user_data;
- GtkAllocation allocation;
-
- gtk_widget_get_allocation (widget, &allocation);
- cairo_set_source_surface (cr, ios->surface, 0, 0);
- cairo_rectangle (cr, 0, 0, allocation.width, allocation.width);
- cairo_fill (cr);
-
- return FALSE;
-}
-#else
-static gboolean
-expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer user_data)
-{
- sctp_graph_t *ios = (sctp_graph_t *)user_data;
- cairo_t *cr;
-
- g_assert(ios != NULL);
-
- cr = gdk_cairo_create (gtk_widget_get_window(widget));
-
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, ios->surface, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, ios->pixmap, 0, 0);
-#endif
- cairo_rectangle (cr, event->area.x, event->area.y, event->area.width, event->area.height);
- cairo_fill (cr);
-
- cairo_destroy (cr);
-
- return FALSE;
-}
-#endif
-
-static void
-on_zoomin_bt (GtkWidget *widget _U_, gpointer user_data)
-{
- struct sctp_udata *u_data = (struct sctp_udata *)user_data;
- sctp_min_max_t *tmp_minmax;
-
- if (u_data->io->rectangle_present==TRUE)
- {
- tmp_minmax = (sctp_min_max_t *)g_malloc(sizeof(sctp_min_max_t));
-
- u_data->io->tmp_min_tsn1=u_data->io->y1_tmp+u_data->io->min_y;
- u_data->io->tmp_max_tsn1=u_data->io->y2_tmp+1+u_data->io->min_y;
- u_data->io->tmp_min_tsn2=u_data->io->tmp_min_tsn1;
- u_data->io->tmp_max_tsn2=u_data->io->tmp_max_tsn1;
- tmp_minmax->tmp_min_secs=u_data->io->x1_tmp_sec;
- tmp_minmax->tmp_min_usecs= u_data->io->x1_tmp_usec;
- tmp_minmax->tmp_max_secs= u_data->io->x2_tmp_sec;
- tmp_minmax->tmp_max_usecs= u_data->io->x2_tmp_usec;
- tmp_minmax->tmp_min_tsn1=u_data->io->tmp_min_tsn1;
- tmp_minmax->tmp_max_tsn1=u_data->io->tmp_max_tsn1;
- tmp_minmax->tmp_min_tsn2=u_data->io->tmp_min_tsn2;
- tmp_minmax->tmp_max_tsn2=u_data->io->tmp_max_tsn2;
- u_data->assoc->min_max = g_slist_prepend(u_data->assoc->min_max, tmp_minmax);
- u_data->io->length = g_slist_length(u_data->assoc->min_max);
- u_data->io->tmp=TRUE;
- u_data->io->rectangle=FALSE;
- u_data->io->rectangle_present=FALSE;
- gtk_widget_set_sensitive(zoomout_bt, TRUE);
- sctp_graph_redraw(u_data);
- }
- else
- {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Please draw a rectangle around the area you want to zoom in.");
- }
-}
-
-static void
-zoomin_bt_fcn (struct sctp_udata *u_data)
-{
- sctp_min_max_t *tmp_minmax;
-
- tmp_minmax = (sctp_min_max_t *)g_malloc(sizeof(sctp_min_max_t));
-
- u_data->io->tmp_min_tsn1=u_data->io->y1_tmp+u_data->io->min_y;
- u_data->io->tmp_max_tsn1=u_data->io->y2_tmp+1+u_data->io->min_y;
- u_data->io->tmp_min_tsn2=u_data->io->tmp_min_tsn1;
- u_data->io->tmp_max_tsn2=u_data->io->tmp_max_tsn1;
- tmp_minmax->tmp_min_secs=u_data->io->x1_tmp_sec;
- tmp_minmax->tmp_min_usecs= u_data->io->x1_tmp_usec;
- tmp_minmax->tmp_max_secs= u_data->io->x2_tmp_sec;
- tmp_minmax->tmp_max_usecs= u_data->io->x2_tmp_usec;
- tmp_minmax->tmp_min_tsn1=u_data->io->tmp_min_tsn1;
- tmp_minmax->tmp_max_tsn1=u_data->io->tmp_max_tsn1;
- tmp_minmax->tmp_min_tsn2=u_data->io->tmp_min_tsn2;
- tmp_minmax->tmp_max_tsn2=u_data->io->tmp_max_tsn2;
- u_data->assoc->min_max = g_slist_prepend(u_data->assoc->min_max, tmp_minmax);
- u_data->io->length = g_slist_length(u_data->assoc->min_max);
- u_data->io->tmp=TRUE;
- u_data->io->rectangle=FALSE;
- u_data->io->rectangle_present=FALSE;
- gtk_widget_set_sensitive(zoomout_bt, TRUE);
- sctp_graph_redraw(u_data);
-
-}
-
-
-
-static void
-on_zoomout_bt (GtkWidget *widget _U_, gpointer user_data)
-{
- struct sctp_udata *u_data = (struct sctp_udata *)user_data;
- sctp_min_max_t *tmp_minmax, *mm;
- gint l;
-
- l = g_slist_length(u_data->assoc->min_max);
-
- if (u_data->assoc->min_max!=NULL)
- {
- mm=(sctp_min_max_t *)((u_data->assoc->min_max)->data);
- u_data->assoc->min_max=g_slist_remove(u_data->assoc->min_max, mm);
- g_free(mm);
- if (l>2)
- {
- tmp_minmax = (sctp_min_max_t *)u_data->assoc->min_max->data;
- u_data->io->x1_tmp_sec=tmp_minmax->tmp_min_secs;
- u_data->io->x1_tmp_usec=tmp_minmax->tmp_min_usecs;
- u_data->io->x2_tmp_sec=tmp_minmax->tmp_max_secs;
- u_data->io->x2_tmp_usec=tmp_minmax->tmp_max_usecs;
- u_data->io->tmp_min_tsn1=tmp_minmax->tmp_min_tsn1;
- u_data->io->tmp_max_tsn1=tmp_minmax->tmp_max_tsn1;
- u_data->io->tmp_min_tsn2=tmp_minmax->tmp_min_tsn2;
- u_data->io->tmp_max_tsn2=tmp_minmax->tmp_max_tsn2;
- u_data->io->tmp=TRUE;
- }
- else
- {
- u_data->io->x1_tmp_sec=u_data->assoc->min_secs;
- u_data->io->x1_tmp_usec=u_data->assoc->min_usecs;
- u_data->io->x2_tmp_sec=u_data->assoc->max_secs;
- u_data->io->x2_tmp_usec=u_data->assoc->max_usecs;
- u_data->io->tmp_min_tsn1=u_data->assoc->min_tsn1;
- u_data->io->tmp_max_tsn1=u_data->assoc->max_tsn1;
- u_data->io->tmp_min_tsn2=u_data->assoc->min_tsn2;
- u_data->io->tmp_max_tsn2=u_data->assoc->max_tsn2;
- u_data->io->tmp=FALSE;
- }
- }
- else
- {
- u_data->io->x1_tmp_sec=u_data->assoc->min_secs;
- u_data->io->x1_tmp_usec=u_data->assoc->min_usecs;
- u_data->io->x2_tmp_sec=u_data->assoc->max_secs;
- u_data->io->x2_tmp_usec=u_data->assoc->max_usecs;
- u_data->io->tmp_min_tsn1=u_data->assoc->min_tsn1;
- u_data->io->tmp_max_tsn1=u_data->assoc->max_tsn1;
- u_data->io->tmp_min_tsn2=u_data->assoc->min_tsn2;
- u_data->io->tmp_max_tsn2=u_data->assoc->max_tsn2;
- u_data->io->tmp=FALSE;
- }
- if (g_slist_length(u_data->assoc->min_max)==1)
- gtk_widget_set_sensitive(zoomout_bt, FALSE);
- sctp_graph_redraw(u_data);
-}
-
-static gboolean
-on_button_press_event (GtkWidget *widget _U_, GdkEventButton *event, gpointer user_data)
-{
- struct sctp_udata *u_data = (struct sctp_udata *)user_data;
- sctp_graph_t *ios;
- cairo_t *cr;
-
- if (u_data->io->rectangle==TRUE)
- {
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_rectangle (cr,
- floor(MIN(u_data->io->x_old,u_data->io->x_new)),
- floor(MIN(u_data->io->y_old,u_data->io->y_new)),
- floor(abs((int)(u_data->io->x_new-u_data->io->x_old))),
- floor(abs((int)(u_data->io->y_new-u_data->io->y_old))));
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_stroke (cr);
- cairo_destroy (cr);
-
- ios=(sctp_graph_t *)g_object_get_data(G_OBJECT(u_data->io->draw_area), "sctp_graph_t");
-
- g_assert(ios != NULL);
-
- cr = gdk_cairo_create (gtk_widget_get_window(u_data->io->draw_area));
-
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, ios->surface, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, ios->pixmap, 0, 0);
-#endif
- cairo_rectangle (cr, 0, 0, abs((int)(u_data->io->x_new-u_data->io->x_old)), abs((int)(u_data->io->y_new-u_data->io->y_old)));
- cairo_fill (cr);
-
- cairo_destroy (cr);
-
- sctp_graph_redraw(u_data);
- }
- u_data->io->x_old=event->x;
- u_data->io->y_old=event->y;
- if (u_data->io->y_old>u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset-POINT_SIZE)
- u_data->io->y_old=u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset-POINT_SIZE;
- if (u_data->io->x_old<LEFT_BORDER+u_data->io->offset)
- u_data->io->x_old=LEFT_BORDER+u_data->io->offset;
- u_data->io->rectangle=FALSE;
-
- return TRUE;
-}
-
-
-static gboolean
-on_button_release_event (GtkWidget *widget _U_, GdkEventButton *event, gpointer user_data)
-{
- struct sctp_udata *u_data = (struct sctp_udata *)user_data;
- sctp_graph_t *ios;
- guint32 helpx, helpy, x1_tmp, x2_tmp, y_value, t_size=0, s_size=0, i, y_tolerance;
- gint label_width, label_height;
- gdouble x_value, position, s_diff=0, t_diff=0, x_tolerance=0.0001;
- gint lwidth;
- char label_string[30];
- GPtrArray *tsnlist = NULL, *sacklist=NULL;
- struct tsn_sort *tsn, *sack=NULL;
- gboolean sack_found = FALSE;
- GtkAllocation widget_alloc;
- PangoLayout *layout;
- cairo_t *cr;
-
- g_snprintf(label_string, sizeof(label_string), "%d", 0);
- memcpy(label_string,(gchar *)g_locale_to_utf8(label_string, -1 , NULL, NULL, NULL), sizeof(label_string));
- layout = gtk_widget_create_pango_layout(u_data->io->draw_area, label_string);
- pango_layout_get_pixel_size(layout, &label_width, &label_height);
-
- if (event->y>u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset)
- event->y = u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset;
- if (event->x < LEFT_BORDER+u_data->io->offset)
- event->x = LEFT_BORDER+u_data->io->offset;
- if (abs((int)(event->x-u_data->io->x_old))>10 || abs((int)(event->y-u_data->io->y_old))>10)
- {
- u_data->io->rect_x_min = (gint)floor(MIN(u_data->io->x_old,event->x));
- u_data->io->rect_x_max = (gint)ceil(MAX(u_data->io->x_old,event->x));
- u_data->io->rect_y_min = (gint)floor(MIN(u_data->io->y_old,event->y));
- u_data->io->rect_y_max = (gint)ceil(MAX(u_data->io->y_old,event->y))+POINT_SIZE;
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_rectangle (cr,
- u_data->io->rect_x_min+0.5,
- u_data->io->rect_y_min+0.5,
- u_data->io->rect_x_max - u_data->io->rect_x_min,
- u_data->io->rect_y_max - u_data->io->rect_y_min);
- cairo_set_line_width (cr, 1.0);
- cairo_stroke (cr);
- cairo_destroy (cr);
-
- ios=(sctp_graph_t *)g_object_get_data(G_OBJECT(u_data->io->draw_area), "sctp_graph_t");
-
- g_assert(ios != NULL);
-
- cr = gdk_cairo_create (gtk_widget_get_window(u_data->io->draw_area));
-
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, ios->surface, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, ios->pixmap, 0, 0);
-#endif
- gtk_widget_get_allocation(u_data->io->draw_area, &widget_alloc);
- cairo_rectangle (cr, 0, 0, widget_alloc.width, widget_alloc.height);
- cairo_fill (cr);
-
- cairo_destroy (cr);
-
- x1_tmp=(unsigned int)floor(u_data->io->min_x+((u_data->io->x_old-LEFT_BORDER-u_data->io->offset)*u_data->io->tmp_width/u_data->io->axis_width));
- x2_tmp=(unsigned int)floor(u_data->io->min_x+((event->x-LEFT_BORDER-u_data->io->offset)*u_data->io->tmp_width/u_data->io->axis_width));
- helpx=MIN(x1_tmp, x2_tmp);
- if (helpx==x2_tmp)
- {
- x2_tmp=x1_tmp;
- x1_tmp=helpx;
- }
- if (u_data->io->uoff)
- {
- if (x2_tmp - x1_tmp <= 1500)
- u_data->io->uoff = FALSE;
- u_data->io->x1_tmp_sec=(guint32)x1_tmp;
- u_data->io->x1_tmp_usec=0;
- u_data->io->x2_tmp_sec=(guint32)x2_tmp;
- u_data->io->x2_tmp_usec=0;
- }
- else
- {
- u_data->io->x1_tmp_sec=(guint32)x1_tmp/1000000;
- u_data->io->x1_tmp_usec=x1_tmp%1000000;
- u_data->io->x2_tmp_sec=(guint32)x2_tmp/1000000;
- u_data->io->x2_tmp_usec=x2_tmp%1000000;
- }
- u_data->io->x1_akt_sec = u_data->io->x1_tmp_sec;
- u_data->io->x1_akt_usec = u_data->io->x1_tmp_usec;
- u_data->io->x2_akt_sec = u_data->io->x2_tmp_sec;
- u_data->io->x2_akt_usec = u_data->io->x2_tmp_usec;
-
- u_data->io->y1_tmp=(guint32)((u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset-u_data->io->y_old)/u_data->io->y_interval);
- u_data->io->y2_tmp=(guint32)((u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset-event->y)/u_data->io->y_interval);
- helpy = MIN(u_data->io->y1_tmp, u_data->io->y2_tmp);
- u_data->io->y2_tmp = MAX(u_data->io->y1_tmp, u_data->io->y2_tmp);
- u_data->io->y1_tmp = helpy;
- u_data->io->x_new=event->x;
- u_data->io->y_new=event->y;
- u_data->io->rectangle=TRUE;
- u_data->io->rectangle_present=TRUE;
- }
- else
- {
- if (u_data->io->rectangle_present==TRUE)
- {
- u_data->io->rectangle_present=FALSE;
- if (event->x >= u_data->io->rect_x_min && event->x <= u_data->io->rect_x_max &&
- event->y >= u_data->io->rect_y_min && event->y <= u_data->io->rect_y_max)
- zoomin_bt_fcn(u_data);
- else
- {
- u_data->io->x1_tmp_sec = u_data->io->x1_akt_sec;
- u_data->io->x1_tmp_usec = u_data->io->x1_akt_usec;
- u_data->io->x2_tmp_sec = u_data->io->x2_akt_sec;
- u_data->io->x2_tmp_usec = u_data->io->x2_akt_usec;
- sctp_graph_redraw(u_data);
- }
- }
- else if (label_set)
- {
- label_set = FALSE;
- sctp_graph_redraw(u_data);
- }
- else
- {
- x_value = ((event->x-LEFT_BORDER-u_data->io->offset) * ((u_data->io->x2_tmp_sec+u_data->io->x2_tmp_usec/1000000.0)-(u_data->io->x1_tmp_sec+u_data->io->x1_tmp_usec/1000000.0)) / (u_data->io->surface_width-LEFT_BORDER-RIGHT_BORDER-u_data->io->offset))+u_data->io->x1_tmp_sec+u_data->io->x1_tmp_usec/1000000.0;
- y_value = (gint)rint((u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset-event->y) * (max_tsn - min_tsn) / (u_data->io->surface_height-BOTTOM_BORDER-u_data->io->offset)) + min_tsn;
-
- if (u_data->dir == 1)
- {
- tsnlist = u_data->assoc->sort_tsn1;
- t_size = u_data->assoc->n_data_chunks_ep1;
- sacklist = u_data->assoc->sort_sack1;
- s_size = u_data->assoc->n_sack_chunks_ep1;
- }
- else
- {
- tsnlist = u_data->assoc->sort_tsn2;
- t_size = u_data->assoc->n_data_chunks_ep2;
- sacklist = u_data->assoc->sort_sack2;
- s_size = u_data->assoc->n_sack_chunks_ep2;
- }
- x_tolerance = (gdouble)(u_data->io->tmp_width / u_data->io->axis_width*1.0)*5/1000000.0;
- y_tolerance = (guint32)(((u_data->io->max_y - u_data->io->min_y) / (u_data->io->surface_height-TOP_BORDER-BOTTOM_BORDER-u_data->io->offset)) * 2.0);
- if (y_tolerance==0)
- y_tolerance = 2;
- else if (y_tolerance > 5)
- y_tolerance = 5;
-
- for (i=0; i<s_size; i++)
- {
- sack = (struct tsn_sort*)(g_ptr_array_index(sacklist, i));
- if ((guint32)(sack->tsnumber - y_value)<y_tolerance)
- {
- s_diff = fabs((sack->secs+sack->usecs/1000000.0)- x_value);
- if (s_diff < x_tolerance)
- sack_found = TRUE;
- break;
- }
- }
-
- for (i=0; i<t_size; i++)
- {
- tsn = (struct tsn_sort*)(g_ptr_array_index(tsnlist, i));
- if ((guint32)(tsn->tsnumber - y_value)<y_tolerance)
- {
- t_diff = fabs((tsn->secs+tsn->usecs/1000000.0)- x_value);
- if (sack_found && s_diff < t_diff)
- {
- cf_goto_frame(&cfile, sack->framenumber);
- x_value = sack->secs+sack->usecs/1000000.0;
- y_value = sack->tsnumber;
- }
- else if (t_diff < x_tolerance)
- {
- cf_goto_frame(&cfile, tsn->framenumber);
- x_value = tsn->secs+tsn->usecs/1000000.0;
- y_value = tsn->tsnumber;
- }
- break;
- }
- }
-
- g_snprintf(label_string, sizeof(label_string), "(%.6lf, %u)", x_value, y_value);
-
- label_set = TRUE;
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr,
- (event->x-2)+0.5,
- (event->y)+0.5);
- cairo_line_to(cr,
- (event->x+2)+0.5,
- (event->y)+0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_set_line_width (cr, 1.0);
- cairo_move_to(cr,
- (event->x)+0.5,
- (event->y-2)+0.5);
- cairo_line_to(cr,
- (event->x)+0.5,
- (event->y+2)+0.5);
- cairo_stroke(cr);
- cairo_destroy(cr);
-
- if (event->x+150>=u_data->io->surface_width)
- position = event->x - 150;
- else
- position = event->x + 5;
-
-
- memcpy(label_string,(gchar *)g_locale_to_utf8(label_string, -1 , NULL, NULL, NULL), sizeof(label_string));
- pango_layout_set_text(layout, label_string, -1);
- pango_layout_get_pixel_size(layout, &lwidth, NULL);
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create (u_data->io->surface);
-#else
- cr = gdk_cairo_create (u_data->io->pixmap);
-#endif
- cairo_move_to (cr,
- position,
- event->y-10);
- pango_cairo_show_layout (cr, layout);
- cairo_destroy (cr);
- cr = NULL;
-
- ios=(sctp_graph_t *)g_object_get_data(G_OBJECT(u_data->io->draw_area), "sctp_graph_t");
- g_assert(ios != NULL);
-
- cr = gdk_cairo_create (gtk_widget_get_window(u_data->io->draw_area));
-
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface (cr, ios->surface, 0, 0);
-#else
- ws_gdk_cairo_set_source_pixmap (cr, ios->pixmap, 0, 0);
-#endif
- gtk_widget_get_allocation(u_data->io->draw_area, &widget_alloc);
- cairo_rectangle (cr, 0, 0, widget_alloc.width, widget_alloc.height);
- cairo_fill (cr);
-
- cairo_destroy (cr);
- }
- }
-
- g_object_unref(G_OBJECT(layout));
-
- return TRUE;
-}
-
-
-static void
-init_sctp_graph_window(struct sctp_udata *u_data)
-{
- GtkWidget *vbox;
- GtkWidget *hbox;
- GtkWidget *bt_close, *tsn_bt, *both_bt, *zoomin_bt;
-
- /* create the main window */
- u_data->io->window= dlg_window_new("WSCTP Graphics"); /* transient_for top_level */
- gtk_window_set_destroy_with_parent (GTK_WINDOW(u_data->io->window), TRUE);
-
- vbox=ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(u_data->io->window), vbox);
- gtk_widget_show(vbox);
-
- create_draw_area(vbox, u_data);
-
- sctp_graph_set_title(u_data);
-
- hbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(hbox), 10);
- gtk_button_box_set_layout(GTK_BUTTON_BOX (hbox), GTK_BUTTONBOX_SPREAD);
- gtk_box_set_spacing(GTK_BOX (hbox), 0);
- gtk_widget_show(hbox);
- sack_bt = gtk_button_new_with_label ("Show Only Sacks");
- gtk_box_pack_start(GTK_BOX(hbox), sack_bt, FALSE, FALSE, 0);
- gtk_widget_show(sack_bt);
- g_signal_connect(sack_bt, "clicked", G_CALLBACK(on_sack_bt), u_data);
-
- tsn_bt = gtk_button_new_with_label ("Show Only TSNs");
- gtk_box_pack_start(GTK_BOX(hbox), tsn_bt, FALSE, FALSE, 0);
- gtk_widget_show(tsn_bt);
- g_signal_connect(tsn_bt, "clicked", G_CALLBACK(on_tsn_bt), u_data);
-
- both_bt = gtk_button_new_with_label ("Show both");
- gtk_box_pack_start(GTK_BOX(hbox), both_bt, FALSE, FALSE, 0);
- gtk_widget_show(both_bt);
- g_signal_connect(both_bt, "clicked", G_CALLBACK(on_both_bt), u_data);
-
- zoomin_bt = gtk_button_new_with_label ("Zoom in");
- gtk_box_pack_start(GTK_BOX(hbox), zoomin_bt, FALSE, FALSE, 0);
- gtk_widget_show(zoomin_bt);
- g_signal_connect(zoomin_bt, "clicked", G_CALLBACK(on_zoomin_bt), u_data);
- gtk_widget_set_tooltip_text(zoomin_bt, "Zoom in the area you have selected");
-
- zoomout_bt = gtk_button_new_with_label ("Zoom out");
- gtk_box_pack_start(GTK_BOX(hbox), zoomout_bt, FALSE, FALSE, 0);
- gtk_widget_show(zoomout_bt);
- g_signal_connect(zoomout_bt, "clicked", G_CALLBACK(on_zoomout_bt), u_data);
- gtk_widget_set_tooltip_text(zoomout_bt, "Zoom out one step");
- gtk_widget_set_sensitive(zoomout_bt, FALSE);
-
- bt_close = ws_gtk_button_new_from_stock(GTK_STOCK_CLOSE);
- gtk_box_pack_start(GTK_BOX(hbox), bt_close, FALSE, FALSE, 0);
- gtk_widget_show(bt_close);
- g_signal_connect(bt_close, "clicked", G_CALLBACK(sctp_graph_close_cb), u_data);
-
- g_signal_connect(u_data->io->draw_area,"button_press_event",G_CALLBACK(on_button_press_event), u_data);
- g_signal_connect(u_data->io->draw_area,"button_release_event",G_CALLBACK(on_button_release_event), u_data);
- gtk_widget_set_events(u_data->io->draw_area, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_EXPOSURE_MASK);
-
- gtk_widget_show(u_data->io->window);
-}
-
-static void
-sctp_graph_set_title(struct sctp_udata *u_data)
-{
- char *display_name;
- char *title;
-
- if(!u_data->io->window)
- {
- return;
- }
- display_name = cf_get_display_name(&cfile);
- title = g_strdup_printf("SCTP TSNs and Sacks over Time: %s Port1 %u Port2 %u Endpoint %u",
- display_name, u_data->parent->assoc->port1, u_data->parent->assoc->port2, u_data->dir);
- g_free(display_name);
- gtk_window_set_title(GTK_WINDOW(u_data->io->window), title);
- g_free(title);
-}
-
-static void
-gtk_sctpgraph_init(struct sctp_udata *u_data)
-{
- sctp_graph_t *io;
- sctp_min_max_t* tmp_minmax;
-
- io=(sctp_graph_t *)g_malloc(sizeof(sctp_graph_t));
- io->needs_redraw=TRUE;
- io->x_interval=1000;
- io->window=NULL;
- io->draw_area=NULL;
-#if GTK_CHECK_VERSION(2,22,0)
- io->surface=NULL;
-#else
- io->pixmap=NULL;
-#endif
- io->surface_width=800;
- io->surface_height=600;
- io->graph_type=0;
- u_data->io=io;
- u_data->io->x1_tmp_sec=u_data->assoc->min_secs;
- u_data->io->x1_tmp_usec=u_data->assoc->min_usecs;
- u_data->io->x2_tmp_sec=u_data->assoc->max_secs;
- u_data->io->x2_tmp_usec=u_data->assoc->max_usecs;
- u_data->io->tmp_min_tsn1=u_data->assoc->min_tsn1;
- u_data->io->tmp_max_tsn1=u_data->assoc->max_tsn1;
- u_data->io->tmp_min_tsn2=u_data->assoc->min_tsn2;
- u_data->io->tmp_max_tsn2=u_data->assoc->max_tsn2;
- u_data->io->tmp=FALSE;
-
- tmp_minmax = (sctp_min_max_t *)g_malloc(sizeof(sctp_min_max_t));
- tmp_minmax->tmp_min_secs = u_data->assoc->min_secs;
- tmp_minmax->tmp_min_usecs=u_data->assoc->min_usecs;
- tmp_minmax->tmp_max_secs=u_data->assoc->max_secs;
- tmp_minmax->tmp_max_usecs=u_data->assoc->max_usecs;
- tmp_minmax->tmp_min_tsn2=u_data->assoc->min_tsn2;
- tmp_minmax->tmp_min_tsn1=u_data->assoc->min_tsn1;
- tmp_minmax->tmp_max_tsn1=u_data->assoc->max_tsn1;
- tmp_minmax->tmp_max_tsn2=u_data->assoc->max_tsn2;
- u_data->assoc->min_max = g_slist_prepend(u_data->assoc->min_max, tmp_minmax);
-
- /* build the GUI */
- init_sctp_graph_window(u_data);
- sctp_graph_redraw(u_data);
-
-}
-
-
-static void
-quit(GObject *object _U_, gpointer user_data)
-{
- struct sctp_udata *u_data=(struct sctp_udata *)user_data;
-
- decrease_childcount(u_data->parent);
- remove_child(u_data, u_data->parent);
-
- g_free(u_data->io);
-
- u_data->assoc->min_max = NULL;
- g_free(u_data);
-}
-
-
-static void
-create_draw_area(GtkWidget *box, struct sctp_udata *u_data)
-{
-
- u_data->io->draw_area=gtk_drawing_area_new();
- g_object_set_data(G_OBJECT(u_data->io->draw_area), "sctp_graph_t", u_data->io);
- g_signal_connect(u_data->io->draw_area, "destroy", G_CALLBACK(quit), u_data);
-
- gtk_widget_set_size_request(u_data->io->draw_area, u_data->io->surface_width, u_data->io->surface_height);
-
- /* signals needed to handle backing pixmap */
-#if GTK_CHECK_VERSION(3,0,0)
- g_signal_connect(u_data->io->draw_area, "draw", G_CALLBACK(draw_event), u_data->io);
-#else
- g_signal_connect(u_data->io->draw_area, "expose_event", G_CALLBACK(expose_event), u_data->io);
-#endif
- g_signal_connect(u_data->io->draw_area, "configure_event", G_CALLBACK(configure_event), u_data);
-
- gtk_widget_show(u_data->io->draw_area);
- gtk_box_pack_start(GTK_BOX(box), u_data->io->draw_area, TRUE, TRUE, 0);
-}
-
-
-
-void
-create_graph(guint16 dir, struct sctp_analyse* userdata)
-{
- struct sctp_udata *u_data;
-
- u_data=(struct sctp_udata *)g_malloc(sizeof(struct sctp_udata));
- u_data->assoc=userdata->assoc;
- u_data->io=NULL;
- u_data->dir = dir;
- u_data->parent = userdata;
- if ((u_data->dir==1 && u_data->assoc->n_array_tsn1==0)|| (u_data->dir==2 && u_data->assoc->n_array_tsn2==0))
- simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK, "No Data Chunks sent");
- else
- {
- set_child(u_data, u_data->parent);
- increase_childcount(u_data->parent);
- gtk_sctpgraph_init(u_data);
- }
-}
-
-#if defined(_WIN32) && !defined(__MINGW32__) && (_MSC_VER < 1800)
-/* Starting VS2013, rint already defined in math.h. No need to redefine */
-/* replacement of Unix rint() for Windows */
-static int
-rint (double x)
-{
- char *buf;
- int i = 0;
- int dec,sig;
-
- buf = _fcvt(x, 0, &dec, &sig);
- ws_strtoi32(buf, NULL, &i);
- if(sig == 1) {
- i = i * -1;
- }
- return(i);
-}
-#endif
-
-/*
- * Editor modelines - http://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/gtk/sctp_stat_dlg.c b/ui/gtk/sctp_stat_dlg.c
deleted file mode 100644
index 04ade4faa1..0000000000
--- a/ui/gtk/sctp_stat_dlg.c
+++ /dev/null
@@ -1,713 +0,0 @@
-/*
- * Copyright 2004, Irene Ruengeler <i.ruengeler [AT] fh-muenster.de>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include "epan/to_str.h"
-
-#include <epan/stat_groups.h>
-
-#include "ui/gtk/gui_stat_menu.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/sctp_stat_gtk.h"
-#include "ui/gtk/gtkglobals.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-#include "ui/gtk/stock_icons.h"
-
-#include "globals.h"
-
-static GtkWidget *sctp_stat_dlg = NULL;
-static GtkWidget *clist = NULL;
-static GList *last_list = NULL;
-static gchar *filter_string = NULL;
-static sctp_assoc_info_t *selected_stream = NULL; /* current selection */
-static sctp_allassocs_info_t *sctp_assocs = NULL;
-static guint16 n_children = 0;
-static GtkWidget *bt_afilter = NULL, *bt_unselect = NULL, *bt_analyse = NULL, *bt_filter = NULL;
-static gboolean prevent_update = FALSE, filter_applied = FALSE;
-
-enum
-{
- PORT1_COLUMN,
- PORT2_COLUMN,
- PACKETS_COLUMN,
- CHECKSUM_TYPE_COLUMN,
- CHECKSUM_ERRORS_COLUMN,
- DATA_CHUNKS_COLUMN,
- DATA_BYTES_COLUMN,
- VTAG1_COLUMN,
- VTAG2_COLUMN,
- N_COLUMN
-};
-
-
-static void
-sctp_stat_on_select_row(GtkTreeSelection *sel, gpointer user_data _U_)
-{
- GtkTreeModel *model;
- GtkTreeIter iter;
- GList *list;
- sctp_assoc_info_t *assoc;
- gboolean stream_found = FALSE;
- guint32 port2, port1;
- guint32 checksum, data_chunks, data_bytes, packets, vtag1, vtag2;
-
- if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
- gtk_tree_model_get(model, &iter,
- PORT1_COLUMN, &port1,
- PORT2_COLUMN, &port2,
- PACKETS_COLUMN, &packets,
- CHECKSUM_ERRORS_COLUMN, &checksum,
- DATA_CHUNKS_COLUMN, &data_chunks,
- DATA_BYTES_COLUMN, &data_bytes,
- VTAG1_COLUMN, &vtag1,
- VTAG2_COLUMN, &vtag2,
- -1);
- } else {
- /* Nothing selected */
- return;
- }
-
- list = g_list_first(sctp_assocs->assoc_info_list);
-
- while (list)
- {
- assoc = (sctp_assoc_info_t*)(list->data);
- if ((assoc->port1 == port1) && (assoc->port2 == port2)
- && (assoc->n_packets == packets)
- && (assoc->n_data_chunks == data_chunks)
- && (assoc->n_data_bytes == data_bytes)
- && (assoc->verification_tag1 == vtag1) && (assoc->verification_tag2 == vtag2))
- {
- selected_stream = assoc;
- stream_found = TRUE;
- break;
- }
- list = g_list_next(list);
- }
-
- if (!stream_found)
- selected_stream = NULL;
-
- gtk_widget_set_sensitive(bt_unselect,TRUE);
- gtk_widget_set_sensitive(bt_analyse,TRUE);
- gtk_widget_set_sensitive(bt_filter,TRUE);
-}
-
-static
-GtkWidget *create_list(void)
-{
- GtkListStore *list_store;
- GtkWidget * list;
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
- GtkTreeView *list_view;
- GtkTreeSelection *selection;
-
- list_store = gtk_list_store_new(N_COLUMN,
- G_TYPE_UINT, /* Port1*/
- G_TYPE_UINT, /* Port2*/
- G_TYPE_UINT, /* number of packets */
- G_TYPE_STRING, /* checksum type */
- G_TYPE_UINT, /* number of checksum errors */
- G_TYPE_UINT, /* number of data chunks */
- G_TYPE_UINT, /* number of data bytes */
- G_TYPE_UINT, /* vtag1 */
- G_TYPE_UINT); /* vtag2 */
-
- /* Create a view */
- list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store));
-
- list_view = GTK_TREE_VIEW(list);
-
- /* Speed up the list display */
- gtk_tree_view_set_fixed_height_mode(list_view, TRUE);
-
- gtk_tree_view_set_headers_clickable(list_view, TRUE);
-
- /* The view now holds a reference. We can get rid of our own reference */
- g_object_unref(G_OBJECT(list_store));
-
- /*
- * Create the first column packet, associating the "text" attribute of the
- * cell_renderer to the first column of the model
- */
- /* 1:st column */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Port 1", renderer,
- "text", PORT1_COLUMN,
- NULL);
-
- gtk_tree_view_column_set_sort_column_id(column, PORT1_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 80);
-
- /* Add the column to the view. */
- gtk_tree_view_append_column(list_view, column);
-
- /* 2:nd column... */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Port 2", renderer,
- "text", PORT2_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, PORT2_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 80);
- gtk_tree_view_append_column(list_view, column);
-
- /* 3:d column... */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("No of Packets", renderer,
- "text", PACKETS_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, PACKETS_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 120);
- gtk_tree_view_append_column(list_view, column);
-
- /* 4:th column... */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Checksum", renderer,
- "text", CHECKSUM_TYPE_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, CHECKSUM_TYPE_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 120);
- gtk_tree_view_append_column(list_view, column);
-
- /* 5:th column... */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("No of Errors", renderer,
- "text", CHECKSUM_ERRORS_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, CHECKSUM_ERRORS_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 120);
- gtk_tree_view_append_column(list_view, column);
-
- /* 6:th column... */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Data Chunks", renderer,
- "text", DATA_CHUNKS_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, DATA_CHUNKS_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 120);
- gtk_tree_view_append_column(list_view, column);
-
- /* 7:th column... */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Data Bytes", renderer,
- "text", DATA_BYTES_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, DATA_BYTES_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 120);
- gtk_tree_view_append_column(list_view, column);
-
- /* 8:th column... */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("VTag 1", renderer,
- "text", VTAG1_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, VTAG1_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 120);
- gtk_tree_view_append_column(list_view, column);
-
-
- /* 9:th column... */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("VTag 2", renderer,
- "text", VTAG2_COLUMN,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, VTAG2_COLUMN);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 120);
- gtk_tree_view_append_column(list_view, column);
-
- /* Now enable the sorting of each column */
- gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(list_view), TRUE);
- gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(list_view), TRUE);
-
- /* Setup the selection handler */
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
- g_signal_connect(selection, "changed", G_CALLBACK(sctp_stat_on_select_row), NULL);
- return list;
-}
-
-static void
-dlg_destroy(GtkWidget *w _U_, gpointer user_data _U_)
-{
- guint32 i, j;
- GList *list;
- struct sctp_analyse *child_data;
-
- j = n_children;
- for (i=0; i<j; i++)
- {
- list = g_list_last(sctp_assocs->children);
- child_data = (struct sctp_analyse *)list->data;
- gtk_grab_remove(GTK_WIDGET(child_data->window));
- gtk_widget_destroy(GTK_WIDGET(child_data->window));
- }
- g_list_free(sctp_assocs->children);
- sctp_assocs->children = NULL;
- sctp_stat_dlg = NULL;
- prevent_update = FALSE;
- filter_applied = FALSE;
-}
-
-void
-decrease_analyse_childcount(void)
-{
- n_children--;
-}
-
-void
-increase_analyse_childcount(void)
-{
- n_children++;
-}
-
-void
-set_analyse_child(struct sctp_analyse *child)
-{
- sctp_assocs->children = g_list_append(sctp_assocs->children, child);
-}
-
-void
-remove_analyse_child(struct sctp_analyse *child)
-{
- sctp_assocs->children = g_list_remove(sctp_assocs->children, child);
-}
-
-
-
-static void add_to_clist(sctp_assoc_info_t* assinfo)
-{
- GtkListStore *list_store;
- GtkTreeIter iter;
-
- list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(clist))); /* Get store */
-
- gtk_list_store_insert_with_values( list_store , &iter, G_MAXINT,
- PORT1_COLUMN, (guint32)assinfo->port1,
- PORT2_COLUMN, (guint32)assinfo->port2,
- PACKETS_COLUMN, assinfo->n_packets,
- CHECKSUM_TYPE_COLUMN, assinfo->checksum_type,
- CHECKSUM_ERRORS_COLUMN, assinfo->n_checksum_errors,
- DATA_CHUNKS_COLUMN, assinfo->n_data_chunks,
- DATA_BYTES_COLUMN, assinfo->n_data_bytes,
- VTAG1_COLUMN, assinfo->verification_tag1,
- VTAG2_COLUMN, assinfo->verification_tag2,
- -1);
-}
-
-static void
-sctp_stat_on_unselect(GtkButton *button _U_, gpointer user_data _U_)
-{
- if (filter_string != NULL) {
- g_free(filter_string);
- filter_string = NULL;
- }
-
- selected_stream = NULL;
- gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), "");
- main_filter_packets(&cfile, "", FALSE);
- gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(clist)));
- gtk_widget_set_sensitive(bt_unselect,FALSE);
- gtk_widget_set_sensitive(bt_filter,FALSE);
- gtk_widget_set_sensitive(bt_analyse,FALSE);
- gtk_widget_set_sensitive(bt_afilter,FALSE);
- prevent_update = FALSE;
- filter_applied = FALSE;
-}
-
-void sctp_stat_dlg_update(void)
-{
- GList *list;
-
- list = (sctp_stat_get_info()->assoc_info_list);
- if ((sctp_stat_dlg != NULL) && !prevent_update)
- {
- gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(clist))));
- list = g_list_first(sctp_stat_get_info()->assoc_info_list);
-
- while (list)
- {
- add_to_clist((sctp_assoc_info_t*)(list->data));
- list = g_list_next(list);
- }
- }
- last_list = list;
-}
-
-
-
-static void
-sctp_stat_on_apply_filter(GtkButton *button _U_, gpointer user_data _U_)
-{
- GList *list;
- sctp_assoc_info_t *assoc;
- guint16 port1, port2;
- guint32 data_chunks, data_bytes, packets, vtag1, vtag2;
-
- if (filter_string != NULL)
- {
- port1 = selected_stream->port1;
- port2 = selected_stream->port2;
- data_chunks = selected_stream->n_data_chunks;
- data_bytes = selected_stream->n_data_bytes;
- packets = selected_stream->n_packets;
- vtag1 = selected_stream->verification_tag1;
- vtag2 = selected_stream->verification_tag2;
- main_filter_packets(&cfile, filter_string, FALSE);
- list = g_list_first(sctp_assocs->assoc_info_list);
-
- while (list)
- {
- assoc = (sctp_assoc_info_t*)(list->data);
- if ((assoc->port1 == port1) && (assoc->port2 == port2)
- && (assoc->n_packets == packets)
- && (assoc->n_data_chunks == data_chunks)
- && (assoc->n_data_bytes == data_bytes)
- && (assoc->verification_tag1 == vtag1) && (assoc->verification_tag2 == vtag2))
- {
- selected_stream = assoc;
- break;
- }
- list = g_list_next(list);
- }
- gtk_widget_set_sensitive(bt_afilter,FALSE);
- prevent_update = TRUE;
- filter_applied = TRUE;
- }
-}
-
-static void
-sctp_stat_on_filter(GtkButton *button _U_, gpointer user_data _U_)
-{
- if (selected_stream == NULL) {
- gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), "");
- return;
- }
-
- if (selected_stream->check_address == FALSE)
- {
- gchar *f_string;
-
- f_string = g_strdup_printf("((sctp.srcport==%u && sctp.dstport==%u && "
- "((sctp.verification_tag==0x%x && sctp.verification_tag!=0x0) || "
- "(sctp.verification_tag==0x0 && sctp.initiate_tag==0x%x) || "
- "(sctp.verification_tag==0x%x && (sctp.abort_t_bit==1 || "
- "sctp.shutdown_complete_t_bit==1)))) ||"
- "(sctp.srcport==%u && sctp.dstport==%u && ((sctp.verification_tag==0x%x "
- "&& sctp.verification_tag!=0x0) || "
- "(sctp.verification_tag==0x0 && sctp.initiate_tag==0x%x) ||"
- "(sctp.verification_tag==0x%x && (sctp.abort_t_bit==1 ||"
- " sctp.shutdown_complete_t_bit==1)))))",
- selected_stream->port1,
- selected_stream->port2,
- selected_stream->verification_tag1,
- selected_stream->initiate_tag,
- selected_stream->verification_tag2,
- selected_stream->port2,
- selected_stream->port1,
- selected_stream->verification_tag2,
- selected_stream->initiate_tag,
- selected_stream->verification_tag1);
- filter_string = f_string;
- }
- else
- {
- gchar *str;
- GString *gstring;
- GList *srclist, *dstlist;
- struct sockaddr_in *infosrc;
- struct sockaddr_in *infodst;
- address addr;
- char *addr_str;
-
- srclist = g_list_first(selected_stream->addr1);
- infosrc = (struct sockaddr_in *)(srclist->data);
- set_address(&addr, AT_IPv4, 4, &(infosrc->sin_addr.s_addr));
- addr_str = (char*)address_to_str(NULL, &addr);
- gstring = g_string_new(g_strdup_printf("((sctp.srcport==%u && sctp.dstport==%u && (ip.src==%s",
- selected_stream->port1, selected_stream->port2, addr_str));
- srclist= g_list_next(srclist);
- wmem_free(NULL, addr_str);
-
- while (srclist)
- {
- infosrc = (struct sockaddr_in *)(srclist->data);
- set_address(&addr, AT_IPv4, 4, &(infosrc->sin_addr.s_addr));
- addr_str = (char*)address_to_str(NULL, &addr);
- str = g_strdup_printf("|| ip.src==%s", addr_str);
- g_string_append(gstring, str);
- wmem_free(NULL, addr_str);
- srclist = g_list_next(srclist);
- }
- dstlist = g_list_first(selected_stream->addr2);
- infodst = (struct sockaddr_in *)(dstlist->data);
- set_address(&addr, AT_IPv4, 4, &(infodst->sin_addr.s_addr));
- addr_str = (char*)address_to_str(NULL, &addr);
- str = g_strdup_printf(") && (ip.dst==%s", addr_str);
- g_string_append(gstring, str);
- wmem_free(NULL, addr_str);
- dstlist = g_list_next(dstlist);
- while (dstlist)
- {
- infodst = (struct sockaddr_in *)(dstlist->data);
- set_address(&addr, AT_IPv4, 4, &(infodst->sin_addr.s_addr));
- addr_str = (char*)address_to_str(NULL, &addr);
- str = g_strdup_printf("|| ip.dst==%s", addr_str);
- g_string_append(gstring, str);
- wmem_free(NULL, addr_str);
- dstlist = g_list_next(dstlist);
- }
- srclist = g_list_first(selected_stream->addr1);
- infosrc = (struct sockaddr_in *)(srclist->data);
- set_address(&addr, AT_IPv4, 4, &(infosrc->sin_addr.s_addr));
- addr_str = (char*)address_to_str(NULL, &addr);
- str = g_strdup_printf(")) || (sctp.dstport==%u && sctp.srcport==%u && (ip.dst==%s",
- selected_stream->port1, selected_stream->port2, addr_str);
- g_string_append(gstring, str);
- wmem_free(NULL, addr_str);
- srclist = g_list_next(srclist);
-
- while (srclist)
- {
- infosrc = (struct sockaddr_in *)(srclist->data);
- set_address(&addr, AT_IPv4, 4, &(infosrc->sin_addr.s_addr));
- addr_str = (char*)address_to_str(NULL, &addr);
- str = g_strdup_printf("|| ip.dst==%s", addr_str);
- g_string_append(gstring, str);
- wmem_free(NULL, addr_str);
- srclist= g_list_next(srclist);
- }
-
- dstlist = g_list_first(selected_stream->addr2);
- infodst = (struct sockaddr_in *)(dstlist->data);
- set_address(&addr, AT_IPv4, 4, &(infodst->sin_addr.s_addr));
- addr_str = (char*)address_to_str(NULL, &addr);
- str = g_strdup_printf(") && (ip.src==%s", addr_str);
- g_string_append(gstring, str);
- wmem_free(NULL, addr_str);
- dstlist = g_list_next(dstlist);
- while (dstlist)
- {
- infodst = (struct sockaddr_in *)(dstlist->data);
- set_address(&addr, AT_IPv4, 4, &(infodst->sin_addr.s_addr));
- addr_str = (char*)address_to_str(NULL, &addr);
- str = g_strdup_printf("|| ip.src==%s", addr_str);
- g_string_append(gstring, str);
- wmem_free(NULL, addr_str);
- dstlist = g_list_next(dstlist);
- }
- str = g_strdup(")))");
- g_string_append(gstring, str);
- filter_string = g_string_free(gstring,FALSE);
- }
-
- if (filter_string != NULL) {
- gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), filter_string);
- } else {
- g_assert_not_reached();
- }
- gtk_widget_set_sensitive(bt_afilter,TRUE);
- gtk_widget_set_sensitive(bt_filter,FALSE);
- prevent_update = TRUE;
- filter_applied = FALSE;
-}
-
-
-static void
-sctp_stat_on_close(GtkWidget *button _U_, gpointer user_data _U_)
-{
- gtk_grab_remove(sctp_stat_dlg);
- gtk_widget_destroy(sctp_stat_dlg);
- prevent_update = FALSE;
- filter_applied = FALSE;
-}
-
-static void
-sctp_stat_on_analyse(GtkButton *button _U_, gpointer user_data _U_)
-{
- if (selected_stream == NULL)
- return;
- else
- assoc_analyse(selected_stream);
- gtk_widget_set_sensitive(bt_analyse,FALSE);
- if (!filter_applied)
- gtk_widget_set_sensitive(bt_filter,TRUE);
- prevent_update = TRUE;
-}
-
-
-static void
-gtk_sctpstat_dlg(void)
-{
- GtkWidget *sctp_stat_dlg_w;
- GtkWidget *vbox1;
- GtkWidget *scrolledwindow1;
- GtkWidget *hbuttonbox2;
- GtkWidget *bt_close;
-
- sctp_stat_dlg_w = window_new(GTK_WINDOW_TOPLEVEL, "Wireshark: SCTP Associations");
- gtk_window_set_position(GTK_WINDOW(sctp_stat_dlg_w), GTK_WIN_POS_CENTER);
- gtk_window_set_default_size(GTK_WINDOW(sctp_stat_dlg_w), 1000, 300);
- g_signal_connect(sctp_stat_dlg_w, "destroy", G_CALLBACK(dlg_destroy), NULL);
-
- /* Container for each row of widgets */
- vbox1 = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 2, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(vbox1), 8);
- gtk_container_add(GTK_CONTAINER(sctp_stat_dlg_w), vbox1);
- gtk_widget_show(vbox1);
-
- scrolledwindow1 = scrolled_window_new(NULL, NULL);
- gtk_widget_show(scrolledwindow1);
- gtk_box_pack_start(GTK_BOX(vbox1), scrolledwindow1, TRUE, TRUE, 0);
-
- clist = create_list();
- gtk_widget_show(clist);
- gtk_container_add(GTK_CONTAINER(scrolledwindow1), clist);
- gtk_widget_set_size_request(clist, 1050, 200);
-
- gtk_widget_show(sctp_stat_dlg_w);
-
- hbuttonbox2 = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_start(GTK_BOX(vbox1), hbuttonbox2, FALSE, FALSE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(hbuttonbox2), 10);
- gtk_button_box_set_layout(GTK_BUTTON_BOX(hbuttonbox2), GTK_BUTTONBOX_SPREAD);
- gtk_box_set_spacing(GTK_BOX(hbuttonbox2), 0);
- gtk_widget_show(hbuttonbox2);
-
- bt_unselect = gtk_button_new_with_label("Unselect");
- gtk_container_add(GTK_CONTAINER(hbuttonbox2), bt_unselect);
- gtk_widget_show(bt_unselect);
- gtk_widget_set_sensitive(bt_unselect,FALSE);
-
- bt_filter = gtk_button_new_with_label("Set filter");
- gtk_container_add(GTK_CONTAINER(hbuttonbox2), bt_filter);
- gtk_widget_show(bt_filter);
- gtk_widget_set_sensitive(bt_filter,FALSE);
-
- bt_afilter = gtk_button_new_with_label("Apply filter");
- gtk_container_add(GTK_CONTAINER(hbuttonbox2), bt_afilter);
- gtk_widget_show(bt_afilter);
- gtk_widget_set_sensitive(bt_afilter,FALSE);
-
- bt_analyse = gtk_button_new_with_label("Analyse");
- gtk_container_add(GTK_CONTAINER(hbuttonbox2), bt_analyse);
- gtk_widget_show(bt_analyse);
- gtk_widget_set_sensitive(bt_analyse,FALSE);
-
- bt_close = ws_gtk_button_new_from_stock(GTK_STOCK_CLOSE);
- gtk_container_add(GTK_CONTAINER(hbuttonbox2), bt_close);
- gtk_widget_set_can_default(bt_close, TRUE);
- window_set_cancel_button(sctp_stat_dlg_w, bt_close, sctp_stat_on_close);
- gtk_widget_grab_focus(bt_close);
- gtk_widget_show(bt_close);
-
- g_signal_connect(sctp_stat_dlg_w, "destroy", G_CALLBACK(dlg_destroy), NULL);
- g_signal_connect(bt_unselect, "clicked", G_CALLBACK(sctp_stat_on_unselect), NULL);
- g_signal_connect(bt_filter, "clicked", G_CALLBACK(sctp_stat_on_filter), NULL);
- g_signal_connect(bt_afilter, "clicked", G_CALLBACK(sctp_stat_on_apply_filter), NULL);
- g_signal_connect(bt_analyse, "clicked", G_CALLBACK(sctp_stat_on_analyse), NULL);
-
- sctp_stat_dlg = sctp_stat_dlg_w;
- cf_retap_packets(&cfile);
- gdk_window_raise(gtk_widget_get_window(sctp_stat_dlg_w));
-
-}
-
-static void sctp_stat_dlg_show(void)
-{
- if (sctp_stat_dlg != NULL)
- {
- /* There's already a dialog box; reactivate it. */
- reactivate_window(sctp_stat_dlg);
- /* Another list since last call? */
- if ((sctp_stat_get_info()->assoc_info_list) != last_list)
- sctp_stat_dlg_update();
- }
- else
- {
- /* Create and show the dialog box */
- gtk_sctpstat_dlg();
- sctp_stat_dlg_update();
- }
-}
-
-
-void sctp_stat_start(GtkAction *action _U_, gpointer user_data _U_)
-{
- prevent_update = FALSE;
- filter_applied = FALSE;
- sctp_assocs = (sctp_allassocs_info_t *)g_malloc(sizeof(sctp_allassocs_info_t));
- sctp_assocs = (sctp_allassocs_info_t*)sctp_stat_get_info();
- /* Register the tap listener */
- if (sctp_stat_get_info()->is_registered == FALSE)
- register_tap_listener_sctp_stat();
- /* (redissect all packets) */
- sctp_stat_scan();
-
- /* Show the dialog box with the list of streams */
- sctp_stat_dlg_show();
-}
-
-/****************************************************************************/
-
-GtkWidget *get_stat_dlg(void)
-{
- return sctp_stat_dlg;
-}
-
-
-/*
- * Editor modelines - http://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/gtk/sctp_stat_gtk.h b/ui/gtk/sctp_stat_gtk.h
deleted file mode 100644
index 451926af38..0000000000
--- a/ui/gtk/sctp_stat_gtk.h
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright 2004-2013, Irene Ruengeler <i.ruengeler [AT] fh-muenster.de>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __SCTP_STAT_GTK_H__
-#define __SCTP_STAT_GTK_H__
-
-#include "ui/tap-sctp-analysis.h"
-
-struct notes {
- GtkWidget *checktype;
- GtkWidget *checksum;
- GtkWidget *bundling;
- GtkWidget *padding;
- GtkWidget *length;
- GtkWidget *value;
- GtkWidget *chunks_ep1;
- GtkWidget *bytes_ep1;
- GtkWidget *chunks_ep2;
- GtkWidget *bytes_ep2;
- struct page *page2;
- struct page *page3;
-};
-
-struct page {
- GtkWidget *addr_frame;
- GtkWidget *scrolled_window;
- GtkWidget *clist;
- GtkWidget *port;
- GtkWidget *veritag;
- GtkWidget *max_in;
- GtkWidget *min_in;
- GtkWidget *max_out;
- GtkWidget *min_out;
-};
-
-struct sctp_analyse {
- sctp_assoc_info_t *assoc;
- GtkWidget* window;
- struct notes *analyse_nb;
- GList *children;
- guint16 num_children;
-};
-
-typedef struct _sctp_graph_t {
- gboolean needs_redraw;
- gfloat x_interval;
- gfloat y_interval;
- GtkWidget *window;
- GtkWidget *draw_area;
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_surface_t *surface;
-#else
- GdkPixmap *pixmap;
-#endif
- gint surface_width;
- gint surface_height;
- gint graph_type;
- gdouble x_old;
- gdouble y_old;
- gdouble x_new;
- gdouble y_new;
- guint16 offset;
- guint16 length;
- gboolean tmp;
- gboolean rectangle;
- gboolean rectangle_present;
- guint32 rect_x_min;
- guint32 rect_x_max;
- guint32 rect_y_min;
- guint32 rect_y_max;
- guint32 x1_tmp_sec;
- guint32 x2_tmp_sec;
- guint32 x1_tmp_usec;
- guint32 x2_tmp_usec;
- guint32 x1_akt_sec;
- guint32 x2_akt_sec;
- guint32 x1_akt_usec;
- guint32 x2_akt_usec;
- guint32 tmp_width;
- guint32 axis_width;
- guint32 y1_tmp;
- guint32 y2_tmp;
- guint32 tmp_min_tsn1;
- guint32 tmp_max_tsn1;
- guint32 tmp_min_tsn2;
- guint32 tmp_max_tsn2;
- guint32 min_x;
- guint32 max_x;
- guint32 min_y;
- guint32 max_y;
- gboolean uoff;
-} sctp_graph_t;
-
-struct sctp_udata {
- sctp_assoc_info_t *assoc;
- sctp_graph_t *io;
- struct sctp_analyse *parent;
- guint16 dir;
-};
-
-void assoc_analyse(sctp_assoc_info_t* assoc);
-
-void set_child(struct sctp_udata *child, struct sctp_analyse *parent);
-
-void remove_child(struct sctp_udata *child, struct sctp_analyse *parent);
-
-void decrease_analyse_childcount(void);
-
-void increase_analyse_childcount(void);
-
-void increase_childcount(struct sctp_analyse *parent);
-
-void decrease_childcount(struct sctp_analyse *parent);
-
-void set_analyse_child(struct sctp_analyse *child);
-
-void remove_analyse_child(struct sctp_analyse *child);
-
-void create_graph(guint16 dir, struct sctp_analyse* u_data);
-
-void create_byte_graph(guint16 dir, struct sctp_analyse* u_data);
-
-void sctp_error_dlg_show(sctp_assoc_info_t* assoc);
-
-void sctp_stat_dlg_update(void);
-
-void sctp_chunk_stat_dlg_update(struct sctp_udata* udata, unsigned int direction);
-
-void sctp_chunk_dlg_show(struct sctp_analyse* userdata);
-
-void sctp_chunk_stat_dlg_show(unsigned int direction, struct sctp_analyse* userdata);
-
-GtkWidget *get_stat_dlg(void);
-
-GtkWidget *get_chunk_stat_dlg(void);
-
-void update_analyse_dlg(struct sctp_analyse* u_data);
-
-void sctp_set_assoc_filter(void);
-
-#endif
diff --git a/ui/gtk/service_response_time_table.c b/ui/gtk/service_response_time_table.c
deleted file mode 100644
index 1a3884e3cd..0000000000
--- a/ui/gtk/service_response_time_table.c
+++ /dev/null
@@ -1,889 +0,0 @@
-/* service_response_time_table.c
- * service_response_time_table 2003 Ronnie Sahlberg
- * Helper routines common to all service response time statistics
- * tap.
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <gtk/gtk.h>
-
-#include "epan/packet_info.h"
-#include "epan/proto.h"
-
-#include "ui/simple_dialog.h"
-#include <wsutil/utf8_entities.h>
-
-#include "ui/gtk/filter_utils.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/service_response_time_table.h"
-#include "ui/gtk/tap_param_dlg.h"
-#include "ui/gtk/main.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-/* XXX - Part of temporary hack */
-#include "epan/conversation.h"
-#include "epan/dissectors/packet-scsi.h"
-
-#include "globals.h"
-
-#define NANOSECS_PER_SEC 1000000000
-
-enum
-{
- INDEX_COLUMN,
- PROCEDURE_COLUMN,
- CALLS_COLUMN,
- MIN_SRT_COLUMN,
- MAX_SRT_COLUMN,
- AVG_SRT_COLUMN,
- SUM_SRT_COLUMN,
- N_COLUMNS
-};
-
-typedef struct _srt_t {
- const char *type;
- const char *filter;
- gtk_srt_t gtk_data;
- register_srt_t* srt;
- srt_data_t data;
-} srt_t;
-
-
-static void
-srt_select_filter_cb(GtkWidget *widget _U_, gpointer callback_data, guint callback_action)
-{
- gtk_srt_table_t *rst_table = (gtk_srt_table_t*)callback_data;
- srt_stat_table* rst = rst_table->rst;
- char *str = NULL;
- GtkTreeIter iter;
- GtkTreeModel *model;
- GtkTreeSelection *sel;
- int selection;
-
- if(rst->filter_string==NULL){
- return;
- }
-
- sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(rst_table->table));
-
- if (!gtk_tree_selection_get_selected(sel, &model, &iter))
- return;
-
- gtk_tree_model_get (model, &iter, SRT_COLUMN_INDEX, &selection, -1);
- if(selection>=(int)rst->num_procs){
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "No procedure selected");
- return;
- }
-
- str = g_strdup_printf("%s==%d", rst->filter_string, selection);
-
- apply_selected_filter (callback_action, str);
-
- g_free(str);
-}
-
-static gboolean
-srt_show_popup_menu_cb(void *widg _U_, GdkEvent *event, gtk_srt_table_t *rst)
-{
- GdkEventButton *bevent = (GdkEventButton *)event;
-
- if(event->type==GDK_BUTTON_PRESS && bevent->button==3){
- gtk_menu_popup(GTK_MENU(rst->menu), NULL, NULL, NULL, NULL,
- bevent->button, bevent->time);
- }
-
- return FALSE;
-}
-
-
-/* Action callbacks */
-static void
-apply_as_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- srt_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_SELECTED, 0));
-}
-static void
-apply_as_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- srt_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_NOT_SELECTED, 0));
-}
-static void
-apply_as_and_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- srt_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_AND_SELECTED, 0));
-}
-static void
-apply_as_or_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- srt_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_OR_SELECTED, 0));
-}
-static void
-apply_as_and_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- srt_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_AND_NOT_SELECTED, 0));
-}
-static void
-apply_as_or_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- srt_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_OR_NOT_SELECTED, 0));
-}
-
-static void
-prep_as_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- srt_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_SELECTED, 0));
-}
-static void
-prep_as_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- srt_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_NOT_SELECTED, 0));
-}
-static void
-prep_as_and_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- srt_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_AND_SELECTED, 0));
-}
-static void
-prep_as_or_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- srt_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_OR_SELECTED, 0));
-}
-static void
-prep_as_and_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- srt_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_AND_NOT_SELECTED, 0));
-}
-static void
-prep_as_or_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- srt_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_OR_NOT_SELECTED, 0));
-}
-
-static void
-find_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- srt_select_filter_cb( widget , user_data, CALLBACK_FIND_FRAME(ACTYPE_SELECTED, 0));
-}
-static void
-find_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- srt_select_filter_cb( widget , user_data, CALLBACK_FIND_FRAME(ACTYPE_NOT_SELECTED, 0));
-}
-static void
-find_prev_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- srt_select_filter_cb( widget , user_data, CALLBACK_FIND_PREVIOUS(ACTYPE_SELECTED, 0));
-}
-static void
-find_prev_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- srt_select_filter_cb( widget , user_data, CALLBACK_FIND_PREVIOUS(ACTYPE_NOT_SELECTED, 0));
-}
-static void
-find_next_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- srt_select_filter_cb( widget , user_data, CALLBACK_FIND_NEXT(ACTYPE_SELECTED, 0));
-}
-static void
-find_next_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- srt_select_filter_cb( widget , user_data, CALLBACK_FIND_NEXT(ACTYPE_NOT_SELECTED, 0));
-}
-static void
-color_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- srt_select_filter_cb( widget , user_data, CALLBACK_COLORIZE(ACTYPE_SELECTED, 0));
-}
-static void
-color_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- srt_select_filter_cb( widget , user_data, CALLBACK_COLORIZE(ACTYPE_SELECTED, 0));
-}
-
-static const char *ui_desc_service_resp_t_filter_popup =
-"<ui>\n"
-" <popup name='ServiceRespTFilterPopup'>\n"
-" <menu action='/Apply as Filter'>\n"
-" <menuitem action='/Apply as Filter/Selected'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " not Selected'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected'/>\n"
-" </menu>\n"
-" <menu action='/Prepare a Filter'>\n"
-" <menuitem action='/Prepare a Filter/Selected'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " not Selected'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected'/>\n"
-" </menu>\n"
-" <menu action='/Find Frame'>\n"
-" <menu action='/Find Frame/Find Frame'>\n"
-" <menuitem action='/Find Frame/Selected'/>\n"
-" <menuitem action='/Find Frame/Not Selected'/>\n"
-" </menu>\n"
-" <menu action='/Find Frame/Find Next'>\n"
-" <menuitem action='/Find Next/Selected'/>\n"
-" <menuitem action='/Find Next/Not Selected'/>\n"
-" </menu>\n"
-" <menu action='/Find Frame/Find Previous'>\n"
-" <menuitem action='/Find Previous/Selected'/>\n"
-" <menuitem action='/Find Previous/Not Selected'/>\n"
-" </menu>\n"
-" </menu>\n"
-" <menu action='/Colorize Procedure'>\n"
-" <menuitem action='/Colorize Procedure/Selected'/>\n"
-" <menuitem action='/Colorize Procedure/Not Selected'/>\n"
-" </menu>\n"
-" </popup>\n"
-"</ui>\n";
-
-/*
- * GtkActionEntry
- * typedef struct {
- * const gchar *name;
- * const gchar *stock_id;
- * const gchar *label;
- * const gchar *accelerator;
- * const gchar *tooltip;
- * GCallback callback;
- * } GtkActionEntry;
- * const gchar *name; The name of the action.
- * const gchar *stock_id; The stock id for the action, or the name of an icon from the icon theme.
- * const gchar *label; The label for the action. This field should typically be marked for translation,
- * see gtk_action_group_set_translation_domain().
- * If label is NULL, the label of the stock item with id stock_id is used.
- * const gchar *accelerator; The accelerator for the action, in the format understood by gtk_accelerator_parse().
- * const gchar *tooltip; The tooltip for the action. This field should typically be marked for translation,
- * see gtk_action_group_set_translation_domain().
- * GCallback callback; The function to call when the action is activated.
- *
- */
-static const GtkActionEntry service_resp_t__popup_entries[] = {
- { "/Apply as Filter", NULL, "Apply as Filter", NULL, NULL, NULL },
- { "/Prepare a Filter", NULL, "Prepare a Filter", NULL, NULL, NULL },
- { "/Find Frame", NULL, "Find Frame", NULL, NULL, NULL },
- { "/Find Frame/Find Frame", NULL, "Find Frame", NULL, NULL, NULL },
- { "/Find Frame/Find Next", NULL, "Find Next" , NULL, NULL, NULL },
- { "/Find Frame/Find Previous", NULL, "Find Previous", NULL, NULL, NULL },
- { "/Colorize Procedure", NULL, "Colorize Procedure", NULL, NULL, NULL },
- { "/Apply as Filter/Selected", NULL, "Selected", NULL, "Selected", G_CALLBACK(apply_as_selected_cb) },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " not Selected", G_CALLBACK(apply_as_not_selected_cb) },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and Selected", G_CALLBACK(apply_as_and_selected_cb) },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or Selected", G_CALLBACK(apply_as_or_selected_cb) },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and not Selected", G_CALLBACK(apply_as_and_not_selected_cb) },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or not Selected", G_CALLBACK(apply_as_or_not_selected_cb) },
- { "/Prepare a Filter/Selected", NULL, "Selected", NULL, "selcted", G_CALLBACK(prep_as_selected_cb) },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " not Selected", G_CALLBACK(prep_as_not_selected_cb) },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and Selected", G_CALLBACK(prep_as_and_selected_cb) },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or Selected", G_CALLBACK(prep_as_or_selected_cb) },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and not Selected", G_CALLBACK(prep_as_and_not_selected_cb) },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or not Selected", G_CALLBACK(prep_as_or_not_selected_cb) },
- { "/Find Frame/Selected", NULL, "Selected", NULL, "Selected", G_CALLBACK(find_selected_cb) },
- { "/Find Frame/Not Selected", NULL, "Not Selected", NULL, "Not Selected", G_CALLBACK(find_not_selected_cb) },
- { "/Find Previous/Selected", NULL, "Selected", NULL, "Selected", G_CALLBACK(find_prev_selected_cb) },
- { "/Find Previous/Not Selected", NULL, "Not Selected", NULL, "Not Selected", G_CALLBACK(find_prev_not_selected_cb) },
- { "/Find Next/Selected", NULL, "Selected", NULL, "Selected", G_CALLBACK(find_next_selected_cb) },
- { "/Find Next/Not Selected", NULL, "Not Selected", NULL, "Not Selected", G_CALLBACK(find_next_not_selected_cb) },
- { "/Colorize Procedure/Selected", NULL, "Selected", NULL, "Selected", G_CALLBACK(color_selected_cb) },
- { "/Colorize Procedure/Not Selected", NULL, "Not Selected", NULL, "Not Selected", G_CALLBACK(color_not_selected_cb) },
-};
-
-static void
-srt_create_popup_menu(gtk_srt_table_t* rst_table)
-{
- GtkUIManager *ui_manager;
- GtkActionGroup *action_group;
- GError *error = NULL;
-
- action_group = gtk_action_group_new ("ServiceRespTFilterPopupActionGroup");
- gtk_action_group_add_actions (action_group, /* the action group */
- (GtkActionEntry *)service_resp_t__popup_entries, /* an array of action descriptions */
- G_N_ELEMENTS(service_resp_t__popup_entries), /* the number of entries */
- rst_table); /* data to pass to the action callbacks */
-
- ui_manager = gtk_ui_manager_new ();
- gtk_ui_manager_insert_action_group (ui_manager,
- action_group,
- 0); /* the position at which the group will be inserted */
- gtk_ui_manager_add_ui_from_string (ui_manager,ui_desc_service_resp_t_filter_popup, -1, &error);
- if (error != NULL)
- {
- fprintf (stderr, "Warning: building service response time filter popup failed: %s\n",
- error->message);
- g_error_free (error);
- error = NULL;
- }
-
- rst_table->menu = gtk_ui_manager_get_widget(ui_manager, "/ServiceRespTFilterPopup");
- g_signal_connect(rst_table->table, "button_press_event", G_CALLBACK(srt_show_popup_menu_cb), rst_table);
-}
-
-/* ---------------- */
-static void
-srt_time_func (GtkTreeViewColumn *column _U_,
- GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer user_data)
-{
- gchar *str;
- nstime_t *data;
-
- /* The col to get data from is in userdata */
- gint data_column = GPOINTER_TO_INT(user_data);
-
- gtk_tree_model_get(model, iter, data_column, &data, -1);
- if (!data) {
- g_object_set(renderer, "text", "", NULL);
- return;
- }
- str = g_strdup_printf("%3d.%06d", (int)data->secs, (data->nsecs+500)/1000);
- g_object_set(renderer, "text", str, NULL);
- g_free(str);
-}
-
-static void
-srt_avg_func (GtkTreeViewColumn *column _U_,
- GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer user_data)
-{
- gchar *str;
- guint64 td;
- gint data_column = GPOINTER_TO_INT(user_data);
-
- gtk_tree_model_get(model, iter, data_column, &td, -1);
- str=g_strdup_printf("%3d.%06d",
- (int)(td/1000000), (int)(td%1000000));
- g_object_set(renderer, "text", str, NULL);
- g_free(str);
-}
-
-static gint
-srt_time_sort_func(GtkTreeModel *model,
- GtkTreeIter *a,
- GtkTreeIter *b,
- gpointer user_data)
-{
- nstime_t *ns_a;
- nstime_t *ns_b;
- gint ret = 0;
- gint data_column = GPOINTER_TO_INT(user_data);
-
- gtk_tree_model_get(model, a, data_column, &ns_a, -1);
- gtk_tree_model_get(model, b, data_column, &ns_b, -1);
-
- if (ns_a == ns_b) {
- ret = 0;
- }
- else if (ns_a == NULL || ns_b == NULL) {
- ret = (ns_a == NULL) ? -1 : 1;
- }
- else {
- ret = nstime_cmp(ns_a,ns_b);
- }
- return ret;
-}
-
-static void
-srt_set_title(srt_t *ss)
-{
- gchar *str;
-
- str = g_strdup_printf("%s Service Response Time statistics", proto_get_protocol_short_name(find_protocol_by_id(get_srt_proto_id(ss->srt))));
- set_window_title(ss->gtk_data.win, str);
- g_free(str);
-}
-
-
-static gtk_srt_table_t*
-get_gtk_table_from_srt(srt_stat_table* rst, gtk_srt_t* gtk)
-{
- guint i;
- gtk_srt_table_t* srt;
-
- for (i = 0; i < gtk->gtk_srt_array->len; i++) {
- srt = g_array_index(gtk->gtk_srt_array, gtk_srt_table_t*, i);
-
- if (srt->rst == rst)
- return srt;
- }
-
- return NULL;
-}
-
-void
-free_table_data(srt_stat_table* rst, void* gui_data)
-{
- gtk_srt_t* gtk_data = (gtk_srt_t*)gui_data;
- gtk_srt_table_t* gtk_table = get_gtk_table_from_srt(rst, gtk_data);
- g_assert(gtk_table);
-
- g_free(gtk_table);
-}
-
-static void
-win_destroy_cb(GtkWindow *win _U_, gpointer data)
-{
- srt_t *ss=(srt_t *)data;
-
- remove_tap_listener(&ss->data);
-
- free_srt_table(ss->srt, ss->data.srt_array, free_table_data, &ss->gtk_data);
-
- g_free(ss);
-}
-
-void
-init_gtk_srt_table(srt_stat_table* rst, void* gui_data)
-{
- int i;
- GtkListStore *store;
- GtkWidget *tree;
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
- GtkTreeSortable *sortable;
- GtkWidget *label;
- GtkWidget *tab_page;
- gtk_srt_t *ss = (gtk_srt_t*)gui_data;
- GtkWidget *parent_box = ss->vbox;
- GtkTreeSelection *sel;
- gtk_srt_table_t *gtk_table_data = g_new0(gtk_srt_table_t, 1);
-
- /* Create GTK data for the table here */
- gtk_table_data->rst = rst;
- g_array_insert_val(ss->gtk_srt_array, ss->gtk_srt_array->len, gtk_table_data);
-
- /* Create the label for the table here */
- label=gtk_label_new(rst->name);
- if (ss->main_nb == NULL)
- {
- gtk_box_pack_start(GTK_BOX(ss->vbox), label, FALSE, FALSE, 0);
- }
- else
- {
- GtkWidget *tab_label=gtk_label_new(rst->short_name);
- tab_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- gtk_notebook_append_page(GTK_NOTEBOOK(ss->main_nb), tab_page, tab_label);
- gtk_box_pack_start(GTK_BOX(tab_page), label, FALSE, FALSE, 0);
- parent_box = tab_page;
- }
-
- /* Create the store */
- store = gtk_list_store_new (NUM_SRT_COLUMNS, /* Total number of columns */
- G_TYPE_INT, /* Index */
- G_TYPE_STRING, /* Procedure */
- G_TYPE_UINT, /* Calls */
- G_TYPE_POINTER, /* Min SRT */
- G_TYPE_POINTER, /* Max SRT */
- G_TYPE_UINT64, /* Avg SRT */
- G_TYPE_UINT64); /* Sum SRT */
-
- /* Create a view */
- tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
- gtk_table_data->table = GTK_TREE_VIEW(tree);
- sortable = GTK_TREE_SORTABLE(store);
-
- /* The view now holds a reference. We can get rid of our own reference */
- g_object_unref (G_OBJECT (store));
-
- for (i = 0; i < NUM_SRT_COLUMNS; i++) {
- renderer = gtk_cell_renderer_text_new ();
- if (i != SRT_COLUMN_PROCEDURE) {
- /* right align numbers */
- g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
- }
- g_object_set(renderer, "ypad", 0, NULL);
- switch (i) {
- case SRT_COLUMN_MIN:
- case SRT_COLUMN_MAX:
- column = gtk_tree_view_column_new_with_attributes (service_response_time_get_column_name(i), renderer, NULL);
- gtk_tree_view_column_set_cell_data_func(column, renderer, srt_time_func, GINT_TO_POINTER(i), NULL);
- gtk_tree_sortable_set_sort_func(sortable, i, srt_time_sort_func, GINT_TO_POINTER(i), NULL);
- break;
- case SRT_COLUMN_AVG:
- case SRT_COLUMN_SUM:
- column = gtk_tree_view_column_new_with_attributes (service_response_time_get_column_name(i), renderer, NULL);
- gtk_tree_view_column_set_cell_data_func(column, renderer, srt_avg_func, GINT_TO_POINTER(i), NULL);
- break;
- case PROCEDURE_COLUMN:
- column = gtk_tree_view_column_new_with_attributes ((rst->proc_column_name != NULL) ? rst->proc_column_name : service_response_time_get_column_name(i), renderer, "text",
- i, NULL);
- break;
- default:
- column = gtk_tree_view_column_new_with_attributes (service_response_time_get_column_name(i), renderer, "text", i, NULL);
- break;
- }
-
- gtk_tree_view_column_set_sort_column_id(column, i);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_append_column (gtk_table_data->table, column);
- if (i == SRT_COLUMN_CALLS) {
- /* XXX revert order sort */
- gtk_tree_view_column_clicked(column);
- gtk_tree_view_column_clicked(column);
- }
- }
-
- gtk_table_data->scrolled_window=scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(gtk_table_data->scrolled_window),
- GTK_SHADOW_IN);
- gtk_container_add(GTK_CONTAINER(gtk_table_data->scrolled_window), GTK_WIDGET (gtk_table_data->table));
- gtk_box_pack_start(GTK_BOX(parent_box), gtk_table_data->scrolled_window, TRUE, TRUE, 0);
-
- gtk_tree_view_set_reorderable (gtk_table_data->table, FALSE);
- /* Now enable the sorting of each column */
- gtk_tree_view_set_rules_hint(gtk_table_data->table, TRUE);
- gtk_tree_view_set_headers_clickable(gtk_table_data->table, TRUE);
-
- gtk_widget_show(gtk_table_data->scrolled_window);
-
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtk_table_data->table));
- gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
-
- /* create popup menu for this table */
- if(rst->filter_string){
- srt_create_popup_menu(gtk_table_data);
- }
-}
-
-void
-draw_srt_table_data(srt_stat_table *rst, gtk_srt_t* gtk_data)
-{
- int idx, new_idx;
- GtkTreeIter iter;
- gboolean first = TRUE;
- gtk_srt_table_t* gtk_table;
- GtkListStore *store;
- gboolean iter_valid;
-
- gtk_table = get_gtk_table_from_srt(rst, gtk_data);
- g_assert(gtk_table);
-
- store = GTK_LIST_STORE(gtk_tree_view_get_model(gtk_table->table));
- iter_valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter);
-
- new_idx = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store), NULL);
-
- /* Update list items (which may not be in "idx" order), then add new items */
- while (iter_valid || (new_idx < rst->num_procs)) {
- srt_procedure_t* procedure;
- guint64 td;
- guint64 sum;
-
- if (iter_valid) {
- gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, INDEX_COLUMN, &idx, -1);
- } else {
- idx = new_idx;
- new_idx++;
- }
-
- procedure = &rst->procedures[idx];
- if ((procedure->procedure == NULL) || (procedure->stats.num == 0)) {
- iter_valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
- continue;
- }
-
- if (first) {
- g_object_ref(store);
- gtk_tree_view_set_model(GTK_TREE_VIEW(gtk_table->table), NULL);
-
- first = FALSE;
- }
-
- /* Scale the average SRT in units of 1us and round to the nearest us.
- tot.secs is a time_t which may be 32 or 64 bits (or even floating)
- depending uon the platform. After casting tot.secs to 64 bits, it
- would take a capture with a duration of over 136 *years* to
- overflow the secs portion of td. */
- td = ((guint64)(procedure->stats.tot.secs))*NANOSECS_PER_SEC + procedure->stats.tot.nsecs;
- sum = (td + 500) / 1000;
- td = ((td / procedure->stats.num) + 500) / 1000;
-
- if (iter_valid) {
- /* Existing row. Only changeable entries */
-
- gtk_list_store_set(store, &iter,
- PROCEDURE_COLUMN, procedure->procedure,
- CALLS_COLUMN, procedure->stats.num,
- MIN_SRT_COLUMN, &procedure->stats.min,
- MAX_SRT_COLUMN, &procedure->stats.max,
- AVG_SRT_COLUMN, td,
- SUM_SRT_COLUMN, sum,
- -1);
- } else {
- /* New row. All entries, including fixed ones */
- gtk_list_store_insert_with_values(store, &iter, G_MAXINT,
- PROCEDURE_COLUMN, procedure->procedure,
- CALLS_COLUMN, procedure->stats.num,
- MIN_SRT_COLUMN, &procedure->stats.min,
- MAX_SRT_COLUMN, &procedure->stats.max,
- AVG_SRT_COLUMN, td,
- SUM_SRT_COLUMN, sum,
- INDEX_COLUMN, idx,
- -1);
- }
-
- iter_valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
- }
-
- if (!first) {
- gtk_tree_view_set_model(GTK_TREE_VIEW(gtk_table->table), GTK_TREE_MODEL(store));
- g_object_unref(store);
- }
-}
-
-static void
-srt_draw(void *arg)
-{
- guint i = 0;
- srt_stat_table *srt_table;
- srt_data_t *srt = (srt_data_t*)arg;
- srt_t *ss = (srt_t*)srt->user_data;
-
- for (i = 0; i < srt->srt_array->len; i++)
- {
- srt_table = g_array_index(srt->srt_array, srt_stat_table*, i);
- draw_srt_table_data(srt_table, &ss->gtk_data);
- }
-}
-
-void
-reset_table_data(srt_stat_table* rst, void* gui_data)
-{
- GtkListStore *store;
- gtk_srt_t* gtk_data = (gtk_srt_t*)gui_data;
- gtk_srt_table_t* gtk_table = get_gtk_table_from_srt(rst, gtk_data);
- g_assert(gtk_table);
-
- store = GTK_LIST_STORE(gtk_tree_view_get_model(gtk_table->table));
- gtk_list_store_clear(store);
-}
-
-static void
-srt_reset(void *arg)
-{
- srt_data_t *srt = (srt_data_t*)arg;
- srt_t *ss = (srt_t *)srt->user_data;
-
- reset_srt_table(ss->data.srt_array, reset_table_data, &ss->gtk_data);
-
- srt_set_title(ss);
-}
-
-static void
-init_srt_tables(register_srt_t* srt, const char *filter)
-{
- srt_t *ss;
- gchar *str;
- GtkWidget *label;
- char *filter_string, *tmp_filter_string;
- GString *error_string;
- GtkWidget *bbox;
- GtkWidget *close_bt;
-
- ss = g_new0(srt_t, 1);
-
- str = g_strdup_printf("%s-stat", proto_get_protocol_filter_name(get_srt_proto_id(srt)));
- ss->gtk_data.win=dlg_window_new(str); /* transient_for top_level */
- g_free(str);
- gtk_window_set_destroy_with_parent (GTK_WINDOW(ss->gtk_data.win), TRUE);
- gtk_window_set_default_size(GTK_WINDOW(ss->gtk_data.win), SRT_PREFERRED_WIDTH, 600);
-
- str = g_strdup_printf("%s Service Response Time Statistics", proto_get_protocol_short_name(find_protocol_by_id(get_srt_proto_id(srt))));
- set_window_title(ss->gtk_data.win, str);
-
- ss->gtk_data.vbox=ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_add(GTK_CONTAINER(ss->gtk_data.win), ss->gtk_data.vbox);
- gtk_container_set_border_width(GTK_CONTAINER(ss->gtk_data.vbox), 12);
-
- label=gtk_label_new(str);
- gtk_box_pack_start(GTK_BOX(ss->gtk_data.vbox), label, FALSE, FALSE, 0);
- g_free(str);
-
- if ((filter != NULL) && (strlen(filter) > MAX_FILTER_STRING_LENGTH))
- {
- tmp_filter_string = g_strndup(filter, MAX_FILTER_STRING_LENGTH);
- filter_string = g_strdup_printf("Filter: %s...", tmp_filter_string);
- g_free(tmp_filter_string);
- }
- else
- {
- filter_string = g_strdup_printf("Filter: %s", filter ? filter : "");
- }
-
- label=gtk_label_new(filter_string);
- gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
- gtk_widget_set_tooltip_text (label, filter ? filter : "");
- g_free(filter_string);
- gtk_box_pack_start(GTK_BOX(ss->gtk_data.vbox), label, FALSE, FALSE, 0);
-
- /* up to 3 tables is reasonable real estate to display tables. Any more than
- * that and we need to switch to a tab view
- */
- if (get_srt_max_tables(srt) > 3)
- {
- ss->gtk_data.main_nb = gtk_notebook_new();
- gtk_box_pack_start(GTK_BOX(ss->gtk_data.vbox), ss->gtk_data.main_nb, TRUE, TRUE, 0);
- }
-
- /* We must display TOP LEVEL Widget before calling srt_table_dissector_init() */
- gtk_widget_show_all(ss->gtk_data.win);
-
- ss->type = proto_get_protocol_short_name(find_protocol_by_id(get_srt_proto_id(srt)));
- ss->filter = g_strdup(filter);
- ss->srt = srt;
- ss->gtk_data.gtk_srt_array = g_array_new(FALSE, TRUE, sizeof(gtk_srt_table_t*));
- ss->data.srt_array = g_array_new(FALSE, TRUE, sizeof(srt_stat_table*));
- ss->data.user_data = ss;
-
- srt_table_dissector_init(srt, ss->data.srt_array, init_gtk_srt_table, &ss->gtk_data);
-
- error_string = register_tap_listener(get_srt_tap_listener_name(srt), &ss->data, filter, 0, srt_reset, get_srt_packet_func(srt), srt_draw);
- if(error_string){
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
- g_string_free(error_string, TRUE);
- free_srt_table(ss->srt, ss->data.srt_array, NULL, NULL);
- g_free(ss);
- return;
- }
-
- /* Button row. */
- bbox = dlg_button_row_new(GTK_STOCK_CLOSE, NULL);
- gtk_box_pack_end(GTK_BOX(ss->gtk_data.vbox), bbox, FALSE, FALSE, 0);
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(ss->gtk_data.win, close_bt, window_cancel_button_cb);
-
- g_signal_connect(ss->gtk_data.win, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(ss->gtk_data.win, "destroy", G_CALLBACK(win_destroy_cb), ss);
-
- gtk_widget_show_all(ss->gtk_data.win);
- window_present(ss->gtk_data.win);
-
- cf_retap_packets(&cfile);
- gdk_window_raise(gtk_widget_get_window(ss->gtk_data.win));
-}
-
-static void
-gtk_srtstat_init(const char *opt_arg, void *userdata _U_)
-{
- gchar** dissector_name;
- register_srt_t *srt;
- const char *filter=NULL;
- char* err;
-
- /* Use first comma to find dissector name */
- dissector_name = g_strsplit(opt_arg, ",", -1);
- g_assert(dissector_name[0]);
-
- /* Use dissector name to find SRT table */
- srt = get_srt_table_by_name(dissector_name[0]);
- g_assert(srt);
-
- srt_table_get_filter(srt, opt_arg, &filter, &err);
-
- if (err != NULL)
- {
- gchar* cmd_str = srt_table_get_tap_string(srt);
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "invalid \"-z %s,%s\" argument", cmd_str, err);
- g_free(cmd_str);
- g_free(err);
- return;
- }
-
- init_srt_tables(srt, filter);
-}
-
-static tap_param srt_stat_params[] = {
- { PARAM_FILTER, "filter", "Filter", NULL, TRUE }
-};
-
-/* XXX - Temporary hack/workaround until a more generic approach can be implemented */
-static const enum_val_t scsi_command_sets[] = {
- { "sbc", "SBC (disk)", SCSI_DEV_SBC },
- { "ssc", "SSC (tape)", SCSI_DEV_SSC },
- { "mmc", "MMC (cd/dvd)", SCSI_DEV_CDROM },
- { "smc", "SMC (tape robot)", SCSI_DEV_SMC },
- { "osd", "OSD (object based)", SCSI_DEV_OSD },
- { NULL, NULL, 0 }
-};
-
-static tap_param scsi_stat_params[] = {
- { PARAM_ENUM, "cmdset", "Command set", scsi_command_sets, FALSE },
- { PARAM_FILTER, "filter", "Filter", NULL, TRUE }
-};
-
-
-gboolean register_service_response_tables(const void *key _U_, void *value, void *userdata _U_)
-{
- register_srt_t *srt = (register_srt_t*)value;
- const char* short_name = proto_get_protocol_short_name(find_protocol_by_id(get_srt_proto_id(srt)));
- tap_param_dlg* srt_dlg;
-
- /* XXX - These dissectors haven't been converted over to due to an "interactive input dialog" for their
- tap data. Let those specific dialogs register for themselves */
- if ((strcmp(short_name, "RPC") == 0) ||
- (strcmp(short_name, "DCERPC") == 0))
- return FALSE;
-
- srt_dlg = g_new(tap_param_dlg, 1);
-
- srt_dlg->win_title = g_strdup_printf("%s SRT Statistics", short_name);
- srt_dlg->init_string = srt_table_get_tap_string(srt);
- srt_dlg->tap_init_cb = gtk_srtstat_init;
- srt_dlg->index = -1;
- srt_dlg->user_data = srt; /* TODO: Actually use this */
- if (get_srt_proto_id(srt) == proto_get_id_by_filter_name("scsi"))
- {
- srt_dlg->nparams = G_N_ELEMENTS(scsi_stat_params);
- srt_dlg->params = scsi_stat_params;
- }
- else
- {
- srt_dlg->nparams = G_N_ELEMENTS(srt_stat_params);
- srt_dlg->params = srt_stat_params;
- }
-
- register_param_stat(srt_dlg, short_name, REGISTER_STAT_GROUP_RESPONSE_TIME);
- return FALSE;
-}
-
-
-/*
- * Editor modelines - http://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/gtk/service_response_time_table.h b/ui/gtk/service_response_time_table.h
deleted file mode 100644
index 0259f67244..0000000000
--- a/ui/gtk/service_response_time_table.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/* service_response_time_table.h
- * service_response_time_table 2003 Ronnie Sahlberg
- * Helper routines common to all service response time statistics
- * tap.
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __SERVICE_RESPONSE_TIME_TABLE_H__
-#define __SERVICE_RESPONSE_TIME_TABLE_H__
-
-#include <gtk/gtk.h>
-#include "wsutil/nstime.h"
-#include "ui/service_response_time.h"
-
-/** Suggested width of SRT window */
-#define SRT_PREFERRED_WIDTH 650
-
-/** Suggested height of SRT window */
-#define SRT_PREFERRED_HEIGHT 400
-
-/** Limit filter string length for sanity */
-#define MAX_FILTER_STRING_LENGTH 1000
-
-/** @file
- * Helper routines common to all service response time statistics taps.
- */
-
-/** Statistics table */
-typedef struct _gtk_srt_stat_table {
- GtkWidget *scrolled_window; /**< window widget */
- GtkTreeView *table; /**< Tree view */
- GtkWidget *menu; /**< context menu */
- srt_stat_table stat_table;
-} gtk_srt_stat_table;
-
-typedef struct _gtk_srt_table_t {
- GtkTreeView *table; /**< Tree view */
- GtkWidget *scrolled_window; /**< window widget */
- GtkWidget *menu; /**< context menu */
- srt_stat_table* rst; /**< Used to match tables with its GUI data */
-} gtk_srt_table_t;
-
-typedef struct _gtk_srt_t {
- GtkWidget *vbox;
- GtkWidget *win;
- GtkWidget *main_nb; /** Used for tab displays */
- GArray *gtk_srt_array; /**< array of gtk_srt_table_t */
-} gtk_srt_t;
-
-/** Init an srt table data structure.
- *
- * @param rst the srt table to init
- * @param gui_data contains GTK specific data
- */
-void init_gtk_srt_table(srt_stat_table* rst, void* gui_data);
-
-/** Draw the srt table data.
- *
- * @param rst the srt table
- * @param gtk_data contains GTK specific data
- */
-void draw_srt_table_data(srt_stat_table *rst, gtk_srt_t* gtk_data);
-
-/** Clean up memory of the srt table.
- *
- * @param rst the srt table
- * @param gui_data contains GTK specific data
- */
-void free_table_data(srt_stat_table* rst, void* gui_data);
-
-/** Reset srt table data.
- * Called when a tap listener is reset
- *
- * @param rst the srt table
- * @param gui_data contains GTK specific data
- */
-void reset_table_data(srt_stat_table* rst, void* gui_data);
-
-/** Register function to register dissectors that support SRT for GTK.
- *
- * @param key is unused
- * @param value register_srt_t* representing dissetor SRT table
- * @param userdata is unused
- */
-gboolean register_service_response_tables(const void *key, void *value, void *userdata);
-
-#endif /* __SERVICE_RESPONSE_TIME_TABLE_H__ */
diff --git a/ui/gtk/simple_dialog.c b/ui/gtk/simple_dialog.c
deleted file mode 100644
index 00b4a32af6..0000000000
--- a/ui/gtk/simple_dialog.c
+++ /dev/null
@@ -1,567 +0,0 @@
-/* simple_dialog.c
- * Simple message dialog box routines.
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <gtk/gtk.h>
-
-#include "epan/strutil.h"
-
-#include "wsutil/utf8_entities.h"
-
-#include "simple_dialog.h"
-
-#include "gtkglobals.h"
-#include "dlg_utils.h"
-#include "gui_utils.h"
-#include "stock_icons.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-
-static void simple_dialog_cancel_cb(GtkWidget *, gpointer);
-
-#define CALLBACK_FCT_KEY "ESD_Callback_Fct"
-#define CALLBACK_BTN_KEY "ESD_Callback_Btn"
-#define CALLBACK_DATA_KEY "ESD_Callback_Data"
-#define CHECK_BUTTON "ESD_Check_Button"
-
-/*
- * Queue for messages requested before we have a main window.
- */
-typedef struct {
- gint type;
- gint btn_mask;
- char *message;
-} queued_message_t;
-
-static GSList *message_queue;
-
-static GtkWidget *
-display_simple_dialog(gint type, gint btn_mask, char *message)
-{
- GtkWidget *win, *main_vb, *top_hb, *msg_vb, *type_pm, *msg_label, *ask_cb,
- *bbox, *ok_bt, *yes_bt, *bt, *save_bt, *dont_save_bt;
-
- /* Main window */
- switch (type) {
- case ESD_TYPE_WARN :
- type_pm = ws_gtk_image_new_from_stock( GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG);
- break;
- case ESD_TYPE_CONFIRMATION:
- type_pm = ws_gtk_image_new_from_stock( GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG);
- break;
- case ESD_TYPE_ERROR:
- type_pm = ws_gtk_image_new_from_stock( GTK_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_DIALOG);
- break;
- case ESD_TYPE_STOP :
- type_pm = ws_gtk_image_new_from_stock( GTK_STOCK_STOP, GTK_ICON_SIZE_DIALOG);
- break;
- case ESD_TYPE_INFO :
- default :
- type_pm = ws_gtk_image_new_from_stock( GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG);
- break;
- }
-
- /*
- * The GNOME HIG:
- *
- * http://developer.gnome.org/projects/gup/hig/1.0/windows.html#alert-windows
- *
- * says that the title should be empty for alert boxes, so there's "less
- * visual noise and confounding text."
- *
- * The Windows HIG:
- *
- * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwue/html/ch09f.asp
- *
- * says it should
- *
- * ...appropriately identify the source of the message -- usually
- * the name of the object. For example, if the message results
- * from editing a document, the title text is the name of the
- * document, optionally followed by the application name. If the
- * message results from a non-document object, then use the
- * application name."
- *
- * and notes that the title is important "because message boxes might
- * not always the the result of current user interaction" (e.g., some
- * app might randomly pop something up, e.g. some browser letting you
- * know that it couldn't fetch something because of a timeout).
- *
- * It also says not to use "warning" or "caution", as there's already
- * an icon that tells you what type of alert it is, and that you
- * shouldn't say "error", as that provides no useful information.
- *
- * So we give it a title on Win32, and don't give it one on UN*X.
- * For now, we give it a Win32 title of just "Wireshark"; we should
- * arguably take an argument for the title.
- */
- if(btn_mask == ESD_BTN_NONE) {
- win = splash_window_new();
- } else {
-#ifdef _WIN32
- win = dlg_window_new("Wireshark");
-#else
- win = dlg_window_new("");
-#endif
- }
-
- gtk_window_set_modal(GTK_WINDOW(win), TRUE);
- gtk_container_set_border_width(GTK_CONTAINER(win), 6);
-
- /* Container for our rows */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 12, FALSE);
- gtk_container_add(GTK_CONTAINER(win), main_vb);
- gtk_widget_show(main_vb);
-
- /* Top row: Icon and message text */
- top_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 6);
- gtk_box_pack_start(GTK_BOX(main_vb), top_hb, TRUE, TRUE, 0);
- gtk_widget_show(top_hb);
-
- gtk_misc_set_alignment (GTK_MISC (type_pm), 0.5f, 0.0f);
- gtk_box_pack_start(GTK_BOX(top_hb), type_pm, TRUE, TRUE, 0);
- gtk_widget_show(type_pm);
-
- /* column for message and optional check button */
- msg_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
- gtk_box_set_spacing(GTK_BOX(msg_vb), 24);
- gtk_box_pack_start(GTK_BOX(top_hb), msg_vb, TRUE, TRUE, 0);
- gtk_widget_show(msg_vb);
-
- /* message */
- msg_label = gtk_label_new(message);
-
- gtk_label_set_markup(GTK_LABEL(msg_label), message);
- gtk_label_set_selectable(GTK_LABEL(msg_label), TRUE);
- g_object_set(gtk_widget_get_settings(msg_label),
- "gtk-label-select-on-focus", FALSE, NULL);
-
- gtk_label_set_justify(GTK_LABEL(msg_label), GTK_JUSTIFY_FILL);
- gtk_misc_set_alignment (GTK_MISC (type_pm), 0.5f, 0.0f);
- gtk_box_pack_start(GTK_BOX(msg_vb), msg_label, TRUE, TRUE, 0);
- gtk_label_set_line_wrap(GTK_LABEL(msg_label), TRUE);
- gtk_widget_show(msg_label);
-
- if(btn_mask == ESD_BTN_NONE) {
- gtk_widget_show(win);
- return win;
- }
-
- /* optional check button */
- ask_cb = gtk_check_button_new_with_label("replace with text...");
- gtk_box_pack_start(GTK_BOX(msg_vb), ask_cb, TRUE, TRUE, 0);
- g_object_set_data(G_OBJECT(win), CHECK_BUTTON, ask_cb);
-
- /* Button row */
- switch(btn_mask) {
- case(ESD_BTN_OK):
- bbox = dlg_button_row_new(GTK_STOCK_OK, NULL);
- break;
- case(ESD_BTN_OK | ESD_BTN_CANCEL):
- bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CANCEL, NULL);
- break;
- case(ESD_BTN_CLEAR | ESD_BTN_CANCEL):
- bbox = dlg_button_row_new(GTK_STOCK_CLEAR, GTK_STOCK_CANCEL, NULL);
- break;
- case(ESD_BTNS_YES_NO_CANCEL):
- bbox = dlg_button_row_new(GTK_STOCK_YES, GTK_STOCK_NO, GTK_STOCK_CANCEL, NULL);
- break;
- case(ESD_BTNS_SAVE_DONTSAVE):
- bbox = dlg_button_row_new(GTK_STOCK_SAVE, WIRESHARK_STOCK_DONT_SAVE, NULL);
- break;
- case(ESD_BTNS_SAVE_DONTSAVE_CANCEL):
- bbox = dlg_button_row_new(GTK_STOCK_SAVE, WIRESHARK_STOCK_DONT_SAVE, GTK_STOCK_CANCEL, NULL);
- break;
- case(ESD_BTNS_SAVE_QUIT_DONTSAVE_CANCEL):
- bbox = dlg_button_row_new(GTK_STOCK_SAVE, WIRESHARK_STOCK_QUIT_DONT_SAVE, GTK_STOCK_CANCEL, NULL);
- break;
- case (ESD_BTNS_QUIT_DONTSAVE_CANCEL):
- bbox = dlg_button_row_new(WIRESHARK_STOCK_QUIT_DONT_SAVE, GTK_STOCK_CANCEL, NULL);
- break;
- case(ESD_BTNS_YES_NO):
- bbox = dlg_button_row_new(GTK_STOCK_YES, GTK_STOCK_NO, NULL);
- break;
- default:
- g_assert_not_reached();
- bbox = NULL;
- break;
- }
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, TRUE, TRUE, 0);
- gtk_widget_show(bbox);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- if(ok_bt) {
- g_object_set_data(G_OBJECT(ok_bt), CALLBACK_BTN_KEY, GINT_TO_POINTER(ESD_BTN_OK));
- g_signal_connect(ok_bt, "clicked", G_CALLBACK(simple_dialog_cancel_cb), win);
- }
-
- save_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_SAVE);
- if (save_bt) {
- g_object_set_data(G_OBJECT(save_bt), CALLBACK_BTN_KEY, GINT_TO_POINTER(ESD_BTN_SAVE));
- g_signal_connect(save_bt, "clicked", G_CALLBACK(simple_dialog_cancel_cb), win);
- }
-
- dont_save_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_DONT_SAVE);
- if (dont_save_bt) {
- g_object_set_data(G_OBJECT(dont_save_bt), CALLBACK_BTN_KEY, GINT_TO_POINTER(ESD_BTN_DONT_SAVE));
- g_signal_connect(dont_save_bt, "clicked", G_CALLBACK(simple_dialog_cancel_cb), win);
- }
-
- dont_save_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_QUIT_DONT_SAVE);
- if (dont_save_bt) {
- g_object_set_data(G_OBJECT(dont_save_bt), CALLBACK_BTN_KEY, GINT_TO_POINTER(ESD_BTN_QUIT_DONT_SAVE));
- g_signal_connect(dont_save_bt, "clicked", G_CALLBACK(simple_dialog_cancel_cb), win);
- }
- bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLEAR);
- if(bt) {
- g_object_set_data(G_OBJECT(bt), CALLBACK_BTN_KEY, GINT_TO_POINTER(ESD_BTN_CLEAR));
- g_signal_connect(bt, "clicked", G_CALLBACK(simple_dialog_cancel_cb), win);
- }
-
- yes_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_YES);
- if(yes_bt) {
- g_object_set_data(G_OBJECT(yes_bt), CALLBACK_BTN_KEY, GINT_TO_POINTER(ESD_BTN_YES));
- g_signal_connect(yes_bt, "clicked", G_CALLBACK(simple_dialog_cancel_cb), win);
- }
-
- bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_NO);
- if(bt) {
- g_object_set_data(G_OBJECT(bt), CALLBACK_BTN_KEY, GINT_TO_POINTER(ESD_BTN_NO));
- g_signal_connect(bt, "clicked", G_CALLBACK(simple_dialog_cancel_cb), win);
- }
-
- bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- if(bt) {
- g_object_set_data(G_OBJECT(bt), CALLBACK_BTN_KEY, GINT_TO_POINTER(ESD_BTN_CANCEL));
- window_set_cancel_button(win, bt, simple_dialog_cancel_cb);
- }
-
- if(!bt) {
- if(yes_bt) {
- window_set_cancel_button(win, yes_bt, simple_dialog_cancel_cb);
- } else if (ok_bt) {
- window_set_cancel_button(win, ok_bt, simple_dialog_cancel_cb);
- }
- }
-
- dlg_button_focus_nth(bbox, 0);
-
- gtk_widget_show(win);
-
- return win;
-}
-
-void
-display_queued_messages(void)
-{
- queued_message_t *queued_message;
-
- while (message_queue != NULL) {
- queued_message = (queued_message_t *)message_queue->data;
- message_queue = g_slist_remove(message_queue, queued_message);
-
- display_simple_dialog(queued_message->type, queued_message->btn_mask,
- queued_message->message);
-
- g_free(queued_message->message);
- g_free(queued_message);
- }
-}
-
-/* Simple dialog function - Displays a dialog box with the supplied message
- * text.
- *
- * Args:
- * type : One of ESD_TYPE_*.
- * btn_mask : The value passed in determines which buttons are displayed.
- * msg_format : Sprintf-style format of the text displayed in the dialog.
- * ... : Argument list for msg_format
- */
-
-static gpointer
-vsimple_dialog(ESD_TYPE_E type, gint btn_mask, const gchar *msg_format, va_list ap)
-{
- gchar *message;
- queued_message_t *queued_message;
- GtkWidget *win;
- GdkWindowState state = (GdkWindowState)0;
-
- /* Format the message. */
- message = g_strdup_vprintf(msg_format, ap);
-
- if (top_level != NULL) {
- state = gdk_window_get_state(gtk_widget_get_window(top_level));
- }
-
- /* If we don't yet have a main window or it's iconified or hidden (i.e. not
- yet ready, don't show the dialog. If showing up a dialog, while main
- window is iconified, program will become unresponsive! */
- if ((top_level == NULL) || state & GDK_WINDOW_STATE_ICONIFIED
- || state & GDK_WINDOW_STATE_WITHDRAWN) {
-
- queued_message = (queued_message_t *)g_malloc(sizeof (queued_message_t));
- queued_message->type = type;
- queued_message->btn_mask = btn_mask;
- queued_message->message = message;
- message_queue = g_slist_append(message_queue, queued_message);
- return NULL;
- }
-
- /*
- * Do we have any queued up messages? If so, pop them up.
- */
- display_queued_messages();
-
- win = display_simple_dialog(type, btn_mask, message);
-
- g_free(message);
-
- return win;
-}
-
-gpointer
-simple_dialog(ESD_TYPE_E type, gint btn_mask, const gchar *msg_format, ...)
-{
- va_list ap;
- gpointer ret;
-
- va_start(ap, msg_format);
- ret = vsimple_dialog(type, btn_mask, msg_format, ap);
- va_end(ap);
- return ret;
-}
-
-static void
-simple_dialog_cancel_cb(GtkWidget *w, gpointer win) {
- gint button = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w), CALLBACK_BTN_KEY));
- simple_dialog_cb_t callback_fct = (simple_dialog_cb_t)g_object_get_data(G_OBJECT(win), CALLBACK_FCT_KEY);
- gpointer data = g_object_get_data(G_OBJECT(win), CALLBACK_DATA_KEY);
-
- if (callback_fct)
- (callback_fct) (win, button, data);
-
- window_destroy(GTK_WIDGET(win));
-}
-
-void
-simple_dialog_close(gpointer dialog)
-{
- window_destroy(GTK_WIDGET(dialog));
-}
-
-void
-simple_dialog_set_cb(gpointer dialog, simple_dialog_cb_t callback_fct, gpointer data)
-{
-
- g_object_set_data(G_OBJECT(GTK_WIDGET(dialog)), CALLBACK_FCT_KEY, callback_fct);
- g_object_set_data(G_OBJECT(GTK_WIDGET(dialog)), CALLBACK_DATA_KEY, data);
-}
-
-void
-simple_dialog_check_set(gpointer dialog, const gchar *text) {
- GtkWidget *ask_cb = (GtkWidget *)g_object_get_data(G_OBJECT(dialog), CHECK_BUTTON);
-
- gtk_button_set_label(GTK_BUTTON(ask_cb), text);
- gtk_widget_show(ask_cb);
-}
-
-gboolean
-simple_dialog_check_get(gpointer dialog) {
- GtkWidget *ask_cb = (GtkWidget *)g_object_get_data(G_OBJECT(GTK_WIDGET(dialog)), CHECK_BUTTON);
-
- return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ask_cb));
-}
-
-const char *
-simple_dialog_primary_start(void) {
- return "<span weight=\"bold\" size=\"larger\">";
-}
-
-const char *
-simple_dialog_primary_end(void) {
- return "</span>";
-}
-
-char *
-simple_dialog_format_message(const char *msg)
-{
- char *str;
-
- if (msg) {
- str = xml_escape(msg);
- } else {
- str = NULL;
- }
- return str;
-}
-
-#define MAX_MESSAGE_LEN 200
-#define MAX_SECONDARY_MESSAGE_LEN 500
-static void
-do_simple_message_box(ESD_TYPE_E type, gboolean *notagain,
- const char *secondary_msg, const char *msg_format,
- va_list ap)
-{
- GtkMessageType gtk_message_type;
- GString *message = g_string_new("");
- GtkWidget *msg_dialog;
- GtkWidget *checkbox = NULL;
-
- if (notagain != NULL) {
- if (*notagain) {
- /*
- * The user had checked the "Don't show this message again" checkbox
- * in the past; don't bother showing it.
- */
- return;
- }
- }
-
- switch (type) {
-
- case ESD_TYPE_INFO:
- gtk_message_type = GTK_MESSAGE_INFO;
- break;
-
- case ESD_TYPE_WARN:
- gtk_message_type = GTK_MESSAGE_WARNING;
- break;
-
- case ESD_TYPE_ERROR:
- gtk_message_type = GTK_MESSAGE_ERROR;
- break;
-
- default:
- g_assert_not_reached();
- gtk_message_type = GTK_MESSAGE_INFO;
- break;
- }
-
- /* Format the message. */
- g_string_vprintf(message, msg_format, ap);
-
- if (g_utf8_strlen(message->str, message->len) > MAX_MESSAGE_LEN) {
- const gchar *end = message->str + MAX_MESSAGE_LEN;
- g_utf8_validate(message->str, MAX_MESSAGE_LEN, &end);
- g_string_truncate(message, end - message->str);
- g_string_append(message, UTF8_HORIZONTAL_ELLIPSIS);
- }
-
- msg_dialog = gtk_message_dialog_new(GTK_WINDOW(top_level),
- (GtkDialogFlags)(GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT),
- gtk_message_type,
- GTK_BUTTONS_OK,
- "%s", message->str);
-
- if (secondary_msg != NULL) {
- g_string_overwrite(message, 0, secondary_msg);
- if (g_utf8_strlen(message->str, message->len) > MAX_SECONDARY_MESSAGE_LEN) {
- const gchar *end = message->str + MAX_SECONDARY_MESSAGE_LEN;
- g_utf8_validate(message->str, MAX_SECONDARY_MESSAGE_LEN, &end);
- g_string_truncate(message, end - message->str);
- g_string_append(message, UTF8_HORIZONTAL_ELLIPSIS);
- }
- gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(msg_dialog),
- "%s", message->str);
- }
-
- g_string_free(message, TRUE);
-
- if (notagain != NULL) {
- checkbox = gtk_check_button_new_with_label("Don't show this message again.");
- gtk_container_set_border_width(GTK_CONTAINER(checkbox), 12);
- gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(msg_dialog))),
- checkbox, TRUE, TRUE, 0);
- gtk_widget_show(checkbox);
- }
-
- gtk_dialog_run(GTK_DIALOG(msg_dialog));
- if (notagain != NULL) {
- /*
- * OK, did they check the checkbox?
- */
- *notagain = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbox));
- }
- gtk_widget_destroy(msg_dialog);
-}
-
-/*
- * Alert box, with optional "don't show this message again" variable
- * and checkbox, and optional secondary text.
- */
-void
-simple_message_box(ESD_TYPE_E type, gboolean *notagain,
- const char *secondary_msg, const char *msg_format, ...)
-{
- va_list ap;
-
- va_start(ap, msg_format);
- do_simple_message_box(type, notagain, secondary_msg, msg_format, ap);
- va_end(ap);
-}
-
-/*
- * Error alert box, taking a format and a va_list argument.
- */
-void
-vsimple_error_message_box(const char *msg_format, va_list ap)
-{
- do_simple_message_box(ESD_TYPE_ERROR, NULL, NULL, msg_format, ap);
-}
-
-/*
- * Error alert box, taking a format and a list of arguments.
- */
-void
-simple_error_message_box(const char *msg_format, ...)
-{
- va_list ap;
-
- va_start(ap, msg_format);
- do_simple_message_box(ESD_TYPE_ERROR, NULL, NULL, msg_format, ap);
- va_end(ap);
-}
-
-/*
- * Warning alert box, taking a format and a va_list argument.
- */
-void
-vsimple_warning_message_box(const char *msg_format, va_list ap)
-{
- do_simple_message_box(ESD_TYPE_WARN, NULL, NULL, msg_format, ap);
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local Variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/simple_dialog.h b/ui/gtk/simple_dialog.h
deleted file mode 100644
index e33fdd7e2c..0000000000
--- a/ui/gtk/simple_dialog.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/* simple_dialog.h
- * Definitions for alert box routines with toolkit-independent APIs but
- * toolkit-dependent implementations.
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __SIMPLE_DIALOG_H__
-#define __SIMPLE_DIALOG_H__
-
-#include "ui/simple_dialog.h"
-
-/** @file
- * Simple dialog box.
- * @ingroup dialog_group
- */
-
-/** Callback function type for simple_dialog_set_cb() */
-typedef void (* simple_dialog_cb_t) (gpointer dialog, gint btn, gpointer data);
-
-/** Set the callback function for the dialog, called when a button was pressed.
- *
- * @param dialog the dialog from simple_dialog()
- * @param callback_fct the callback function to set
- * @param data data to be passed to the callback function
- */
-extern void simple_dialog_set_cb(gpointer dialog, simple_dialog_cb_t callback_fct, gpointer data);
-
-/** Close the dialog, useful for "no button" dialogs.
- *
- * @param dialog the dialog to close from simple_dialog()
- */
-extern void simple_dialog_close(gpointer dialog);
-
-/** Add a check button to the dialog (e.g. "Don't show this message again")
- *
- * @param dialog the dialog from simple_dialog()
- * @param text the text to display
- */
-extern void simple_dialog_check_set(gpointer dialog, const gchar *text);
-
-/** Get the check buttons state.
- *
- * @param dialog the dialog from simple_dialog()
- * @return current button state (TRUE is checked)
- */
-extern gboolean simple_dialog_check_get(gpointer dialog);
-
-/**
- * Display all queued messages.
- * If a routine is called to display a dialog before there are any windows
- * open, information to use to display the dialog is queued up. This
- * routine should be called once there are windows open, so that the queued
- * up dialogs are displayed on top of those windows.
- */
-extern void display_queued_messages(void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __SIMPLE_DIALOG_H__ */
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/simple_stattable.c b/ui/gtk/simple_stattable.c
deleted file mode 100644
index bcf7681c37..0000000000
--- a/ui/gtk/simple_stattable.c
+++ /dev/null
@@ -1,303 +0,0 @@
-/* simple_stattable.c
- *
- * Based on response_time_delay_table.c
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <gtk/gtk.h>
-
-#include "epan/packet_info.h"
-#include "epan/proto.h"
-#include <epan/stat_tap_ui.h>
-
-#include "ui/simple_dialog.h"
-#include <wsutil/utf8_entities.h>
-
-#include "ui/gtk/filter_utils.h"
-#include "ui/gtk/gui_stat_util.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/simple_stattable.h"
-#include "ui/gtk/tap_param_dlg.h"
-#include "ui/gtk/main.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-#include "globals.h"
-
-typedef struct _gtk_simplestat_t {
- GtkWidget *vbox;
- GtkWidget *win;
- GtkTreeView *table; /**< Tree view */
- GtkWidget *scrolled_window; /**< window widget */
- GtkWidget *menu; /**< context menu */
-} gtk_simplestat_t_t;
-
-typedef struct _simple_stat_t {
- const char *filter;
- gtk_simplestat_t_t gtk_data;
- stat_tap_table_ui *stat_tap;
- stat_data_t data;
-} simple_stat_t;
-
-static void
-win_destroy_cb(GtkWindow *win _U_, gpointer data)
-{
- simple_stat_t *ss = (simple_stat_t*)data;
-
- remove_tap_listener(&ss->data);
-
- free_stat_tables(ss->stat_tap, NULL, NULL);
-
- g_free(ss);
-}
-
-static void
-init_gtk_simple_stat_table(stat_tap_table* stat_table, void* gui_data)
-{
- guint i;
- stat_data_t* stat_data = (stat_data_t*)gui_data;
- simple_stat_t *ss = (simple_stat_t*)stat_data->user_data;
- stat_column *start_columns = g_new(stat_column, stat_table->num_fields),
- *columns;
- stat_tap_table_item* field;
- GType gtk_type;
-
- /* XXX - Use # columns/fields, etc to compute a better value */
- gtk_window_set_default_size(GTK_WINDOW(ss->gtk_data.win), 600, 300);
-
- for (i = 0, columns = start_columns, field = stat_data->stat_tap_data->fields;
- i < stat_table->num_fields;
- i++, columns++, field++)
- {
- switch(field->type)
- {
- case TABLE_ITEM_UINT:
- gtk_type = G_TYPE_UINT;
- break;
- case TABLE_ITEM_INT:
- gtk_type = G_TYPE_INT;
- break;
- case TABLE_ITEM_STRING:
- gtk_type = G_TYPE_STRING;
- break;
- case TABLE_ITEM_FLOAT:
- gtk_type = G_TYPE_FLOAT;
- break;
- case TABLE_ITEM_ENUM:
- gtk_type = G_TYPE_ENUM;
- break;
- default:
- g_assert(FALSE);
- return;
- }
- columns->type = gtk_type;
- columns->align = field->align;
- columns->title = field->column_name;
- }
-
- ss->gtk_data.table = create_stat_table(ss->gtk_data.scrolled_window, ss->gtk_data.vbox, stat_table->num_fields, start_columns);
- g_free(start_columns);
-}
-
-static void
-simple_stat_draw(void *arg)
-{
- GtkListStore *store;
- stat_data_t *stats = (stat_data_t*)arg;
- simple_stat_t *ss = (simple_stat_t*)stats->user_data;
- stat_tap_table* table;
- stat_tap_table_item* field;
- stat_tap_table_item_type* field_data;
- GtkTreeIter iter;
- guint table_index = 0, element, field_index;
-
- /* clear list before printing */
- store = GTK_LIST_STORE(gtk_tree_view_get_model(ss->gtk_data.table));
- gtk_list_store_clear(store);
-
- /* XXX - Only support a single table at the moment */
- table = g_array_index(stats->stat_tap_data->tables, stat_tap_table*, table_index);
-
- for (element = 0; element < table->num_elements; element++)
- {
- field_index = 0;
- field_data = stat_tap_get_field_data(table, element, field_index);
- if (field_data->type == TABLE_ITEM_NONE) /* Nothing for us here */
- continue;
-
- gtk_list_store_append(store, &iter);
-
- for (field = stats->stat_tap_data->fields; field_index < table->num_fields; field_index++, field++)
- {
- field_data = stat_tap_get_field_data(table, element, field_index);
-
- switch(field_data->type)
- {
- case TABLE_ITEM_UINT:
- gtk_list_store_set(store, &iter, field_index, field_data->value.uint_value, -1);
- break;
- case TABLE_ITEM_INT:
- gtk_list_store_set(store, &iter, field_index, field_data->value.int_value, -1);
- break;
- case TABLE_ITEM_STRING:
- gtk_list_store_set(store, &iter, field_index, field_data->value.string_value, -1);
- break;
- case TABLE_ITEM_FLOAT:
- gtk_list_store_set(store, &iter, field_index, field_data->value.float_value, -1);
- break;
- case TABLE_ITEM_ENUM:
- gtk_list_store_set(store, &iter, field_index, field_data->value.enum_value, -1);
- break;
- case TABLE_ITEM_NONE:
- break;
- }
- }
- }
-}
-
-static void
-reset_table_data(stat_tap_table* table _U_, void* gui_data)
-{
- GtkListStore *store;
- gtk_simplestat_t_t* gtk_data = (gtk_simplestat_t_t*)gui_data;
-
- store = GTK_LIST_STORE(gtk_tree_view_get_model(gtk_data->table));
- gtk_list_store_clear(store);
-}
-
-static void
-simple_stat_reset(void *arg)
-{
- stat_data_t *stats = (stat_data_t*)arg;
- simple_stat_t *ss = (simple_stat_t*)stats->user_data;
-
- reset_stat_table(stats->stat_tap_data, reset_table_data, &ss->gtk_data);
-
- set_window_title(ss->gtk_data.win, ss->stat_tap->title);
-}
-
-static void
-init_simple_stat_tables(stat_tap_table_ui *stat_tap, const char *filter)
-{
- simple_stat_t *ss;
- GString *error_string;
- GtkWidget *bbox;
- GtkWidget *close_bt;
-
- ss = g_new0(simple_stat_t, 1);
-
- ss->gtk_data.win=dlg_window_new(stat_tap->title); /* transient_for top_level */
- gtk_window_set_destroy_with_parent (GTK_WINDOW(ss->gtk_data.win), TRUE);
-
- ss->gtk_data.vbox=ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
-
- init_main_stat_window(ss->gtk_data.win, ss->gtk_data.vbox, stat_tap->title, filter);
-
- /* init a scrolled window*/
- ss->gtk_data.scrolled_window = scrolled_window_new(NULL, NULL);
-
- ss->filter = g_strdup(filter);
- ss->stat_tap = stat_tap;
- ss->data.stat_tap_data = stat_tap;
- ss->data.user_data = ss;
-
- stat_tap->stat_tap_init_cb(stat_tap, init_gtk_simple_stat_table, &ss->data);
-
- error_string = register_tap_listener(stat_tap->tap_name, &ss->data, filter, 0, simple_stat_reset, stat_tap->packet_func, simple_stat_draw);
- if(error_string){
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
- g_string_free(error_string, TRUE);
- free_stat_tables(ss->stat_tap, NULL, NULL);
- g_free(ss);
- return;
- }
-
- /* Button row. */
- bbox = dlg_button_row_new(GTK_STOCK_CLOSE, NULL);
- gtk_box_pack_end(GTK_BOX(ss->gtk_data.vbox), bbox, FALSE, FALSE, 0);
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(ss->gtk_data.win, close_bt, window_cancel_button_cb);
-
- g_signal_connect(ss->gtk_data.win, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(ss->gtk_data.win, "destroy", G_CALLBACK(win_destroy_cb), ss);
-
- gtk_widget_show_all(ss->gtk_data.win);
- window_present(ss->gtk_data.win);
-
- cf_retap_packets(&cfile);
- gdk_window_raise(gtk_widget_get_window(ss->gtk_data.win));
-}
-
-static void
-gtk_simple_stat_init(const char *opt_arg, void *userdata)
-{
- stat_tap_table_ui *stat_tap = (stat_tap_table_ui*)userdata;
- const char *filter=NULL;
- char* err;
-
- stat_tap_get_filter(stat_tap, opt_arg, &filter, &err);
-
- if (err != NULL)
- {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err);
- g_free(err);
- return;
- }
-
- init_simple_stat_tables(stat_tap, filter);
-}
-
-gboolean register_simple_stat_tables(const void *key, void *value, void *userdata _U_)
-{
- stat_tap_table_ui *stat_tap = (stat_tap_table_ui*)value;
- tap_param_dlg* stat_dlg;
-
- stat_dlg = g_new(tap_param_dlg, 1);
-
- stat_dlg->win_title = stat_tap->title;
- stat_dlg->init_string = (const char*)key;
- stat_dlg->tap_init_cb = gtk_simple_stat_init;
- stat_dlg->index = -1;
-
- stat_dlg->nparams = stat_tap->nparams;
- stat_dlg->params = stat_tap->params;
-
- stat_dlg->user_data = stat_tap;
-
- register_param_stat(stat_dlg, stat_tap->title, stat_tap->group);
- return FALSE;
-}
-
-/*
- * Editor modelines - http://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/gtk/simple_stattable.h b/ui/gtk/simple_stattable.h
deleted file mode 100644
index 24d7c8174f..0000000000
--- a/ui/gtk/simple_stattable.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* simple_stattable.h
- *
- * Based on response_time_delay_table.h
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __SIMPLE_STAT_TABLE_H__
-#define __SIMPLE_STAT_TABLE_H__
-
-#include <gtk/gtk.h>
-#include "epan/stat_tap_ui.h"
-
-/** Register function to register dissectors that support a "simple" statistics table.
- *
- * @param key is tap string
- * @param value stat_tap_table_ui* representing dissetor stat table
- * @param userdata is unused
- */
-gboolean register_simple_stat_tables(const void *key, void *value, void *userdata);
-
-#endif /* __SIMPLE_STAT_TABLE_H__ */
diff --git a/ui/gtk/stats_tree_stat.c b/ui/gtk/stats_tree_stat.c
deleted file mode 100644
index 9be6bbdd07..0000000000
--- a/ui/gtk/stats_tree_stat.c
+++ /dev/null
@@ -1,618 +0,0 @@
-/* stats_tree_stat.c
- * GTK Tap implementation of stats_tree
- * 2005, Luis E. G. Ontanon
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/* stats_tree modifications by Deon van der Westhuysen, November 2013
- * support for
- * - sorting by column,
- * - display a generic number of columns(driven by stats_tree.c
- * - copy to clipboard
- * - export to text, CSV or XML file
- */
-
-#include "config.h"
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <wsutil/report_message.h>
-#include <wsutil/file_util.h>
-
-#include <epan/stats_tree_priv.h>
-
-#include "ui/simple_dialog.h"
-
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/file_dlg.h"
-#include "ui/gtk/tap_param_dlg.h"
-#include "ui/gtk/main.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-#include "ui/gtk/gui_stat_menu.h"
-
-
-#ifdef _WIN32
-#define USE_WIN32_FILE_DIALOGS
-#endif
-
-#ifdef USE_WIN32_FILE_DIALOGS
-#include <gdk/gdkwin32.h>
-#include <windows.h>
-#include "ui/win32/file_dlg_win32.h"
-#endif
-
-#include "globals.h"
-
-void register_tap_listener_stats_tree_stat(void);
-
-struct _st_node_pres {
- GtkTreeIter *iter;
-};
-
-struct _tree_cfg_pres {
- tap_param_dlg *stat_dlg;
-};
-
-struct _tree_pres {
- GString* text;
- GtkWidget *win;
- GtkTreeStore *store;
- GtkWidget* tree;
-};
-
-/* Define fixed column indexes */
-#define NODEPTR_COLUMN 0 /* Always first column */
-#define N_RESERVED_COL 1 /* Number of columns for internal use - added before visible cols */
-
-
-static void
-draw_gtk_node(stat_node* node)
-{
- GtkTreeIter *parent = NULL;
- stat_node *child;
- int num_columns = node->st->num_columns+N_RESERVED_COL;
- gint *columns = (gint*) g_malloc(sizeof(gint)*num_columns);
- GValue *values = (GValue*) g_malloc0(sizeof(GValue)*num_columns);
- gchar **valstrs = stats_tree_get_values_from_node(node);
- int count;
-
- columns[0]= 0;
- g_value_init(values, G_TYPE_POINTER);
- g_value_set_pointer(values, node);
- for (count = N_RESERVED_COL; count<num_columns; count++) {
- columns[count]= count;
- g_value_init(values+count, G_TYPE_STRING);
- g_value_take_string (values+count,valstrs[count-N_RESERVED_COL]);
- }
-
- if (!node->pr) {
- node->pr = (st_node_pres *)g_malloc(sizeof(st_node_pres));
-
- if (node->st->pr->store) {
- node->pr->iter = (GtkTreeIter *)g_malloc0(sizeof(GtkTreeIter));
-
- if ( node->parent && node->parent->pr ) {
- parent = node->parent->pr->iter;
- }
- gtk_tree_store_append (node->st->pr->store, node->pr->iter, parent);
- gtk_tree_store_set_valuesv(node->st->pr->store, node->pr->iter,
- columns, values, num_columns);
- }
- }
- if (node->st->pr->store && node->pr->iter) {
- /* skip reserved columns and first entry in the stats_tree values */
- /* list (the node name). These should already be set and static. */
- gtk_tree_store_set_valuesv(node->st->pr->store, node->pr->iter,
- columns+N_RESERVED_COL+1, values+N_RESERVED_COL+1,
- num_columns-N_RESERVED_COL-1);
- }
-
- for (count = 0; count<num_columns; count++) {
- g_value_unset(values+count);
- }
- g_free(columns);
- g_free(values);
- g_free(valstrs);
-
- if (node->children) {
- for (child = node->children; child; child = child->next )
- draw_gtk_node(child);
- }
-
-}
-
-static void
-draw_gtk_tree(void *psp)
-{
- stats_tree *st = (stats_tree *)psp;
- stat_node *child;
- int count;
- gint sort_column = GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID;
- GtkSortType order = GTK_SORT_DESCENDING;
-
- for (count = 0; count<st->num_columns; count++) {
- gtk_tree_view_column_set_title(gtk_tree_view_get_column(GTK_TREE_VIEW(st->pr->tree),count),
- stats_tree_get_column_name(count));
- }
-
- gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (st->pr->store), &sort_column, &order);
- gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (st->pr->store),
- GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, GTK_SORT_DESCENDING);
-
- for (child = st->root.children; child; child = child->next ) {
- draw_gtk_node(child);
-
- if ( (!(child->st_flags&ST_FLG_DEF_NOEXPAND)) && child->pr->iter && st->pr->store ) {
- gtk_tree_view_expand_row(GTK_TREE_VIEW(st->pr->tree),
- gtk_tree_model_get_path(GTK_TREE_MODEL(st->pr->store),child->pr->iter),
- FALSE);
- }
- }
-
- if ((sort_column==GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID)||
- (sort_column==GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID)) {
- sort_column= stats_tree_get_default_sort_col(st)+N_RESERVED_COL;
- order= stats_tree_is_default_sort_DESC(st)?GTK_SORT_DESCENDING:GTK_SORT_ASCENDING;
- }
-
- /* Only call this once the entire list is drawn - else Gtk seems */
- /* to get sorting order wrong (sorting broken when new nodes are */
- /* added after setting sort column.) Also for performance. */
- gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (st->pr->store), sort_column, order);
-}
-
-static gboolean
-copy_tree_to_clipboard
-(GtkWidget *win _U_, stats_tree *st)
-{
- gint sort_column = N_RESERVED_COL; /* default */
- GtkSortType order = GTK_SORT_DESCENDING;
- GString *s;
-
- gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (st->pr->store), &sort_column, &order);
- s= stats_tree_format_as_str(st,ST_FORMAT_PLAIN,sort_column-N_RESERVED_COL,order==GTK_SORT_DESCENDING);
- copy_to_clipboard(s);
- g_string_free (s,TRUE);
-
- return TRUE;
-}
-
-
-#ifndef USE_WIN32_FILE_DIALOGS
-static gboolean
-gtk_save_as_statstree(GtkWidget *win, GString *file_name, int *file_type)
-{
- GtkWidget *saveas_w;
- GtkWidget *main_vb;
- GtkWidget *ft_hb, *ft_lb, *ft_combo_box;
- char *st_name;
- gpointer ptr;
-
- saveas_w = file_selection_new("Wireshark: Save stats tree as ...",
- GTK_WINDOW(win), FILE_SELECTION_SAVE);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 5, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
- file_selection_set_extra_widget(saveas_w, main_vb);
- gtk_widget_show(main_vb);
-
- /* File type row */
- ft_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(main_vb), ft_hb, FALSE, FALSE, 0);
- gtk_widget_show(ft_hb);
-
- ft_lb = gtk_label_new("Save as format:");
- gtk_box_pack_start(GTK_BOX(ft_hb), ft_lb, FALSE, FALSE, 0);
- gtk_widget_show(ft_lb);
-
- ft_combo_box = ws_combo_box_new_text_and_pointer();
- ws_combo_box_append_text_and_pointer(GTK_COMBO_BOX(ft_combo_box), "Plain text file (.txt)", GINT_TO_POINTER(ST_FORMAT_PLAIN));
- ws_combo_box_append_text_and_pointer(GTK_COMBO_BOX(ft_combo_box), "Comma separated values (.csv)", GINT_TO_POINTER(ST_FORMAT_CSV));
- ws_combo_box_append_text_and_pointer(GTK_COMBO_BOX(ft_combo_box), "XML document (.xml)", GINT_TO_POINTER(ST_FORMAT_XML));
- ws_combo_box_append_text_and_pointer(GTK_COMBO_BOX(ft_combo_box), "YAML document (.yaml)", GINT_TO_POINTER(ST_FORMAT_YAML));
-
- gtk_box_pack_start(GTK_BOX(ft_hb), ft_combo_box, FALSE, FALSE, 0);
- gtk_widget_show(ft_combo_box);
- ws_combo_box_set_active(GTK_COMBO_BOX(ft_combo_box), 0);
-
- st_name = file_selection_run(saveas_w);
- if (st_name == NULL) {
- /* User cancelled or closed the dialog. */
- return FALSE;
- }
-
- if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(ft_combo_box), &ptr)) {
- g_assert_not_reached(); /* Programming error: somehow nothing is active */
- }
-
- /* Save result from dialog box */
- *file_type = GPOINTER_TO_INT(ptr);
- g_string_printf(file_name, "%s", st_name);
-
- /* We've crossed the Rubicon; get rid of the file save-as box. */
- window_destroy(GTK_WIDGET(saveas_w));
- g_free(st_name);
- return TRUE;
-}
-#endif /* USE_WIN32_FILE_DIALOGS */
-
-static gboolean
-save_as_dialog(GtkWidget *win _U_, stats_tree *st)
-{
- gint sort_column = 1; /* default */
- GtkSortType order = GTK_SORT_DESCENDING;
- GString *str_tree;
- GString *file_name = g_string_new("");
- int file_type;
- gchar *file_name_lower;
- const gchar *file_ext;
- FILE *f;
- gboolean success = FALSE;
- int last_errno;
-
-#ifdef USE_WIN32_FILE_DIALOGS
- if (win32_save_as_statstree(GDK_WINDOW_HWND(gtk_widget_get_window(st->pr->win)),
- file_name, &file_type)) {
-#else /* USE_WIN32_FILE_DIALOGS */
- if (gtk_save_as_statstree(st->pr->win,file_name,&file_type)) {
-#endif /* USE_WIN32_FILE_DIALOGS */
-
- /* add file extension as required */
- file_name_lower = g_utf8_strdown(file_name->str, -1);
- switch (file_type) {
- case ST_FORMAT_YAML: file_ext = ".yaml";
- break;
- case ST_FORMAT_XML: file_ext = ".xml";
- break;
- case ST_FORMAT_CSV: file_ext = ".csv";
- break;
- default: file_ext = ".txt";
- break;
- }
- if (!g_str_has_suffix(file_name_lower, file_ext)) {
- /* Must add extenstion */
- g_string_append(file_name,file_ext);
- }
- g_free(file_name_lower);
-
- gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (st->pr->store), &sort_column, &order);
- str_tree=stats_tree_format_as_str(st,(st_format_type)file_type,sort_column-N_RESERVED_COL,order==GTK_SORT_DESCENDING);
-
- /* actually save the file */
- f= ws_fopen (file_name->str,"w");
- last_errno= errno;
- if (f) {
- if (fputs(str_tree->str, f)!=EOF) {
- success= TRUE;
- }
- last_errno= errno;
- fclose(f);
- }
- if (!success) {
- GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW(st->pr->win),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_CLOSE,
- "Error saving file '%s': %s",
- file_name->str, g_strerror (last_errno));
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
- }
-
- g_string_free(str_tree, TRUE);
- }
-
- g_string_free(file_name, TRUE);
-
- return TRUE;
-}
-
-static void
-free_gtk_tree(GtkWindow *win _U_, stats_tree *st)
-{
- remove_tap_listener(st);
-
- if (st->root.pr)
- st->root.pr->iter = NULL;
-
- st->cfg->in_use = FALSE;
- stats_tree_free(st);
-
-}
-
-static void
-clear_node_pr(stat_node* n)
-{
- stat_node* c;
- for (c = n->children; c; c = c->next) {
- clear_node_pr(c);
- }
-
- if (n->pr && n->pr->iter) {
- gtk_tree_store_remove(n->st->pr->store, n->pr->iter);
- n->pr->iter = NULL;
- }
-}
-
-static void
-reset_tap(void* p)
-{
- stats_tree* st = (stats_tree *)p;
- stat_node* c;
-
- for (c = st->root.children; c; c = c->next) {
- clear_node_pr(c);
- }
-
- stats_tree_reinit(st);
-/* st->cfg->init(st); doesn't properly delete nodes */
-}
-
-static gint
-st_sort_func(GtkTreeModel *model,
- GtkTreeIter *a,
- GtkTreeIter *b,
- gpointer user_data)
-{
- gint sort_column= 1; /* default */
- GtkSortType order= GTK_SORT_DESCENDING;
- stat_node *node_a;
- stat_node *node_b;
- gint result;
-
- gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (user_data), &sort_column, &order);
-
- gtk_tree_model_get(model, a, NODEPTR_COLUMN, &node_a, -1);
- gtk_tree_model_get(model, b, NODEPTR_COLUMN, &node_b, -1);
-
- result= stats_tree_sort_compare(node_a,node_b,sort_column-N_RESERVED_COL,order==GTK_SORT_DESCENDING);
- if (order==GTK_SORT_DESCENDING) {
- result= -result;
- }
- return result;
-}
-
-/* initializes the stats_tree window */
-static void
-init_gtk_tree(const char* opt_arg, void *userdata _U_)
-{
- gchar *abbr = stats_tree_get_abbr(opt_arg);
- stats_tree* st = NULL;
- stats_tree_cfg* cfg = NULL;
- tree_pres* pr = (tree_pres *)g_malloc(sizeof(tree_pres));
- gchar* title = NULL;
- gchar* window_name = NULL;
- GString* error_string;
- GtkWidget *scr_win;
- size_t init_strlen;
- GtkWidget *main_vb, *bbox, *bt_close, *bt_copy, *bt_saveas;
- GtkTreeViewColumn* column;
- GtkCellRenderer* renderer;
- GtkTreeSortable *sortable;
- GType *col_types;
- int count;
-
- if (abbr) {
- cfg = stats_tree_get_cfg_by_abbr(abbr);
-
- if (cfg && cfg->in_use) {
- /* XXX: ! */
- report_failure("cannot open more than one tree of the same type at once");
- return;
- }
-
- if (cfg != NULL) {
- init_strlen = strlen(cfg->pr->stat_dlg->init_string);
-
- if (strncmp (opt_arg, cfg->pr->stat_dlg->init_string, init_strlen) == 0){
- if (init_strlen == strlen(opt_arg)) {
- st = stats_tree_new(cfg,pr,NULL);
- } else {
- st = stats_tree_new(cfg,pr,opt_arg+init_strlen+1);
- }
-
- } else {
- st = stats_tree_new(cfg,pr,NULL);
- }
- } else {
- report_failure("no such stats_tree (%s) in stats_tree registry",abbr);
- g_free(abbr);
- return;
- }
- g_free(abbr);
-
- } else {
- report_failure("could not obtain stats_tree abbr from opt_arg");
- g_free(pr);
- return;
- }
-
- cfg->in_use = TRUE;
-
- window_name = g_strdup_printf("%s Stats Tree", st->display_name);
-
- st->pr->win = window_new_with_geom(GTK_WINDOW_TOPLEVEL, window_name, NULL, GTK_WIN_POS_CENTER_ON_PARENT);
- gtk_window_set_default_size(GTK_WINDOW(st->pr->win), st->num_columns*80+80, 400);
- g_free(window_name);
-
- if(st->filter){
- title=g_strdup_printf("%s with filter: %s",st->display_name,st->filter);
- } else {
- st->filter=NULL;
- title=g_strdup(st->display_name);
- }
-
- gtk_window_set_title(GTK_WINDOW(st->pr->win), title);
- g_free(title);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 12);
- gtk_container_add(GTK_CONTAINER(st->pr->win), main_vb);
-
- scr_win = scrolled_window_new(NULL, NULL);
-
- col_types= (GType*)g_malloc(sizeof(GType)*(st->num_columns+N_RESERVED_COL));
- col_types[0] = G_TYPE_POINTER;
- for (count = 0; count<st->num_columns; count++) {
- col_types[count+N_RESERVED_COL] = G_TYPE_STRING;
- }
- st->pr->store = gtk_tree_store_newv (st->num_columns+N_RESERVED_COL,col_types);
- g_free (col_types);
-
- sortable= GTK_TREE_SORTABLE (st->pr->store);
- st->pr->tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (st->pr->store));
- gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(st->pr->tree), FALSE);
- g_object_unref(G_OBJECT(st->pr->store));
-
- gtk_container_add( GTK_CONTAINER(scr_win), st->pr->tree);
-
- /* the columns */
- for (count = 0; count<st->num_columns; count++) {
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes (stats_tree_get_column_name(count),
- renderer, "text", count+N_RESERVED_COL, NULL);
- gtk_tree_view_column_set_sort_column_id(column, count+N_RESERVED_COL);
- gtk_tree_sortable_set_sort_func(sortable,count+N_RESERVED_COL, st_sort_func, sortable, NULL);
- gtk_tree_view_column_set_resizable (column,TRUE);
- gtk_tree_view_column_set_sizing(column,GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_append_column (GTK_TREE_VIEW (st->pr->tree), column);
- }
-
- gtk_tree_sortable_set_default_sort_func (sortable, NULL, NULL, NULL);
-
- gtk_box_pack_start(GTK_BOX(main_vb), scr_win, TRUE, TRUE, 0);
-
- error_string = register_tap_listener( cfg->tapname,
- st,
- st->filter,
- cfg->flags,
- reset_tap,
- stats_tree_packet,
- draw_gtk_tree);
-
- if (error_string) {
- /* error, we failed to attach to the tap. clean up */
- /* destroy_stat_tree_window(st); */
- report_failure("stats_tree for: %s failed to attach to the tap: %s",cfg->name,error_string->str);
- g_string_free(error_string, TRUE);
- }
-
- /* Button row. */
- bbox = dlg_button_row_new(GTK_STOCK_COPY, GTK_STOCK_SAVE_AS, GTK_STOCK_CLOSE, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 0);
-
- bt_close = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(st->pr->win, bt_close, window_cancel_button_cb);
-
- g_signal_connect(GTK_WINDOW(st->pr->win), "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(GTK_WINDOW(st->pr->win), "destroy", G_CALLBACK(free_gtk_tree), st);
-
- bt_copy = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_COPY);
- g_signal_connect(GTK_WINDOW (bt_copy), "clicked", G_CALLBACK(copy_tree_to_clipboard), st);
-
- bt_saveas = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_SAVE_AS);
- g_signal_connect(GTK_WINDOW (bt_saveas), "clicked", G_CALLBACK(save_as_dialog), st);
-
- gtk_widget_show_all(st->pr->win);
- window_present(st->pr->win);
-
- cf_retap_packets(&cfile);
- gdk_window_raise(gtk_widget_get_window(st->pr->win));
-}
-
-static tap_param tree_stat_params[] = {
- { PARAM_FILTER, "filter", "Filter", NULL, TRUE }
-};
-
-static void
-register_gtk_stats_tree_tap (gpointer k _U_, gpointer v, gpointer p _U_)
-{
- stats_tree_cfg* cfg = (stats_tree_cfg *)v;
- gchar* display_name= stats_tree_get_displayname(cfg->name);
-
- cfg->pr = (tree_cfg_pres *)g_malloc(sizeof(tree_cfg_pres));
-
- cfg->pr->stat_dlg = (tap_param_dlg *)g_malloc(sizeof(tap_param_dlg));
-
- cfg->pr->stat_dlg->win_title = g_strdup_printf("%s Stats Tree",display_name);
- cfg->pr->stat_dlg->init_string = g_strdup_printf("%s,tree",cfg->abbr);
- cfg->pr->stat_dlg->tap_init_cb = init_gtk_tree;
- cfg->pr->stat_dlg->index = -1;
- cfg->pr->stat_dlg->nparams = G_N_ELEMENTS(tree_stat_params);
- cfg->pr->stat_dlg->params = tree_stat_params;
- cfg->pr->stat_dlg->user_data = NULL;
- g_free(display_name);
-}
-
-static void
-free_tree_presentation(stats_tree* st)
-{
- g_free(st->pr);
-}
-
-void
-register_tap_listener_stats_tree_stat(void)
-{
- stats_tree_presentation(register_gtk_stats_tree_tap,
- NULL, free_tree_presentation, NULL);
-}
-
-void gtk_stats_tree_cb(GtkAction *action, gpointer user_data _U_)
-{
- const gchar *action_name;
- gchar *abbr;
- stats_tree_cfg* cfg = NULL;
-
- action_name = gtk_action_get_name (action);
- abbr = strrchr(action_name,'/');
- if(abbr){
- abbr = abbr+1;
- }else{
- abbr = g_strdup(action_name);
- }
- cfg = stats_tree_get_cfg_by_abbr(abbr);
- if(cfg){
- tap_param_dlg_cb(action, cfg->pr->stat_dlg);
- }else{
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Failed to find the stat tree named %s",
- abbr);
- return;
- }
-
-}
-
-
-/*
- * Editor modelines - http://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/gtk/stock_icons.c b/ui/gtk/stock_icons.c
deleted file mode 100644
index 94f638149a..0000000000
--- a/ui/gtk/stock_icons.c
+++ /dev/null
@@ -1,631 +0,0 @@
-/* stock_icons.c
- * Wireshark specific stock icons
- * Copyright 2003-2008, Ulf Lamping <ulf.lamping@web.de>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "ui/gtk/stock_icons.h"
-#ifndef HAVE_GDK_GRESOURCE
-#include "ui/gtk/pixbuf-csource.h"
-#endif
-#include "ui/gtk/gui_utils.h"
-
-#include <wsutil/utf8_entities.h>
-
-/* these icons are derived from the original stock icons */
-#include "../../image/toolbar/capture_filter_24.xpm"
-#include "../../image/toolbar/capture_details_24.xpm"
-#include "../../image/toolbar/display_filter_24.xpm"
-#include "../../image/toolbar/colorize_24.xpm"
-#include "../../image/toolbar/autoscroll_24.xpm"
-#include "../../image/toolbar/resize_columns_24.xpm"
-#include "../../image/toolbar/time_24.xpm"
-#include "../../image/toolbar/internet_24.xpm"
-#include "../../image/toolbar/web_support_24.xpm"
-#include "../../image/toolbar/conversations_16.xpm"
-#include "../../image/toolbar/endpoints_16.xpm"
-#include "../../image/toolbar/expert_info_16.xpm"
-#include "../../image/toolbar/flow_graph_16.xpm"
-#include "../../image/toolbar/graphs_16.xpm"
-#include "../../image/toolbar/telephony_16.xpm"
-#include "../../image/toolbar/decode_as_16.xpm"
-#include "../../image/toolbar/checkbox_16.xpm"
-#include "../../image/toolbar/file_set_list_16.xpm"
-#include "../../image/toolbar/file_set_next_16.xpm"
-#include "../../image/toolbar/file_set_previous_16.xpm"
-#include "../../image/toolbar/icon_color_1.xpm"
-#include "../../image/toolbar/icon_color_2.xpm"
-#include "../../image/toolbar/icon_color_3.xpm"
-#include "../../image/toolbar/icon_color_4.xpm"
-#include "../../image/toolbar/icon_color_5.xpm"
-#include "../../image/toolbar/icon_color_6.xpm"
-#include "../../image/toolbar/icon_color_7.xpm"
-#include "../../image/toolbar/icon_color_8.xpm"
-#include "../../image/toolbar/icon_color_9.xpm"
-#include "../../image/toolbar/icon_color_0.xpm"
-#include "../../image/toolbar/decode_24.xpm"
-#include "../../image/toolbar/audio_player_24.xpm"
-#include "../../image/toolbar/voip_flow_24.xpm"
-#include "../../image/toolbar/telephone_16.xpm"
-#include "../../image/toolbar/analyze_24.xpm"
-
-/*
- * the minimal value is 10, since gtk_button_new_from_icon_name() is available
- * from GTK+ 3.10
- */
-#define WS_GTK3_MINOR_STOCK_DEPRECATION_STARTS 99
-
-typedef struct stock_item_tag {
- const char * name;
- const char * icon;
- const char * label;
-} stock_item_t;
-
-typedef struct stock_pixmap_tag{
- const char * name;
- const char ** xpm_data;
- const guint size;
-} stock_pixmap_t;
-
-typedef struct stock_pixbuf_tag{
- const char * name;
-#ifdef HAVE_GDK_GRESOURCE
- struct {
- const char *p16; /* Optional */
- const char *p24; /* Mandatory */
- } path;
-#else
- const guint8 * pb_data16; /* Optional */
- const guint8 * pb_data24; /* Mandatory */
-#endif
-} stock_pixbuf_t;
-
-/*
- * Register non-standard pixmaps with the gtk-stock engine.
- * Most of the icon names match the item name here.
- * Use default stock icons for Wireshark specifics where the icon metapher makes sense.
- * PLEASE DON'T REUSE STOCK ICONS IF THEY ARE USUALLY USED FOR SOME DIFFERENT MEANING!!!)
- */
-static stock_item_t ws_stock_items[] = {
- {(const char *)WIRESHARK_STOCK_CAPTURE_INTERFACES, (char *)WIRESHARK_STOCK_CAPTURE_INTERFACES, (const char *)"_Interfaces"},
- {(const char *)WIRESHARK_STOCK_CAPTURE_OPTIONS, (const char *)WIRESHARK_STOCK_CAPTURE_OPTIONS, (const char *)"_Options"},
- {(const char *)WIRESHARK_STOCK_CAPTURE_START, (const char *)WIRESHARK_STOCK_CAPTURE_START, (const char *)"_Start"},
- {(const char *)WIRESHARK_STOCK_CAPTURE_STOP, (const char *)WIRESHARK_STOCK_CAPTURE_STOP, (const char *)"S_top"},
- {(const char *)WIRESHARK_STOCK_CAPTURE_RESTART, (const char *)WIRESHARK_STOCK_CAPTURE_RESTART, (const char *)"_Restart"},
- {(const char *)WIRESHARK_STOCK_CAPTURE_FILTER, (const char *)WIRESHARK_STOCK_CAPTURE_FILTER, (const char *)"_Capture Filter"},
- {(const char *)WIRESHARK_STOCK_CAPTURE_FILTER_ENTRY, (const char *)WIRESHARK_STOCK_CAPTURE_FILTER_ENTRY, (const char *)"_Capture Filter:"},
- {(const char *)WIRESHARK_STOCK_CAPTURE_DETAILS, (const char *)WIRESHARK_STOCK_CAPTURE_DETAILS, (const char *)"_Details"},
- #ifdef HAVE_GEOIP
- {(const char *)WIRESHARK_STOCK_MAP, (const char *)WIRESHARK_STOCK_MAP, (const char *)"Map"},
- #endif
- {(const char *)WIRESHARK_STOCK_GRAPH_A_B, (const char *)WIRESHARK_STOCK_GRAPH_A_B, (const char *)"Graph A" UTF8_RIGHTWARDS_ARROW "B"},
- {(const char *)WIRESHARK_STOCK_GRAPH_B_A, (const char *)WIRESHARK_STOCK_GRAPH_B_A, (const char *)"Graph A" UTF8_LEFTWARDS_ARROW "B"},
- {(const char *)WIRESHARK_STOCK_FOLLOW_STREAM, (const char *)WIRESHARK_STOCK_FOLLOW_STREAM, (const char *)"Follow Stream"},
- {(const char *)WIRESHARK_STOCK_DISPLAY_FILTER, (const char *)WIRESHARK_STOCK_DISPLAY_FILTER, (const char *)"Display _Filter"},
- {(const char *)WIRESHARK_STOCK_DISPLAY_FILTER_ENTRY, (const char *)WIRESHARK_STOCK_DISPLAY_FILTER_ENTRY, (const char *)"F_ilter:"},
- {(const char *)WIRESHARK_STOCK_BROWSE, (const char *)GTK_STOCK_OPEN, (const char *)"_Browse..."},
- {(const char *)WIRESHARK_STOCK_CREATE_STAT, (const char *)GTK_STOCK_OK, (const char *)"Create _Stat"},
- {(const char *)WIRESHARK_STOCK_EXPORT, (const char *)GTK_STOCK_SAVE, (const char *)"_Export..."}, /* XXX: needs a better icon */
- {(const char *)WIRESHARK_STOCK_IMPORT, (const char *)GTK_STOCK_OPEN, (const char *)"_Import..."}, /* XXX: needs a better icon */
- {(const char *)WIRESHARK_STOCK_EDIT, (const char *)GTK_STOCK_PROPERTIES, (const char *)"_Edit..."},
- {(const char *)WIRESHARK_STOCK_ADD_EXPRESSION, (const char *)GTK_STOCK_ADD, (const char *)"E_xpression..." }, /* plus sign coming from icon */
- {(const char *)WIRESHARK_STOCK_CLEAR_EXPRESSION, (const char *)GTK_STOCK_CLEAR, (const char *)"Clea_r" },
- {(const char *)WIRESHARK_STOCK_APPLY_EXPRESSION, (const char *)GTK_STOCK_APPLY, (const char *)"App_ly" },
- {(const char *)WIRESHARK_STOCK_SAVE_ALL, (const char *)GTK_STOCK_SAVE, (const char *)"Save A_ll"}, /* XXX: needs a better icon */
- {(const char *)WIRESHARK_STOCK_DONT_SAVE, (const char *)GTK_STOCK_CLEAR, (const char *)"Continue _without Saving"},
- {(const char *)WIRESHARK_STOCK_QUIT_DONT_SAVE, (const char *)GTK_STOCK_CLEAR, (const char *)"Quit _without Saving"},
- {(const char *)WIRESHARK_STOCK_STOP_DONT_SAVE, (const char *)GTK_STOCK_CLEAR, (const char *)"Stop and Continue _without Saving"},
- {(const char *)WIRESHARK_STOCK_STOP_QUIT_DONT_SAVE, (const char *)GTK_STOCK_CLEAR, (const char *)"Stop and Quit _without Saving"},
- {(const char *)WIRESHARK_STOCK_STOP_SAVE, (const char *)GTK_STOCK_SAVE, (const char *)"Stop and Save"},
- {(const char *)WIRESHARK_STOCK_ABOUT, (const char *)WIRESHARK_STOCK_ABOUT, (const char *)"_About"},
- {(const char *)WIRESHARK_STOCK_COLORIZE, (const char *)WIRESHARK_STOCK_COLORIZE, (const char *)"_Colorize"},
- {(const char *)WIRESHARK_STOCK_AUTOSCROLL, (const char *)WIRESHARK_STOCK_AUTOSCROLL, (const char *)"_Auto Scroll"},
- {(const char *)WIRESHARK_STOCK_RESIZE_COLUMNS, (const char *)WIRESHARK_STOCK_RESIZE_COLUMNS, (const char *)"Resize Columns"},
- {(const char *)WIRESHARK_STOCK_TIME, (const char *)WIRESHARK_STOCK_TIME, (const char *)"Time"},
- {(const char *)WIRESHARK_STOCK_INTERNET, (const char *)WIRESHARK_STOCK_INTERNET, (const char *)"Internet"},
- {(const char *)WIRESHARK_STOCK_WEB_SUPPORT, (const char *)WIRESHARK_STOCK_WEB_SUPPORT, (const char *)"Web Support"},
- {(const char *)WIRESHARK_STOCK_WIKI, (const char *)WIRESHARK_STOCK_WIKI, (const char *)"Wiki"},
- {(const char *)WIRESHARK_STOCK_CONVERSATIONS, (const char *)WIRESHARK_STOCK_CONVERSATIONS, (const char *)"Conversations"},
- {(const char *)WIRESHARK_STOCK_ENDPOINTS, (const char *)WIRESHARK_STOCK_ENDPOINTS, (const char *)"Endpoints"},
- {(const char *)WIRESHARK_STOCK_EXPERT_INFO, (const char *)WIRESHARK_STOCK_EXPERT_INFO, (const char *)"Expert Info"},
- {(const char *)WIRESHARK_STOCK_GRAPHS, (const char *)WIRESHARK_STOCK_GRAPHS, (const char *)"Graphs"},
- {(const char *)WIRESHARK_STOCK_FLOW_GRAPH, (const char *)WIRESHARK_STOCK_FLOW_GRAPH, (const char *)"Flow Graph"},
- {(const char *)WIRESHARK_STOCK_TELEPHONY, (const char *)WIRESHARK_STOCK_TELEPHONY, (const char *)"Telephony"},
- {(const char *)WIRESHARK_STOCK_DECODE_AS, (const char *)WIRESHARK_STOCK_DECODE_AS, (const char *)"Decode As"},
- {(const char *)WIRESHARK_STOCK_CHECKBOX, (const char *)WIRESHARK_STOCK_CHECKBOX, (const char *)"Checkbox"},
- {(const char *)WIRESHARK_STOCK_FILE_SET_LIST, (const char *)WIRESHARK_STOCK_FILE_SET_LIST, (const char *)"List Files"},
- {(const char *)WIRESHARK_STOCK_FILE_SET_NEXT, (const char *)WIRESHARK_STOCK_FILE_SET_NEXT, (const char *)"Next File"},
- {(const char *)WIRESHARK_STOCK_FILE_SET_PREVIOUS, (const char *)WIRESHARK_STOCK_FILE_SET_PREVIOUS, (const char *)"Previous File"},
- {(const char *)WIRESHARK_STOCK_FILTER_OUT_STREAM, (const char *)WIRESHARK_STOCK_FILTER_OUT_STREAM, (const char *)"Filter Out This Stream"},
- {(const char *)WIRESHARK_STOCK_ENABLE, (const char *)WIRESHARK_STOCK_ENABLE, (const char *)"Enable"},
- {(const char *)WIRESHARK_STOCK_DISABLE, (const char *)GTK_STOCK_CLOSE, (const char *)"Disable"},
- {(const char *)WIRESHARK_STOCK_COLOR1, (const char *)WIRESHARK_STOCK_COLOR1, (const char *)"Color 1"},
- {(const char *)WIRESHARK_STOCK_COLOR2, (const char *)WIRESHARK_STOCK_COLOR2, (const char *)"Color 2"},
- {(const char *)WIRESHARK_STOCK_COLOR3, (const char *)WIRESHARK_STOCK_COLOR3, (const char *)"Color 3"},
- {(const char *)WIRESHARK_STOCK_COLOR4, (const char *)WIRESHARK_STOCK_COLOR4, (const char *)"Color 4"},
- {(const char *)WIRESHARK_STOCK_COLOR5, (const char *)WIRESHARK_STOCK_COLOR5, (const char *)"Color 5"},
- {(const char *)WIRESHARK_STOCK_COLOR6, (const char *)WIRESHARK_STOCK_COLOR6, (const char *)"Color 6"},
- {(const char *)WIRESHARK_STOCK_COLOR7, (const char *)WIRESHARK_STOCK_COLOR7, (const char *)"Color 7"},
- {(const char *)WIRESHARK_STOCK_COLOR8, (const char *)WIRESHARK_STOCK_COLOR8, (const char *)"Color 8"},
- {(const char *)WIRESHARK_STOCK_COLOR9, (const char *)WIRESHARK_STOCK_COLOR9, (const char *)"Color 9"},
- {(const char *)WIRESHARK_STOCK_COLOR0, (const char *)WIRESHARK_STOCK_COLOR0, (const char *)"Color 10"},
- {(const char *)WIRESHARK_STOCK_DECODE, (const char *)WIRESHARK_STOCK_DECODE, (const char *)"Decode"},
- {(const char *)WIRESHARK_STOCK_AUDIO_PLAYER, (const char *)WIRESHARK_STOCK_AUDIO_PLAYER, (const char *)"Player"},
- {(const char *)WIRESHARK_STOCK_VOIP_FLOW, (const char *)WIRESHARK_STOCK_VOIP_FLOW, (const char *)"Flow"},
- {(const char *)WIRESHARK_STOCK_TELEPHONE, (const char *)WIRESHARK_STOCK_TELEPHONE, (const char *)"Telephone"},
- {(const char *)WIRESHARK_STOCK_PREPARE_FILTER, (const char *)WIRESHARK_STOCK_PREPARE_FILTER, (const char *)"Prepare Filter"},
- {(const char *)WIRESHARK_STOCK_ANALYZE, (const char *)WIRESHARK_STOCK_ANALYZE, (const char *)"Analyze"},
- {(const char *)WIRESHARK_STOCK_SAVE, (const char *)WIRESHARK_STOCK_SAVE, (const char *)"Save"}
-};
-
-static stock_item_t gtk_stock_items[] = {
- {(const char *)GTK_STOCK_ABOUT, (const char *)"help-about", (const char *)"_About"},
- {(const char *)GTK_STOCK_ADD, (const char *)"list-add", (const char *)"_Add"},
- {(const char *)GTK_STOCK_APPLY, NULL, (const char *)"_Apply"},
- {(const char *)GTK_STOCK_BOLD, (const char *)"format-text-bold", (const char *)"_Bold"},
- {(const char *)GTK_STOCK_CANCEL, NULL, (const char *)"_Cancel"},
-#ifdef GTK_STOCK_CAPS_LOCK_WARNING
- {(const char *)GTK_STOCK_CAPS_LOCK_WARNING, NULL, NULL},
-#endif
- {(const char *)GTK_STOCK_CDROM, (const char *)"media-optical", (const char *)"_CD-ROM"},
- {(const char *)GTK_STOCK_CLEAR, (const char *)"edit-clear", (const char *)"_Clear"},
- {(const char *)GTK_STOCK_CLOSE, (const char *)"window-close", (const char *)"_Close"},
- {(const char *)GTK_STOCK_COLOR_PICKER, NULL, NULL},
- {(const char *)GTK_STOCK_CONNECT, NULL, (const char *)"C_onnect"},
- {(const char *)GTK_STOCK_CONVERT, NULL, (const char *)"_Convert"},
- {(const char *)GTK_STOCK_COPY, (const char *)"edit-copy", (const char *)"_Copy"},
- {(const char *)GTK_STOCK_CUT, (const char *)"edit-cut", (const char *)"Cu_t"},
- {(const char *)GTK_STOCK_DELETE, (const char *)"edit-delete", (const char *)"_Delete"},
- {(const char *)GTK_STOCK_DIALOG_AUTHENTICATION, (const char *)"dialog-password", NULL},
- {(const char *)GTK_STOCK_DIALOG_INFO, (const char *)"dialog-information", (const char *)"Information"},
- {(const char *)GTK_STOCK_DIALOG_WARNING, (const char *)"dialog-warning", (const char *)"Warning"},
- {(const char *)GTK_STOCK_DIALOG_ERROR, (const char *)"dialog-error", (const char *)"Error"},
- {(const char *)GTK_STOCK_DIALOG_QUESTION, (const char *)"dialog-question", (const char *)"Question"},
- {(const char *)GTK_STOCK_DIRECTORY, (const char *)"folder", NULL},
- {(const char *)GTK_STOCK_DISCARD, NULL, (const char *)"_Discard"},
- {(const char *)GTK_STOCK_DISCONNECT, NULL, (const char *)"_Disconnect"},
- {(const char *)GTK_STOCK_DND, NULL, NULL},
- {(const char *)GTK_STOCK_DND_MULTIPLE, NULL, NULL},
- {(const char *)GTK_STOCK_EDIT, NULL, (const char *)"_Edit"},
- {(const char *)GTK_STOCK_EXECUTE, (const char *)"system-run", (const char *)"_Execute"},
- {(const char *)GTK_STOCK_FILE, (const char *)"text-x-generic", (const char *)"_File"},
- {(const char *)GTK_STOCK_FIND, (const char *)"edit-find", (const char *)"_Find"},
- {(const char *)GTK_STOCK_FIND_AND_REPLACE, (const char *)"edit-find-replace", (const char *)"Find and _Replace"},
- {(const char *)GTK_STOCK_FLOPPY, (const char *)"media-floppy", (const char *)"_Floppy"},
- {(const char *)GTK_STOCK_FULLSCREEN, (const char *)"view-fullscreen", (const char *)"_Fullscreen"},
- {(const char *)GTK_STOCK_GOTO_BOTTOM, (const char *)"go-bottom", (const char *)"_Bottom"},
- {(const char *)GTK_STOCK_GOTO_FIRST, (const char *)"go-first", (const char *)"_First"},
- {(const char *)GTK_STOCK_GOTO_LAST, (const char *)"go-last", (const char *)"_Last"},
- {(const char *)GTK_STOCK_GOTO_TOP, (const char *)"go-top", (const char *)"_Top"},
- {(const char *)GTK_STOCK_GO_BACK, (const char *)"go-previous", (const char *)"_Back"},
- {(const char *)GTK_STOCK_GO_DOWN, (const char *)"go-down", (const char *)"_Down"},
- {(const char *)GTK_STOCK_GO_FORWARD, (const char *)"go-next", (const char *)"_Forward"},
- {(const char *)GTK_STOCK_GO_UP, (const char *)"go-up", (const char *)"_Up"},
- {(const char *)GTK_STOCK_HARDDISK, (const char *)"drive-harddisk", (const char *)"_Hard Disk"},
- {(const char *)GTK_STOCK_HELP, (const char *)"help-browser", (const char *)"_Help"},
- {(const char *)GTK_STOCK_HOME, (const char *)"go-home", (const char *)"_Home"},
- {(const char *)GTK_STOCK_INDEX, NULL, (const char *)"_Index"},
- {(const char *)GTK_STOCK_INDENT, (const char *)"format-indent-more", (const char *)"Increase Indent"},
- {(const char *)GTK_STOCK_INFO, (const char *)"dialog-information", (const char *)"_Information"},
- {(const char *)GTK_STOCK_ITALIC, (const char *)"format-text-italic", (const char *)"_Italic"},
- {(const char *)GTK_STOCK_JUMP_TO, (const char *)"go-jump", (const char *)"_Jump to"},
- {(const char *)GTK_STOCK_JUSTIFY_CENTER, (const char *)"format-justify-center", (const char *)"_Center"},
- {(const char *)GTK_STOCK_JUSTIFY_FILL, (const char *)"format-justify-fill", (const char *)"_Fill"},
- {(const char *)GTK_STOCK_JUSTIFY_LEFT, (const char *)"format-justify-left", (const char *)"_Left"},
- {(const char *)GTK_STOCK_JUSTIFY_RIGHT, (const char *)"format-justify-right", (const char *)"_Right"},
- {(const char *)GTK_STOCK_LEAVE_FULLSCREEN, (const char *)"view-restore", (const char *)"_Leave Fullscreen"},
- {(const char *)GTK_STOCK_MISSING_IMAGE, (const char *)"image-missing", NULL},
- {(const char *)GTK_STOCK_MEDIA_FORWARD, (const char *)"media-seek-forward", (const char *)"_Forward"},
- {(const char *)GTK_STOCK_MEDIA_NEXT, (const char *)"media-skip-forward", (const char *)"_Next"},
- {(const char *)GTK_STOCK_MEDIA_PAUSE, (const char *)"media-playback-pause", (const char *)"P_ause"},
- {(const char *)GTK_STOCK_MEDIA_PLAY, (const char *)"media-playback-start", (const char *)"_Play"},
- {(const char *)GTK_STOCK_MEDIA_PREVIOUS, (const char *)"media-skip-backward", (const char *)"Pre_vious"},
- {(const char *)GTK_STOCK_MEDIA_RECORD, (const char *)"media-record", (const char *)"_Record"},
- {(const char *)GTK_STOCK_MEDIA_REWIND, (const char *)"media-seek-backward", (const char *)"R_ewind"},
- {(const char *)GTK_STOCK_MEDIA_STOP, (const char *)"media-playback-stop", (const char *)"_Stop"},
- {(const char *)GTK_STOCK_NETWORK, (const char *)"network-workgroup", (const char *)"_Network"},
- {(const char *)GTK_STOCK_NEW, (const char *)"document-new", (const char *)"_New"},
- {(const char *)GTK_STOCK_NO, NULL, (const char *)"_No"},
- {(const char *)GTK_STOCK_OK, NULL, (const char *)"_OK"},
- {(const char *)GTK_STOCK_OPEN, (const char *)"document-open", (const char *)"_Open"},
- {(const char *)GTK_STOCK_ORIENTATION_PORTRAIT, (const char *)"?", (const char *)"Portrait"},
- {(const char *)GTK_STOCK_ORIENTATION_LANDSCAPE, (const char *)"?", (const char *)"Landscape"},
- {(const char *)GTK_STOCK_ORIENTATION_REVERSE_LANDSCAPE, (const char *)"?", (const char *)"Reverse landscape"},
- {(const char *)GTK_STOCK_ORIENTATION_REVERSE_PORTRAIT, (const char *)"?", (const char *)"Reverse portrait"},
-#ifdef GTK_STOCK_PAGE_SETUP
- {(const char *)GTK_STOCK_PAGE_SETUP, (const char *)"document-page-setup", (const char *)"Page Set_up"},
-#endif
- {(const char *)GTK_STOCK_PASTE, (const char *)"edit-paste", (const char *)"_Paste"},
- {(const char *)GTK_STOCK_PREFERENCES, (const char *)"preferences-system", (const char *)"_Preferences"},
- {(const char *)GTK_STOCK_PRINT, (const char *)"document-print", (const char *)"_Print"},
-#ifdef GTK_STOCK_PRINT_ERROR
- {(const char *)GTK_STOCK_PRINT_ERROR, (const char *)"printer-error", NULL},
-#endif
-#ifdef GTK_STOCK_PRINT_PAUSED
- {(const char *)GTK_STOCK_PRINT_PAUSED, NULL, NULL},
-#endif
- {(const char *)GTK_STOCK_PRINT_PREVIEW, NULL, (const char *)"Print Pre_view"},
-#ifdef GTK_STOCK_PRINT_REPORT
- {(const char *)GTK_STOCK_PRINT_REPORT, NULL, NULL},
-#endif
-#ifdef GTK_STOCK_PRINT_WARNING
- {(const char *)GTK_STOCK_PRINT_WARNING, NULL, NULL},
-#endif
- {(const char *)GTK_STOCK_PROPERTIES, (const char *)"document-properties", (const char *)"_Properties"},
- {(const char *)GTK_STOCK_QUIT, (const char *)"application-exit", (const char *)"_Quit"},
- {(const char *)GTK_STOCK_REDO, (const char *)"edit-redo", (const char *)"_Redo"},
- {(const char *)GTK_STOCK_REFRESH, (const char *)"view-refresh", (const char *)"_Refresh"},
- {(const char *)GTK_STOCK_REMOVE, (const char *)"list-remove", (const char *)"_Remove"},
- {(const char *)GTK_STOCK_REVERT_TO_SAVED, (const char *)"document-revert", (const char *)"_Revert"},
- {(const char *)GTK_STOCK_SAVE, (const char *)"document-save", (const char *)"_Save"},
- {(const char *)GTK_STOCK_SAVE_AS, (const char *)"document-save-as", (const char *)"Save _As"},
- {(const char *)GTK_STOCK_SELECT_ALL, (const char *)"edit-select-all", (const char *)"Select _All"},
- {(const char *)GTK_STOCK_SELECT_COLOR, NULL, (const char *)"_Color"},
- {(const char *)GTK_STOCK_SELECT_FONT, NULL, (const char *)"_Font"},
- {(const char *)GTK_STOCK_SORT_ASCENDING, (const char *)"view-sort-ascending", (const char *)"_Ascending"},
- {(const char *)GTK_STOCK_SORT_DESCENDING, (const char *)"view-sort-descending", (const char *)"_Descending"},
- {(const char *)GTK_STOCK_SPELL_CHECK, (const char *)"tools-check-spelling", (const char *)"_Spell Check"},
- {(const char *)GTK_STOCK_STOP, (const char *)"process-stop", (const char *)"_Stop"},
- {(const char *)GTK_STOCK_STRIKETHROUGH, (const char *)"format-text-strikethrough", (const char *)"_Strikethrough"},
- {(const char *)GTK_STOCK_UNDELETE, NULL, (const char *)"_Undelete"},
- {(const char *)GTK_STOCK_UNDERLINE, (const char *)"format-text-underline", (const char *)"_Underline"},
- {(const char *)GTK_STOCK_UNDO, (const char *)"edit-undo", (const char *)"_Undo"},
- {(const char *)GTK_STOCK_UNINDENT, (const char *)"format-indent-less", NULL},
- {(const char *)GTK_STOCK_YES, NULL, (const char *)"_Yes"},
- {(const char *)GTK_STOCK_ZOOM_100, (const char *)"zoom-original", (const char *)"_Normal Size"},
- {(const char *)GTK_STOCK_ZOOM_FIT, (const char *)"zoom-fit-best", (const char *)"Best _Fit"},
- {(const char *)GTK_STOCK_ZOOM_IN, (const char *)"zoom-in", (const char *)"Zoom _In"},
- {(const char *)GTK_STOCK_ZOOM_OUT, (const char *)"zoom-out", (const char *)"Zoom _Out"},
-};
-
-/**
- * Compare two stock items by name.
- */
-static int si_cmp(const stock_item_t * a, const stock_item_t * b) {
- return strcmp(a->name, b->name);
-}
-
-
-#define BS(item, arr) (stock_item_t *)bsearch((void*)(((char*)&item) - offsetof(stock_item_t, name)), \
- (void*)arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), \
- (int (*)(const void *, const void *))si_cmp)
-
-/* generate application specific stock items */
-void stock_icons_init(void) {
- guint32 i;
-#if !GTK_CHECK_VERSION(3, WS_GTK3_MINOR_STOCK_DEPRECATION_STARTS, 0)
- GtkIconFactory * factory;
- GtkIconSet *icon_set;
- GtkIconSource *source16;
-#endif
-
- static const stock_pixbuf_t pixbufs[] = {
-#ifdef HAVE_GDK_GRESOURCE
- { WIRESHARK_STOCK_ABOUT,
- { "/org/wireshark/image/wsicon16.png",
- "/org/wireshark/image/wsicon24.png" }
- },
- { WIRESHARK_STOCK_CAPTURE_INTERFACES,
- { "/org/wireshark/image/toolbar/capture_interfaces_16.png",
- "/org/wireshark/image/toolbar/capture_interfaces_24.png" }
- },
- { WIRESHARK_STOCK_CAPTURE_OPTIONS,
- { "/org/wireshark/image/stock_icons/16x16/x-capture-options.png",
- "/org/wireshark/image/stock_icons/24x24/x-capture-options.png" }
- },
- { WIRESHARK_STOCK_CAPTURE_RESTART,
- { "/org/wireshark/image/stock_icons/16x16/x-capture-restart.png",
- "/org/wireshark/image/stock_icons/24x24/x-capture-restart.png" }
- },
- { WIRESHARK_STOCK_CAPTURE_START,
- { "/org/wireshark/image/stock_icons/16x16/x-capture-start.png",
- "/org/wireshark/image/stock_icons/24x24/x-capture-start.png" }
- },
- { WIRESHARK_STOCK_CAPTURE_STOP,
- { "/org/wireshark/image/stock_icons/16x16/x-capture-stop.png",
- "/org/wireshark/image/stock_icons/24x24/x-capture-stop.png" }
- },
- { WIRESHARK_STOCK_SAVE,
- { "/org/wireshark/image/stock_icons/16x16/x-capture-file-save.png",
- "/org/wireshark/image/stock_icons/24x24/x-capture-file-save.png" }
- },
- { WIRESHARK_STOCK_WIKI,
- { "/org/wireshark/image/toolbar/gnome_emblem_web_16.png",
- "/org/wireshark/image/toolbar/gnome_emblem_web_24.png" }
- },
- { NULL, { NULL, NULL } }
-#else
- { WIRESHARK_STOCK_ABOUT, wsicon_16_pb_data, wsicon_24_pb_data },
- { WIRESHARK_STOCK_CAPTURE_INTERFACES, capture_interfaces_16_pb_data, capture_interfaces_24_pb_data },
- { WIRESHARK_STOCK_CAPTURE_OPTIONS, capture_options_alt1_16_pb_data, capture_options_alt1_24_pb_data },
- { WIRESHARK_STOCK_CAPTURE_RESTART, capture_restart_16_pb_data, capture_restart_24_pb_data },
- { WIRESHARK_STOCK_CAPTURE_START, capture_start_16_pb_data, capture_start_24_pb_data },
- { WIRESHARK_STOCK_CAPTURE_STOP, capture_stop_16_pb_data, capture_stop_24_pb_data },
- { WIRESHARK_STOCK_SAVE, toolbar_wireshark_file_16_pb_data, toolbar_wireshark_file_24_pb_data},
- { WIRESHARK_STOCK_WIKI, gnome_emblem_web_16_pb_data, gnome_emblem_web_24_pb_data },
- { NULL, NULL, NULL }
-#endif
- };
-
- /* New images should be PNGs + pixbufs above. Please don't add to this list. */
- static const stock_pixmap_t pixmaps[] = {
- { WIRESHARK_STOCK_CAPTURE_FILTER, capture_filter_24_xpm, 24},
- { WIRESHARK_STOCK_CAPTURE_FILTER_ENTRY, capture_filter_24_xpm, 24},
- { WIRESHARK_STOCK_CAPTURE_DETAILS, capture_details_24_xpm, 24},
-#ifdef HAVE_GEOIP
- { WIRESHARK_STOCK_MAP, internet_24_xpm, 24},
-#endif
- { WIRESHARK_STOCK_DISPLAY_FILTER, display_filter_24_xpm, 24},
- { WIRESHARK_STOCK_DISPLAY_FILTER_ENTRY, display_filter_24_xpm, 24},
- { WIRESHARK_STOCK_COLORIZE, colorize_24_xpm, 24},
- { WIRESHARK_STOCK_AUTOSCROLL, autoscroll_24_xpm, 24},
- { WIRESHARK_STOCK_RESIZE_COLUMNS, resize_columns_24_xpm, 24},
- { WIRESHARK_STOCK_TIME, time_24_xpm, 24},
- { WIRESHARK_STOCK_INTERNET, internet_24_xpm, 24},
- { WIRESHARK_STOCK_WEB_SUPPORT, web_support_24_xpm, 24},
- { WIRESHARK_STOCK_CONVERSATIONS, conversations_16_xpm, 16},
- { WIRESHARK_STOCK_ENDPOINTS, endpoints_16_xpm, 16},
- { WIRESHARK_STOCK_EXPERT_INFO, expert_info_16_xpm, 16},
- { WIRESHARK_STOCK_GRAPHS, graphs_16_xpm, 16},
- { WIRESHARK_STOCK_FLOW_GRAPH, flow_graph_16_xpm, 16},
- { WIRESHARK_STOCK_TELEPHONY, telephony_16_xpm, 16},
- { WIRESHARK_STOCK_DECODE_AS, decode_as_16_xpm, 16},
- { WIRESHARK_STOCK_CHECKBOX, checkbox_16_xpm, 16},
- { WIRESHARK_STOCK_FILE_SET_LIST, file_set_list_16_xpm, 16},
- { WIRESHARK_STOCK_FILE_SET_NEXT, file_set_next_16_xpm, 16},
- { WIRESHARK_STOCK_FILE_SET_PREVIOUS, file_set_previous_16_xpm, 16},
- { WIRESHARK_STOCK_FILTER_OUT_STREAM, display_filter_24_xpm, 24},
- { WIRESHARK_STOCK_ENABLE, checkbox_16_xpm, 16},
- { WIRESHARK_STOCK_COLOR1, icon_color_1_xpm, 24},
- { WIRESHARK_STOCK_COLOR2, icon_color_2_xpm, 24},
- { WIRESHARK_STOCK_COLOR3, icon_color_3_xpm, 24},
- { WIRESHARK_STOCK_COLOR4, icon_color_4_xpm, 24},
- { WIRESHARK_STOCK_COLOR5, icon_color_5_xpm, 24},
- { WIRESHARK_STOCK_COLOR6, icon_color_6_xpm, 24},
- { WIRESHARK_STOCK_COLOR7, icon_color_7_xpm, 24},
- { WIRESHARK_STOCK_COLOR8, icon_color_8_xpm, 24},
- { WIRESHARK_STOCK_COLOR9, icon_color_9_xpm, 24},
- { WIRESHARK_STOCK_COLOR0, icon_color_0_xpm, 24},
- { WIRESHARK_STOCK_DECODE, decode_24_xpm, 24},
- { WIRESHARK_STOCK_AUDIO_PLAYER, audio_player_24_xpm, 24},
- { WIRESHARK_STOCK_VOIP_FLOW, voip_flow_24_xpm, 24},
- { WIRESHARK_STOCK_TELEPHONE, telephone_16_xpm, 16},
- { WIRESHARK_STOCK_PREPARE_FILTER, display_filter_24_xpm, 24},
- { WIRESHARK_STOCK_ANALYZE, analyze_24_xpm, 24},
- { NULL, NULL, 0}
- };
-
- /* sort lookup arrays */
- qsort(ws_stock_items, sizeof(ws_stock_items)/sizeof(ws_stock_items[0]),
- sizeof(ws_stock_items[0]), (int (*)(const void *, const void *))si_cmp);
- qsort(gtk_stock_items, sizeof(gtk_stock_items)/sizeof(gtk_stock_items[0]),
- sizeof(gtk_stock_items[0]), (int (*)(const void *, const void *))si_cmp);
-
-#if !GTK_CHECK_VERSION(3, WS_GTK3_MINOR_STOCK_DEPRECATION_STARTS, 0)
- for (i = 0; i < (sizeof(ws_stock_items) / sizeof(ws_stock_items[0])) ; i++) {
- GtkStockItem stock_item =
- {(char *)ws_stock_items[i].name,
- (char *)ws_stock_items[i].label,
- (GdkModifierType)0, 0, NULL};
- gtk_stock_add(&stock_item, 1);
- }
- /* Add our custom icon factory to the list of defaults */
- factory = gtk_icon_factory_new();
- gtk_icon_factory_add_default(factory);
-#endif
-
- /* Add pixmaps as builtin theme icons */
- /* Please use pixbufs (below) for new icons */
- for (i = 0; pixmaps[i].name != NULL; i++) {
- /* The default icon */
- GdkPixbuf * pixbuf = gdk_pixbuf_new_from_xpm_data((const char **) (pixmaps[i].xpm_data));
- g_assert(pixbuf);
-#if !GTK_CHECK_VERSION(3, WS_GTK3_MINOR_STOCK_DEPRECATION_STARTS, 0)
- icon_set = gtk_icon_set_new_from_pixbuf (pixbuf);
- gtk_icon_factory_add (factory, pixmaps[i].name, icon_set);
- gtk_icon_set_unref (icon_set);
-#endif
- gtk_icon_theme_add_builtin_icon(pixmaps[i].name, pixmaps[i].size, pixbuf);
- g_object_unref (G_OBJECT (pixbuf));
- }
-
- /* Add pixbufs as builtin theme icons */
- for (i = 0; pixbufs[i].name != NULL; i++) {
-#ifdef HAVE_GDK_GRESOURCE
- GdkPixbuf * pixbuf24 = ws_gdk_pixbuf_new_from_resource(pixbufs[i].path.p24);
-#else
- GdkPixbuf * pixbuf24 = gdk_pixbuf_new_from_inline(-1, pixbufs[i].pb_data24, FALSE, NULL);
- g_assert(pixbuf24);
-#endif
-#if !GTK_CHECK_VERSION(3, WS_GTK3_MINOR_STOCK_DEPRECATION_STARTS, 0)
- icon_set = gtk_icon_set_new_from_pixbuf(pixbuf24);
- gtk_icon_factory_add (factory, pixbufs[i].name, icon_set);
- gtk_icon_set_unref (icon_set);
-#endif
- /* Default image */
- gtk_icon_theme_add_builtin_icon(pixbufs[i].name, 24, pixbuf24);
-
-#ifdef HAVE_GDK_GRESOURCE
- if (pixbufs[i].path.p16 != NULL) {
- GdkPixbuf * pixbuf16 = ws_gdk_pixbuf_new_from_resource(pixbufs[i].path.p16);
-#else
- if (pixbufs[i].pb_data16) {
- GdkPixbuf * pixbuf16 = gdk_pixbuf_new_from_inline(-1, pixbufs[i].pb_data16, FALSE, NULL);
- g_assert(pixbuf16);
-#endif
-#if !GTK_CHECK_VERSION(3, WS_GTK3_MINOR_STOCK_DEPRECATION_STARTS, 0)
- source16 = gtk_icon_source_new();
- gtk_icon_source_set_pixbuf(source16, pixbuf16);
- gtk_icon_source_set_size_wildcarded(source16, FALSE);
- gtk_icon_source_set_size(source16, GTK_ICON_SIZE_MENU);
-
- /* Twice? Really? Seriously? */
- source16 = gtk_icon_source_new();
- gtk_icon_source_set_pixbuf(source16, pixbuf16);
- gtk_icon_source_set_size_wildcarded(source16, FALSE);
- gtk_icon_source_set_size(source16, GTK_ICON_SIZE_SMALL_TOOLBAR);
-#else
- gtk_icon_theme_add_builtin_icon(pixbufs[i].name, 16, pixbuf16);
-#endif
- g_object_unref (G_OBJECT (pixbuf16));
- }
- g_object_unref (G_OBJECT (pixbuf24));
- }
-#if !GTK_CHECK_VERSION(3, WS_GTK3_MINOR_STOCK_DEPRECATION_STARTS, 0)
- /* use default stock icons for Wireshark specifics where the icon metapher makes sense */
- /* PLEASE DON'T REUSE STOCK ICONS IF THEY ARE USUALLY USED FOR SOME DIFFERENT MEANING!!!) */
-
- for (i = 0; i < (sizeof(ws_stock_items) / sizeof(ws_stock_items[0])) ; i++) {
- stock_item_t * fallback_item = NULL;
- if (NULL != (fallback_item = BS(ws_stock_items[i].icon, gtk_stock_items))) {
- icon_set = gtk_icon_factory_lookup_default(fallback_item->name);
- gtk_icon_factory_add(factory, ws_stock_items[i].name, icon_set);
- }
- }
-#endif
-}
-
-GtkWidget * ws_gtk_button_new_from_stock(const gchar *stock_id) {
-#if !GTK_CHECK_VERSION(3, WS_GTK3_MINOR_STOCK_DEPRECATION_STARTS, 0)
- return gtk_button_new_from_stock(stock_id);
-#else
- GtkWidget * b;
- stock_item_t * i = NULL;
- if (NULL != (i = BS(stock_id, gtk_stock_items))) {
- /* GTK stock item*/
- return gtk_button_new_with_mnemonic(i->label);
- } else if (NULL != (i = BS(stock_id, ws_stock_items))) {
- /* Wireshark stock item*/
- stock_item_t * fallback_item;
- if (NULL != (fallback_item = BS(i->icon, gtk_stock_items))) {
- /* Wireshark fallback item uses a GTK stock icon*/
- b = gtk_button_new_from_icon_name(fallback_item->icon, GTK_ICON_SIZE_BUTTON);
- } else {
- b = gtk_button_new_from_icon_name(i->icon, GTK_ICON_SIZE_BUTTON);
- }
- gtk_button_set_label(GTK_BUTTON(b), i->label);
- gtk_button_set_use_underline(GTK_BUTTON(b), TRUE);
- return b;
- }
- return NULL;
-#endif
-}
-
-#define LBL_UNDERLINE(type, tb, lbl_item) \
- gtk_tool_button_set_label(type(tb), (lbl_item)->label); \
- gtk_tool_button_set_use_underline(type(tb), TRUE);
-
-GtkToolItem * ws_gtk_tool_button_new_from_stock(const gchar *stock_id) {
-#if !GTK_CHECK_VERSION(3, WS_GTK3_MINOR_STOCK_DEPRECATION_STARTS, 0)
- return gtk_tool_button_new_from_stock(stock_id);
-#else
- GtkToolItem * b = NULL;
- stock_item_t * i = NULL;
- if (NULL != (i = BS(stock_id, gtk_stock_items))) {
- /* GTK stock item*/
- b = gtk_tool_button_new(NULL, i->label);
- gtk_tool_button_set_use_underline(GTK_TOOL_BUTTON(b), TRUE);
- gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (b), i->icon);
- } else if (NULL != (i = BS(stock_id, ws_stock_items))) {
- /* Wireshark stock item*/
- stock_item_t * fallback_item;
- if (NULL != (fallback_item = BS(i->icon, gtk_stock_items))) {
- /* Wireshark fallback item uses a GTK stock icon*/
- b = gtk_tool_button_new(NULL, i->label);
- gtk_tool_button_set_use_underline(GTK_TOOL_BUTTON(b), TRUE);
- gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(b), fallback_item->icon);
- } else {
- b = gtk_tool_button_new(NULL, i->label);
- gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(b), i->icon);
- }
- }
- return b;
-#endif
-}
-
-GtkToolItem * ws_gtk_toggle_tool_button_new_from_stock(const gchar *stock_id) {
-#if !GTK_CHECK_VERSION(3, WS_GTK3_MINOR_STOCK_DEPRECATION_STARTS, 0)
- return gtk_toggle_tool_button_new_from_stock(stock_id);
-#else
- GtkToolItem * b = NULL;
- stock_item_t * i = NULL;
- if (NULL != (i = BS(stock_id, gtk_stock_items))) {
- /* GTK stock item*/
- b = gtk_toggle_tool_button_new();
- gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (b), i->icon);
- LBL_UNDERLINE(GTK_TOOL_BUTTON, b, i);
- } else if (NULL != (i = BS(stock_id, ws_stock_items))) {
- /* Wireshark stock item*/
- stock_item_t * fallback_item;
- if (NULL != (fallback_item = BS(i->icon, gtk_stock_items))) {
- /* Wireshark fallback item uses a GTK stock icon*/
- b = gtk_toggle_tool_button_new();
- gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (b), fallback_item->icon);
- LBL_UNDERLINE(GTK_TOOL_BUTTON, b, i);
- } else {
- b = gtk_toggle_tool_button_new();
- gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (b), i->icon);
- LBL_UNDERLINE(GTK_TOOL_BUTTON, b, i);
- }
- }
- return b;
-#endif
-}
-
-GtkWidget * ws_gtk_image_new_from_stock(const gchar *stock_id, GtkIconSize size) {
-#if !GTK_CHECK_VERSION(3, WS_GTK3_MINOR_STOCK_DEPRECATION_STARTS, 0)
- return gtk_image_new_from_stock(stock_id, size);
-#else
- stock_item_t * i = NULL;
- if (NULL != (i = BS(stock_id, gtk_stock_items))) {
- /* GTK stock item*/
- return gtk_image_new_from_icon_name(i->icon, size);
- } else if (NULL != (i = BS(stock_id, ws_stock_items))) {
- /* Wireshark stock item*/
- stock_item_t * fallback_item;
- if (NULL != (fallback_item = BS(i->icon, gtk_stock_items))) {
- /* Wireshark fallback item uses a GTK stock icon*/
- return gtk_image_new_from_icon_name(fallback_item->icon, size);
- } else {
- return gtk_image_new_from_icon_name(i->icon, size);
- }
- }
- return NULL;
-#endif
-}
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/stock_icons.h b/ui/gtk/stock_icons.h
deleted file mode 100644
index b5fd9d0ec9..0000000000
--- a/ui/gtk/stock_icons.h
+++ /dev/null
@@ -1,665 +0,0 @@
-/* stock_icons.h
- * Wireshark specific stock icons
- * Copyright 2003-2008, Ulf Lamping <ulf.lamping@web.de>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __STOCK_ICONS_H__
-#define __STOCK_ICONS_H__
-
-#include <gtk/gtk.h>
-
-#define WIRESHARK_STOCK_CAPTURE_INTERFACES "Wireshark_Stock_CaptureInterfaces"
-#define WIRESHARK_STOCK_CAPTURE_OPTIONS "Wireshark_Stock_CaptureOptionss"
-#define WIRESHARK_STOCK_CAPTURE_START "Wireshark_Stock_CaptureStart"
-#define WIRESHARK_STOCK_CAPTURE_STOP "Wireshark_Stock_CaptureStop"
-#define WIRESHARK_STOCK_CAPTURE_RESTART "Wireshark_Stock_CaptureRestart"
-#define WIRESHARK_STOCK_CAPTURE_FILTER "Wireshark_Stock_CaptureFilter"
-#define WIRESHARK_STOCK_CAPTURE_FILTER_ENTRY "Wireshark_Stock_CaptureFilter_Entry"
-#define WIRESHARK_STOCK_CAPTURE_DETAILS "Wireshark_Stock_CaptureDetails"
-#ifdef HAVE_GEOIP
-#define WIRESHARK_STOCK_MAP "Wireshark_Stock_Map"
-#endif
-#define WIRESHARK_STOCK_GRAPH_A_B "Wireshark_Stock_Graph_A_B"
-#define WIRESHARK_STOCK_GRAPH_B_A "Wireshark_Stock_Graph_B_A"
-#define WIRESHARK_STOCK_FOLLOW_STREAM "Wireshark_Stock_FollowStream"
-#define WIRESHARK_STOCK_DISPLAY_FILTER "Wireshark_Stock_DisplayFilter"
-#define WIRESHARK_STOCK_DISPLAY_FILTER_ENTRY "Wireshark_Stock_DisplayFilter_Entry"
-#define WIRESHARK_STOCK_BROWSE "Wireshark_Stock_Browse"
-#define WIRESHARK_STOCK_CREATE_STAT "Wireshark_Stock_CreateStat"
-#define WIRESHARK_STOCK_EXPORT "Wireshark_Stock_Export"
-#define WIRESHARK_STOCK_IMPORT "Wireshark_Stock_Import"
-#define WIRESHARK_STOCK_EDIT "Wireshark_Stock_Edit"
-#define WIRESHARK_STOCK_ADD_EXPRESSION "Wireshark_Stock_Edit_Add_Expression"
-#define WIRESHARK_STOCK_CLEAR_EXPRESSION "Wireshark_Stock_Clear_Expression"
-#define WIRESHARK_STOCK_APPLY_EXPRESSION "Wireshark_Stock_Apply_Expression"
-#define WIRESHARK_STOCK_DONT_SAVE "Wireshark_Stock_Continue_without_Saving"
-#define WIRESHARK_STOCK_QUIT_DONT_SAVE "Wireshark_Stock_Quit_without_Saving"
-#define WIRESHARK_STOCK_STOP_DONT_SAVE "Wireshark_Stock_Stop_and_Continue_without_Saving"
-#define WIRESHARK_STOCK_STOP_QUIT_DONT_SAVE "Wireshark_Stock_Stop_and_Quit_without_Saving"
-#define WIRESHARK_STOCK_STOP_SAVE "Wireshark_Stock_Stop_and_Save"
-#define WIRESHARK_STOCK_SAVE_ALL "Wireshark_Stock_Save_All"
-#define WIRESHARK_STOCK_ABOUT "Wireshark_Stock_About"
-#define WIRESHARK_STOCK_COLORIZE "Wireshark_Stock_Colorize"
-#define WIRESHARK_STOCK_AUTOSCROLL "Wireshark_Stock_Autoscroll"
-#define WIRESHARK_STOCK_RESIZE_COLUMNS "Wireshark_Stock_Resize_Columns"
-#define WIRESHARK_STOCK_TIME "Wireshark_Stock_Time"
-#define WIRESHARK_STOCK_INTERNET "Wireshark_Stock_Internet"
-#define WIRESHARK_STOCK_WEB_SUPPORT "Wireshark_Stock_Web_Support"
-#define WIRESHARK_STOCK_WIKI "Wireshark_Stock_Wiki"
-#define WIRESHARK_STOCK_CONVERSATIONS "Wireshark_Stock_Conversations"
-#define WIRESHARK_STOCK_ENDPOINTS "Wireshark_Stock_Endpoints"
-#define WIRESHARK_STOCK_EXPERT_INFO "Wireshark_Stock_Expert_Info"
-#define WIRESHARK_STOCK_GRAPHS "Wireshark_Stock_Graphs"
-#define WIRESHARK_STOCK_FLOW_GRAPH "Wireshark_Stock_Flow_Graph"
-#define WIRESHARK_STOCK_TELEPHONY "Wireshark_Stock_Telephony"
-#define WIRESHARK_STOCK_DECODE_AS "Wireshark_Stock_DecodeAs"
-#define WIRESHARK_STOCK_CHECKBOX "Wireshark_Stock_Checkbox"
-#define WIRESHARK_STOCK_FILE_SET_LIST "Wireshark_Stock_File_Set_List"
-#define WIRESHARK_STOCK_FILE_SET_NEXT "Wireshark_Stock_File_Set_Next"
-#define WIRESHARK_STOCK_FILE_SET_PREVIOUS "Wireshark_Stock_File_Set_Previous"
-#define WIRESHARK_STOCK_FILTER_OUT_STREAM "Wireshark_Stock_Filter_Out_This_Stream"
-#define WIRESHARK_STOCK_ENABLE "Wireshark_Stock_Enable"
-#define WIRESHARK_STOCK_DISABLE "Wireshark_Stock_Disable"
-#define WIRESHARK_STOCK_COLOR1 "Wireshark_Stock_Color_1"
-#define WIRESHARK_STOCK_COLOR2 "Wireshark_Stock_Color_2"
-#define WIRESHARK_STOCK_COLOR3 "Wireshark_Stock_Color_3"
-#define WIRESHARK_STOCK_COLOR4 "Wireshark_Stock_Color_4"
-#define WIRESHARK_STOCK_COLOR5 "Wireshark_Stock_Color_5"
-#define WIRESHARK_STOCK_COLOR6 "Wireshark_Stock_Color_6"
-#define WIRESHARK_STOCK_COLOR7 "Wireshark_Stock_Color_7"
-#define WIRESHARK_STOCK_COLOR8 "Wireshark_Stock_Color_8"
-#define WIRESHARK_STOCK_COLOR9 "Wireshark_Stock_Color_9"
-#define WIRESHARK_STOCK_COLOR0 "Wireshark_Stock_Color_10"
-#define WIRESHARK_STOCK_DECODE "Wireshark_Stock_Decode"
-#define WIRESHARK_STOCK_AUDIO_PLAYER "Wireshark_Audio_Player"
-#define WIRESHARK_STOCK_VOIP_FLOW "Wireshark_Voip_Flow"
-#define WIRESHARK_STOCK_TELEPHONE "Wireshark_Telephone"
-#define WIRESHARK_STOCK_PREPARE_FILTER "Wireshark_Prepare_Filter"
-#define WIRESHARK_STOCK_ANALYZE "Wireshark_Analyze"
-#define WIRESHARK_STOCK_SAVE "Wireshark_Save"
-
-/*
- * Use of GTK_STOCK_.* is deprecated from 3.10
- * https://developer.gnome.org/gtk3/stable/gtk3-Stock-Items.html
- * We keep the defined names in the code and provide mapping for them
- * to labels and standard icons based on
- * https://docs.google.com/spreadsheet/pub?key=0AsPAM3pPwxagdGF4THNMMUpjUW5xMXZfdUNzMXhEa2c&output=html
- */
-#if GTK_CHECK_VERSION(3, 10, 0)
-
-#ifdef GTK_STOCK_ABOUT
-#undef GTK_STOCK_ABOUT
-#endif
-#define GTK_STOCK_ABOUT "gtk-about"
-
-#ifdef GTK_STOCK_ADD
-#undef GTK_STOCK_ADD
-#endif
-#define GTK_STOCK_ADD "gtk-add"
-
-#ifdef GTK_STOCK_APPLY
-#undef GTK_STOCK_APPLY
-#endif
-#define GTK_STOCK_APPLY "gtk-apply"
-
-#ifdef GTK_STOCK_BOLD
-#undef GTK_STOCK_BOLD
-#endif
-#define GTK_STOCK_BOLD "gtk-bold"
-
-#ifdef GTK_STOCK_CANCEL
-#undef GTK_STOCK_CANCEL
-#endif
-#define GTK_STOCK_CANCEL "gtk-cancel"
-
-#ifdef GTK_STOCK_CAPS_LOCK_WARNING
-#undef GTK_STOCK_CAPS_LOCK_WARNING
-#endif
-#define GTK_STOCK_CAPS_LOCK_WARNING "gtk-caps-lock-warning"
-
-#ifdef GTK_STOCK_CDROM
-#undef GTK_STOCK_CDROM
-#endif
-#define GTK_STOCK_CDROM "gtk-cdrom"
-
-#ifdef GTK_STOCK_CLEAR
-#undef GTK_STOCK_CLEAR
-#endif
-#define GTK_STOCK_CLEAR "gtk-clear"
-
-#ifdef GTK_STOCK_CLOSE
-#undef GTK_STOCK_CLOSE
-#endif
-#define GTK_STOCK_CLOSE "gtk-close"
-
-#ifdef GTK_STOCK_COLOR_PICKER
-#undef GTK_STOCK_COLOR_PICKER
-#endif
-#define GTK_STOCK_COLOR_PICKER "gtk-color-picker"
-
-#ifdef GTK_STOCK_CONNECT
-#undef GTK_STOCK_CONNECT
-#endif
-#define GTK_STOCK_CONNECT "gtk-connect"
-
-#ifdef GTK_STOCK_CONVERT
-#undef GTK_STOCK_CONVERT
-#endif
-#define GTK_STOCK_CONVERT "gtk-convert"
-
-#ifdef GTK_STOCK_COPY
-#undef GTK_STOCK_COPY
-#endif
-#define GTK_STOCK_COPY "gtk-copy"
-
-#ifdef GTK_STOCK_CUT
-#undef GTK_STOCK_CUT
-#endif
-#define GTK_STOCK_CUT "gtk-cut"
-
-#ifdef GTK_STOCK_DELETE
-#undef GTK_STOCK_DELETE
-#endif
-#define GTK_STOCK_DELETE "gtk-delete"
-
-#ifdef GTK_STOCK_DIALOG_AUTHENTICATION
-#undef GTK_STOCK_DIALOG_AUTHENTICATION
-#endif
-#define GTK_STOCK_DIALOG_AUTHENTICATION "gtk-dialog-authentication"
-
-#ifdef GTK_STOCK_DIALOG_INFO
-#undef GTK_STOCK_DIALOG_INFO
-#endif
-#define GTK_STOCK_DIALOG_INFO "gtk-dialog-info"
-
-#ifdef GTK_STOCK_DIALOG_WARNING
-#undef GTK_STOCK_DIALOG_WARNING
-#endif
-#define GTK_STOCK_DIALOG_WARNING "gtk-dialog-warning"
-
-#ifdef GTK_STOCK_DIALOG_ERROR
-#undef GTK_STOCK_DIALOG_ERROR
-#endif
-#define GTK_STOCK_DIALOG_ERROR "gtk-dialog-error"
-
-#ifdef GTK_STOCK_DIALOG_QUESTION
-#undef GTK_STOCK_DIALOG_QUESTION
-#endif
-#define GTK_STOCK_DIALOG_QUESTION "gtk-dialog-question"
-
-#ifdef GTK_STOCK_DIRECTORY
-#undef GTK_STOCK_DIRECTORY
-#endif
-#define GTK_STOCK_DIRECTORY "gtk-directory"
-
-#ifdef GTK_STOCK_DISCARD
-#undef GTK_STOCK_DISCARD
-#endif
-#define GTK_STOCK_DISCARD "gtk-discard"
-
-#ifdef GTK_STOCK_DISCONNECT
-#undef GTK_STOCK_DISCONNECT
-#endif
-#define GTK_STOCK_DISCONNECT "gtk-disconnect"
-
-#ifdef GTK_STOCK_DND
-#undef GTK_STOCK_DND
-#endif
-#define GTK_STOCK_DND "gtk-dnd"
-
-#ifdef GTK_STOCK_DND_MULTIPLE
-#undef GTK_STOCK_DND_MULTIPLE
-#endif
-#define GTK_STOCK_DND_MULTIPLE "gtk-dnd-multiple"
-
-#ifdef GTK_STOCK_EDIT
-#undef GTK_STOCK_EDIT
-#endif
-#define GTK_STOCK_EDIT "gtk-edit"
-
-#ifdef GTK_STOCK_EXECUTE
-#undef GTK_STOCK_EXECUTE
-#endif
-#define GTK_STOCK_EXECUTE "gtk-execute"
-
-#ifdef GTK_STOCK_FILE
-#undef GTK_STOCK_FILE
-#endif
-#define GTK_STOCK_FILE "gtk-file"
-
-#ifdef GTK_STOCK_FIND
-#undef GTK_STOCK_FIND
-#endif
-#define GTK_STOCK_FIND "gtk-find"
-
-#ifdef GTK_STOCK_FIND_AND_REPLACE
-#undef GTK_STOCK_FIND_AND_REPLACE
-#endif
-#define GTK_STOCK_FIND_AND_REPLACE "gtk-find-and-replace"
-
-#ifdef GTK_STOCK_FLOPPY
-#undef GTK_STOCK_FLOPPY
-#endif
-#define GTK_STOCK_FLOPPY "gtk-floppy"
-
-#ifdef GTK_STOCK_FULLSCREEN
-#undef GTK_STOCK_FULLSCREEN
-#endif
-#define GTK_STOCK_FULLSCREEN "gtk-fullscreen"
-
-#ifdef GTK_STOCK_GOTO_BOTTOM
-#undef GTK_STOCK_GOTO_BOTTOM
-#endif
-#define GTK_STOCK_GOTO_BOTTOM "gtk-goto-bottom"
-
-#ifdef GTK_STOCK_GOTO_FIRST
-#undef GTK_STOCK_GOTO_FIRST
-#endif
-#define GTK_STOCK_GOTO_FIRST "gtk-goto-first"
-
-#ifdef GTK_STOCK_GOTO_LAST
-#undef GTK_STOCK_GOTO_LAST
-#endif
-#define GTK_STOCK_GOTO_LAST "gtk-goto-last"
-
-#ifdef GTK_STOCK_GOTO_TOP
-#undef GTK_STOCK_GOTO_TOP
-#endif
-#define GTK_STOCK_GOTO_TOP "gtk-goto-top"
-
-#ifdef GTK_STOCK_GO_BACK
-#undef GTK_STOCK_GO_BACK
-#endif
-#define GTK_STOCK_GO_BACK "gtk-go-back"
-
-#ifdef GTK_STOCK_GO_DOWN
-#undef GTK_STOCK_GO_DOWN
-#endif
-#define GTK_STOCK_GO_DOWN "gtk-go-down"
-
-#ifdef GTK_STOCK_GO_FORWARD
-#undef GTK_STOCK_GO_FORWARD
-#endif
-#define GTK_STOCK_GO_FORWARD "gtk-go-forward"
-
-#ifdef GTK_STOCK_GO_UP
-#undef GTK_STOCK_GO_UP
-#endif
-#define GTK_STOCK_GO_UP "gtk-go-up"
-
-#ifdef GTK_STOCK_HARDDISK
-#undef GTK_STOCK_HARDDISK
-#endif
-#define GTK_STOCK_HARDDISK "gtk-harddisk"
-
-#ifdef GTK_STOCK_HELP
-#undef GTK_STOCK_HELP
-#endif
-#define GTK_STOCK_HELP "gtk-help"
-
-#ifdef GTK_STOCK_HOME
-#undef GTK_STOCK_HOME
-#endif
-#define GTK_STOCK_HOME "gtk-home"
-
-#ifdef GTK_STOCK_INDEX
-#undef GTK_STOCK_INDEX
-#endif
-#define GTK_STOCK_INDEX "gtk-index"
-
-#ifdef GTK_STOCK_INDENT
-#undef GTK_STOCK_INDENT
-#endif
-#define GTK_STOCK_INDENT "gtk-indent"
-
-#ifdef GTK_STOCK_INFO
-#undef GTK_STOCK_INFO
-#endif
-#define GTK_STOCK_INFO "gtk-info"
-
-#ifdef GTK_STOCK_ITALIC
-#undef GTK_STOCK_ITALIC
-#endif
-#define GTK_STOCK_ITALIC "gtk-italic"
-
-#ifdef GTK_STOCK_JUMP_TO
-#undef GTK_STOCK_JUMP_TO
-#endif
-#define GTK_STOCK_JUMP_TO "gtk-jump-to"
-
-#ifdef GTK_STOCK_JUSTIFY_CENTER
-#undef GTK_STOCK_JUSTIFY_CENTER
-#endif
-#define GTK_STOCK_JUSTIFY_CENTER "gtk-justify-center"
-
-#ifdef GTK_STOCK_JUSTIFY_FILL
-#undef GTK_STOCK_JUSTIFY_FILL
-#endif
-#define GTK_STOCK_JUSTIFY_FILL "gtk-justify-fill"
-
-#ifdef GTK_STOCK_JUSTIFY_LEFT
-#undef GTK_STOCK_JUSTIFY_LEFT
-#endif
-#define GTK_STOCK_JUSTIFY_LEFT "gtk-justify-left"
-
-#ifdef GTK_STOCK_JUSTIFY_RIGHT
-#undef GTK_STOCK_JUSTIFY_RIGHT
-#endif
-#define GTK_STOCK_JUSTIFY_RIGHT "gtk-justify-right"
-
-#ifdef GTK_STOCK_LEAVE_FULLSCREEN
-#undef GTK_STOCK_LEAVE_FULLSCREEN
-#endif
-#define GTK_STOCK_LEAVE_FULLSCREEN "gtk-leave-fullscreen"
-
-#ifdef GTK_STOCK_MISSING_IMAGE
-#undef GTK_STOCK_MISSING_IMAGE
-#endif
-#define GTK_STOCK_MISSING_IMAGE "gtk-missing-image"
-
-#ifdef GTK_STOCK_MEDIA_FORWARD
-#undef GTK_STOCK_MEDIA_FORWARD
-#endif
-#define GTK_STOCK_MEDIA_FORWARD "gtk-media-forward"
-
-#ifdef GTK_STOCK_MEDIA_NEXT
-#undef GTK_STOCK_MEDIA_NEXT
-#endif
-#define GTK_STOCK_MEDIA_NEXT "gtk-media-next"
-
-#ifdef GTK_STOCK_MEDIA_PAUSE
-#undef GTK_STOCK_MEDIA_PAUSE
-#endif
-#define GTK_STOCK_MEDIA_PAUSE "gtk-media-pause"
-
-#ifdef GTK_STOCK_MEDIA_PLAY
-#undef GTK_STOCK_MEDIA_PLAY
-#endif
-#define GTK_STOCK_MEDIA_PLAY "gtk-media-play"
-
-#ifdef GTK_STOCK_MEDIA_PREVIOUS
-#undef GTK_STOCK_MEDIA_PREVIOUS
-#endif
-#define GTK_STOCK_MEDIA_PREVIOUS "gtk-media-previous"
-
-#ifdef GTK_STOCK_MEDIA_RECORD
-#undef GTK_STOCK_MEDIA_RECORD
-#endif
-#define GTK_STOCK_MEDIA_RECORD "gtk-media-record"
-
-#ifdef GTK_STOCK_MEDIA_REWIND
-#undef GTK_STOCK_MEDIA_REWIND
-#endif
-#define GTK_STOCK_MEDIA_REWIND "gtk-media-rewind"
-
-#ifdef GTK_STOCK_MEDIA_STOP
-#undef GTK_STOCK_MEDIA_STOP
-#endif
-#define GTK_STOCK_MEDIA_STOP "gtk-media-stop"
-
-#ifdef GTK_STOCK_NETWORK
-#undef GTK_STOCK_NETWORK
-#endif
-#define GTK_STOCK_NETWORK "gtk-network"
-
-#ifdef GTK_STOCK_NEW
-#undef GTK_STOCK_NEW
-#endif
-#define GTK_STOCK_NEW "gtk-new"
-
-#ifdef GTK_STOCK_NO
-#undef GTK_STOCK_NO
-#endif
-#define GTK_STOCK_NO "gtk-no"
-
-#ifdef GTK_STOCK_OK
-#undef GTK_STOCK_OK
-#endif
-#define GTK_STOCK_OK "gtk-ok"
-
-#ifdef GTK_STOCK_OPEN
-#undef GTK_STOCK_OPEN
-#endif
-#define GTK_STOCK_OPEN "gtk-open"
-
-#ifdef GTK_STOCK_ORIENTATION_PORTRAIT
-#undef GTK_STOCK_ORIENTATION_PORTRAIT
-#endif
-#define GTK_STOCK_ORIENTATION_PORTRAIT "gtk-orientation-portrait"
-
-#ifdef GTK_STOCK_ORIENTATION_LANDSCAPE
-#undef GTK_STOCK_ORIENTATION_LANDSCAPE
-#endif
-#define GTK_STOCK_ORIENTATION_LANDSCAPE "gtk-orientation-landscape"
-
-#ifdef GTK_STOCK_ORIENTATION_REVERSE_LANDSCAPE
-#undef GTK_STOCK_ORIENTATION_REVERSE_LANDSCAPE
-#endif
-#define GTK_STOCK_ORIENTATION_REVERSE_LANDSCAPE "gtk-orientation-reverse-landscape"
-
-#ifdef GTK_STOCK_ORIENTATION_REVERSE_PORTRAIT
-#undef GTK_STOCK_ORIENTATION_REVERSE_PORTRAIT
-#endif
-#define GTK_STOCK_ORIENTATION_REVERSE_PORTRAIT "gtk-orientation-reverse-portrait"
-
-#ifdef GTK_STOCK_PAGE_SETUP
-#undef GTK_STOCK_PAGE_SETUP
-#endif
-#define GTK_STOCK_PAGE_SETUP "gtk-page-setup"
-
-#ifdef GTK_STOCK_PASTE
-#undef GTK_STOCK_PASTE
-#endif
-#define GTK_STOCK_PASTE "gtk-paste"
-
-#ifdef GTK_STOCK_PREFERENCES
-#undef GTK_STOCK_PREFERENCES
-#endif
-#define GTK_STOCK_PREFERENCES "gtk-preferences"
-
-#ifdef GTK_STOCK_PRINT
-#undef GTK_STOCK_PRINT
-#endif
-#define GTK_STOCK_PRINT "gtk-print"
-
-#ifdef GTK_STOCK_PRINT_ERROR
-#undef GTK_STOCK_PRINT_ERROR
-#endif
-#define GTK_STOCK_PRINT_ERROR "gtk-print-error"
-
-#ifdef GTK_STOCK_PRINT_PAUSED
-#undef GTK_STOCK_PRINT_PAUSED
-#endif
-#define GTK_STOCK_PRINT_PAUSED "gtk-print-paused"
-
-#ifdef GTK_STOCK_PRINT_PREVIEW
-#undef GTK_STOCK_PRINT_PREVIEW
-#endif
-#define GTK_STOCK_PRINT_PREVIEW "gtk-print-preview"
-
-#ifdef GTK_STOCK_PRINT_REPORT
-#undef GTK_STOCK_PRINT_REPORT
-#endif
-#define GTK_STOCK_PRINT_REPORT "gtk-print-report"
-
-#ifdef GTK_STOCK_PRINT_WARNING
-#undef GTK_STOCK_PRINT_WARNING
-#endif
-#define GTK_STOCK_PRINT_WARNING "gtk-print-warning"
-
-#ifdef GTK_STOCK_PROPERTIES
-#undef GTK_STOCK_PROPERTIES
-#endif
-#define GTK_STOCK_PROPERTIES "gtk-properties"
-
-#ifdef GTK_STOCK_QUIT
-#undef GTK_STOCK_QUIT
-#endif
-#define GTK_STOCK_QUIT "gtk-quit"
-
-#ifdef GTK_STOCK_REDO
-#undef GTK_STOCK_REDO
-#endif
-#define GTK_STOCK_REDO "gtk-redo"
-
-#ifdef GTK_STOCK_REFRESH
-#undef GTK_STOCK_REFRESH
-#endif
-#define GTK_STOCK_REFRESH "gtk-refresh"
-
-#ifdef GTK_STOCK_REMOVE
-#undef GTK_STOCK_REMOVE
-#endif
-#define GTK_STOCK_REMOVE "gtk-remove"
-
-#ifdef GTK_STOCK_REVERT_TO_SAVED
-#undef GTK_STOCK_REVERT_TO_SAVED
-#endif
-#define GTK_STOCK_REVERT_TO_SAVED "gtk-revert-to-saved"
-
-#ifdef GTK_STOCK_SAVE
-#undef GTK_STOCK_SAVE
-#endif
-#define GTK_STOCK_SAVE "gtk-save"
-
-#ifdef GTK_STOCK_SAVE_AS
-#undef GTK_STOCK_SAVE_AS
-#endif
-#define GTK_STOCK_SAVE_AS "gtk-save-as"
-
-#ifdef GTK_STOCK_SELECT_ALL
-#undef GTK_STOCK_SELECT_ALL
-#endif
-#define GTK_STOCK_SELECT_ALL "gtk-select-all"
-
-#ifdef GTK_STOCK_SELECT_COLOR
-#undef GTK_STOCK_SELECT_COLOR
-#endif
-#define GTK_STOCK_SELECT_COLOR "gtk-select-color"
-
-#ifdef GTK_STOCK_SELECT_FONT
-#undef GTK_STOCK_SELECT_FONT
-#endif
-#define GTK_STOCK_SELECT_FONT "gtk-select-font"
-
-#ifdef GTK_STOCK_SORT_ASCENDING
-#undef GTK_STOCK_SORT_ASCENDING
-#endif
-#define GTK_STOCK_SORT_ASCENDING "gtk-sort-ascending"
-
-#ifdef GTK_STOCK_SORT_DESCENDING
-#undef GTK_STOCK_SORT_DESCENDING
-#endif
-#define GTK_STOCK_SORT_DESCENDING "gtk-sort-descending"
-
-#ifdef GTK_STOCK_SPELL_CHECK
-#undef GTK_STOCK_SPELL_CHECK
-#endif
-#define GTK_STOCK_SPELL_CHECK "gtk-spell-check"
-
-#ifdef GTK_STOCK_STOP
-#undef GTK_STOCK_STOP
-#endif
-#define GTK_STOCK_STOP "gtk-stop"
-
-#ifdef GTK_STOCK_STRIKETHROUGH
-#undef GTK_STOCK_STRIKETHROUGH
-#endif
-#define GTK_STOCK_STRIKETHROUGH "gtk-strikethrough"
-
-#ifdef GTK_STOCK_UNDELETE
-#undef GTK_STOCK_UNDELETE
-#endif
-#define GTK_STOCK_UNDELETE "gtk-undelete"
-
-#ifdef GTK_STOCK_UNDERLINE
-#undef GTK_STOCK_UNDERLINE
-#endif
-#define GTK_STOCK_UNDERLINE "gtk-underline"
-
-#ifdef GTK_STOCK_UNDO
-#undef GTK_STOCK_UNDO
-#endif
-#define GTK_STOCK_UNDO "gtk-undo"
-
-#ifdef GTK_STOCK_UNINDENT
-#undef GTK_STOCK_UNINDENT
-#endif
-#define GTK_STOCK_UNINDENT "gtk-unindent"
-
-#ifdef GTK_STOCK_YES
-#undef GTK_STOCK_YES
-#endif
-#define GTK_STOCK_YES "gtk-yes"
-
-#ifdef GTK_STOCK_ZOOM_100
-#undef GTK_STOCK_ZOOM_100
-#endif
-#define GTK_STOCK_ZOOM_100 "gtk-zoom-100"
-
-#ifdef GTK_STOCK_ZOOM_FIT
-#undef GTK_STOCK_ZOOM_FIT
-#endif
-#define GTK_STOCK_ZOOM_FIT "gtk-zoom-fit"
-
-#ifdef GTK_STOCK_ZOOM_IN
-#undef GTK_STOCK_ZOOM_IN
-#endif
-#define GTK_STOCK_ZOOM_IN "gtk-zoom-in"
-
-#ifdef GTK_STOCK_ZOOM_OUT
-#undef GTK_STOCK_ZOOM_OUT
-#endif
-#define GTK_STOCK_ZOOM_OUT "gtk-zoom-out"
-
-#endif /* GTK_CHECK_VERSION(3, 10, 0) */
-
-void stock_icons_init(void);
-
-/**
- * Creates a GtkButton with a preset icon and label.
- * @param stock_id Id of the icon and label pair
- * @return The newly created GtkButton widget.
- */
-GtkWidget * ws_gtk_button_new_from_stock(const gchar *stock_id);
-
-/**
- * Creates a GtkToolButton with a preset icon and label.
- * @param stock_id Id of the icon and label pair
- * @return The newly created GtkButton widget.
- */
-GtkToolItem * ws_gtk_tool_button_new_from_stock(const gchar *stock_id);
-
-/**
- * Creates a GtkToggleToolButton with a preset icon and label.
- * @param stock_id Id of the icon and label pair
- * @return The newly created GtkButton widget.
- */
-GtkToolItem * ws_gtk_toggle_tool_button_new_from_stock(const gchar *stock_id);
-
-/**
- * Creates a GtkImage displaying a stock icon.
- * @param stock_id a stock icon name
- * @param size a stock icon size of GtkIconSize type
- */
-GtkWidget * ws_gtk_image_new_from_stock(const gchar *stock_id, GtkIconSize size);
-
-#endif /* __STOCK_ICONS_H__ */
diff --git a/ui/gtk/summary_dlg.c b/ui/gtk/summary_dlg.c
deleted file mode 100644
index 6a24690178..0000000000
--- a/ui/gtk/summary_dlg.c
+++ /dev/null
@@ -1,1008 +0,0 @@
-/* summary_dlg.c
- * Routines for capture file summary window
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <version_info.h>
-
-#include "../../file.h"
-
-#ifdef HAVE_LIBPCAP
-#include "ui/capture.h"
-#include "ui/capture_globals.h"
-#endif
-#include "ui/main_statusbar.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/summary_dlg.h"
-#include "ui/summary.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/packet_list.h"
-
-#include "globals.h"
-
-#define SUM_STR_MAX 1024
-#define FILTER_SNIP_LEN 50
-#define SHB_STR_SNIP_LEN 50
-
-static GtkWidget *summary_dlg = NULL;
-static GtkWidget *view_capture_and_pkt_comments_dlg = NULL;
-
-
-static void
-add_string_to_grid_sensitive(GtkWidget *grid, guint *row, const gchar *title, const gchar *value, gboolean sensitive)
-{
- GtkWidget *label;
- gchar *indent;
-
- if(strlen(value) != 0) {
- indent = g_strdup_printf(" %s", title);
- } else {
- indent = g_strdup(title);
- }
- label = gtk_label_new(indent);
- if (strlen(value) == 0) {
- gchar *message = g_strdup_printf("<span weight=\"bold\">%s</span>", title);
- gtk_label_set_markup(GTK_LABEL(label), message);
- g_free (message);
- }
- g_free(indent);
- gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
- gtk_widget_set_sensitive(label, sensitive);
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 0, *row, 1, 1);
-
- label = gtk_label_new(value);
- gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
- gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
- gtk_widget_set_sensitive(label, sensitive);
- ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 1, *row, 1, 1);
-
- *row = *row + 1;
-}
-
-static void
-add_string_to_grid(GtkWidget *grid, guint *row, const gchar *title, const gchar *value)
-{
- add_string_to_grid_sensitive(grid, row, title, value, TRUE);
-}
-
-
-static void
-add_string_to_list(GtkWidget *list, const gchar *title, gchar *captured,
- gchar *displayed, gchar *pct_displayed, gchar *marked,
- gchar *pct_marked)
-{
- simple_list_append(list,
- 0, title,
- 1, captured,
- 2, displayed,
- 3, pct_displayed,
- 4, marked,
- 5, pct_marked,
- -1);
-}
-
-static void
-time_to_string(char *string_buff, gulong string_buff_size, time_t ti_time)
-{
- struct tm *ti_tm;
-
- ti_tm = localtime(&ti_time);
- if (ti_tm == NULL) {
- g_snprintf(string_buff, string_buff_size, "Not representable");
- return;
- }
- g_snprintf(string_buff, string_buff_size,
- "%04d-%02d-%02d %02d:%02d:%02d",
- ti_tm->tm_year + 1900,
- ti_tm->tm_mon + 1,
- ti_tm->tm_mday,
- ti_tm->tm_hour,
- ti_tm->tm_min,
- ti_tm->tm_sec);
-}
-
-static void
-summary_ok_cb(GtkWidget *w _U_, GtkWidget *view)
-{
- GtkTextBuffer *buffer;
- GtkTextIter start_iter;
- GtkTextIter end_iter;
- gchar *new_comment = NULL;
-
- if (view != NULL && cfile.filename != NULL) {
- buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
- gtk_text_buffer_get_start_iter (buffer, &start_iter);
- gtk_text_buffer_get_end_iter (buffer, &end_iter);
-
- new_comment = gtk_text_buffer_get_text (buffer, &start_iter, &end_iter, FALSE /* whether to include invisible text */);
-
- cf_update_section_comment(&cfile, new_comment);
-
- /* Update the main window */
- main_update_for_unsaved_changes(&cfile);
-
- status_capture_comment_update();
- }
-
- window_destroy(summary_dlg);
-}
-
-static void
-summary_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
-{
- /* Note that we no longer have a Summary dialog box. */
- summary_dlg = NULL;
-}
-
-void
-summary_open_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- summary_tally summary;
- GtkWidget *main_vb, *bbox, *cancel_bt, *ok_bt, *help_bt;
- GtkWidget *grid, *scrolled_window;
- GtkWidget *list, *treeview;
- GtkWidget *comment_view = NULL, *comment_frame, *comment_vbox;
- GtkTextBuffer *buffer = NULL;
- GtkListStore *store;
- GtkTreeIter iter;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
- static const char *titles[] = {
- "Traffic", "Captured", "Displayed", "Displayed %", "Marked", "Marked %" };
-
- gchar string_buff[SUM_STR_MAX];
- gchar string_buff2[SUM_STR_MAX];
- gchar string_buff3[SUM_STR_MAX];
- gchar string_buff4[SUM_STR_MAX];
- gchar string_buff5[SUM_STR_MAX];
-
- double seconds;
- double disp_seconds;
- double marked_seconds;
- guint row;
-
- unsigned int elapsed_time;
- iface_options iface;
- wtap_block_t shb_inf;
- unsigned int i;
-
- if (summary_dlg != NULL) {
- /* There's already a Summary dialog box; reactivate it. */
- reactivate_window(summary_dlg);
- return;
- }
-
- /* initial computations */
- summary_fill_in(&cfile, &summary);
-#ifdef HAVE_LIBPCAP
- summary_fill_in_capture(&cfile, &global_capture_opts, &summary);
-#endif
- /*
- * Note: the start and stop times are initialized to 0, so if we
- * have zero or one packets of the type in question that have
- * time stamps, the elapsed times will be zero, just as if we
- * have both start and stop time stamps but they're the same.
- * That means we can avoid some checks for whether we have more
- * than one packet of the type in question with time stamps.
- */
- seconds = summary.stop_time - summary.start_time;
- disp_seconds = summary.filtered_stop - summary.filtered_start;
- marked_seconds = summary.marked_stop - summary.marked_start;
-
- summary_dlg = window_new(GTK_WINDOW_TOPLEVEL, "Wireshark: Summary");
- gtk_window_set_default_size(GTK_WINDOW(summary_dlg), 400, 750);
-
- /* Scrolled Window to hold them all */
- scrolled_window = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- gtk_container_add(GTK_CONTAINER(summary_dlg), scrolled_window);
-
- /* Container for each row of widgets */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 12, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 12);
-#if ! GTK_CHECK_VERSION(3,8,0)
- gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), main_vb);
-#else
- gtk_container_add(GTK_CONTAINER(scrolled_window), main_vb);
-#endif
-
- /* grid */
- grid = ws_gtk_grid_new();
- ws_gtk_grid_set_column_spacing(GTK_GRID(grid), 6);
- ws_gtk_grid_set_row_spacing(GTK_GRID(grid), 3);
- gtk_box_pack_start(GTK_BOX(main_vb), grid, TRUE, TRUE, 0);
- row = 0;
-
- /* File */
- add_string_to_grid(grid, &row, "File", "");
-
- /* filename */
- g_snprintf(string_buff, SUM_STR_MAX, "%s", summary.filename);
- add_string_to_grid(grid, &row, "Name:", string_buff);
-
- /* length */
- g_snprintf(string_buff, SUM_STR_MAX, "%" G_GINT64_MODIFIER "d bytes",
- summary.file_length);
- add_string_to_grid(grid, &row, "Length:", string_buff);
-
- /* format */
- g_snprintf(string_buff, SUM_STR_MAX, "%s%s",
- wtap_file_type_subtype_string(summary.file_type),
- summary.iscompressed? " (gzip compressed)" : "");
- add_string_to_grid(grid, &row, "Format:", string_buff);
-
- /* encapsulation */
- if (summary.file_encap_type == WTAP_ENCAP_PER_PACKET) {
- for (i = 0; i < summary.packet_encap_types->len; i++) {
- g_snprintf(string_buff, SUM_STR_MAX, "%s",
- wtap_encap_string(g_array_index(summary.packet_encap_types, int, i)));
- add_string_to_grid(grid, &row, (i == 0) ? "Encapsulation:" : "",
- string_buff);
- }
- } else {
- g_snprintf(string_buff, SUM_STR_MAX, "%s", wtap_encap_string(summary.file_encap_type));
- add_string_to_grid(grid, &row, "Encapsulation:", string_buff);
- }
- if (summary.snap != 0) {
- /* snapshot length */
- g_snprintf(string_buff, SUM_STR_MAX, "%u bytes", summary.snap);
- add_string_to_grid(grid, &row, "Packet size limit:", string_buff);
- }
-
- shb_inf = wtap_file_get_shb(cfile.provider.wth);
-
- /* Capture file comment area */
- if (wtap_dump_can_write(cfile.linktypes, WTAP_COMMENT_PER_SECTION)) {
- comment_frame = gtk_frame_new("Capture file comments");
- gtk_frame_set_shadow_type(GTK_FRAME(comment_frame), GTK_SHADOW_ETCHED_IN);
- gtk_box_pack_start(GTK_BOX(main_vb), comment_frame, TRUE, TRUE, 0);
- gtk_widget_show(comment_frame);
-
- comment_vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(comment_frame), comment_vbox);
- gtk_widget_show(comment_vbox);
-
- comment_view = gtk_text_view_new();
- gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(comment_view), GTK_WRAP_WORD);
- buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (comment_view));
- gtk_text_buffer_set_text (buffer, "", -1);
- if (shb_inf != NULL) {
- char *opt_comment;
-
- /* XXX - this only shows the last comment */
- for (i = 0; wtap_block_get_nth_string_option_value(shb_inf, OPT_COMMENT, i, &opt_comment) == WTAP_OPTTYPE_SUCCESS; i++) {
- if (opt_comment[0] != '\0')
- gtk_text_buffer_set_text (buffer, opt_comment, -1);
- }
- }
- gtk_box_pack_start(GTK_BOX(comment_vbox), comment_view, TRUE, TRUE, 0);
- gtk_widget_show (comment_view);
- }
-
- /*
- * We must have no un-time-stamped packets (i.e., the number of
- * time-stamped packets must be the same as the number of packets),
- * and at least one time-stamped packet, in order for the start
- * and stop times to be valid.
- */
- if (summary.packet_count_ts == summary.packet_count &&
- summary.packet_count >= 1) {
- /* Time */
- add_string_to_grid(grid, &row, "", "");
- add_string_to_grid(grid, &row, "Time", "");
-
- /* start time */
- time_to_string(string_buff, SUM_STR_MAX, (time_t)summary.start_time);
- add_string_to_grid(grid, &row, "First packet:", string_buff);
-
- /* stop time */
- time_to_string(string_buff, SUM_STR_MAX, (time_t)summary.stop_time);
- add_string_to_grid(grid, &row, "Last packet:", string_buff);
-
- /*
- * We must have at least two time-stamped packets for the elapsed time
- * to be valid.
- */
- if (summary.packet_count_ts >= 2) {
- /* elapsed seconds */
- elapsed_time = (unsigned int)summary.elapsed_time;
- if(elapsed_time/86400) {
- g_snprintf(string_buff, SUM_STR_MAX, "%02u days %02u:%02u:%02u",
- elapsed_time/86400, elapsed_time%86400/3600, elapsed_time%3600/60, elapsed_time%60);
- } else {
- g_snprintf(string_buff, SUM_STR_MAX, "%02u:%02u:%02u",
- elapsed_time%86400/3600, elapsed_time%3600/60, elapsed_time%60);
- }
- add_string_to_grid(grid, &row, "Elapsed:", string_buff);
- }
- }
-
- /* Capture */
- add_string_to_grid(grid, &row, "", "");
- add_string_to_grid_sensitive(grid, &row, "Capture", "", (summary.ifaces->len > 0));
- if (shb_inf != NULL) {
- char *str;
-
- if (wtap_block_get_string_option_value(shb_inf, OPT_SHB_HARDWARE, &str) == WTAP_OPTTYPE_SUCCESS &&
- str[0] != '\0') {
- g_snprintf(string_buff, SHB_STR_SNIP_LEN, "%s", str);
- add_string_to_grid(grid, &row, "Capture HW:",string_buff);
- }
-
- if (wtap_block_get_string_option_value(shb_inf, OPT_SHB_OS, &str) == WTAP_OPTTYPE_SUCCESS &&
- str[0] != '\0') {
- /* truncate the strings to a reasonable length */
- g_snprintf(string_buff, SHB_STR_SNIP_LEN, "%s", str);
- add_string_to_grid(grid, &row, "OS:", string_buff);
- }
-
- if (wtap_block_get_string_option_value(shb_inf, OPT_SHB_USERAPPL, &str) == WTAP_OPTTYPE_SUCCESS &&
- str[0] != '\0') {
- /* truncate the strings to a reasonable length */
- g_snprintf(string_buff, SHB_STR_SNIP_LEN, "%s", str);
- add_string_to_grid(grid, &row, "Capture application:", string_buff);
- }
- }
- scrolled_window = gtk_scrolled_window_new (NULL, NULL);
- gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 5);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_widget_set_size_request(scrolled_window, -1, 120);
-
- treeview = gtk_tree_view_new();
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Interface", renderer, "text", 0, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Dropped Packets", renderer, "text", 1, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Capture Filter", renderer, "text", 2, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Link type", renderer, "text", 3, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Packet size limit", renderer, "text", 4, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
-
- store = gtk_list_store_new(5, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
- for (i = 0; i < summary.ifaces->len; i++) {
- iface = g_array_index(summary.ifaces, iface_options, i);
- /* interface */
- if (iface.descr) {
- g_snprintf(string_buff, SUM_STR_MAX, "%s", iface.descr);
- } else if (iface.name) {
- g_snprintf(string_buff, SUM_STR_MAX, "%s", iface.name);
- } else {
- g_snprintf(string_buff, SUM_STR_MAX, "unknown");
- }
- /* Dropped count */
- if (iface.drops_known) {
- g_snprintf(string_buff2, SUM_STR_MAX, "%" G_GINT64_MODIFIER "u (%.3f%%)",
- iface.drops, summary.packet_count ? (100.0 * iface.drops)/summary.packet_count : 0.0);
- } else {
- g_snprintf(string_buff2, SUM_STR_MAX, "unknown");
- }
- /* Capture filter */
- if (iface.cfilter && iface.cfilter[0] != '\0') {
- g_snprintf(string_buff3, SUM_STR_MAX, "%s", iface.cfilter);
- } else {
- if (iface.name) {
- g_snprintf(string_buff3, SUM_STR_MAX, "none");
- } else {
- g_snprintf(string_buff3, SUM_STR_MAX, "unknown");
- }
- }
- g_snprintf(string_buff4, SUM_STR_MAX, "%s", wtap_encap_string(iface.encap_type));
- g_snprintf(string_buff5, SUM_STR_MAX, "%u bytes", iface.snap);
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, string_buff, 1, string_buff2, 2, string_buff3, 3, string_buff4, 4, string_buff5,-1);
- }
- gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(store));
- g_object_unref (store);
- gtk_container_add(GTK_CONTAINER(scrolled_window), treeview);
- gtk_box_pack_start(GTK_BOX(main_vb), scrolled_window, TRUE, TRUE, 0);
- gtk_widget_show_all(scrolled_window);
- grid = ws_gtk_grid_new();
- ws_gtk_grid_set_column_spacing(GTK_GRID(grid), 6);
- ws_gtk_grid_set_row_spacing(GTK_GRID(grid), 3);
- gtk_box_pack_start(GTK_BOX(main_vb), grid, TRUE, TRUE, 0);
- row = 0;
-
-
- /* Data */
- add_string_to_grid(grid, &row, "", "");
- add_string_to_grid(grid, &row, "Display", "");
-
- if (summary.dfilter) {
- /* Display filter */
- add_string_to_grid(grid, &row, "Display filter:", summary.dfilter);
- } else {
- /* Display filter */
- add_string_to_grid(grid, &row, "Display filter:", "none");
- }
-
- /* Ignored packet count */
- g_snprintf(string_buff, SUM_STR_MAX, "%i (%.3f%%)", summary.ignored_count,
- summary.packet_count ? (100.0 * summary.ignored_count)/summary.packet_count : 0.0);
- add_string_to_grid(grid, &row, "Ignored packets:", string_buff);
-
- /* Traffic */
- list = simple_list_new(6, titles);
- gtk_box_pack_start(GTK_BOX(main_vb), list, TRUE, TRUE, 0);
-
-#define cap_buf string_buff
-#define disp_buf string_buff2
-#define disp_pct_buf string_buff3
-#define mark_buf string_buff4
-#define mark_pct_buf string_buff5
-
- /* Packet count */
- g_snprintf(cap_buf, SUM_STR_MAX, "%i", summary.packet_count);
- if (summary.dfilter) {
- g_snprintf(disp_buf, SUM_STR_MAX, "%i", summary.filtered_count);
- g_snprintf(disp_pct_buf, SUM_STR_MAX, "%.3f%%", summary.packet_count ?
- (100.0 * summary.filtered_count)/summary.packet_count : 0.0);
- } else {
- g_strlcpy(disp_buf, cap_buf, SUM_STR_MAX);
- g_strlcpy(disp_pct_buf, "100.000%", SUM_STR_MAX);
- }
- g_snprintf(mark_buf, SUM_STR_MAX, "%i", summary.marked_count);
- g_snprintf(mark_pct_buf, SUM_STR_MAX, "%.3f%%", summary.packet_count ?
- (100.0 * summary.marked_count)/summary.packet_count : 0.0);
- add_string_to_list(list, "Packets", cap_buf,
- disp_buf, disp_pct_buf, mark_buf, mark_pct_buf);
-
- /* Time between first and last */
- if (seconds > 0) {
- g_snprintf(cap_buf, SUM_STR_MAX, "%.3f sec", seconds);
- } else {
- cap_buf[0] = '\0';
- }
- if (summary.dfilter && disp_seconds > 0) {
- g_snprintf(disp_buf, SUM_STR_MAX, "%.3f sec", disp_seconds);
- } else {
- disp_buf[0] = '\0';
- }
- disp_pct_buf[0] = '\0';
- if (summary.marked_count && marked_seconds > 0) {
- g_snprintf(mark_buf, SUM_STR_MAX, "%.3f sec", marked_seconds);
- } else {
- mark_buf[0] = '\0';
- }
- mark_pct_buf[0] = '\0';
- if (cap_buf[0] != '\0' || disp_buf[0] != '\0' || mark_buf[0] != '\0') {
- add_string_to_list(list, "Between first and last packet", cap_buf,
- disp_buf, disp_pct_buf, mark_buf, mark_pct_buf);
- }
-
- /* Average packets per second */
- if (seconds > 0) {
- g_snprintf(cap_buf, SUM_STR_MAX, "%.3f", summary.packet_count/seconds);
- } else {
- cap_buf[0] = '\0';
- }
- if(summary.dfilter && disp_seconds > 0) {
- g_snprintf(disp_buf, SUM_STR_MAX, "%.3f", summary.filtered_count/disp_seconds);
- } else {
- disp_buf[0] = '\0';
- }
- disp_pct_buf[0] = '\0';
- if(summary.marked_count && marked_seconds > 0) {
- g_snprintf(mark_buf, SUM_STR_MAX, "%.3f", summary.marked_count/marked_seconds);
- } else {
- mark_buf[0] = '\0';
- }
- mark_pct_buf[0] = '\0';
- if (cap_buf[0] != '\0' || disp_buf[0] != '\0' || mark_buf[0] != '\0') {
- add_string_to_list(list, "Avg. packets/sec", cap_buf,
- disp_buf, disp_pct_buf, mark_buf, mark_pct_buf);
- }
-
- /* Average packet size */
- if (summary.packet_count > 1) {
- g_snprintf(cap_buf, SUM_STR_MAX, "%" G_GUINT64_FORMAT " bytes",
- (guint64) ((double)summary.bytes/summary.packet_count + 0.5) );
- } else {
- cap_buf[0] = '\0';
- }
- if (summary.dfilter && summary.filtered_count > 1) {
- g_snprintf(disp_buf, SUM_STR_MAX, "%" G_GUINT64_FORMAT " bytes",
- (guint64) ((double)summary.filtered_bytes/summary.filtered_count + 0.5));
- } else {
- disp_buf[0] = '\0';
- }
- disp_pct_buf[0] = '\0';
- if (summary.marked_count > 1) {
- g_snprintf(mark_buf, SUM_STR_MAX, "%" G_GUINT64_FORMAT " bytes",
- (guint64) ((double)summary.marked_bytes/summary.marked_count + 0.5));
- } else {
- mark_buf[0] = '\0';
- }
- mark_pct_buf[0] = '\0';
- if (cap_buf[0] != '\0' || disp_buf[0] != '\0' || mark_buf[0] != '\0') {
- add_string_to_list(list, "Avg. packet size", cap_buf,
- disp_buf, disp_pct_buf, mark_buf, mark_pct_buf);
- }
-
- /* Byte count */
- g_snprintf(cap_buf, SUM_STR_MAX, "%" G_GINT64_MODIFIER "u", summary.bytes);
- if (summary.dfilter) {
- g_snprintf(disp_buf, SUM_STR_MAX, "%" G_GINT64_MODIFIER "u", summary.filtered_bytes);
- g_snprintf(disp_pct_buf, SUM_STR_MAX, "%.3f%%", summary.bytes ?
- /* MSVC cannot convert from unsigned __int64 to float, so first convert to signed __int64 */
- (100.0 * (gint64) summary.filtered_bytes)/summary.bytes : 0.0);
- } else {
- g_strlcpy(disp_buf, cap_buf, SUM_STR_MAX);
- g_strlcpy(disp_pct_buf, "100.000%", SUM_STR_MAX);
- }
- if (summary.marked_count) {
- g_snprintf(mark_buf, SUM_STR_MAX, "%" G_GINT64_MODIFIER "u", summary.marked_bytes);
- g_snprintf(mark_pct_buf, SUM_STR_MAX, "%.3f%%", summary.bytes ?
- /* MSVC cannot convert from unsigned __int64 to float, so first convert to signed __int64 */
- (100.0 * (gint64) summary.marked_bytes)/summary.bytes : 0.0);
- } else {
- g_strlcpy(mark_buf, "0", SUM_STR_MAX);
- g_strlcpy(mark_pct_buf, "0.000%", SUM_STR_MAX);
- }
- if (cap_buf[0] != '\0' || disp_buf[0] != '\0' || mark_buf[0] != '\0') {
- add_string_to_list(list, "Bytes", cap_buf,
- disp_buf, disp_pct_buf, mark_buf, mark_pct_buf);
- }
-
- /* Bytes per second */
- if (seconds > 0){
- /* MSVC cannot convert from unsigned __int64 to float, so first convert to signed __int64 */
- g_snprintf(cap_buf, SUM_STR_MAX, "%.3f", ((gint64) summary.bytes)/seconds);
- } else {
- cap_buf[0] = '\0';
- }
- if (summary.dfilter && disp_seconds > 0) {
- /* MSVC cannot convert from unsigned __int64 to float, so first convert to signed __int64 */
- g_snprintf(disp_buf, SUM_STR_MAX, "%.3f", ((gint64) summary.filtered_bytes)/disp_seconds);
- } else {
- disp_buf[0] = '\0';
- }
- disp_pct_buf[0] = '\0';
- if (summary.marked_count && marked_seconds > 0) {
- /* MSVC cannot convert from unsigned __int64 to float, so first convert to signed __int64 */
- g_snprintf(mark_buf, SUM_STR_MAX, "%.3f", ((gint64) summary.marked_bytes)/marked_seconds);
- } else {
- mark_buf[0] = '\0';
- }
- mark_pct_buf[0] = '\0';
- if (cap_buf[0] != '\0' || disp_buf[0] != '\0' || mark_buf[0] != '\0') {
- add_string_to_list(list, "Avg. bytes/sec", cap_buf,
- disp_buf, disp_pct_buf, mark_buf, mark_pct_buf);
- }
-
- /* MBit per second */
- if (seconds > 0) {
- g_snprintf(cap_buf, SUM_STR_MAX, "%.3f",
- /* MSVC cannot convert from unsigned __int64 to float, so first convert to signed __int64 */
- ((gint64) summary.bytes) * 8.0 / (seconds * 1000.0 * 1000.0));
- } else {
- cap_buf[0] = '\0';
- }
- if (summary.dfilter && disp_seconds > 0) {
- g_snprintf(disp_buf, SUM_STR_MAX, "%.3f",
- /* MSVC cannot convert from unsigned __int64 to float, so first convert to signed __int64 */
- ((gint64) summary.filtered_bytes) * 8.0 / (disp_seconds * 1000.0 * 1000.0));
- } else {
- disp_buf[0] = '\0';
- }
- disp_pct_buf[0] = '\0';
- if (summary.marked_count && marked_seconds > 0) {
- g_snprintf(mark_buf, SUM_STR_MAX, "%.3f",
- /* MSVC cannot convert from unsigned __int64 to float, so first convert to signed __int64 */
- ((gint64) summary.marked_bytes) * 8.0 / (marked_seconds * 1000.0 * 1000.0));
- } else {
- mark_buf[0] = '\0';
- }
- mark_pct_buf[0] = '\0';
- if (cap_buf[0] != '\0' || disp_buf[0] != '\0' || mark_buf[0] != '\0') {
- add_string_to_list(list, "Avg. MBit/sec", cap_buf,
- disp_buf, disp_pct_buf, mark_buf, mark_pct_buf);
- }
-
-
- /* Button row. */
- bbox = dlg_button_row_new(GTK_STOCK_CANCEL, GTK_STOCK_OK, GTK_STOCK_HELP, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, TRUE, TRUE, 0);
-
- cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- window_set_cancel_button(summary_dlg, cancel_bt, window_cancel_button_cb);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- g_signal_connect (ok_bt, "clicked",
- G_CALLBACK(summary_ok_cb), comment_view);
- gtk_widget_grab_focus(ok_bt);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_STATS_SUMMARY_DIALOG);
-
-
- g_signal_connect(summary_dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(summary_dlg, "destroy", G_CALLBACK(summary_destroy_cb), NULL);
-
- gtk_widget_show_all(summary_dlg);
- window_present(summary_dlg);
-}
-
-#define INDENT " "
-void
-summary_to_texbuff(GtkTextBuffer *buffer)
-{
- summary_tally summary;
- gchar string_buff[SUM_STR_MAX];
- gchar tmp_buff[SUM_STR_MAX];
- wtap_block_t shb_inf;
- unsigned int i;
- unsigned int elapsed_time;
- iface_options iface;
- double seconds;
-
- /* initial computations */
- summary_fill_in(&cfile, &summary);
-#ifdef HAVE_LIBPCAP
- summary_fill_in_capture(&cfile, &global_capture_opts, &summary);
-#endif
-
- /* Add Wireshark version*/
- g_snprintf(string_buff, SUM_STR_MAX, "Summary created by Wireshark %s\n\n", get_ws_vcs_version_info());
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- /* Info about file */
- g_snprintf(string_buff, SUM_STR_MAX, "File: \n");
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- /* Filename */
- g_snprintf(string_buff, SUM_STR_MAX, INDENT "Name: %s\n", summary.filename);
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- /* length */
- g_snprintf(string_buff, SUM_STR_MAX, INDENT "Length: %" G_GINT64_MODIFIER "d bytes\n",
- summary.file_length);
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- /* format */
- g_snprintf(string_buff, SUM_STR_MAX, INDENT "Format: %s%s",
- wtap_file_type_subtype_string(summary.file_type),
- summary.iscompressed? " (gzip compressed)\n" : "\n");
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- /* encapsulation */
- if (summary.file_encap_type == WTAP_ENCAP_PER_PACKET) {
- for (i = 0; i < summary.packet_encap_types->len; i++) {
- g_snprintf(string_buff, SUM_STR_MAX, INDENT "Encapsulation: %s\n",
- wtap_encap_string(g_array_index(summary.packet_encap_types, int, i)));
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
- }
- } else {
- g_snprintf(string_buff, SUM_STR_MAX, INDENT "Encapsulation: %s\n", wtap_encap_string(summary.file_encap_type));
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
- }
- if (summary.snap != 0) {
- /* snapshot length */
- g_snprintf(string_buff, SUM_STR_MAX, INDENT "Packet size limit: %u bytes\n", summary.snap);
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
- }
-
- /* Add two empty lines */
- g_snprintf(string_buff, SUM_STR_MAX, "\n\n");
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- /* Time Section */
- if (summary.packet_count_ts == summary.packet_count &&
- summary.packet_count >= 1) {
- /* Add heading Time */
- g_snprintf(string_buff, SUM_STR_MAX, "Time:\n");
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- /* start time */
- time_to_string(tmp_buff, SUM_STR_MAX, (time_t)summary.start_time);
- g_snprintf(string_buff, SUM_STR_MAX, INDENT "First packet: %s\n",tmp_buff);
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- /* stop time */
- time_to_string(tmp_buff, SUM_STR_MAX, (time_t)summary.stop_time);
- g_snprintf(string_buff, SUM_STR_MAX, INDENT "Last packet: %s\n", tmp_buff);
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- /*
- * We must have at least two time-stamped packets for the elapsed time
- * to be valid.
- */
- if (summary.packet_count_ts >= 2) {
- /* elapsed seconds */
- elapsed_time = (unsigned int)summary.elapsed_time;
- if(elapsed_time/86400) {
- g_snprintf(tmp_buff, SUM_STR_MAX, "%02u days %02u:%02u:%02u",
- elapsed_time/86400, elapsed_time%86400/3600, elapsed_time%3600/60, elapsed_time%60);
- } else {
- g_snprintf(tmp_buff, SUM_STR_MAX, "%02u:%02u:%02u",
- elapsed_time%86400/3600, elapsed_time%3600/60, elapsed_time%60);
- }
- g_snprintf(string_buff, SUM_STR_MAX, INDENT "Elapsed: %s\n", tmp_buff);
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
- }
- }
-
- /* Add two empty lines */
- g_snprintf(string_buff, SUM_STR_MAX, "\n\n");
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- g_snprintf(string_buff, SUM_STR_MAX, "Capture:\n");
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- shb_inf = wtap_file_get_shb(cfile.provider.wth);
- if (shb_inf != NULL) {
- char *str;
-
- if (wtap_block_get_string_option_value(shb_inf, OPT_SHB_HARDWARE, &str) == WTAP_OPTTYPE_SUCCESS &&
- str[0] != '\0') {
- /* truncate the string to a reasonable length */
- g_snprintf(string_buff, SUM_STR_MAX, INDENT "Capture HW: %s\n", str);
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
- }
- if (wtap_block_get_string_option_value(shb_inf, OPT_SHB_OS, &str) == WTAP_OPTTYPE_SUCCESS &&
- str[0] != '\0') {
- /* truncate the strings to a reasonable length */
- g_snprintf(string_buff, SUM_STR_MAX, INDENT "OS: %s\n", str);
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
- }
- if (wtap_block_get_string_option_value(shb_inf, OPT_SHB_USERAPPL, &str) == WTAP_OPTTYPE_SUCCESS &&
- str[0] != '\0') {
- /* truncate the string to a reasonable length */
- g_snprintf(string_buff, SUM_STR_MAX, INDENT "Capture application: %s\n", str);
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
- }
- }
-
- /* Add empty line */
- g_snprintf(string_buff, SUM_STR_MAX, "\n");
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- /* Interface info */
- for (i = 0; i < summary.ifaces->len; i++) {
- iface = g_array_index(summary.ifaces, iface_options, i);
- /* interface */
- if (iface.descr) {
- g_snprintf(string_buff, SUM_STR_MAX, INDENT "%s:\n", iface.descr);
- } else if (iface.name) {
- g_snprintf(string_buff, SUM_STR_MAX, INDENT "%s:\n", iface.name);
- } else {
- g_snprintf(string_buff, SUM_STR_MAX, INDENT "Unknown interface:\n");
- }
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- /* Dropped count */
- if (iface.drops_known) {
- g_snprintf(string_buff, SUM_STR_MAX, INDENT INDENT "Dropped packets: %" G_GINT64_MODIFIER "u (%.3f%%)\n",
- iface.drops, summary.packet_count ? (100.0 * iface.drops)/summary.packet_count : 0.0);
- } else {
- g_snprintf(string_buff, SUM_STR_MAX, INDENT INDENT "Dropped packets: unknown\n");
- }
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- /* Capture filter */
- if (iface.cfilter && iface.cfilter[0] != '\0') {
- g_snprintf(string_buff, SUM_STR_MAX, INDENT INDENT "Capture filter: %s\n", iface.cfilter);
- } else {
- if (iface.name) {
- g_snprintf(string_buff, SUM_STR_MAX, INDENT INDENT "Capture filter: none\n");
- } else {
- g_snprintf(string_buff, SUM_STR_MAX, INDENT INDENT "Capture filter: unknown\n");
- }
- }
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- g_snprintf(string_buff, SUM_STR_MAX, INDENT INDENT "Link type: %s\n", wtap_encap_string(iface.encap_type));
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- g_snprintf(string_buff, SUM_STR_MAX, INDENT INDENT "Packet size limit %u bytes\n", iface.snap);
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- }
-
- /* Add empty line */
- g_snprintf(string_buff, SUM_STR_MAX, "\n");
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- /* Statistics */
- g_snprintf(string_buff, SUM_STR_MAX, "Statistics:\n");
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- /* Packet count */
- g_snprintf(cap_buf, SUM_STR_MAX, INDENT "Packets: %i\n", summary.packet_count);
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- /*
- * Note: the start and stop times are initialized to 0, so if we
- * have zero or one packets of the type in question that have
- * time stamps, the elapsed times will be zero, just as if we
- * have both start and stop time stamps but they're the same.
- * That means we can avoid some checks for whether we have more
- * than one packet of the type in question with time stamps.
- */
- seconds = summary.stop_time - summary.start_time;
- /* Time between first and last */
- if (seconds > 0) {
- g_snprintf(string_buff, SUM_STR_MAX, INDENT "Between first and last packet:%.3f sec\n", seconds);
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
- }
-
- /* Average packets per second */
- if (seconds > 0) {
- g_snprintf(string_buff, SUM_STR_MAX, INDENT "Avg. packets/sec: %.3f\n", summary.packet_count/seconds);
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
- }
-
- /* Average packet size */
- if (summary.packet_count > 1) {
- g_snprintf(string_buff, SUM_STR_MAX, INDENT "Avg packet size: %.3f bytes\n",
- /* MSVC cannot convert from unsigned __int64 to float, so first convert to signed __int64 */
- (float) ((gint64) summary.bytes)/summary.packet_count);
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
- }
-
- /* Byte count */
- g_snprintf(string_buff, SUM_STR_MAX, INDENT "Bytes: %" G_GINT64_MODIFIER "u\n", summary.bytes);
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- /* Bytes per second */
- if (seconds > 0){
- /* MSVC cannot convert from unsigned __int64 to float, so first convert to signed __int64 */
- g_snprintf(string_buff, SUM_STR_MAX, INDENT "Avg bytes/sec: %.3f\n", ((gint64) summary.bytes)/seconds);
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
- }
-
- /* MBit per second */
- if (seconds > 0) {
- g_snprintf(string_buff, SUM_STR_MAX, INDENT "Avg Mbit/sec: %.3f\n",
- /* MSVC cannot convert from unsigned __int64 to float, so first convert to signed __int64 */
- ((gint64) summary.bytes) * 8.0 / (seconds * 1000.0 * 1000.0));
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
- }
-
- /* Add empty line */
- g_snprintf(string_buff, SUM_STR_MAX, "\n");
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
- /* Trace file comments from SHB */
- shb_inf = wtap_file_get_shb(cfile.provider.wth);
- if (shb_inf != NULL) {
- char *opt_comment;
-
- for (i = 0; wtap_block_get_nth_string_option_value(shb_inf, OPT_COMMENT, i, &opt_comment) == WTAP_OPTTYPE_SUCCESS; i++) {
- /* XXX - separator between comments? */
- if (opt_comment[0] != '\0')
- gtk_text_buffer_insert_at_cursor(buffer, opt_comment, -1);
- }
- }
-
-
- g_snprintf(string_buff, SUM_STR_MAX, "\n\n");
- gtk_text_buffer_insert_at_cursor (buffer, string_buff, -1);
-
-}
-
-static void
-comment_summary_copy_to_clipboard_cb(GtkWidget *w _U_, GtkWidget *view)
-{
- GtkTextBuffer *buffer;
- GtkTextIter start_iter, end_iter;
- GtkClipboard *clipboard;
-
- buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
-
- gtk_text_buffer_get_bounds(buffer, &start_iter, &end_iter);
-
- gtk_text_buffer_select_range(buffer, &start_iter, &end_iter);
-
- clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); /* Get the default clipboard */
- gtk_text_buffer_copy_clipboard (buffer, clipboard);
-
- gtk_text_buffer_select_range(buffer, &end_iter, &end_iter);
-
-}
-
-void
-show_packet_comment_summary_dlg (GtkAction *action _U_, gpointer data _U_)
-{
-
- GtkWidget *vbox;
- GtkWidget *view;
- GtkWidget *scroll;
- GtkWidget *bbox;
- GtkWidget *copy_bt, *cancel_bt, *help_bt;
- GtkTextBuffer *buffer;
-
- view_capture_and_pkt_comments_dlg = dlg_window_new ("Comments Summary");
- gtk_widget_set_size_request (view_capture_and_pkt_comments_dlg, 700, 350);
- gtk_window_set_resizable (GTK_WINDOW (view_capture_and_pkt_comments_dlg), TRUE);
- gtk_container_set_border_width (GTK_CONTAINER (view_capture_and_pkt_comments_dlg), DLG_OUTER_MARGIN);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
- gtk_container_add (GTK_CONTAINER (view_capture_and_pkt_comments_dlg), vbox);
- gtk_widget_show (vbox);
-
- view = gtk_text_view_new ();
- gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view), GTK_WRAP_WORD);
- buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
- gtk_widget_show (view);
-
- scroll = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll),
- GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- gtk_container_add(GTK_CONTAINER(scroll), view);
- gtk_widget_show(scroll);
- gtk_box_pack_start(GTK_BOX (vbox), scroll, TRUE, TRUE, 0);
-
- /* Add capture summary information */
- summary_to_texbuff(buffer);
-
- /* Add all packet comments */
- packet_list_return_all_comments(buffer);
-
- /* Button row. */
- bbox = dlg_button_row_new (GTK_STOCK_COPY, GTK_STOCK_CANCEL, GTK_STOCK_HELP, NULL);
- gtk_box_pack_end (GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
-
- copy_bt = (GtkWidget *)g_object_get_data (G_OBJECT(bbox), GTK_STOCK_COPY);
- g_signal_connect (copy_bt, "clicked", G_CALLBACK(comment_summary_copy_to_clipboard_cb), view);
- gtk_widget_set_sensitive (copy_bt, TRUE);
-
- cancel_bt = (GtkWidget *)g_object_get_data (G_OBJECT(bbox), GTK_STOCK_CANCEL);
- window_set_cancel_button (view_capture_and_pkt_comments_dlg, cancel_bt, window_cancel_button_cb);
-
- help_bt = (GtkWidget *)g_object_get_data (G_OBJECT(bbox), GTK_STOCK_HELP);
-#if 0
- g_signal_connect (help_bt, "clicked",/* G_CALLBACK(topic_cb)*/NULL, /*(gpointer)HELP_MANUAL_ADDR_RESOLVE_DIALOG*/NULL);
-#endif
- gtk_widget_set_sensitive (help_bt, FALSE);
-
- gtk_widget_grab_default (copy_bt);
-
-
- gtk_widget_show (view_capture_and_pkt_comments_dlg);
-}
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/summary_dlg.h b/ui/gtk/summary_dlg.h
deleted file mode 100644
index febd9e583d..0000000000
--- a/ui/gtk/summary_dlg.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* summary_dlg.h
- * Routines for capture file summary window
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __SUMMARY_DLG_H__
-#define __SUMMARY_DLG_H__
-
-/** @file
- * "Summary" dialog box.
- */
-
-/**
- * Create the summary dialog box.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-void summary_open_cb(GtkWidget *widget, gpointer data);
-void summary_to_texbuff(GtkTextBuffer *buffer);
-void show_packet_comment_summary_dlg(GtkAction *action, gpointer data);
-
-#endif /* __SUMMARY_DLG_H__ */
diff --git a/ui/gtk/supported_protos_dlg.c b/ui/gtk/supported_protos_dlg.c
deleted file mode 100644
index e34aad9027..0000000000
--- a/ui/gtk/supported_protos_dlg.c
+++ /dev/null
@@ -1,356 +0,0 @@
-/* supported_protos_dlg.c
- *
- * Laurent Deniel <laurent.deniel@free.fr>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 2000 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/proto.h>
-#include <epan/prefs.h>
-
-#include "ui/gtk/supported_protos_dlg.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/font_utils.h"
-
-static const char *proto_supported =
-"The following %d protocols (and packet types) are currently\n"
-"supported by Wireshark:\n\n";
-
-static const char *dfilter_supported =
-"The following per-protocol fields are currently supported by\n"
-"Wireshark and can be used in display filters:\n";
-
-
-
-typedef enum {
- PROTOCOL_SUPPORTED,
- DFILTER_SUPPORTED
-} supported_type_t;
-
-static void supported_destroy_cb(GtkWidget *w, gpointer data);
-static void insert_text(GtkWidget *w, const char *buffer, int nchars);
-static void set_supported_text(GtkWidget *w, supported_type_t type);
-
-/*
- * Keep a static pointer to the current "Supported" window, if any, so that
- * if somebody tries to do "Help->Supported" while there's already a
- * "Supported" window up, we just pop up the existing one, rather than
- * creating a new one.
-*/
-static GtkWidget *supported_w = NULL;
-
-/*
- * Keep static pointers to the text widgets as well (for text format changes).
- */
-static GtkWidget *proto_text, *dfilter_text;
-
-
-
-void supported_cb(GtkWidget *w _U_, gpointer data _U_)
-{
-
- GtkWidget *main_vb, *bbox, *supported_nb, *ok_bt, *label, *txt_scrollw,
- *proto_vb,
- *dfilter_vb;
-
- if (supported_w != NULL) {
- /* There's already a "Supported" dialog box; reactivate it. */
- reactivate_window(supported_w);
- return;
- }
-
- supported_w = window_new(GTK_WINDOW_TOPLEVEL, "Wireshark: Supported Protocols");
- gtk_window_set_default_size(GTK_WINDOW(supported_w), DEF_WIDTH * 2/3, DEF_HEIGHT * 2/3);
- gtk_container_set_border_width(GTK_CONTAINER(supported_w), 2);
-
- /* Container for each row of widgets */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 1, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 1);
- gtk_container_add(GTK_CONTAINER(supported_w), main_vb);
- gtk_widget_show(main_vb);
-
- /* supported topics container */
- supported_nb = gtk_notebook_new();
- gtk_box_pack_start(GTK_BOX(main_vb), supported_nb, TRUE, TRUE, 0);
-
-
- /* protocol list */
- proto_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(proto_vb), 1);
-
- txt_scrollw = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(txt_scrollw),
- GTK_SHADOW_IN);
- gtk_box_pack_start(GTK_BOX(proto_vb), txt_scrollw, TRUE, TRUE, 0);
- proto_text = gtk_text_view_new();
- gtk_text_view_set_editable(GTK_TEXT_VIEW(proto_text), FALSE);
- set_supported_text(proto_text, PROTOCOL_SUPPORTED);
- gtk_container_add(GTK_CONTAINER(txt_scrollw), proto_text);
- gtk_widget_show(txt_scrollw);
- gtk_widget_show(proto_text);
- gtk_widget_show(proto_vb);
- label = gtk_label_new("Protocols");
- gtk_notebook_append_page(GTK_NOTEBOOK(supported_nb), proto_vb, label);
-
- /* display filter fields */
- dfilter_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(dfilter_vb), 1);
-
- txt_scrollw = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(txt_scrollw),
- GTK_SHADOW_IN);
- gtk_box_pack_start(GTK_BOX(dfilter_vb), txt_scrollw, TRUE, TRUE, 0);
- dfilter_text = gtk_text_view_new();
- gtk_text_view_set_editable(GTK_TEXT_VIEW(dfilter_text), FALSE);
- set_supported_text(dfilter_text, DFILTER_SUPPORTED);
- gtk_container_add(GTK_CONTAINER(txt_scrollw), dfilter_text);
- gtk_widget_show(txt_scrollw);
- gtk_widget_show(dfilter_text);
- gtk_widget_show(dfilter_vb);
- label = gtk_label_new("Display Filter Fields");
- gtk_notebook_append_page(GTK_NOTEBOOK(supported_nb), dfilter_vb, label);
-
- /* XXX add other panels here ... */
-
- gtk_widget_show(supported_nb);
-
- /* Button row */
- bbox = dlg_button_row_new(GTK_STOCK_OK, NULL);
- gtk_box_pack_end(GTK_BOX(main_vb), bbox, FALSE, FALSE, 0);
- gtk_widget_show(bbox);
-
- ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- window_set_cancel_button(supported_w, ok_bt, window_cancel_button_cb);
-
- g_signal_connect(supported_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(supported_w, "destroy", G_CALLBACK(supported_destroy_cb), NULL);
-
- gtk_widget_show(supported_w);
- window_present(supported_w);
-} /* supported_cb */
-
-static void supported_destroy_cb(GtkWidget *w _U_, gpointer data _U_)
-{
- /* Note that we no longer have a Help window. */
- supported_w = NULL;
-}
-
-static void insert_text(GtkWidget *w, const char *buffer, int nchars)
-{
- GtkTextBuffer *buf= gtk_text_view_get_buffer(GTK_TEXT_VIEW(w));
- GtkTextIter iter;
-
- gtk_text_buffer_get_end_iter(buf, &iter);
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_override_font(w, user_font_get_regular());
-#else
- gtk_widget_modify_font(w, user_font_get_regular());
-#endif
- if (!g_utf8_validate(buffer, -1, NULL))
- printf("Invalid utf8 encoding: %s\n", buffer); /* ToDo: Don't use printf ?? */
- gtk_text_buffer_insert(buf, &iter, buffer, nchars);
-}
-
-
-static void set_supported_text(GtkWidget *w, supported_type_t type)
-{
-
-#define BUFF_LEN 4096
-#define B_LEN 256
- char buffer[BUFF_LEN];
- header_field_info *hfinfo;
- int i, len, maxlen = 0, maxlen2 = 0, maxlen4 = 0;
- const char *type_name;
- void *cookie, *cookie2;
- protocol_t *protocol;
- const char *name, *short_name, *filter_name;
- int namel = 0, short_namel = 0, filter_namel = 0;
- int count, fcount;
-
-
- /*
- * XXX quick hack:
- * the width and height computations are performed to make the
- * horizontal scrollbar work in gtk1.2. This is only necessary for the
- * PROTOCOL_SUPPORTED and DFILTER_SUPPORTED windows since all others should
- * not have any horizontal scrollbar (line wrapping enabled).
- */
-
-
- switch(type) {
-
- case PROTOCOL_SUPPORTED :
- /* first pass to know the maximum length of first field */
- count = 0;
- for (i = proto_get_first_protocol(&cookie); i != -1;
- i = proto_get_next_protocol(&cookie)) {
- count++;
- protocol = find_protocol_by_id(i);
- name = proto_get_protocol_name(i);
- short_name = proto_get_protocol_short_name(protocol);
- filter_name = proto_get_protocol_filter_name(i);
- if ((len = (int) strlen(name)) > namel)
- namel = len;
- if ((len = (int) strlen(short_name)) > short_namel)
- short_namel = len;
- if ((len = (int) strlen(filter_name)) > filter_namel)
- filter_namel = len;
- }
-
- len = g_snprintf(buffer, BUFF_LEN, proto_supported, count);
- insert_text(w, buffer, len);
-
- /* ok, display the correctly aligned strings */
- for (i = proto_get_first_protocol(&cookie); i != -1;
- i = proto_get_next_protocol(&cookie)) {
- protocol = find_protocol_by_id(i);
- name = proto_get_protocol_name(i);
- short_name = proto_get_protocol_short_name(protocol);
- filter_name = proto_get_protocol_filter_name(i);
-
- /* the name used for sorting in the left column */
- len = g_snprintf(buffer, BUFF_LEN, "%*s %*s %*s\n",
- -short_namel, short_name,
- -namel, name,
- -filter_namel, filter_name);
- insert_text(w, buffer, len);
- }
-
- break;
-
- case DFILTER_SUPPORTED :
-
- /* XXX we should display hinfo->blurb instead of name (if not empty) */
-
- /* first pass to know the maximum length of first and second fields */
- for (i = proto_get_first_protocol(&cookie); i != -1;
- i = proto_get_next_protocol(&cookie)) {
-
- for (hfinfo = proto_get_first_protocol_field(i, &cookie2); hfinfo != NULL;
- hfinfo = proto_get_next_protocol_field(i, &cookie2)) {
-
- if (hfinfo->same_name_prev_id != -1) /* ignore duplicate names */
- continue;
-
- if ((len = (int) strlen(hfinfo->abbrev)) > maxlen)
- maxlen = len;
- if ((len = (int) strlen(hfinfo->name)) > maxlen2)
- maxlen2 = len;
- if (hfinfo->blurb != NULL) {
- if ((len = (int) strlen(hfinfo->blurb)) > maxlen4)
- maxlen4 = len;
- }
- }
- }
-
- insert_text(w, dfilter_supported, (int) strlen(dfilter_supported));
-
- fcount = 0;
- for (i = proto_get_first_protocol(&cookie); i != -1;
- i = proto_get_next_protocol(&cookie)) {
- protocol = find_protocol_by_id(i);
- name = proto_get_protocol_name(i);
- short_name = proto_get_protocol_short_name(protocol);
- filter_name = proto_get_protocol_filter_name(i);
-
- count = 0;
- for (hfinfo = proto_get_first_protocol_field(i, &cookie2); hfinfo != NULL;
- hfinfo = proto_get_next_protocol_field(i, &cookie2)) {
-
- if (hfinfo->same_name_prev_id != -1) /* ignore duplicate names */
- continue;
- count++;
- }
- fcount += count;
-
- len = g_snprintf(buffer, BUFF_LEN, "\n%s - %s (%s) [%d fields]:\n",
- short_name, name, filter_name, count);
- insert_text(w, buffer, len);
-
- for (hfinfo = proto_get_first_protocol_field(i, &cookie2); hfinfo != NULL;
- hfinfo = proto_get_next_protocol_field(i, &cookie2)) {
-
- if (hfinfo->same_name_prev_id != -1) /* ignore duplicate names */
- continue;
-
- type_name = ftype_pretty_name(hfinfo->type);
- if (hfinfo->blurb != NULL && hfinfo->blurb[0] != '\0') {
- len = g_snprintf(buffer, BUFF_LEN, "%*s %*s %*s (%s)\n",
- -maxlen, hfinfo->abbrev,
- -maxlen2, hfinfo->name,
- -maxlen4, hfinfo->blurb,
- type_name);
- } else {
- len = g_snprintf(buffer, BUFF_LEN, "%*s %*s (%s)\n",
- -maxlen, hfinfo->abbrev,
- -maxlen2, hfinfo->name,
- type_name);
- }
- insert_text(w, buffer, len);
- }
- }
- len = g_snprintf(buffer, BUFF_LEN, "\n-- Total %d fields\n", fcount);
- insert_text(w, buffer, len);
-
- break;
- default :
- g_assert_not_reached();
- break;
- } /* switch(type) */
-} /* set_supported_text */
-
-
-static void clear_supported_text(GtkWidget *w)
-{
- GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(w));
-
- gtk_text_buffer_set_text(buf, "", 0);
-}
-
-
-/* Redraw all the text widgets, to use a new font. */
-void supported_redraw(void)
-{
- if (supported_w != NULL) {
- clear_supported_text(proto_text);
- set_supported_text(proto_text, PROTOCOL_SUPPORTED);
- clear_supported_text(dfilter_text);
- set_supported_text(dfilter_text, DFILTER_SUPPORTED);
- }
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local Variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/supported_protos_dlg.h b/ui/gtk/supported_protos_dlg.h
deleted file mode 100644
index 26aa742df3..0000000000
--- a/ui/gtk/supported_protos_dlg.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* supported_protos_dlg.h
- *
- * Laurent Deniel <laurent.deniel@free.fr>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 2000 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- */
-
-#ifndef __SUPPORTED_PROTOS_DLG_H__
-#define __SUPPORTED_PROTOS_DLG_H__
-
-/** @file
- * "Supported Protocols" dialog box.
- */
-
-/**
- * Create the supported protos dialog box.
- *
- * @param widget parent widget (unused)
- * @param data unused
- */
-void supported_cb(GtkWidget *widget, gpointer data);
-
-/** Redraw all the supported protos text widgets, to use a new font. */
-void supported_redraw(void);
-
-#endif /* __SUPPORTED_PROTOS_DLG_H__ */
diff --git a/ui/gtk/tap_param_dlg.c b/ui/gtk/tap_param_dlg.c
deleted file mode 100644
index 4fd0be60ae..0000000000
--- a/ui/gtk/tap_param_dlg.c
+++ /dev/null
@@ -1,430 +0,0 @@
-/* tap_param_dlg.c
- * Routines for parameter dialog used by gui taps
- * Copyright 2003 Lars Roland
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-
-#include "../../globals.h"
-#include <epan/stat_groups.h>
-
-#include "ui/gtk/old-gtk-compat.h"
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/filter_dlg.h"
-#include "ui/gtk/gui_stat_menu.h"
-#include "ui/gtk/tap_param_dlg.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/filter_autocomplete.h"
-
-
-typedef struct _tap_param_dlg_list_item {
- GtkWidget *dlg;
- tap_param_dlg cont;
- construct_args_t args;
- GtkWidget **param_items; /* items for params */
- struct _tap_param_dlg_list_item *next;
-} tap_param_dlg_list_item;
-
-static tap_param_dlg_list_item *start_dlg_list=NULL;
-static tap_param_dlg_list_item *end_dlg_list=NULL;
-static tap_param_dlg_list_item *current_dlg = NULL;
-
-/*
- * Register a stat that has a parameter dialog.
- * We register it both as a command-line stat and a menu item stat.
- */
-void
-register_param_stat(tap_param_dlg *info, const char *name,
- register_stat_group_t group)
-{
- gchar *action_name;
- gchar *full_name;
- const gchar *stock_id = NULL;
- stat_tap_ui ui_info;
- size_t i;
-
- /* XXX We appear to leak memory here. */
- /*
- * This menu item will pop up a dialog box, so append "..."
- * to it.
- */
- full_name = g_strdup_printf("%s...", name);
- /*
- * Escape path separators for add_menu_item_to_main_menubar.
- */
- action_name = g_strdup(name);
- for (i = 0; i < strlen(action_name); i++) {
- if (action_name[i] == '/') {
- action_name[i] = '#';
- }
- }
-
- ui_info.group = group;
- ui_info.title = full_name;
- ui_info.cli_string = info->init_string;
- ui_info.tap_init_cb = info->tap_init_cb;
- ui_info.nparams = info->nparams;
- ui_info.params = info->params;
- register_stat_tap_ui(&ui_info, NULL);
-
- switch (group) {
-
- case REGISTER_ANALYZE_GROUP_UNSORTED:
- case REGISTER_ANALYZE_GROUP_CONVERSATION_FILTER:
- case REGISTER_STAT_GROUP_UNSORTED:
- case REGISTER_STAT_GROUP_GENERIC:
- break;
-
- case REGISTER_STAT_GROUP_CONVERSATION_LIST:
- stock_id = WIRESHARK_STOCK_CONVERSATIONS;
- break;
-
- case REGISTER_STAT_GROUP_ENDPOINT_LIST:
- stock_id = WIRESHARK_STOCK_ENDPOINTS;
- break;
-
- case REGISTER_STAT_GROUP_RESPONSE_TIME:
- stock_id = WIRESHARK_STOCK_TIME;
- break;
-
- case REGISTER_STAT_GROUP_TELEPHONY:
- case REGISTER_STAT_GROUP_TELEPHONY_ANSI:
- case REGISTER_STAT_GROUP_TELEPHONY_GSM:
- case REGISTER_STAT_GROUP_TELEPHONY_LTE:
- case REGISTER_STAT_GROUP_TELEPHONY_MTP3:
- case REGISTER_STAT_GROUP_TELEPHONY_SCTP:
- break;
-
- case REGISTER_TOOLS_GROUP_UNSORTED:
- break;
- }
-
- register_menu_bar_menu_items(
- stat_group_name(group), /* GUI path to the place holder in the menu */
- action_name, /* Action name */
- stock_id, /* Stock id */
- full_name, /* label */
- NULL, /* Accelerator */
- NULL, /* Tooltip */
- tap_param_dlg_cb, /* Callback */
- info, /* Callback data */
- TRUE, /* Enabled */
- NULL,
- NULL);
-}
-
-void tap_param_dlg_update (void)
-{
- tap_param_dlg_list_item *dialog = start_dlg_list;
- char *display_name;
- char *title;
-
- while(dialog != NULL) {
- if(dialog->dlg) {
- display_name = cf_get_display_name(&cfile);
- title = g_strdup_printf("Wireshark: %s: %s", dialog->cont.win_title , display_name);
- g_free(display_name);
- gtk_window_set_title(GTK_WINDOW(dialog->dlg), title);
- g_free(title);
- }
- dialog = dialog->next;
- }
-}
-
-static void
-dlg_destroy_cb(GtkWidget *item _U_, gpointer dialog_data)
-{
- tap_param_dlg_list_item *dlg_data = (tap_param_dlg_list_item *) dialog_data;
- dlg_data->dlg = NULL;
-}
-
-static void
-tap_param_dlg_start_button_clicked(GtkWidget *item _U_, gpointer dialog_data)
-{
- GString *params;
- size_t i;
- gdouble d;
- gint j;
-
- tap_param_dlg_list_item *dlg_data = (tap_param_dlg_list_item *) dialog_data;
-
- params = g_string_new(dlg_data->cont.init_string);
- for(i=0;i<dlg_data->cont.nparams;i++) {
- g_string_append_c(params, ',');
- switch (dlg_data->cont.params[i].type) {
-
- case PARAM_ENUM:
- j = gtk_combo_box_get_active(GTK_COMBO_BOX(dlg_data->param_items[i]));
- g_string_append_printf(params,"%d",
- dlg_data->cont.params[i].enum_vals[j].value);
- break;
-
- case PARAM_UINT:
- d = gtk_spin_button_get_value(GTK_SPIN_BUTTON(dlg_data->param_items[i]));
- g_string_append_printf(params,"%u",(guint)d);
- break;
-
- case PARAM_STRING:
- case PARAM_UUID: /* XXX - do as multiple fixed-length boxes */
- case PARAM_FILTER:
- g_string_append(params,
- gtk_entry_get_text(GTK_ENTRY(dlg_data->param_items[i])));
- break;
- }
- }
- (dlg_data->cont.tap_init_cb)(params->str, dlg_data->cont.user_data);
- g_string_free(params, TRUE);
-}
-
-void
-tap_param_dlg_cb(GtkAction *action _U_, gpointer data)
-{
- const char *filter;
- char *display_name;
- char *title;
- GtkWidget *dlg_box;
- GtkWidget *item_box, *item, *label, *filter_bt;
- GtkWidget *bbox, *start_button, *cancel_button;
- size_t i, j;
- char *label_with_colon;
-
- tap_param_dlg *dlg_data = (tap_param_dlg *) data;
-
- if(dlg_data==NULL)
- return;
-
- if(dlg_data->index==-1) {
- /* Dialog is not registered */
- if(start_dlg_list==NULL) {
- start_dlg_list = (tap_param_dlg_list_item *) g_malloc(sizeof (tap_param_dlg_list_item));
- end_dlg_list = start_dlg_list;
- end_dlg_list->cont.index = 0; /* first entry in list -> index = 0 */
- } else {
- end_dlg_list->next = (tap_param_dlg_list_item *) g_malloc(sizeof (tap_param_dlg_list_item));
- end_dlg_list->next->cont.index = end_dlg_list->cont.index + 1;
- end_dlg_list = end_dlg_list->next;
- }
- end_dlg_list->dlg = NULL;
- end_dlg_list->param_items = (GtkWidget **)g_malloc(dlg_data->nparams * sizeof (GtkWidget *));
- end_dlg_list->cont.win_title = dlg_data->win_title;
- end_dlg_list->cont.init_string = dlg_data->init_string;
- end_dlg_list->cont.tap_init_cb = dlg_data->tap_init_cb;
- end_dlg_list->cont.nparams = dlg_data->nparams;
- end_dlg_list->cont.params = dlg_data->params;
- end_dlg_list->cont.user_data = dlg_data->user_data;
- end_dlg_list->args.title = g_strdup_printf("%s Filter", dlg_data->win_title);
- end_dlg_list->args.wants_apply_button = TRUE;
- end_dlg_list->args.activate_on_ok = FALSE;
- end_dlg_list->args.modal_and_transient = FALSE;
- end_dlg_list->next = NULL;
- dlg_data->index = end_dlg_list->cont.index;
- current_dlg = end_dlg_list;
- } else {
- /* Dialog is registered, find it */
- current_dlg = start_dlg_list;
- while(dlg_data->index != current_dlg->cont.index)
- {
- if(current_dlg->next == NULL) {
- /* could not find any dialog */
- return;
- }
- current_dlg = current_dlg->next;
- }
- }
-
- /* if the window is already open, bring it to front */
- if(current_dlg->dlg){
- gdk_window_raise(gtk_widget_get_window(current_dlg->dlg));
- return;
- }
-
- /* If we don't have any parameters, just launch the stat dialog */
- if (current_dlg->cont.nparams == 0)
- {
- tap_param_dlg_start_button_clicked(NULL, current_dlg);
- return;
- }
-
- display_name = cf_get_display_name(&cfile);
- title = g_strdup_printf("Wireshark: %s: %s", current_dlg->cont.win_title , display_name);
- g_free(display_name);
-
- current_dlg->dlg=dlg_window_new_with_geom(title, current_dlg->cont.win_title, GTK_WIN_POS_CENTER_ON_PARENT);
- gtk_window_set_default_size(GTK_WINDOW(current_dlg->dlg), 300, -1);
- g_free(title);
-
- dlg_box=ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 10, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(dlg_box), 10);
- gtk_container_add(GTK_CONTAINER(current_dlg->dlg), dlg_box);
- gtk_widget_show(dlg_box);
-
- /* Parameter items */
- for(i=0;i<current_dlg->cont.nparams;i++) {
- /* Item box */
- item_box=ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
-
- switch (current_dlg->cont.params[i].type) {
-
- case PARAM_UINT:
- /* Label */
- label_with_colon=g_strdup_printf("%s:", current_dlg->cont.params[i].title);
- label=gtk_label_new(label_with_colon);
- g_free(label_with_colon);
- gtk_box_pack_start(GTK_BOX(item_box), label, FALSE, TRUE, 0);
- gtk_widget_show(label);
-
- /* Spin button */
- item=gtk_spin_button_new_with_range(0, G_MAXUINT, 1);
- gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(item), TRUE);
-
- break;
-
- case PARAM_STRING:
- /* Label */
- label_with_colon=g_strdup_printf("%s:", current_dlg->cont.params[i].title);
- label=gtk_label_new(label_with_colon);
- g_free(label_with_colon);
- gtk_box_pack_start(GTK_BOX(item_box), label, FALSE, TRUE, 0);
- gtk_widget_show(label);
-
- /* Entry */
- item=gtk_entry_new();
- break;
-
- case PARAM_ENUM:
- /* Label */
- label_with_colon=g_strdup_printf("%s:", current_dlg->cont.params[i].title);
- label=gtk_label_new(label_with_colon);
- g_free(label_with_colon);
- gtk_box_pack_start(GTK_BOX(item_box), label, FALSE, TRUE, 0);
- gtk_widget_show(label);
-
- /* Combo box */
- item=gtk_combo_box_text_new();
- for (j = 0; current_dlg->cont.params[i].enum_vals[j].name != NULL;
- j++)
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(item),
- current_dlg->cont.params[i].enum_vals[j].description);
- gtk_combo_box_set_active(GTK_COMBO_BOX(item), 0);
- break;
-
- case PARAM_FILTER:
- /* Filter button */
- filter_bt=ws_gtk_button_new_from_stock(WIRESHARK_STOCK_DISPLAY_FILTER_ENTRY);
- g_signal_connect(filter_bt, "clicked", G_CALLBACK(display_filter_construct_cb), &(current_dlg->args));
- gtk_box_pack_start(GTK_BOX(item_box), filter_bt, FALSE, TRUE, 0);
- gtk_widget_show(filter_bt);
-
- /* Entry */
- item=gtk_entry_new();
- g_signal_connect(item, "changed", G_CALLBACK(filter_te_syntax_check_cb), NULL);
- g_object_set_data(G_OBJECT(item_box), E_FILT_AUTOCOMP_PTR_KEY, NULL);
- g_signal_connect(item, "key-press-event", G_CALLBACK (filter_string_te_key_pressed_cb), NULL);
- g_signal_connect(current_dlg->dlg, "key-press-event", G_CALLBACK (filter_parent_dlg_key_pressed_cb), NULL);
- g_object_set_data(G_OBJECT(filter_bt), E_FILT_TE_PTR_KEY, item);
-
- filter=gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget));
- if(filter){
- gtk_entry_set_text(GTK_ENTRY(item), filter);
- } else {
- colorize_filter_te_as_empty(item);
- }
- break;
-
- default:
- g_assert_not_reached();
- item=NULL;
- break;
- }
-
- gtk_box_pack_start(GTK_BOX(item_box), item, TRUE, TRUE, 0);
- current_dlg->param_items[i]=item;
- gtk_widget_show(item);
-
- gtk_box_pack_start(GTK_BOX(dlg_box), item_box, TRUE, TRUE, 0);
- gtk_widget_show(item_box);
- }
-
- /* button box */
- bbox = dlg_button_row_new(WIRESHARK_STOCK_CREATE_STAT, GTK_STOCK_CANCEL, NULL);
- gtk_box_pack_start(GTK_BOX(dlg_box), bbox, FALSE, FALSE, 0);
- gtk_widget_show(bbox);
-
- start_button = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_CREATE_STAT);
- g_signal_connect(start_button, "clicked",
- G_CALLBACK(tap_param_dlg_start_button_clicked), current_dlg);
-
- cancel_button = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- window_set_cancel_button(current_dlg->dlg, cancel_button, window_cancel_button_cb);
-
- /* Catch the "activate" signal on all the text entries, so that
- if the user types Return there, we act as if the "Create Stat"
- button had been selected, as happens if Return is typed if
- some widget that *doesn't* handle the Return key has the input
- focus. */
- for(i=0;i<current_dlg->cont.nparams;i++){
- switch (current_dlg->cont.params[i].type) {
-
- case PARAM_UINT:
- case PARAM_ENUM:
- break;
-
- case PARAM_STRING:
- case PARAM_FILTER:
- case PARAM_UUID:
- dlg_set_activate(current_dlg->param_items[i], start_button);
- break;
- }
- }
-
- /* Give the initial focus to the first entry box. */
- if(current_dlg->cont.nparams>0){
- gtk_widget_grab_focus(current_dlg->param_items[0]);
- }
-
- gtk_widget_grab_default(start_button );
-
- g_signal_connect(current_dlg->dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(current_dlg->dlg, "destroy", G_CALLBACK(dlg_destroy_cb), current_dlg);
-
- gtk_widget_show_all(current_dlg->dlg);
- window_present(current_dlg->dlg);
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/tap_param_dlg.h b/ui/gtk/tap_param_dlg.h
deleted file mode 100644
index 858304e112..0000000000
--- a/ui/gtk/tap_param_dlg.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/* tap_param_dlg.h
- * Header file for parameter dialog used by gui taps
- * Copyright 2003 Lars Roland
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __TAP_PARAM_DLG_H__
-#define __TAP_PARAM_DLG_H__
-
-/*
- * You can easily add a parameter dialog for your gui tap by using
- * the following infrastructure:
- *
- * Define a global structure of tap_param_dlg within your stat source file.
- * Initiate it with:
- * 1) a title string for the Dialog Window
- * 2) the init string, which is the same as the string after "-z" option without
- * the filter string and without the separating comma.
- * 3) a pointer to the init function of the tap, which will be called when you click
- * on the start button in the display filter dialog.
- * 4) the index with "-1"
- *
- * Within register_tap_menu_yourtap(void), call register_param_stat()
- * with a pointer to the tap_param_dlg structure, a string for the
- * menu item (don't put "..." at the end, register_param_stat() will
- * add it for you), and the REGISTER_STAT_GROUP_ value for the stat
- * group to which your stat should belong.
- *
- * Usage:
- *
- * tap_param_dlg my_tap_param_dlg = {
- * "My Title",
- * "myproto,mytap",
- * gtk_mytap_init,
- * -1
- * };
- *
- * register_tap_menu_mytap(void) {
- * register_param_stat(&my_tap_param_dlg, "My Menu Item",
- * REGISTER_STAT_GROUP_my_group);
- * }
- *
- * See also: h225_ras_srt.c
- *
- */
-
-#include <epan/params.h>
-#include <epan/stat_tap_ui.h>
-
-typedef struct _tap_param_dlg {
- const char *win_title; /* title */
- const char *init_string; /* the string to call the tap without a filter via "-z" option */
- void (* tap_init_cb)(const char *,void*); /* callback to init function of the tap */
- gint index; /* initiate this value always with "-1" */
- size_t nparams; /* number of parameters */
- tap_param *params; /* pointer to table of parameter info */
- gpointer user_data; /* Optional "dialog specific" data */
-} tap_param_dlg;
-
-/*
- * Register a stat that has a parameter dialog.
- * We register it both as a command-line stat and a menu item stat.
- */
-void register_param_stat(tap_param_dlg *info, const char *name,
- register_stat_group_t group);
-
-void tap_param_dlg_cb(GtkAction *action, gpointer user_data);
-
-/* This will update the titles of the dialog windows when we load a new capture file. */
-void tap_param_dlg_update (void);
-
-#endif /* __TAP_PARAM_DLG_H__ */
diff --git a/ui/gtk/tcp_graph.c b/ui/gtk/tcp_graph.c
deleted file mode 100644
index 8d941bf031..0000000000
--- a/ui/gtk/tcp_graph.c
+++ /dev/null
@@ -1,4546 +0,0 @@
-/* tcp_graph.c
- * TCP graph drawing code
- * By Pavel Mores <pvl@uh.cz>
- * Win32 port: rwh@unifiedtech.com
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <math.h>
-#include <string.h>
-
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-#if GTK_CHECK_VERSION(3,0,0)
-# include <gdk/gdkkeysyms-compat.h>
-#endif
-
-#include <epan/packet.h>
-#include <epan/to_str.h>
-#include <epan/etypes.h>
-#include <epan/ppptypes.h>
-#include <epan/epan_dissect.h>
-#include <epan/dissectors/packet-tcp.h>
-#include <epan/address.h>
-#include <epan/conv_id.h>
-
-#include "../../globals.h"
-
-#include <epan/stat_groups.h>
-#include "ui/tap-tcp-stream.h"
-#include <wsutil/utf8_entities.h>
-#include <wsutil/strtoi.h>
-
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_stat_menu.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-#ifndef HAVE_LRINT
-#define lrint rint
-#endif
-
-#define TCP_SYN(flags) ( flags & TH_SYN )
-#define TCP_ACK(flags) ( flags & TH_ACK )
-#define TCP_FIN(flags) ( flags & TH_FIN )
-
-#define TXT_WIDTH 850
-#define TXT_HEIGHT 550
-
-/* initialize_axis() */
-#define AXIS_HORIZONTAL 0
-#define AXIS_VERTICAL 1
-
-#define WINDOW_TITLE_LENGTH 256
-
-#define MOUSE_BUTTON_LEFT 1
-#define MOUSE_BUTTON_MIDDLE 2
-#define MOUSE_BUTTON_RIGHT 3
-
-struct rect {
- double x, y, width, height;
-};
-
-struct line {
- double x1, y1, x2, y2;
-};
-
-struct irect {
- int x, y, width, height;
-};
-
-struct ipoint {
- int x, y;
-};
-
-struct zoomfactor {
- double x, y;
-};
-
-typedef enum {
- ELMT_NONE=0,
- ELMT_RECT=1,
- ELMT_LINE=2,
- ELMT_ELLIPSE=3
-} ElementType;
-
-struct rect_params {
- struct rect dim;
- gint filled;
-};
-
-struct line_params {
- struct line dim;
-};
-
-struct ellipse_params {
- struct rect dim;
-};
-
-struct element {
- ElementType type;
- GdkRGBA *elment_color_p;
- struct segment *parent;
- union {
- struct ellipse_params ellipse;
- struct rect_params rect;
- struct line_params line;
- } p;
-};
-
-struct element_list {
- struct element_list *next;
- struct element *elements;
-};
-
-struct axis {
- struct gtk_graph *g; /* which graph we belong to */
- GtkWidget *drawing_area;
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_surface_t *surface[2];
-#else
- GdkPixmap *pixmap[2];
-#endif
- int displayed;
- gboolean is_horizontal_axis;
- /* dim and orig (relative to origin of window) of axis' pixmap */
- struct irect p;
- /* dim and orig (relative to origin of axis' pixmap) of scale itself */
- struct irect s;
- gdouble min, max;
- gdouble major, minor; /* major and minor ticks */
- const char **label;
-};
-
-#define HAXIS_INIT_HEIGHT 70
-#define VAXIS_INIT_WIDTH 100
-#define TITLEBAR_HEIGHT 50
-#define RMARGIN_WIDTH 30
-
-struct style_tseq_tcptrace {
- GdkRGBA seq_color;
- GdkRGBA ack_color[2];
- GdkRGBA sack_color[2];
- int flags;
-};
-
-struct style_tseq_stevens {
- int seq_width;
- int seq_height;
- int flags;
-};
-
-struct style_tput {
- int width, height;
- int ma_size;
- int flags;
-};
-
-struct style_rtt {
- int width, height;
- int flags;
-};
-
-struct style_wscale {
- int win_width;
- int win_height;
- int flags;
-};
-
-/* style flags */
-#define SEQ_ORIGIN 0x1
-/* show absolute sequence numbers (not differences from isn) */
-#define SEQ_ORIGIN_ZERO 0x1
-#define SEQ_ORIGIN_ISN 0x0
-#define TIME_ORIGIN 0x10
-/* show time from beginning of capture as opposed to time from beginning
- * of the connection */
-#define TIME_ORIGIN_CAP 0x10
-#define TIME_ORIGIN_CONN 0x0
-
-struct cross {
- int x, y;
- int draw; /* indicates whether we should draw cross at all */
- int erase_needed;
- GtkToggleButton *on_toggle;
- GtkToggleButton *off_toggle;
-};
-
-struct bounds {
- double x0, y0, width, height;
-};
-
-struct zoom {
- double x, y;
-};
-
-struct zooms {
- double x, y;
- double step_x, step_y;
- struct zoom initial;
-#define ZOOM_OUT (1 << 0)
-#define ZOOM_HLOCK (1 << 1)
-#define ZOOM_VLOCK (1 << 2)
-#define ZOOM_STEPS_SAME (1 << 3)
-#define ZOOM_STEPS_KEEP_RATIO (1 << 4)
- int flags;
- /* unfortunately, we need them both because gtk_toggle_button_set_active()
- * with second argument FALSE doesn't do anything, somehow */
- struct {
- GtkToggleButton *in_toggle;
- GtkToggleButton *out_toggle;
- GtkEntry *h_zoom;
- GtkEntry *v_zoom;
- GtkSpinButton *h_step;
- GtkSpinButton *v_step;
- } widget;
-};
-
-struct grab {
- int grabbed;
- int x, y;
-};
-
-struct magnify {
- int active;
- int x, y;
- struct ipoint offset;
- int width, height;
- struct zoom zoom;
- struct gtk_graph *g;
-#define MAGZOOMS_SAME (1U << 0)
-#define MAGZOOMS_SAME_RATIO (1U << 1)
-#define MAGZOOMS_IGNORE (1U << 31)
- guint flags;
- struct {
- GtkSpinButton *h_zoom, *v_zoom;
- } widget;
-};
-
-struct gtk_graph {
-#define GRAPH_DESTROYED (1 << 0)
-#define GRAPH_INIT_ON_TYPE_CHANGE (1 << 1)
- int flags;
- GtkWidget *toplevel; /* keypress handler needs this */
- GtkWidget *drawing_area;
- GtkWidget *text; /* text widget for seg list - probably
- * temporary
- */
- PangoFontDescription *font; /* font used for annotations etc. */
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_surface_t *title_surface;
- cairo_surface_t *surface[2];
-#else
- GdkPixmap *title_pixmap;
- GdkPixmap *pixmap[2];
-#endif
- int displayed; /* which of both pixmaps is on screen right now */
- struct {
- GtkWidget *control_panel;
- /* this belongs to style structs of graph types that make use of it */
- GtkToggleButton *time_orig_conn, *seq_orig_isn;
- } gui;
- const char **title;
-
- /* Next 4 attribs describe the graph in natural units, before any scaling.
- * For example, if we want to display graph of TCP conversation that
- * started 112.309845 s after beginning of the capture and ran until
- * 479.093582 s, 237019 B went through the connection (in one direction)
- * starting with isn 31934022, then (bounds.x0, bounds.y0)=(112.309845,
- * 31934022) and (bounds.width, bounds.height)=(366.783737, 237019). */
- struct bounds bounds;
-
- /* dimensions and position of the graph, both expressed already in pixels.
- * x and y give the position of upper left corner of the graph relative
- * to origin of the graph window, size is basically bounds*zoom */
- struct irect geom;
-
- /* viewport (=graph window area which is reserved for graph itself), its
- * size and position relative to origin of the graph window */
- struct irect wp;
-
- /* whether and where the graph has been 'grabbed' and may now be moved */
- struct grab grab;
-
- /* If we need to display 237019 sequence numbers (=bytes) onto say 500
- * pixels, we have to scale the graph down by factor of 0.002109. This
- * number would be zoom.y. Obviously, both directions have separate zooms.*/
- struct zooms zoom;
-
- struct cross cross;
- gboolean zoomrect_erase_needed;
- struct magnify magnify;
- struct axis *x_axis, *y_axis;
-
- struct tcp_graph tg;
-
- struct element_list *elists; /* element lists */
- union {
- struct style_tseq_stevens tseq_stevens;
- struct style_tseq_tcptrace tseq_tcptrace;
- struct style_tput tput;
- struct style_rtt rtt;
- struct style_wscale wscale;
- } s;
- /* This allows keyboard to set the radio button */
- struct {
- GtkToggleButton *graph_rtt, *graph_tput, *graph_tseqstevens, *graph_tseqttrace;
- GtkToggleButton *graph_wscale;
- } gt;
-};
-
-static int refnum=0;
-
-#define debug(section) if (debugging & section)
-/* print function entry points */
-#define DBS_FENTRY (1 << 0)
-#define DBS_AXES_TICKS (1 << 1)
-#define DBS_AXES_DRAWING (1 << 2)
-#define DBS_GRAPH_DRAWING (1 << 3)
-#define DBS_TPUT_ELMTS (1 << 4)
-/*static int debugging = DBS_FENTRY;*/
-static int debugging = 0;
-/*static int debugging = DBS_AXES_TICKS;*/
-/*static int debugging = DBS_AXES_DRAWING;*/
-/*static int debugging = DBS_GRAPH_DRAWING;*/
-/*static int debugging = DBS_TPUT_ELMTS;*/
-
-static void create_gui(struct gtk_graph * );
-#if 0
-static void create_text_widget(struct gtk_graph * );
-static void display_text(struct gtk_graph * );
-#endif
-static void create_drawing_area(struct gtk_graph * );
-static void control_panel_create(struct gtk_graph * );
-static GtkWidget *control_panel_create_zoom_group(struct gtk_graph * );
-static GtkWidget *control_panel_create_magnify_group(struct gtk_graph * );
-static GtkWidget *control_panel_create_cross_group(struct gtk_graph * );
-static GtkWidget *control_panel_create_zoomlock_group(struct gtk_graph * );
-static GtkWidget *control_panel_create_graph_type_group(struct gtk_graph * );
-static void control_panel_add_zoom_page(struct gtk_graph * , GtkWidget * );
-static void control_panel_add_magnify_page(struct gtk_graph * , GtkWidget * );
-static void control_panel_add_origin_page(struct gtk_graph * , GtkWidget * );
-static void control_panel_add_cross_page(struct gtk_graph * , GtkWidget * );
-static void control_panel_add_graph_type_page(struct gtk_graph * , GtkWidget * );
-static void callback_toplevel_destroy(GtkWidget * , gpointer );
-static gboolean callback_delete_event(GtkWidget * , GdkEvent * , gpointer);
-static void callback_close(GtkWidget * , gpointer );
-static void callback_time_origin(GtkWidget * , gpointer );
-static void callback_seq_origin(GtkWidget * , gpointer );
-static void callback_zoomlock_h(GtkWidget * , gpointer );
-static void callback_zoomlock_v(GtkWidget * , gpointer );
-static void callback_zoom_inout(GtkWidget * , gpointer );
-static void callback_zoom_step(GtkWidget * , gpointer );
-static void callback_zoom_flags(GtkWidget * , gpointer );
-static void callback_cross_on_off(GtkWidget * , gpointer );
-static void callback_mag_width(GtkWidget * , gpointer );
-static void callback_mag_height(GtkWidget * , gpointer );
-static void callback_mag_x(GtkWidget * , gpointer );
-static void callback_mag_y(GtkWidget * , gpointer );
-static void callback_mag_zoom(GtkWidget * , gpointer );
-static void callback_mag_flags(GtkWidget * , gpointer );
-static void callback_graph_type(GtkWidget * , gpointer );
-static void callback_graph_init_on_typechg(GtkWidget * , gpointer );
-static void callback_create_help(GtkWidget * , gpointer );
-static void get_mouse_position(GtkWidget *, int *pointer_x, int *pointer_y, GdkModifierType *mask);
-static void update_zoom_spins(struct gtk_graph * );
-static void graph_type_dependent_initialize(struct gtk_graph * );
-static struct gtk_graph *graph_new(void);
-static void graph_destroy(struct gtk_graph * );
-static void graph_initialize_values(struct gtk_graph * );
-static void graph_init_sequence(struct gtk_graph * );
-static void draw_element_line(struct gtk_graph * , struct element * , cairo_t *cr, GdkRGBA *new_color);
-static void draw_element_ellipse(struct gtk_graph * , struct element * , cairo_t *cr);
-static void graph_display(struct gtk_graph * );
-static void graph_pixmaps_create(struct gtk_graph * );
-static void graph_pixmaps_switch(struct gtk_graph * );
-static void graph_pixmap_draw(struct gtk_graph * );
-static void graph_pixmap_display(struct gtk_graph * );
-static void graph_element_lists_make(struct gtk_graph * );
-static void graph_element_lists_free(struct gtk_graph * );
-static void graph_element_lists_initialize(struct gtk_graph * );
-static void graph_title_pixmap_create(struct gtk_graph * );
-static void graph_title_pixmap_draw(struct gtk_graph * );
-static void graph_title_pixmap_display(struct gtk_graph * );
-static void graph_select_segment(struct gtk_graph * , int , int );
-static int line_detect_collision(struct element * , int , int );
-static int ellipse_detect_collision(struct element * , int , int );
-static void axis_pixmaps_create(struct axis * );
-static void axis_pixmaps_switch(struct axis * );
-static void axis_display(struct axis * );
-static void v_axis_pixmap_draw(struct axis * );
-static void h_axis_pixmap_draw(struct axis * );
-static void axis_pixmap_display(struct axis * );
-static void axis_compute_ticks(struct axis * , double , double , int );
-static double axis_zoom_get(struct axis * , int );
-static void axis_ticks_up(int * , int * );
-static void axis_ticks_down(int * , int * );
-static void axis_destroy(struct axis * );
-static int get_label_dim(struct axis * , int , double );
-static void toggle_crosshairs(struct gtk_graph *g);
-static void toggle_time_origin(struct gtk_graph * );
-static void toggle_seq_origin(struct gtk_graph * );
-static void restore_initial_graph_view(struct gtk_graph *g);
-static void cross_draw(struct gtk_graph * , int , int );
-static void cross_erase(struct gtk_graph * );
-static void zoomrect_draw(struct gtk_graph * , int , int );
-static void zoomrect_erase(struct gtk_graph * );
-static void magnify_move(struct gtk_graph * , int , int );
-static void magnify_create(struct gtk_graph * , int , int );
-static void magnify_destroy(struct gtk_graph * );
-static void magnify_draw(struct gtk_graph * );
-static void magnify_get_geom(struct gtk_graph * , int , int );
-static gboolean configure_event(GtkWidget * , GdkEventConfigure * , gpointer );
-#if GTK_CHECK_VERSION(3,0,0)
-static gboolean draw_event(GtkWidget *widget, cairo_t *cr, gpointer user_data);
-#else
-static gboolean expose_event(GtkWidget * , GdkEventExpose * , gpointer );
-#endif
-static gboolean button_press_event(GtkWidget * , GdkEventButton * , gpointer );
-static gboolean button_release_event(GtkWidget * , GdkEventButton * , gpointer );
-static gboolean motion_notify_event(GtkWidget * , GdkEventMotion * , gpointer );
-static gboolean leave_notify_event(GtkWidget * , GdkEventCrossing * , gpointer );
-static gboolean enter_notify_event(GtkWidget * , GdkEventCrossing * , gpointer );
-static gboolean key_press_event(GtkWidget * , GdkEventKey * , gpointer );
-static gboolean key_release_event(GtkWidget * , GdkEventKey * , gpointer );
-static void tseq_initialize(struct gtk_graph * );
-static void tseq_get_bounds(struct gtk_graph * );
-static void tseq_stevens_read_config(struct gtk_graph * );
-static void tseq_stevens_make_elmtlist(struct gtk_graph * );
-static void tseq_stevens_toggle_seq_origin(struct gtk_graph * );
-static void tseq_stevens_toggle_time_origin(struct gtk_graph * );
-static void tseq_tcptrace_read_config(struct gtk_graph * );
-static void tseq_tcptrace_make_elmtlist(struct gtk_graph * );
-static void tseq_tcptrace_toggle_seq_origin(struct gtk_graph * );
-static void tseq_tcptrace_toggle_time_origin(struct gtk_graph * );
-static void tput_initialize(struct gtk_graph * );
-static void tput_read_config(struct gtk_graph * );
-static void tput_make_elmtlist(struct gtk_graph * );
-static void tput_toggle_time_origin(struct gtk_graph * );
-static void rtt_read_config(struct gtk_graph * );
-static void rtt_initialize(struct gtk_graph * );
-static void rtt_make_elmtlist(struct gtk_graph * );
-static void rtt_toggle_seq_origin(struct gtk_graph * );
-static void wscale_initialize(struct gtk_graph *);
-static void wscale_read_config(struct gtk_graph *);
-static void wscale_make_elmtlist(struct gtk_graph *);
-#if defined(_WIN32) && !defined(__MINGW32__) && (_MSC_VER < 1800)
-/* Starting VS2013, rint already defined in math.h. No need to redefine */
-static int rint(double ); /* compiler template for Windows */
-#endif
-
-/* This should arguably be part of the graph, but in practice you can
- only click on one graph at a time, so this is probably OK */
-static struct irect zoomrect;
-
-/*
- * Uncomment the following define to revert Windows to
- * use original mouse button controls
- */
-
-/* #define ORIGINAL_WIN32_BUTTONS 1 */
-
-/* XXX - what about macOS? */
-/* XXX: Needs work to ensire that the columns line up properly in both Gtk2 & Gtk3 */
-/* What is the proper way to do this ?? */
-static char helptext[] =
- "Here's what you can do:\n"
- "\n"
-#ifdef ORIGINAL_WIN32_BUTTONS
- " <Ctrl>-Left Mouse Button selects segment under cursor in Wireshark's packet list\n"
- "\n"
- " Left Mouse Button zooms in (towards area under mouse pointer)\n"
- " <Shift>-Left Mouse Button zooms out\n"
- "\n"
- " Right Mouse Button moves the graph (if zoomed in)\n"
- " <Ctrl>-Right Mouse Button displays a portion of graph under cursor magnified\n"
-#else /* !ORIGINAL_WIN32_BUTTONS */
- " Left Mouse Button selects segment under cursor in Wireshark's packet list\n"
- " can also drag to zoom in on a rectangular region\n"
- "\n"
- " Middle Mouse Button zooms in (towards area under cursor)\n"
- " <Shift>-Middle Mouse Button zooms out\n"
- "\n"
- " Right Mouse Button moves the graph (if zoomed in)\n"
- " <Ctrl>-Right Mouse Button displays a portion of graph under cursor magnified\n"
-#endif
- "\n"
- "\n"
- " '1' display Round Trip Time Graph\n"
- " '2' display Throughput Graph\n"
- " '3' display Time/Sequence Graph (Stevens)\n"
- " '4' display Time/Sequence Graph (tcptrace)\n"
- " '5' display Window Scaling Graph\n"
- "\n"
- " <Space bar> toggles crosshairs on/off\n"
- "\n"
- " 'i' or '+' zoom in (towards area under mouse pointer)\n"
- " 'o' or '-' zoom out\n"
- " 'r' or <Home> restore graph to initial state (zoom out max)\n"
- " 's' toggles relative/absolute sequence numbers\n"
- " 't' toggles time origin\n"
- " 'g' go to frame under cursor in Wireshark's packet list (if possible)\n"
- "\n"
- " <Left> move view left by 100 pixels (if zoomed in)\n"
- " <Right> move view right 100 pixels (if zoomed in)\n"
- " <Up> move view up by 100 pixels (if zoomed in)\n"
- " <Down> move view down by 100 pixels (if zoomed in)\n"
- "\n"
- " <Shift><Left> move view left by 10 pixels (if zoomed in)\n"
- " <Shift><Right> move view right 10 pixels (if zoomed in)\n"
- " <Shift><Up> move view up by 10 pixels (if zoomed in)\n"
- " <Shift><Down> move view down by 10 pixels (if zoomed in)\n"
- "\n"
- " <Ctrl><Left> move view left by 1 pixel (if zoomed in)\n"
- " <Ctrl><Right> move view right 1 pixel (if zoomed in)\n"
- " <Ctrl><Up> move view up by 1 pixel (if zoomed in)\n"
- " <Ctrl><Down> move view down by 1 pixel (if zoomed in)\n"
-;
-
-#if 0
-static void debug_coord(struct gtk_graph *g, const char *c)
-{
- static guint count = 0;
-
- count++;
- printf("%u: %s\n", count, c);
- printf("%u: g->geom.width %d\n", count, g->geom.width);
- printf("%u: g->geom.height %d\n", count, g->geom.height);
- printf("%u: g->geom.x %d\n", count, g->geom.x);
- printf("%u: g->geom.y %d\n", count, g->geom.y);
-
- printf("%u: g->wp.width %d\n", count, g->wp.width);
- printf("%u: g->wp.height %d\n", count, g->wp.height);
- printf("%u: g->wp.x %d\n", count, g->wp.x);
- printf("%u: g->wp.y %d\n", count, g->wp.y);
- printf("---------------\n");
-}
-#endif
-
-static void set_busy_cursor(GdkWindow *w)
-{
- GdkCursor *cursor;
-
- cursor = gdk_cursor_new(GDK_WATCH);
- gdk_window_set_cursor(w, cursor);
- gdk_flush();
-#if GTK_CHECK_VERSION(3,0,0)
- g_object_unref(cursor);
-#else
- gdk_cursor_unref(cursor);
-#endif
-}
-
-static void unset_busy_cursor(GdkWindow *w, gboolean cross)
-{
- GdkCursor *cursor;
-
- if (cross) {
- cursor = gdk_cursor_new(GDK_CROSSHAIR);
- gdk_window_set_cursor(w, cursor);
- gdk_flush();
-#if GTK_CHECK_VERSION(3,0,0)
- g_object_unref(cursor);
-#else
- gdk_cursor_unref(cursor);
-#endif
- } else {
- gdk_window_set_cursor(w, NULL);
- gdk_flush();
- }
-}
-
-void tcp_graph_cb(GtkAction *action, gpointer user_data _U_)
-{
- struct segment current;
- struct gtk_graph *g;
- const gchar *name;
- tcp_graph_type graph_type;
-
- name = gtk_action_get_name(action);
- if (strcmp(name, "/Statistics/TCPStreamGraphMenu/Time-Sequence-Graph-Stevens") == 0) {
- graph_type = GRAPH_TSEQ_STEVENS;
- } else if (strcmp(name, "/Statistics/TCPStreamGraphMenu/Time-Sequence-Graph-tcptrace") == 0) {
- graph_type = GRAPH_TSEQ_TCPTRACE;
- } else if (strcmp(name, "/Statistics/TCPStreamGraphMenu/Throughput-Graph") == 0) {
- graph_type = GRAPH_THROUGHPUT;
- } else if (strcmp(name, "/Statistics/TCPStreamGraphMenu/RTT-Graph") == 0) {
- graph_type = GRAPH_RTT;
- } else if (strcmp(name, "/Statistics/TCPStreamGraphMenu/Window-Scaling-Graph") == 0) {
- graph_type = GRAPH_WSCALE;
- } else {
- return;
- }
-
- debug(DBS_FENTRY) puts("tcp_graph_cb()");
-
- if (!select_tcpip_session(&cfile, &current)) {
- return;
- }
-
- if (! (g = graph_new()))
- return;
-
- refnum++;
- graph_initialize_values(g);
-
- g->tg.type = graph_type;
-
- graph_segment_list_get(&cfile, &g->tg, FALSE);
- create_gui(g);
- /* display_text(g); */
- graph_init_sequence(g);
-
-}
-
-void tcp_graph_known_stream_launch(address *src_address, guint16 src_port,
- address *dst_address, guint16 dst_port,
- conv_id_t stream)
-{
- struct gtk_graph *g;
-
- if (!(g = graph_new())) {
- return;
- }
-
- refnum++;
- graph_initialize_values(g);
-
- /* Can set stream info for graph now */
- copy_address(&g->tg.src_address, src_address);
- g->tg.src_port = src_port;
- copy_address(&g->tg.dst_address, dst_address);
- g->tg.dst_port = dst_port;
- g->tg.stream = stream;
-
- /* This graph type is arguably the most useful, so start there */
- g->tg.type = GRAPH_TSEQ_TCPTRACE;
-
- /* Get our list of segments from the packet list */
- graph_segment_list_get(&cfile, &g->tg, TRUE);
-
- create_gui(g);
- graph_init_sequence(g);
-}
-
-
-static void create_gui(struct gtk_graph *g)
-{
- /* ToDo: Ensure that drawing area window doesn't
- * (completely) cover the contraol_panel window.
- */
- debug(DBS_FENTRY) puts("create_gui()");
- /* create_text_widget(g); */
- control_panel_create(g);
- create_drawing_area(g);
-}
-
-
-
-static void create_drawing_area(struct gtk_graph *g)
-{
-#if GTK_CHECK_VERSION(3,0,0)
- GtkStyleContext *context;
-#endif
- char *display_name;
- char window_title[WINDOW_TITLE_LENGTH];
- GtkAllocation widget_alloc;
- char *src_addr, *dst_addr;
-#if 0
- /* Prep. to include the controls in the graph window */
- GtkWidget *frame;
- GtkWidget *vbox;
- GtkWidget *hbox;
-#endif
- debug(DBS_FENTRY) puts("create_drawing_area()");
-
- /* Set title of window with file + conversation details */
- display_name = cf_get_display_name(&cfile);
- src_addr = (char*)address_to_str(NULL, &g->tg.src_address);
- dst_addr = (char*)address_to_str(NULL, &g->tg.dst_address);
- g_snprintf(window_title, WINDOW_TITLE_LENGTH, "TCP Graph %d: %s %s:%d " UTF8_RIGHTWARDS_ARROW " %s:%d",
- refnum,
- display_name,
- src_addr,
- g->tg.src_port,
- dst_addr,
- g->tg.dst_port
- );
- g_free(display_name);
- wmem_free(NULL, src_addr);
- wmem_free(NULL, dst_addr);
- g->toplevel = dlg_window_new("Tcp Graph");
- gtk_window_set_title(GTK_WINDOW(g->toplevel), window_title);
- gtk_widget_set_name(g->toplevel, "Test Graph");
-
- /* Create the drawing area */
- g->drawing_area = gtk_drawing_area_new();
- g->x_axis->drawing_area = g->y_axis->drawing_area = g->drawing_area;
- gtk_widget_set_size_request(g->drawing_area,
- g->wp.width + g->wp.x + RMARGIN_WIDTH,
- g->wp.height + g->wp.y + g->x_axis->s.height);
- gtk_widget_show(g->drawing_area);
-
-#if GTK_CHECK_VERSION(3,0,0)
- g_signal_connect(g->drawing_area, "draw", G_CALLBACK(draw_event), g);
-#else
- g_signal_connect(g->drawing_area, "expose_event", G_CALLBACK(expose_event), g);
-#endif
- /* this has to be done later, after the widget has been shown */
- /*
- g_signal_connect(g->drawing_area, "configure_event", G_CALLBACK(configure_event), g);
- */
-
- g_signal_connect(g->drawing_area, "button_press_event",
- G_CALLBACK(button_press_event), g);
- g_signal_connect(g->drawing_area, "button_release_event",
- G_CALLBACK(button_release_event), g);
- g_signal_connect(g->drawing_area, "motion_notify_event",
- G_CALLBACK(motion_notify_event), g);
- g_signal_connect(g->drawing_area, "leave_notify_event",
- G_CALLBACK(leave_notify_event), g);
- g_signal_connect(g->drawing_area, "enter_notify_event",
- G_CALLBACK(enter_notify_event), g);
- g_signal_connect(g->toplevel, "destroy", G_CALLBACK(callback_toplevel_destroy), g);
- /* why doesn't drawing area send key_press_signals? */
- g_signal_connect(g->toplevel, "key_press_event", G_CALLBACK(key_press_event), g);
- g_signal_connect(g->toplevel, "key_release_event", G_CALLBACK(key_release_event),
- g);
- gtk_widget_set_events(g->toplevel, GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK);
-
- gtk_widget_set_events(g->drawing_area,
- GDK_EXPOSURE_MASK
- | GDK_LEAVE_NOTIFY_MASK
- | GDK_ENTER_NOTIFY_MASK
- | GDK_BUTTON_PRESS_MASK
- | GDK_BUTTON_RELEASE_MASK
- | GDK_POINTER_MOTION_MASK
- | GDK_POINTER_MOTION_HINT_MASK);
-
-#if 0
- /* Prep. to include the controls in the graph window */
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(g->toplevel), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(g->toplevel), 5);
- gtk_widget_show(vbox);
-
- frame = gtk_frame_new(NULL);
- gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN);
- gtk_container_add(GTK_CONTAINER(frame), g->drawing_area);
- gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0);
- gtk_widget_show(frame);
-
-
- /*gtk_box_pack_start(GTK_BOX(vbox), g->gui.control_panel, FALSE, FALSE, 0);*/
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
- gtk_container_set_border_width(GTK_CONTAINER(hbox), 3);
- gtk_widget_show(hbox);
-
- create_ctrl_area(g, hbox);
-
-#endif
-
- gtk_container_add(GTK_CONTAINER(g->toplevel), g->drawing_area);
- gtk_widget_show(g->toplevel);
-
- /* in case we didn't get what we asked for */
- gtk_widget_get_allocation(GTK_WIDGET(g->drawing_area), &widget_alloc);
- g->wp.width = widget_alloc.width - g->wp.x - RMARGIN_WIDTH;
- g->wp.height = widget_alloc.height - g->wp.y - g->x_axis->s.height;
-
-#if GTK_CHECK_VERSION(3,0,0)
- context = gtk_widget_get_style_context(g->drawing_area);
- gtk_style_context_get(context, GTK_STATE_FLAG_NORMAL,
- GTK_STYLE_PROPERTY_FONT, &g->font,
- NULL);
-#else
- g->font = gtk_widget_get_style(g->drawing_area)->font_desc;
-
-
- /* this is probably quite an ugly way to get rid of the first configure
- * event
- * immediately after gtk_widget_show(window) drawing_area gets a configure
- * event which is handled during the next return to gtk_main which is
- * probably the gdk_gc_new() call. configure handler calls
- * graph_element_lists_make() which is not good because the graph struct is
- * not fully set up yet - namely we're not sure about actual geometry
- * and we don't have the GC's at all. so we just postpone installation
- * of configure handler until we're ready to deal with it.
- *
- * !!! NEMLLO BY TO BYT NA KONCI graph_init_sequence()? !!!
- *
- */
-#endif
- g_signal_connect(g->drawing_area, "configure_event", G_CALLBACK(configure_event),
- g);
-
- /* puts("exiting create_drawing_area()"); */
-}
-
-static void callback_toplevel_destroy(GtkWidget *widget _U_, gpointer data)
-{
- struct gtk_graph *g = (struct gtk_graph *)data;
-
- if (!(g->flags & GRAPH_DESTROYED)) {
- g->flags |= GRAPH_DESTROYED;
- graph_destroy((struct gtk_graph *)data);
- }
-}
-
-static void control_panel_create(struct gtk_graph *g)
-{
- GtkWidget *toplevel, *notebook;
- GtkWidget *top_vb;
- GtkWidget *help_bt, *close_bt, *bbox;
- char window_title[WINDOW_TITLE_LENGTH];
-
- debug(DBS_FENTRY) puts("control_panel_create()");
-
- notebook = gtk_notebook_new();
- control_panel_add_zoom_page(g, notebook);
- control_panel_add_magnify_page(g, notebook);
- control_panel_add_origin_page(g, notebook);
- control_panel_add_cross_page(g, notebook);
- control_panel_add_graph_type_page(g, notebook);
-
- g_snprintf(window_title, WINDOW_TITLE_LENGTH,
- "Graph %d - Control - Wireshark", refnum);
- toplevel = dlg_window_new("tcp-graph-control");
- gtk_window_set_title(GTK_WINDOW(toplevel), window_title);
-
- gtk_window_set_resizable(GTK_WINDOW(toplevel), FALSE); /* XXX: Acceptable ? */
-
- top_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(toplevel), top_vb);
-
- gtk_box_pack_start(GTK_BOX(top_vb), notebook, FALSE, FALSE, 5);
-
- /* Button row. */
- bbox = dlg_button_row_new(GTK_STOCK_HELP, GTK_STOCK_CLOSE, NULL);
- gtk_box_pack_start(GTK_BOX(top_vb), bbox, FALSE, FALSE, 5);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(callback_create_help), g);
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(toplevel, close_bt, NULL);
- g_signal_connect(close_bt, "clicked", G_CALLBACK(callback_close), g);
-
- g_signal_connect(toplevel, "delete_event", G_CALLBACK(callback_delete_event), g);
- g_signal_connect(toplevel, "destroy", G_CALLBACK(callback_toplevel_destroy), g);
-
- gtk_widget_show_all(toplevel);
- window_present(toplevel);
-
- g->gui.control_panel = toplevel;
-}
-
-static void control_panel_add_zoom_page(struct gtk_graph *g, GtkWidget *n)
-{
- GtkWidget *zoom_frame;
- GtkWidget *zoom_lock_frame;
- GtkWidget *label;
- GtkWidget *box;
-
- zoom_frame = control_panel_create_zoom_group(g);
- gtk_container_set_border_width(GTK_CONTAINER(zoom_frame), 5);
- zoom_lock_frame = control_panel_create_zoomlock_group(g);
- gtk_container_set_border_width(GTK_CONTAINER(zoom_lock_frame), 5);
- box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(box), zoom_frame, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(box), zoom_lock_frame, TRUE, TRUE, 0);
- gtk_widget_show(box);
- label = gtk_label_new("Zoom");
- gtk_notebook_append_page(GTK_NOTEBOOK(n), box, label);
-}
-
-static void control_panel_add_magnify_page(struct gtk_graph *g, GtkWidget *n)
-{
- GtkWidget *mag_frame, *label;
-
- mag_frame = control_panel_create_magnify_group(g);
- gtk_container_set_border_width(GTK_CONTAINER(mag_frame), 5);
- label = gtk_label_new("Magnify");
- gtk_notebook_append_page(GTK_NOTEBOOK(n), mag_frame, label);
-}
-
-static void control_panel_add_origin_page(struct gtk_graph *g, GtkWidget *n)
-{
- GtkWidget *time_orig_cap, *time_orig_conn, *time_orig_box, *time_orig_frame;
- GtkWidget *seq_orig_isn, *seq_orig_zero, *seq_orig_box, *seq_orig_frame;
- GtkWidget *box, *label;
-
- /* time origin box */
- time_orig_cap = gtk_radio_button_new_with_label(NULL, "beginning of capture");
- time_orig_conn = gtk_radio_button_new_with_label(
- gtk_radio_button_get_group(GTK_RADIO_BUTTON(time_orig_cap)),
- "beginning of this TCP connection");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(time_orig_conn), TRUE);
- time_orig_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(time_orig_box), time_orig_conn, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(time_orig_box), time_orig_cap, TRUE, TRUE, 0);
- time_orig_frame = gtk_frame_new("Time origin");
- gtk_container_set_border_width(GTK_CONTAINER(time_orig_frame), 5);
- gtk_container_add(GTK_CONTAINER(time_orig_frame), time_orig_box);
-
- /* sequence number origin group */
- seq_orig_isn = gtk_radio_button_new_with_label(NULL, "initial sequence number");
- seq_orig_zero = gtk_radio_button_new_with_label(
- gtk_radio_button_get_group(GTK_RADIO_BUTTON(seq_orig_isn)),
- "0 (=absolute)");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(seq_orig_isn), TRUE);
- seq_orig_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(seq_orig_box), seq_orig_isn, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(seq_orig_box), seq_orig_zero, TRUE, TRUE, 0);
- seq_orig_frame = gtk_frame_new("Sequence number origin");
- gtk_container_set_border_width(GTK_CONTAINER(seq_orig_frame), 5);
- gtk_container_add(GTK_CONTAINER(seq_orig_frame), seq_orig_box);
-
- g->gui.time_orig_conn = (GtkToggleButton * )time_orig_conn;
- g->gui.seq_orig_isn = (GtkToggleButton * )seq_orig_isn;
-
- g_signal_connect(time_orig_conn, "toggled", G_CALLBACK(callback_time_origin), g);
- g_signal_connect(seq_orig_isn, "toggled", G_CALLBACK(callback_seq_origin), g);
-
- box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(box), 5);
- gtk_box_pack_start(GTK_BOX(box), time_orig_frame, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(box), seq_orig_frame, TRUE, TRUE, 0);
- gtk_widget_show(box);
- label = gtk_label_new("Origin");
- gtk_notebook_append_page(GTK_NOTEBOOK(n), box, label);
-}
-
-static void control_panel_add_cross_page (struct gtk_graph *g, GtkWidget *n)
-{
- GtkWidget *cross_frame, *label;
-
- cross_frame = control_panel_create_cross_group(g);
- gtk_container_set_border_width(GTK_CONTAINER(cross_frame), 5);
- label = gtk_label_new("Cross");
- gtk_notebook_append_page(GTK_NOTEBOOK(n), cross_frame, label);
-}
-
-static void control_panel_add_graph_type_page(struct gtk_graph *g, GtkWidget *n)
-{
- GtkWidget *frame, *label;
-
- frame = control_panel_create_graph_type_group(g);
- gtk_container_set_border_width(GTK_CONTAINER(frame), 5);
- label = gtk_label_new("Graph type");
- gtk_notebook_append_page(GTK_NOTEBOOK(n), frame, label);
-}
-
-/* Treat this as a cancel, by calling "callback_close()" */
-static gboolean
-callback_delete_event(GtkWidget *widget _U_, GdkEvent *event _U_,
- gpointer data)
-{
- callback_close(NULL, data);
- return FALSE;
-}
-
-static void callback_close(GtkWidget *widget _U_, gpointer data)
-{
- struct gtk_graph *g = (struct gtk_graph * )data;
-
- if (!(g->flags & GRAPH_DESTROYED)) {
- g->flags |= GRAPH_DESTROYED;
- graph_destroy((struct gtk_graph * )data);
- }
-}
-
-static void callback_create_help(GtkWidget *widget _U_, gpointer data _U_)
-{
- GtkWidget *toplevel, *vbox, *text, *scroll, *bbox, *close_bt;
- GtkTextBuffer *buf;
-
- toplevel = dlg_window_new("Help for TCP graphing");
- gtk_window_set_default_size(GTK_WINDOW(toplevel), 500, 400);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 12);
- gtk_container_add(GTK_CONTAINER(toplevel), vbox);
-
- scroll = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scroll),
- GTK_SHADOW_IN);
- gtk_box_pack_start(GTK_BOX(vbox), scroll, TRUE, TRUE, 0);
- text = gtk_text_view_new();
- gtk_text_view_set_editable(GTK_TEXT_VIEW(text), FALSE);
- buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
- gtk_text_buffer_set_text(buf, helptext, -1);
- gtk_container_add(GTK_CONTAINER(scroll), text);
-
- /* Button row. */
- bbox = dlg_button_row_new(GTK_STOCK_CLOSE, NULL);
- gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
- gtk_widget_show(bbox);
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(toplevel, close_bt, window_cancel_button_cb);
-
- g_signal_connect(toplevel, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
-
- gtk_widget_show_all(toplevel);
- window_present(toplevel);
-}
-
-static void get_mouse_position(GtkWidget *widget, int *pointer_x, int *pointer_y, GdkModifierType *mask)
-{
-#if GTK_CHECK_VERSION(3,0,0)
- gdk_window_get_device_position(gtk_widget_get_window(widget),
- gdk_device_manager_get_client_pointer(
- gdk_display_get_device_manager(
- gtk_widget_get_display(GTK_WIDGET(widget)))),
- pointer_x, pointer_y, mask);
-
-#else
- gdk_window_get_pointer(gtk_widget_get_window(widget), pointer_x, pointer_y, mask);
-#endif
-
-}
-
-static void callback_time_origin(GtkWidget *toggle _U_, gpointer data)
-{
- toggle_time_origin((struct gtk_graph * )data);
-}
-
-static void callback_seq_origin(GtkWidget *toggle _U_, gpointer data)
-{
- toggle_seq_origin((struct gtk_graph * )data);
-}
-
-static GtkWidget *control_panel_create_zoom_group(struct gtk_graph *g)
-{
- GtkWidget *zoom_in, *zoom_out, *zoom_box, *zoom_frame;
- GtkAdjustment *zoom_h_adj, *zoom_v_adj;
- GtkWidget *zoom_inout_box, *zoom_h_step_label, *zoom_h_step;
- GtkWidget *zoom_v_step_label, *zoom_v_step;
- GtkWidget *zoom_separator1, *zoom_separator2, *zoom_step_grid, *zoom_grid;
- GtkWidget *zoom_ratio_toggle, *zoom_same_toggle;
- GtkWidget *zoom_h_entry, *zoom_v_entry;
- GtkWidget *zoom_h_label, *zoom_v_label;
-
- zoom_in = gtk_radio_button_new_with_label(NULL, "in");
- zoom_out = gtk_radio_button_new_with_label(
- gtk_radio_button_get_group(GTK_RADIO_BUTTON(zoom_in)), "out");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(zoom_in), TRUE);
- zoom_inout_box = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(zoom_inout_box), zoom_in, FALSE, FALSE, 10);
- gtk_box_pack_start(GTK_BOX(zoom_inout_box), zoom_out, FALSE, FALSE, 0);
-
- zoom_separator1 = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
-
- zoom_h_entry = gtk_entry_new();
- gtk_entry_set_text(GTK_ENTRY(zoom_h_entry), "1.000");
- gtk_editable_set_editable(GTK_EDITABLE(zoom_h_entry), FALSE);
- zoom_h_label = gtk_label_new("Horizontal:");
-
- zoom_v_entry = gtk_entry_new();
- gtk_entry_set_text(GTK_ENTRY(zoom_v_entry), "1.000");
- gtk_editable_set_editable(GTK_EDITABLE(zoom_v_entry), FALSE);
- zoom_v_label = gtk_label_new("Vertical:");
-
- g->zoom.widget.h_zoom = (GtkEntry * )zoom_h_entry;
- g->zoom.widget.v_zoom = (GtkEntry * )zoom_v_entry;
-
- zoom_grid = ws_gtk_grid_new();
- ws_gtk_grid_attach_extended(GTK_GRID(zoom_grid), zoom_h_label, 0, 0, 1, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 5, 0);
- ws_gtk_grid_attach_extended(GTK_GRID(zoom_grid), zoom_h_entry, 1, 0, 1, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 5, 0);
- ws_gtk_grid_attach_extended(GTK_GRID(zoom_grid), zoom_v_label, 0, 1, 1, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 5, 0);
- ws_gtk_grid_attach_extended(GTK_GRID(zoom_grid), zoom_v_entry, 1, 1, 1, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 5, 0);
-
- zoom_separator2 = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
-
- zoom_h_adj = (GtkAdjustment * )gtk_adjustment_new((gfloat)1.2, 1.0, 5, (gfloat)0.1, 1, 0);
- zoom_h_step = gtk_spin_button_new(zoom_h_adj, 0, 1);
- gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(zoom_h_step), TRUE);
- zoom_h_step_label = gtk_label_new("Horizontal step:");
-
- zoom_v_adj = (GtkAdjustment * )gtk_adjustment_new((gfloat)1.2, 1.0, 5, (gfloat)0.1, 1, 0);
- zoom_v_step = gtk_spin_button_new(zoom_v_adj, 0, 1);
- gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(zoom_v_step), TRUE);
- zoom_v_step_label = gtk_label_new("Vertical step:");
-
- g->zoom.widget.h_step = (GtkSpinButton * )zoom_h_step;
- g->zoom.widget.v_step = (GtkSpinButton * )zoom_v_step;
-
- zoom_same_toggle = gtk_check_button_new_with_label("Keep them the same");
- zoom_ratio_toggle = gtk_check_button_new_with_label("Preserve their ratio");
- g_object_set_data(G_OBJECT(zoom_same_toggle), "flag", (gpointer)ZOOM_STEPS_SAME);
- g_object_set_data(G_OBJECT(zoom_ratio_toggle), "flag",
- (gpointer)ZOOM_STEPS_KEEP_RATIO);
- g_signal_connect(zoom_same_toggle, "clicked", G_CALLBACK(callback_zoom_flags), g);
- g_signal_connect(zoom_ratio_toggle, "clicked", G_CALLBACK(callback_zoom_flags), g);
-
- zoom_step_grid = ws_gtk_grid_new();
- ws_gtk_grid_attach_extended(GTK_GRID(zoom_step_grid), zoom_h_step_label, 0, 0, 1, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 5, 0);
- ws_gtk_grid_attach_extended(GTK_GRID(zoom_step_grid), zoom_h_step, 1, 0, 1, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 5, 0);
- ws_gtk_grid_attach_extended(GTK_GRID(zoom_step_grid), zoom_v_step_label, 0, 1, 1, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 5, 0);
- ws_gtk_grid_attach_extended(GTK_GRID(zoom_step_grid), zoom_v_step, 1, 1, 1, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 5, 0);
- ws_gtk_grid_attach_extended(GTK_GRID(zoom_step_grid), zoom_same_toggle, 0, 2, 2, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 5, 0);
- ws_gtk_grid_attach_extended(GTK_GRID(zoom_step_grid), zoom_ratio_toggle, 0, 3, 2, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 5, 0);
-
- zoom_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(zoom_box), zoom_inout_box, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(zoom_box), zoom_separator1, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(zoom_box), zoom_grid, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(zoom_box), zoom_separator2, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(zoom_box), zoom_step_grid, TRUE, TRUE, 0);
- zoom_frame = gtk_frame_new("Zoom");
- gtk_container_add(GTK_CONTAINER(zoom_frame), zoom_box);
-
- g_object_set_data(G_OBJECT(zoom_h_step), "direction", GINT_TO_POINTER(0));
- g_object_set_data(G_OBJECT(zoom_v_step), "direction", GINT_TO_POINTER(1));
-
- g_signal_connect(zoom_in, "toggled", G_CALLBACK(callback_zoom_inout), g);
- g_signal_connect(zoom_h_step, "changed", G_CALLBACK(callback_zoom_step), g);
- g_signal_connect(zoom_v_step, "changed", G_CALLBACK(callback_zoom_step), g);
-
- g->zoom.widget.in_toggle = (GtkToggleButton * )zoom_in;
- g->zoom.widget.out_toggle = (GtkToggleButton * )zoom_out;
- return zoom_frame;
-}
-
-static void callback_zoom_inout(GtkWidget *toggle, gpointer data)
-{
- struct gtk_graph *g = (struct gtk_graph * )data;
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toggle)))
- g->zoom.flags &= ~ZOOM_OUT;
- else
- g->zoom.flags |= ZOOM_OUT;
-}
-
-static void callback_zoom_step(GtkWidget *spin, gpointer data)
-{
- struct gtk_graph *g = (struct gtk_graph * )data;
- double value;
- int direction;
- double *zoom_this, *zoom_other;
- GtkSpinButton *widget_this, *widget_other;
- double old_this;
-
- direction = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(spin), "direction"));
- value = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin));
-
- if (direction) {
- zoom_this = &g->zoom.step_y;
- zoom_other = &g->zoom.step_x;
- widget_this = g->zoom.widget.v_step;
- widget_other = g->zoom.widget.h_step;
- } else {
- zoom_this = &g->zoom.step_x;
- zoom_other = &g->zoom.step_y;
- widget_this = g->zoom.widget.h_step;
- widget_other = g->zoom.widget.v_step;
- }
-
- old_this = *zoom_this;
- *zoom_this = value;
- if (g->zoom.flags & ZOOM_STEPS_SAME) {
- *zoom_other = value;
- gtk_spin_button_set_value(widget_other, (gfloat) *zoom_other);
- } else if (g->zoom.flags & ZOOM_STEPS_KEEP_RATIO) {
- double old_other = *zoom_other;
- *zoom_other *= value / old_this;
- if (*zoom_other < 1.0) {
- *zoom_other = 1.0;
- *zoom_this = old_this * 1.0 / old_other;
- gtk_spin_button_set_value(widget_this, (gfloat) *zoom_this);
- } else if (*zoom_other > 5.0) {
- *zoom_other = 5.0;
- *zoom_this = old_this * 5.0 / old_other;
- gtk_spin_button_set_value(widget_this, (gfloat) *zoom_this);
- }
- gtk_spin_button_set_value(widget_other, (gfloat) *zoom_other);
- }
-}
-
-static void callback_zoom_flags(GtkWidget *toggle, gpointer data)
-{
- struct gtk_graph *g = (struct gtk_graph * )data;
- int flag = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(toggle), "flag"));
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toggle)))
- g->zoom.flags |= flag;
- else
- g->zoom.flags &= ~flag;
-}
-
-static void update_zoom_spins(struct gtk_graph *g)
-{
- char s[32];
-
- g_snprintf(s, sizeof(s), "%.3f", g->zoom.x / g->zoom.initial.x);
- gtk_entry_set_text(g->zoom.widget.h_zoom, s);
- g_snprintf(s, sizeof(s), "%.3f", g->zoom.y / g->zoom.initial.y);
- gtk_entry_set_text(g->zoom.widget.v_zoom, s);
-}
-
-static GtkWidget *control_panel_create_magnify_group(struct gtk_graph *g)
-{
- GtkWidget *mag_width_label, *mag_width;
- GtkWidget *mag_height_label, *mag_height;
- GtkWidget *mag_x_label, *mag_x;
- GtkWidget *mag_y_label, *mag_y;
- GtkWidget *mag_wh_grid, *mag_zoom_frame, *mag_zoom_grid;
- GtkWidget *mag_h_zoom_label, *mag_h_zoom;
- GtkWidget *mag_v_zoom_label, *mag_v_zoom;
- GtkWidget *mag_zoom_same, *mag_zoom_ratio;
- GtkAdjustment *mag_width_adj, *mag_height_adj, *mag_x_adj, *mag_y_adj;
- GtkAdjustment *mag_h_zoom_adj, *mag_v_zoom_adj;
- GtkWidget *mag_box, *mag_frame;
-
- mag_width_label = gtk_label_new("Width:");
- mag_width_adj = (GtkAdjustment * )gtk_adjustment_new(250, 100, 600, 1, 10, 0);
- mag_width = gtk_spin_button_new(mag_width_adj, 0, 0);
-
- mag_height_label = gtk_label_new("Height:");
- mag_height_adj = (GtkAdjustment * )gtk_adjustment_new(250, 100, 600, 1, 10, 0);
- mag_height = gtk_spin_button_new(mag_height_adj, 0, 0);
-
- mag_x_label = gtk_label_new("X:");
- mag_x_adj = (GtkAdjustment * )gtk_adjustment_new(0, -1000, 1000, 1, 10, 0);
- mag_x = gtk_spin_button_new(mag_x_adj, 0, 0);
-
- mag_y_label = gtk_label_new("Y:");
- mag_y_adj = (GtkAdjustment * )gtk_adjustment_new(0, -1000, 1000, 1, 10, 0);
- mag_y = gtk_spin_button_new(mag_y_adj, 0, 0);
-
- mag_wh_grid = ws_gtk_grid_new();
- ws_gtk_grid_attach_extended(GTK_GRID(mag_wh_grid), mag_width_label, 0, 0, 1, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 5, 0);
- ws_gtk_grid_attach_extended(GTK_GRID(mag_wh_grid), mag_width, 1, 0, 1, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 5, 0);
- ws_gtk_grid_attach_extended(GTK_GRID(mag_wh_grid), mag_height_label, 0, 1, 1, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 5, 0);
- ws_gtk_grid_attach_extended(GTK_GRID(mag_wh_grid), mag_height, 1, 1, 1, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 5, 0);
- ws_gtk_grid_attach_extended(GTK_GRID(mag_wh_grid), mag_x_label, 0, 2, 1, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 5, 0);
- ws_gtk_grid_attach_extended(GTK_GRID(mag_wh_grid), mag_x, 1, 2, 1, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 5, 0);
- ws_gtk_grid_attach_extended(GTK_GRID(mag_wh_grid), mag_y_label, 0, 3, 1, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 5, 0);
- ws_gtk_grid_attach_extended(GTK_GRID(mag_wh_grid), mag_y, 1, 3, 1, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 5, 0);
-
- mag_h_zoom_label = gtk_label_new("Horizontal:");
- mag_h_zoom_adj = (GtkAdjustment *)gtk_adjustment_new(10.0, 1.0, 25.0, (gfloat)0.1, 1, 0);
- mag_h_zoom = gtk_spin_button_new(mag_h_zoom_adj, 0, 1);
-
- mag_v_zoom_label = gtk_label_new("Vertical:");
- mag_v_zoom_adj = (GtkAdjustment *)gtk_adjustment_new(10.0, 1.0, 25.0, (gfloat)0.1, 1, 0);
- mag_v_zoom = gtk_spin_button_new(mag_v_zoom_adj, 0, 1);
-
- mag_zoom_same = gtk_check_button_new_with_label("Keep them the same");
- mag_zoom_ratio = gtk_check_button_new_with_label("Preserve their ratio");
-
- mag_zoom_grid = ws_gtk_grid_new();
- ws_gtk_grid_attach_extended(GTK_GRID(mag_zoom_grid), mag_h_zoom_label, 0, 0, 1, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 0, 0);
- ws_gtk_grid_attach_extended(GTK_GRID(mag_zoom_grid), mag_h_zoom, 1, 0, 1, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 0, 0);
- ws_gtk_grid_attach_extended(GTK_GRID(mag_zoom_grid), mag_v_zoom_label, 0, 1 , 1, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 0, 0);
- ws_gtk_grid_attach_extended(GTK_GRID(mag_zoom_grid), mag_v_zoom, 1, 1, 1, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 0, 0);
- ws_gtk_grid_attach_extended(GTK_GRID(mag_zoom_grid), mag_zoom_same, 0, 2, 2, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 0, 0);
- ws_gtk_grid_attach_extended(GTK_GRID(mag_zoom_grid), mag_zoom_ratio, 0, 3, 2, 1,
- (GtkAttachOptions)(GTK_FILL|GTK_EXPAND), (GtkAttachOptions)0, 0, 0);
-
- mag_zoom_frame = gtk_frame_new("Magnify zoom");
- gtk_container_add(GTK_CONTAINER(mag_zoom_frame), mag_zoom_grid);
- gtk_container_set_border_width(GTK_CONTAINER(mag_zoom_frame), 3);
-
- mag_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(mag_box), mag_wh_grid, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(mag_box), mag_zoom_frame, TRUE, TRUE, 0);
- mag_frame = gtk_frame_new("Magnify");
- gtk_container_add(GTK_CONTAINER(mag_frame), mag_box);
-
- g->magnify.widget.h_zoom = (GtkSpinButton * )mag_h_zoom;
- g->magnify.widget.v_zoom = (GtkSpinButton * )mag_v_zoom;
- g_object_set_data(G_OBJECT(mag_h_zoom), "direction", GINT_TO_POINTER(0));
- g_object_set_data(G_OBJECT(mag_v_zoom), "direction", GINT_TO_POINTER(1));
- g_object_set_data(G_OBJECT(mag_zoom_same), "flag", (gpointer)MAGZOOMS_SAME);
- g_object_set_data(G_OBJECT(mag_zoom_ratio), "flag", (gpointer)MAGZOOMS_SAME_RATIO);
-
- g_signal_connect(mag_width, "changed", G_CALLBACK(callback_mag_width), g);
- g_signal_connect(mag_height, "changed", G_CALLBACK(callback_mag_height), g);
- g_signal_connect(mag_x, "changed", G_CALLBACK(callback_mag_x), g);
- g_signal_connect(mag_y, "changed", G_CALLBACK(callback_mag_y), g);
- g_signal_connect(mag_h_zoom, "changed", G_CALLBACK(callback_mag_zoom), g);
- g_signal_connect(mag_v_zoom, "changed", G_CALLBACK(callback_mag_zoom), g);
- g_signal_connect(mag_zoom_same, "clicked", G_CALLBACK(callback_mag_flags), g);
- g_signal_connect(mag_zoom_ratio, "clicked", G_CALLBACK(callback_mag_flags), g);
-
- return mag_frame;
-}
-
-static void callback_mag_width(GtkWidget *spin, gpointer data)
-{
- struct gtk_graph *g = (struct gtk_graph * )data;
-
- g->magnify.width = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin));
-}
-
-static void callback_mag_height(GtkWidget *spin, gpointer data)
-{
- struct gtk_graph *g = (struct gtk_graph * )data;
-
- g->magnify.height = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin));
-}
-
-static void callback_mag_x(GtkWidget *spin, gpointer data)
-{
- struct gtk_graph *g = (struct gtk_graph * )data;
-
- g->magnify.offset.x = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin));
-}
-
-static void callback_mag_y(GtkWidget *spin, gpointer data)
-{
- struct gtk_graph *g = (struct gtk_graph * )data;
-
- g->magnify.offset.y = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin));
-}
-
-static void callback_mag_zoom(GtkWidget *spin, gpointer data)
-{
- struct gtk_graph *g = (struct gtk_graph * )data;
- double value;
- int direction;
- double *zoom_this, *zoom_other;
- GtkSpinButton *widget_this, *widget_other;
- double old_this;
-
- if (g->magnify.flags & MAGZOOMS_IGNORE) {
- printf("refusing callback for %s zoom widget.\n",
- ((GtkSpinButton * )spin == g->magnify.widget.h_zoom) ? "horizontal" : "vertical");
- g->magnify.flags &= ~MAGZOOMS_IGNORE;
- return;
- }
- direction = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(spin), "direction"));
- value = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin));
-
- if (direction) {
- zoom_this = &g->magnify.zoom.y;
- zoom_other = &g->magnify.zoom.x;
- widget_this = g->magnify.widget.v_zoom;
- widget_other = g->magnify.widget.h_zoom;
- } else {
- zoom_this = &g->magnify.zoom.x;
- zoom_other = &g->magnify.zoom.y;
- widget_this = g->magnify.widget.h_zoom;
- widget_other = g->magnify.widget.v_zoom;
- }
-
- old_this = *zoom_this;
- *zoom_this = value;
- if (g->magnify.flags & MAGZOOMS_SAME) {
- *zoom_other = value;
- /* g->magnify.flags |= MAGZOOMS_IGNORE; */
- gtk_spin_button_set_value(widget_other, (gfloat) *zoom_other);
- } else if (g->magnify.flags & MAGZOOMS_SAME_RATIO) {
- double old_other = *zoom_other;
- *zoom_other *= value / old_this;
- if (*zoom_other < 1.0) {
- *zoom_other = 1.0;
- *zoom_this = old_this * 1.0 / old_other;
- /* g->magnify.flags |= MAGZOOMS_IGNORE; */
- gtk_spin_button_set_value(widget_this, (gfloat) *zoom_this);
- } else if (*zoom_other > 25.0) {
- *zoom_other = 25.0;
- *zoom_this = old_this * 25.0 / old_other;
- /* g->magnify.flags |= MAGZOOMS_IGNORE; */
- gtk_spin_button_set_value(widget_this, (gfloat) *zoom_this);
- }
- /* g->magnify.flags |= MAGZOOMS_IGNORE; */
- gtk_spin_button_set_value(widget_other, (gfloat) *zoom_other);
- }
-}
-
-static void callback_mag_flags(GtkWidget *toggle, gpointer data)
-{
- struct gtk_graph *g = (struct gtk_graph * )data;
- int flag = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(toggle), "flag"));
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toggle)))
- g->magnify.flags |= flag;
- else
- g->magnify.flags &= ~flag;
-}
-
-static GtkWidget *control_panel_create_zoomlock_group(struct gtk_graph *g)
-{
- GtkWidget *zoom_lock_h, *zoom_lock_v, *zoom_lock_none, *zoom_lock_box;
- GtkWidget *zoom_lock_frame;
-
- zoom_lock_none = gtk_radio_button_new_with_label(NULL, "none");
- zoom_lock_h = gtk_radio_button_new_with_label(
- gtk_radio_button_get_group(GTK_RADIO_BUTTON(zoom_lock_none)),
- "horizontal");
- zoom_lock_v = gtk_radio_button_new_with_label(
- gtk_radio_button_get_group(GTK_RADIO_BUTTON(zoom_lock_none)),
- "vertical");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(zoom_lock_none), TRUE);
- zoom_lock_box = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(zoom_lock_box), zoom_lock_none, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(zoom_lock_box), zoom_lock_h, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(zoom_lock_box), zoom_lock_v, TRUE, TRUE, 0);
- zoom_lock_frame = gtk_frame_new("Zoom lock:");
- gtk_container_add(GTK_CONTAINER(zoom_lock_frame), zoom_lock_box);
-
- g_signal_connect(zoom_lock_h, "toggled", G_CALLBACK(callback_zoomlock_h), g);
- g_signal_connect(zoom_lock_v, "toggled", G_CALLBACK(callback_zoomlock_v), g);
-
- return zoom_lock_frame;
-}
-
-static void callback_zoomlock_h(GtkWidget *toggle, gpointer data)
-{
- struct gtk_graph *g = (struct gtk_graph * )data;
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toggle)))
- g->zoom.flags |= ZOOM_HLOCK;
- else
- g->zoom.flags &= ~ZOOM_HLOCK;
-}
-
-static void callback_zoomlock_v(GtkWidget *toggle, gpointer data)
-{
- struct gtk_graph *g = (struct gtk_graph * )data;
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toggle)))
- g->zoom.flags |= ZOOM_VLOCK;
- else
- g->zoom.flags &= ~ZOOM_VLOCK;
-}
-
-static GtkWidget *control_panel_create_cross_group(struct gtk_graph *g)
-{
- GtkWidget *on, *off, *box, *frame, *vbox, *label;
-
- label = gtk_label_new("Crosshairs:");
- off = gtk_radio_button_new_with_label(NULL, "off");
- on = gtk_radio_button_new_with_label(
- gtk_radio_button_get_group(GTK_RADIO_BUTTON(off)), "on");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(off), TRUE);
- box = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 10);
- gtk_box_pack_start(GTK_BOX(box), off, FALSE, FALSE, 10);
- gtk_box_pack_start(GTK_BOX(box), on, FALSE, FALSE, 0);
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(vbox), box, FALSE, FALSE, 15);
- /* frame = gtk_frame_new("Cross:"); */
- frame = gtk_frame_new(NULL);
- gtk_container_add(GTK_CONTAINER(frame), vbox);
-
- g_signal_connect(on, "toggled", G_CALLBACK(callback_cross_on_off), g);
-
- g->cross.on_toggle = (GtkToggleButton * )on;
- g->cross.off_toggle = (GtkToggleButton * )off;
-
- return frame;
-}
-static void callback_cross_on_off(GtkWidget *toggle, gpointer data)
-{
- struct gtk_graph *g = (struct gtk_graph * )data;
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toggle))) {
- int x, y;
- g->cross.draw = TRUE;
- get_mouse_position(g->drawing_area, &x, &y, 0);
- cross_draw(g, x, y);
- } else {
- g->cross.draw = FALSE;
- if (g->cross.erase_needed) {
- cross_erase(g);
- }
- }
-}
-
-static GtkWidget *control_panel_create_graph_type_group(struct gtk_graph *g)
-{
- GtkWidget *graph_tseqttrace, *graph_tseqstevens;
- GtkWidget *graph_tput, *graph_rtt, *graph_sep, *graph_init, *graph_box;
- GtkWidget *graph_frame;
- GtkWidget *graph_wscale;
-
- graph_tput = gtk_radio_button_new_with_label(NULL, "Throughput");
- graph_tseqttrace = gtk_radio_button_new_with_label(
- gtk_radio_button_get_group(GTK_RADIO_BUTTON(graph_tput)),
- "Time/Sequence (tcptrace-style)");
- graph_tseqstevens = gtk_radio_button_new_with_label(
- gtk_radio_button_get_group(GTK_RADIO_BUTTON(graph_tput)),
- "Time/Sequence (Stevens'-style)");
- graph_rtt = gtk_radio_button_new_with_label(
- gtk_radio_button_get_group(GTK_RADIO_BUTTON(graph_tput)),
- "Round-trip Time");
- graph_wscale = gtk_radio_button_new_with_label(
- gtk_radio_button_get_group(GTK_RADIO_BUTTON(graph_tput)),
- "Window Scaling");
-
- switch (g->tg.type) {
- case GRAPH_TSEQ_STEVENS:
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(graph_tseqstevens), TRUE);
- break;
- case GRAPH_TSEQ_TCPTRACE:
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(graph_tseqttrace), TRUE);
- break;
- case GRAPH_THROUGHPUT:
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(graph_tput), TRUE);
- break;
- case GRAPH_RTT:
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(graph_rtt), TRUE);
- break;
- case GRAPH_WSCALE:
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(graph_wscale), TRUE);
- break;
- case GRAPH_UNDEFINED:
- break;
- }
- graph_init = gtk_check_button_new_with_label("Init on change");
- graph_sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
- graph_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_box_pack_start(GTK_BOX(graph_box), graph_rtt, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(graph_box), graph_tput, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(graph_box), graph_tseqstevens, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(graph_box), graph_tseqttrace, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(graph_box), graph_wscale, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(graph_box), graph_sep, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(graph_box), graph_init, TRUE, TRUE, 0);
- graph_frame = gtk_frame_new("Graph type:");
- gtk_container_add(GTK_CONTAINER(graph_frame), graph_box);
-
- g_object_set_data(G_OBJECT(graph_tseqstevens), "new-graph-type",
- GINT_TO_POINTER(GRAPH_TSEQ_STEVENS));
- g_object_set_data(G_OBJECT(graph_tseqttrace), "new-graph-type",
- GINT_TO_POINTER(GRAPH_TSEQ_TCPTRACE));
- g_object_set_data(G_OBJECT(graph_tput), "new-graph-type",
- GINT_TO_POINTER(GRAPH_THROUGHPUT));
- g_object_set_data(G_OBJECT(graph_rtt), "new-graph-type",
- GINT_TO_POINTER(GRAPH_RTT));
- g_object_set_data(G_OBJECT(graph_wscale), "new-graph-type",
- GINT_TO_POINTER(GRAPH_WSCALE));
-
- g->gt.graph_wscale = (GtkToggleButton * )graph_wscale;
- g->gt.graph_rtt = (GtkToggleButton * )graph_rtt;
- g->gt.graph_tput = (GtkToggleButton * )graph_tput;
- g->gt.graph_tseqstevens = (GtkToggleButton * )graph_tseqstevens;
- g->gt.graph_tseqttrace = (GtkToggleButton * )graph_tseqttrace;
-
- g_signal_connect(graph_tseqttrace, "toggled", G_CALLBACK(callback_graph_type), g);
- g_signal_connect(graph_tseqstevens, "toggled", G_CALLBACK(callback_graph_type), g);
- g_signal_connect(graph_tput, "toggled", G_CALLBACK(callback_graph_type), g);
- g_signal_connect(graph_rtt, "toggled", G_CALLBACK(callback_graph_type), g);
- g_signal_connect(graph_wscale, "toggled", G_CALLBACK(callback_graph_type), g);
- g_signal_connect(graph_init, "toggled", G_CALLBACK(callback_graph_init_on_typechg), g);
-
- return graph_frame;
-}
-
-static void callback_graph_type(GtkWidget *toggle, gpointer data)
-{
- tcp_graph_type old_type, new_type;
- struct gtk_graph *g = (struct gtk_graph * )data;
-
- new_type = (tcp_graph_type)GPOINTER_TO_INT(g_object_get_data(G_OBJECT(toggle), "new-graph-type"));
-
- if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toggle)))
- return;
-
- old_type = g->tg.type;
- g->tg.type = new_type;
-
- graph_element_lists_free(g);
- graph_element_lists_initialize(g);
-
- if ((old_type == GRAPH_THROUGHPUT) || (new_type == GRAPH_THROUGHPUT)) {
- /* throughput graph uses differently constructed segment list so we
- * need to recreate it */
- graph_segment_list_free(&g->tg);
- graph_segment_list_get(&cfile, &g->tg, TRUE);
- }
-
- if (g->flags & GRAPH_INIT_ON_TYPE_CHANGE) {
- g->geom.width = g->wp.width;
- g->geom.height = g->wp.height;
- g->geom.x = g->wp.x;
- g->geom.y = g->wp.y;
- }
- g->x_axis->min = g->y_axis->min = 0;
- gtk_toggle_button_set_active(g->gui.time_orig_conn, TRUE);
- gtk_toggle_button_set_active(g->gui.seq_orig_isn, TRUE);
- graph_init_sequence(g);
-}
-
-static void callback_graph_init_on_typechg(GtkWidget *toggle _U_, gpointer data)
-{
- ((struct gtk_graph * )data)->flags ^= GRAPH_INIT_ON_TYPE_CHANGE;
-}
-
-static struct gtk_graph *graph_new(void)
-{
- struct gtk_graph *g;
-
- g = (struct gtk_graph * )g_malloc0(sizeof(struct gtk_graph));
- graph_element_lists_initialize(g);
-
- g->x_axis = (struct axis * )g_malloc0(sizeof(struct axis));
- g->y_axis = (struct axis * )g_malloc0(sizeof(struct axis));
- g->x_axis->g = g;
- g->x_axis->is_horizontal_axis = TRUE;
- g->x_axis->s.x = g->x_axis->s.y = 0;
- g->x_axis->s.height = HAXIS_INIT_HEIGHT;
- g->x_axis->p.x = VAXIS_INIT_WIDTH;
- g->x_axis->p.height = HAXIS_INIT_HEIGHT;
- g->y_axis->g = g;
- g->y_axis->is_horizontal_axis = FALSE;
- g->y_axis->p.x = g->y_axis->p.y = 0;
- g->y_axis->p.width = VAXIS_INIT_WIDTH;
- g->y_axis->s.x = 0;
- g->y_axis->s.y = TITLEBAR_HEIGHT;
- g->y_axis->s.width = VAXIS_INIT_WIDTH;
-
- return g;
-}
-
-static void graph_initialize_values(struct gtk_graph *g)
-{
- g->geom.width = g->wp.width = 750;
- g->geom.height = g->wp.height = 550;
- g->geom.x = g->wp.x = VAXIS_INIT_WIDTH;
- g->geom.y = g->wp.y = TITLEBAR_HEIGHT;
- g->flags = 0;
- /* g->zoom.x = g->zoom.y = 1.0; */
- g->zoom.step_x = g->zoom.step_y = 1.2;
- g->zoom.flags = 0;
- g->cross.draw = g->cross.erase_needed = FALSE;
- g->zoomrect_erase_needed = FALSE;
- g->grab.grabbed = 0;
- g->magnify.active = 0;
- g->magnify.offset.x = g->magnify.offset.y = 0;
- g->magnify.width = g->magnify.height = 250;
- g->magnify.zoom.x = g->magnify.zoom.y = 10.0;
- g->magnify.flags = 0;
-}
-
-static void graph_init_sequence(struct gtk_graph *g)
-{
- debug(DBS_FENTRY) puts("graph_init_sequence()");
-
- graph_type_dependent_initialize(g);
- g->zoom.initial.x = g->zoom.x;
- g->zoom.initial.y = g->zoom.y;
- graph_element_lists_make(g);
- g->x_axis->s.width = g->wp.width;
- g->x_axis->p.width = g->x_axis->s.width + RMARGIN_WIDTH;
- g->x_axis->p.y = TITLEBAR_HEIGHT + g->wp.height;
- g->x_axis->s.height = g->x_axis->p.height = HAXIS_INIT_HEIGHT;
- g->y_axis->s.height = g->wp.height;
- g->y_axis->p.height = g->wp.height + TITLEBAR_HEIGHT;
- graph_pixmaps_create(g);
- axis_pixmaps_create(g->y_axis);
- axis_pixmaps_create(g->x_axis);
- graph_title_pixmap_create(g);
- graph_title_pixmap_draw(g);
- graph_title_pixmap_display(g);
- graph_display(g);
- axis_display(g->y_axis);
- axis_display(g->x_axis);
-}
-
-static void graph_type_dependent_initialize(struct gtk_graph *g)
-{
- switch (g->tg.type) {
- case GRAPH_TSEQ_STEVENS:
- case GRAPH_TSEQ_TCPTRACE:
- tseq_initialize(g);
- break;
- case GRAPH_THROUGHPUT:
- tput_initialize(g);
- break;
- case GRAPH_RTT:
- rtt_initialize(g);
- break;
- case GRAPH_WSCALE:
- wscale_initialize(g);
- break;
- default:
- break;
- }
-}
-
-static void graph_destroy(struct gtk_graph *g)
-{
- debug(DBS_FENTRY) puts("graph_destroy()");
-
- axis_destroy(g->x_axis);
- axis_destroy(g->y_axis);
- /* window_destroy(g->drawing_area); */
- window_destroy(g->gui.control_panel);
- window_destroy(g->toplevel);
- /* window_destroy(g->text); */
-#if GTK_CHECK_VERSION(2,22,0)
- if (g->title_surface) {
- cairo_surface_destroy(g->title_surface);
- }
- if (g->surface[0]) {
- cairo_surface_destroy(g->surface[0]);
- }
- if (g->surface[1]) {
- cairo_surface_destroy(g->surface[1]);
- }
-#else
- g_object_unref(g->pixmap[0]);
- g_object_unref(g->pixmap[1]);
-#endif /* GTK_CHECK_VERSION(2,22,0) */
- g_free(g->x_axis);
- g_free(g->y_axis);
- g_free((gpointer )(g->title));
- graph_segment_list_free(&g->tg);
- graph_element_lists_free(g);
-
- g_free(g);
-}
-
-static void graph_element_lists_initialize(struct gtk_graph *g)
-{
- g->elists = (struct element_list *)g_malloc0(sizeof(struct element_list));
-}
-
-static void graph_element_lists_make(struct gtk_graph *g)
-{
- debug(DBS_FENTRY) puts("graph_element_lists_make()");
-
- switch (g->tg.type) {
- case GRAPH_TSEQ_STEVENS:
- tseq_stevens_make_elmtlist(g);
- break;
- case GRAPH_TSEQ_TCPTRACE:
- tseq_tcptrace_make_elmtlist(g);
- break;
- case GRAPH_THROUGHPUT:
- tput_make_elmtlist(g);
- break;
- case GRAPH_RTT:
- rtt_make_elmtlist(g);
- break;
- case GRAPH_WSCALE:
- wscale_make_elmtlist(g);
- break;
- default:
- printf("graph_element_lists_make: unknown graph type: %d\n", g->tg.type);
- break;
- }
-}
-
-static void graph_element_lists_free(struct gtk_graph *g)
-{
- struct element_list *list, *next_list;
-
- for (list=g->elists; list; list=next_list) {
- g_free(list->elements);
- next_list = list->next;
- g_free(list);
- }
- g->elists = NULL; /* just to make debugging easier */
-}
-
-static void graph_title_pixmap_create(struct gtk_graph *g)
-{
-#if GTK_CHECK_VERSION(2,22,0)
- if (g->title_surface) {
- cairo_surface_destroy(g->title_surface);
- g->title_surface = NULL;
- }
-
- g->title_surface = gdk_window_create_similar_surface(gtk_widget_get_window(g->drawing_area),
- CAIRO_CONTENT_COLOR,
- g->x_axis->p.width,
- g->wp.y);
-
-#else
- if (g->title_pixmap)
- g_object_unref(g->title_pixmap);
-
- g->title_pixmap = gdk_pixmap_new(gtk_widget_get_window(g->drawing_area),
- g->x_axis->p.width, g->wp.y, -1);
-#endif
-}
-
-static void graph_title_pixmap_draw(struct gtk_graph *g)
-{
- int i;
- cairo_t *cr;
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create(g->title_surface);
-#else
- cr = gdk_cairo_create(g->title_pixmap);
-#endif
- cairo_set_source_rgb(cr, 1, 1, 1); /* set fill color */
- cairo_rectangle(cr, 0, 0, g->x_axis->p.width, g->wp.y);
- cairo_fill(cr);
- cairo_set_source_rgb(cr, 0, 0, 0); /* set text color */
-
- for (i=0; g->title[i]; i++) {
- gint w, h;
- PangoLayout *layout;
- layout = gtk_widget_create_pango_layout(g->drawing_area,
- g->title[i]);
- pango_layout_get_pixel_size(layout, &w, &h);
- cairo_move_to(cr, g->wp.width/2 - w/2, 20 + i*(h+3));
- pango_cairo_show_layout(cr, layout);
- g_object_unref(G_OBJECT(layout));
- }
- cairo_destroy(cr);
-}
-
-static void graph_title_pixmap_display(struct gtk_graph *g)
-{
- cairo_t *cr;
-
- cr = gdk_cairo_create(gtk_widget_get_window(g->drawing_area));
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface(cr, g->title_surface, g->wp.x, 0);
-#else
- ws_gdk_cairo_set_source_pixmap(cr, g->title_pixmap, g->wp.x, 0);
-#endif
- cairo_rectangle(cr, g->wp.x, 0, g->x_axis->p.width, g->wp.y);
- cairo_fill(cr);
- cairo_destroy(cr);
-}
-
-static void graph_pixmaps_create(struct gtk_graph *g)
-{
- debug(DBS_FENTRY) puts("graph_pixmaps_create()");
-#if GTK_CHECK_VERSION(2,22,0)
- if (g->surface[0]) {
- cairo_surface_destroy(g->surface[0]);
- g->surface[0] = NULL;
- }
-
- if (g->surface[1]) {
- cairo_surface_destroy(g->surface[1]);
- g->surface[1] = NULL;
- }
-
- g->surface[0] = gdk_window_create_similar_surface(gtk_widget_get_window(g->drawing_area),
- CAIRO_CONTENT_COLOR,
- g->wp.width,
- g->wp.height);
-
- g->surface[1] = gdk_window_create_similar_surface(gtk_widget_get_window(g->drawing_area),
- CAIRO_CONTENT_COLOR,
- g->wp.width,
- g->wp.height);
-
- g->displayed = 0;
-#else
- if (g->pixmap[0])
- g_object_unref(g->pixmap[0]);
- if (g->pixmap[1])
- g_object_unref(g->pixmap[1]);
-
- g->pixmap[0] = gdk_pixmap_new(gtk_widget_get_window(g->drawing_area),
- g->wp.width, g->wp.height, -1);
- g->pixmap[1] = gdk_pixmap_new(gtk_widget_get_window(g->drawing_area),
- g->wp.width, g->wp.height, -1);
-
- g->displayed = 0;
-#endif /* GTK_CHECK_VERSION(2,22,0) */
-}
-
-static void graph_display(struct gtk_graph *g)
-{
- set_busy_cursor(gtk_widget_get_window(g->drawing_area));
- graph_pixmap_draw(g);
- unset_busy_cursor(gtk_widget_get_window(g->drawing_area), g->cross.draw);
- graph_pixmaps_switch(g);
- graph_pixmap_display(g);
-}
-
-static void graph_pixmap_display(struct gtk_graph *g)
-{
- cairo_t *cr;
-
- cr = gdk_cairo_create(gtk_widget_get_window(g->drawing_area));
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface(cr, g->surface[g->displayed], g->wp.x, g->wp.y);
-#else
- ws_gdk_cairo_set_source_pixmap(cr, g->pixmap[g->displayed], g->wp.x, g->wp.y);
-#endif /* GTK_CHECK_VERSION(2,22,0) */
- cairo_rectangle(cr, g->wp.x, g->wp.y, g->wp.width, g->wp.height);
- cairo_fill(cr);
- cairo_destroy(cr);
- if (g->cross.erase_needed) {
- cross_erase(g);
- }
-}
-
-static void graph_pixmaps_switch(struct gtk_graph *g)
-{
- g->displayed = 1 ^ g->displayed;
-}
-
-static void graph_pixmap_draw(struct gtk_graph *g)
-{
- struct element_list *list;
- struct element *e;
- int not_disp;
- cairo_t *cr;
- GdkRGBA *current_line_color = NULL;
- GdkRGBA *color_to_set = NULL;
- gboolean line_stroked = TRUE;
-
- debug(DBS_FENTRY) puts("graph_pixmap_draw()");
- not_disp = 1 ^ g->displayed;
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create(g->surface[not_disp]);
-#else
- cr = gdk_cairo_create(g->pixmap[not_disp]);
-#endif /* GTK_CHECK_VERSION(2,22,0) */
- cairo_set_source_rgb(cr, 1, 1, 1);
- cairo_rectangle(cr, 0, 0, g->wp.width, g->wp.height);
- cairo_fill(cr);
-
- /* Want line width 1 for all elements */
- cairo_set_line_width(cr, 1.0);
-
- for (list=g->elists; list; list=list->next) {
- for (e=list->elements; e->type != ELMT_NONE; e++) {
- switch (e->type) {
- case ELMT_RECT:
- current_line_color = NULL;
- break;
-
- case ELMT_LINE:
- /* Work out if we need to change colour */
- if (current_line_color == e->elment_color_p) {
- /* No change needed */
- color_to_set = NULL;
- }
- else {
- /* Changing colour */
- current_line_color = color_to_set = e->elment_color_p;
- }
-
- /* Draw the line */
- draw_element_line(g, e, cr, color_to_set);
- line_stroked = FALSE;
- break;
-
- case ELMT_ELLIPSE:
- if (!line_stroked) {
- cairo_stroke(cr);
- line_stroked = TRUE;
- }
- draw_element_ellipse(g, e, cr);
- break;
-
- default:
- break;
- }
- }
- }
-
- /* Make sure any remaining lines get drawn */
- if (!line_stroked)
- cairo_stroke(cr);
-
- cairo_destroy(cr);
-}
-
-static void draw_element_line(struct gtk_graph *g, struct element *e, cairo_t *cr,
- GdkRGBA *new_color)
-{
- int xx1, xx2, yy1, yy2;
-
- debug(DBS_GRAPH_DRAWING) printf("line element: (%.2f,%.2f)->(%.2f,%.2f), "
- "seg %u ... ", e->p.line.dim.x1, e->p.line.dim.y1,
- e->p.line.dim.x2, e->p.line.dim.y2, e->parent->num);
-
- /* Set our new colour (if changed) */
- if (new_color != NULL) {
- /* First draw any previous lines with old colour */
- cairo_stroke(cr);
- gdk_cairo_set_source_rgba(cr, new_color);
- }
-
- xx1 = (int )lrint(e->p.line.dim.x1 + g->geom.x - g->wp.x);
- xx2 = (int )lrint(e->p.line.dim.x2 + g->geom.x - g->wp.x);
- yy1 = (int )lrint((g->geom.height-1-e->p.line.dim.y1) + g->geom.y-g->wp.y);
- yy2 = (int )lrint((g->geom.height-1-e->p.line.dim.y2) + g->geom.y-g->wp.y);
-
- /* If line completely out of the area, we won't show it */
- if (((xx1 < 0) && (xx2 < 0)) || ((xx1 >= g->wp.width) && (xx2 >= g->wp.width)) ||
- ((yy1 < 0) && (yy2 < 0)) || ((yy1 >= g->wp.height) && (yy2 >= g->wp.height))) {
- debug(DBS_GRAPH_DRAWING) printf(" refusing: (%d,%d)->(%d,%d)\n",
- xx1, yy1, xx2, yy2);
- return;
- }
-
- /* If one end of the line is out of bounds, don't worry. Cairo will
- clip the line to the outside of g->wp at the correct angle! */
-
- debug(DBS_GRAPH_DRAWING) printf("line: (%d,%d)->(%d,%d)\n", xx1, yy1, xx2, yy2);
-
- g_assert(e->elment_color_p!=NULL);
-
- cairo_move_to(cr, xx1+0.5, yy1+0.5);
- cairo_line_to(cr, xx2+0.5, yy2+0.5);
-}
-
-static void draw_element_ellipse(struct gtk_graph *g, struct element *e, cairo_t *cr)
-{
- gdouble w = e->p.ellipse.dim.width;
- gdouble h = e->p.ellipse.dim.height;
- gdouble x = e->p.ellipse.dim.x + g->geom.x - g->wp.x;
- gdouble y = g->geom.height-1 - e->p.ellipse.dim.y + g->geom.y - g->wp.y;
-
- debug(DBS_GRAPH_DRAWING) printf("ellipse: (x, y) " UTF8_RIGHTWARDS_ARROW " (w, h): (%f, %f) " UTF8_RIGHTWARDS_ARROW " (%f, %f)\n", x, y, w, h);
-
- cairo_save(cr);
- cairo_set_source_rgb(cr, 0, 0, 0);
- cairo_translate(cr, x + w / 2., y + h / 2.);
- cairo_scale(cr, w / 2., h / 2.);
- cairo_arc(cr, 0., 0., 1., 0., 2 * G_PI);
- cairo_fill(cr);
- cairo_restore(cr);
-}
-
-static void axis_pixmaps_create(struct axis *axis)
-{
- debug(DBS_FENTRY) puts("axis_pixmaps_create()");
-#if GTK_CHECK_VERSION(2,22,0)
- if (axis->surface[0]) {
- cairo_surface_destroy(axis->surface[0]);
- axis->surface[0] = NULL;
- }
- if (axis->surface[1]) {
- cairo_surface_destroy(axis->surface[1]);
- axis->surface[1] = NULL;
- }
- axis->surface[0] = gdk_window_create_similar_surface(gtk_widget_get_window(axis->drawing_area),
- CAIRO_CONTENT_COLOR,
- axis->p.width,
- axis->p.height);
-
- axis->surface[1] = gdk_window_create_similar_surface(gtk_widget_get_window(axis->drawing_area),
- CAIRO_CONTENT_COLOR,
- axis->p.width,
- axis->p.height);
-
- axis->displayed = 0;
-#else
- if (axis->pixmap[0])
- g_object_unref(axis->pixmap[0]);
- if (axis->pixmap[1])
- g_object_unref(axis->pixmap[1]);
-
- axis->pixmap[0] = gdk_pixmap_new(gtk_widget_get_window(axis->drawing_area),
- axis->p.width, axis->p.height, -1);
- axis->pixmap[1] = gdk_pixmap_new(gtk_widget_get_window(axis->drawing_area),
- axis->p.width, axis->p.height, -1);
-
- axis->displayed = 0;
-#endif
-}
-
-static void axis_destroy(struct axis *axis)
-{
-#if GTK_CHECK_VERSION(2,22,0)
- if (axis->surface[0]) {
- cairo_surface_destroy(axis->surface[0]);
- axis->surface[0] = NULL;
- }
- if (axis->surface[1]) {
- cairo_surface_destroy(axis->surface[1]);
- axis->surface[1] = NULL;
- }
-#else
- g_object_unref(axis->pixmap[0]);
- g_object_unref(axis->pixmap[1]);
-#endif
- g_free( (gpointer) (axis->label) );
-}
-
-static void axis_display(struct axis *axis)
-{
- if (axis->is_horizontal_axis)
- h_axis_pixmap_draw(axis);
- else
- v_axis_pixmap_draw(axis);
- axis_pixmaps_switch(axis);
- axis_pixmap_display(axis);
-}
-
-static void v_axis_pixmap_draw(struct axis *axis)
-{
- struct gtk_graph *g = axis->g;
- int i;
- double major_tick;
- int not_disp, rdigits, offset, imin, imax;
- double bottom, top, j, fl, corr;
- PangoLayout *layout;
- cairo_t *cr;
-
- debug(DBS_FENTRY) puts("v_axis_pixmap_draw()");
- bottom = (g->geom.height - (g->wp.height + g->wp.y + (-g->geom.y))) /
- (double )g->geom.height * g->bounds.height;
- bottom += axis->min;
- top = (g->geom.height - (g->wp.y + (-g->geom.y))) /
- (double )g->geom.height * g->bounds.height;
- top += axis->min;
- axis_compute_ticks(axis, bottom, top, AXIS_VERTICAL);
-
- j = axis->major - floor(axis->major);
- for (rdigits=0; rdigits <= 6; rdigits++) {
- j *= 10;
- if (j <= 0.000001)
- break;
- j = j - floor(j);
- }
-
- not_disp = 1 ^ axis->displayed;
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create(axis->surface[not_disp]);
-#else
- cr = gdk_cairo_create(axis->pixmap[not_disp]);
-#endif
- cairo_set_source_rgb(cr, 1, 1, 1);
- cairo_rectangle(cr, 0, 0, axis->p.width, axis->p.height);
- cairo_fill(cr);
-
- /* axis */
- cairo_set_source_rgb(cr, 0, 0, 0);
- cairo_set_line_width(cr, 1.0);
- cairo_move_to(cr, axis->p.width - 1.5, (axis->p.height-axis->s.height)/2.0);
- cairo_line_to(cr, axis->s.width - 1.5, axis->p.height);
-
- offset = g->wp.y + (-g->geom.y);
- fl = floor(axis->min / axis->major) * axis->major;
- corr = rint((axis->min - fl) * g->zoom.y);
-
- /* major ticks */
- major_tick = axis->major * g->zoom.y;
- imin = (int) ((g->geom.height - offset + corr - g->wp.height) / major_tick + 1);
- imax = (int) ((g->geom.height - offset + corr) / major_tick);
- for (i=imin; i <= imax; i++) {
- gint w, h;
- char desc[32];
- int y = (int) (g->geom.height - 1 - (int )lrint(i * major_tick) -
- offset + corr + axis->s.y);
-
- debug(DBS_AXES_DRAWING) printf("%f @ %d\n",
- (i * axis->major) + fl, y);
- if ((y < 0) || (y > axis->p.height))
- continue;
-
- cairo_move_to(cr, axis->p.width - 15, y + 0.5);
- cairo_line_to(cr, axis->s.width - 1, y + 0.5);
-
- g_snprintf(desc, sizeof(desc), "%.*f", rdigits, i*axis->major + fl);
- layout = gtk_widget_create_pango_layout(g->drawing_area, desc);
- pango_layout_get_pixel_size(layout, &w, &h);
- cairo_move_to(cr, axis->s.width-14-4-w, y - h/2);
- pango_cairo_show_layout(cr, layout);
- g_object_unref(G_OBJECT(layout));
- }
- /* minor ticks */
- if (axis->minor) {
- double minor_tick = axis->minor * g->zoom.y;
- imin = (int) ((g->geom.height - offset + corr - g->wp.height)/minor_tick + 1);
- imax = (int) ((g->geom.height - offset + corr) / minor_tick);
- for (i=imin; i <= imax; i++) {
- int y = (int) (g->geom.height-1 - (int )lrint(i*minor_tick) -
- offset + corr + axis->s.y);
-
- debug(DBS_AXES_DRAWING) printf("%f @ %d\n", i*axis->minor+fl, y);
- if ((y > 0) && (y < axis->p.height)) {
- cairo_move_to(cr, axis->s.width - 8, y+0.5);
- cairo_line_to(cr, axis->s.width - 1, y+0.5);
- }
- }
- }
- for (i=0; axis->label[i]; i++) {
- gint w, h;
- layout = gtk_widget_create_pango_layout(g->drawing_area,
- axis->label[i]);
- pango_layout_get_pixel_size(layout, &w, &h);
- cairo_move_to(cr,(axis->p.width - w)/2, TITLEBAR_HEIGHT-10 - i*(h+3) - h);
- pango_cairo_show_layout(cr, layout);
- g_object_unref(G_OBJECT(layout));
- }
- cairo_stroke(cr);
- cairo_destroy(cr);
-}
-
-static void h_axis_pixmap_draw(struct axis *axis)
-{
- struct gtk_graph *g = axis->g;
- int i;
- double major_tick, minor_tick;
- int not_disp, rdigits, offset, imin, imax;
- double left, right, j, fl, corr;
- PangoLayout *layout;
- cairo_t *cr;
-
- debug(DBS_FENTRY) puts("h_axis_pixmap_draw()");
- left = (g->wp.x-g->geom.x) / (double )g->geom.width * g->bounds.width;
- left += axis->min;
- right = (g->wp.x - g->geom.x + g->wp.width) / (double )g->geom.width * g->bounds.width;
- right += axis->min;
- axis_compute_ticks(axis, left, right, AXIS_HORIZONTAL);
-
- j = axis->major - floor(axis->major);
- for (rdigits=0; rdigits <= 6; rdigits++) {
- j *= 10;
- if (j <= 0.000001)
- break;
- j = j - floor(j);
- }
-
- not_disp = 1 ^ axis->displayed;
-
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create(axis->surface[not_disp]);
-#else
- cr = gdk_cairo_create(axis->pixmap[not_disp]);
-#endif
- cairo_set_source_rgb(cr, 1, 1, 1);
- cairo_rectangle(cr, 0, 0, axis->p.width, axis->p.height);
- cairo_fill(cr);
-
- /* axis */
- cairo_set_source_rgb(cr, 0, 0, 0);
- cairo_set_line_width(cr, 1.0);
- cairo_move_to(cr, 0, 0.5);
- cairo_line_to(cr, axis->s.width + (axis->p.width-axis->s.width)/2.0, 0.5);
-
- offset = g->wp.x - g->geom.x;
-
- fl = floor(axis->min / axis->major) * axis->major;
- corr = rint((axis->min - fl) * g->zoom.x);
-
- /* major ticks */
- major_tick = axis->major*g->zoom.x;
- imin = (int) ((offset + corr) / major_tick + 1);
- imax = (int) ((offset + corr + axis->s.width) / major_tick);
- for (i=imin; i <= imax; i++) {
- char desc[32];
- int w, h;
- int x = (int ) (rint(i * major_tick) - offset - corr);
-
- /* printf("%f @ %d\n", i*axis->major + fl, x); */
- if ((x < 0) || (x > axis->s.width))
- continue;
- cairo_move_to(cr, x+0.5, 0);
- cairo_line_to(cr, x+0.5, 15);
-
- g_snprintf(desc, sizeof(desc), "%.*f", rdigits, i*axis->major + fl);
- layout = gtk_widget_create_pango_layout(g->drawing_area, desc);
- pango_layout_get_pixel_size(layout, &w, &h);
- cairo_move_to(cr, x - w/2, 15+4);
- pango_cairo_show_layout(cr, layout);
- g_object_unref(G_OBJECT(layout));
- }
- if (axis->minor > 0) {
- /* minor ticks */
- minor_tick = axis->minor*g->zoom.x;
- imin = (int) ((offset + corr) / minor_tick + 1);
- imax = (int) ((offset + corr + g->wp.width) / minor_tick);
- for (i=imin; i <= imax; i++) {
- int x = (int) (rint(i * minor_tick) - offset - corr);
- if ((x > 0) && (x < axis->s.width)) {
- cairo_move_to(cr, x+0.5, 0);
- cairo_line_to(cr, x+0.5, 8);
- }
- }
- }
- for (i=0; axis->label[i]; i++) {
- gint w, h;
- layout = gtk_widget_create_pango_layout(g->drawing_area,
- axis->label[i]);
- pango_layout_get_pixel_size(layout, &w, &h);
- cairo_move_to(cr, axis->s.width - w - 50, 15+h+15 + i*(h+3));
- pango_cairo_show_layout(cr, layout);
- g_object_unref(G_OBJECT(layout));
- }
- cairo_stroke(cr);
- cairo_destroy(cr);
-}
-
-static void axis_pixmaps_switch(struct axis *axis)
-{
- axis->displayed = 1 ^ axis->displayed;
-}
-
-static void axis_pixmap_display(struct axis *axis)
-{
- cairo_t *cr;
-
- cr = gdk_cairo_create(gtk_widget_get_window(axis->drawing_area));
-#if GTK_CHECK_VERSION(2,22,0)
- cairo_set_source_surface(cr, axis->surface[axis->displayed], axis->p.x, axis->p.y);
-#else
- ws_gdk_cairo_set_source_pixmap(cr, axis->pixmap[axis->displayed], axis->p.x, axis->p.y);
-#endif
- cairo_rectangle(cr, axis->p.x, axis->p.y, axis->p.width, axis->p.height);
- cairo_fill(cr);
- cairo_destroy(cr);
-
-}
-
-static void axis_compute_ticks(struct axis *axis, double x0, double xmax, int dir)
-{
- int i, j, ii, jj, ms;
- double zoom, x, steps[3] = { 0.1, 0.5 };
- int dim, check_needed, diminished;
- double majthresh[2] = {2.0, 3.0};
-
- debug((DBS_FENTRY | DBS_AXES_TICKS)) puts("axis_compute_ticks()");
- debug(DBS_AXES_TICKS)
- printf("x0=%f xmax=%f dir=%s\n", x0,xmax, dir?"VERTICAL":"HORIZONTAL");
-
- zoom = axis_zoom_get(axis, dir);
- x = xmax-x0;
- for (i=-9; i <= 12; i++) {
- if (x / pow(10, i) < 1)
- break;
- }
- --i;
- ms = (int )(x / pow(10, i));
-
- if (ms > 5) {
- j = 0;
- ++i;
- } else if (ms > 2)
- j = 1;
- else
- j = 0;
-
- axis->major = steps[j] * pow(10, i);
-
- debug(DBS_AXES_TICKS) printf("zoom=%.1f, x=%f " UTF8_RIGHTWARDS_ARROW " i=%d " UTF8_RIGHTWARDS_ARROW " ms=%d " UTF8_RIGHTWARDS_ARROW " j=%d ->"
- " axis->major=%f\n", zoom, x, i, ms, j, axis->major);
-
- /* let's compute minor ticks */
- jj = j;
- ii = i;
- axis_ticks_down(&ii, &jj);
- axis->minor = steps[jj] * pow(10, ii);
- /* we don't want minors if they would be less than 10 pixels apart */
- if (axis->minor*zoom < 10) {
- debug(DBS_AXES_TICKS) printf("refusing axis->minor of %f: "
- "axis->minor*zoom == %f\n", axis->minor, axis->minor*zoom);
- axis->minor = 0;
- }
-
- check_needed = TRUE;
- diminished = FALSE;
- while (check_needed) {
- check_needed = FALSE;
- dim = get_label_dim(axis, dir, xmax);
- debug(DBS_AXES_TICKS) printf("axis->major==%.1f, axis->minor==%.1f =>"
- " axis->major*zoom/dim==%f, axis->minor*zoom/dim==%f\n",
- axis->major, axis->minor, axis->major*zoom/dim,
- axis->minor*zoom/dim);
-
- /* corrections: if majors are less than majthresh[dir] times label
- * dimension apart, we need to use bigger ones */
- if (axis->major*zoom / dim < majthresh[dir]) {
- axis_ticks_up(&ii, &jj);
- axis->minor = axis->major;
- axis_ticks_up(&i, &j);
- axis->major = steps[j] * pow(10, i);
- check_needed = TRUE;
- debug(DBS_AXES_TICKS) printf("axis->major enlarged to %.1f\n",
- axis->major);
- }
- /* if minor ticks are bigger than majthresh[dir] times label dimension,
- * we could promote them to majors as well */
- if (((axis->minor * zoom / dim) > majthresh[dir]) && !diminished) {
- axis_ticks_down(&i, &j);
- axis->major = axis->minor;
- axis_ticks_down(&ii, &jj);
- axis->minor = steps[jj] * pow(10, ii);
- check_needed = TRUE;
- diminished = TRUE;
-
- debug(DBS_AXES_TICKS) printf("axis->minor diminished to %.1f\n",
- axis->minor);
-
- if (axis->minor*zoom < 10) {
- debug(DBS_AXES_TICKS) printf("refusing axis->minor of %f:"
- " axis->minor*zoom == %f\n",
- axis->minor, axis->minor*zoom);
- axis->minor = 0;
- }
- }
- }
-
- debug(DBS_AXES_TICKS) printf("corrected: axis->major == %.1f ->"
- " axis->minor == %.1f\n", axis->major, axis->minor);
-}
-
-static void axis_ticks_up(int *i, int *j)
-{
- (*j)++;
- if (*j > 1) {
- (*i)++;
- *j = 0;
- }
-}
-
-static void axis_ticks_down(int *i, int *j)
-{
- (*j)--;
- if (*j < 0) {
- (*i)--;
- *j = 1;
- }
-}
-
-static int get_label_dim(struct axis *axis, int dir, double label)
-{
- double y;
- char str[32];
- int rdigits, dim;
- PangoLayout *layout;
-
- /* First, let's compute how many digits to the right of radix
- * we need to print */
- y = axis->major - floor(axis->major);
- for (rdigits=0; rdigits <= 6; rdigits++) {
- y *= 10;
- if (y <= 0.000001)
- break;
- y = y - floor(y);
- }
- g_snprintf(str, sizeof(str), "%.*f", rdigits, label);
- switch (dir) {
- case AXIS_HORIZONTAL:
- layout = gtk_widget_create_pango_layout(axis->g->drawing_area, str);
- pango_layout_get_pixel_size(layout, &dim, NULL);
- g_object_unref(G_OBJECT(layout));
- break;
- case AXIS_VERTICAL:
- layout = gtk_widget_create_pango_layout(axis->g->drawing_area,
- str);
- pango_layout_get_pixel_size(layout, NULL, &dim);
- g_object_unref(G_OBJECT(layout));
- break;
- default:
- puts("initialize axis: an axis must be either horizontal or vertical");
- return -1;
- }
- return dim;
-}
-
-static double axis_zoom_get(struct axis *axis, int dir)
-{
- switch (dir) {
- case AXIS_HORIZONTAL:
- return axis->g->zoom.x;
- case AXIS_VERTICAL:
- return axis->g->zoom.y;
- default:
- return -1;
- }
-}
-
-static void graph_select_segment(struct gtk_graph *g, int x, int y)
-{
- struct element_list *list;
- struct element *e;
- guint num = 0;
-
- debug(DBS_FENTRY) puts("graph_select_segment()");
-
- x -= g->geom.x;
- y = g->geom.height-1 - (y - g->geom.y);
-
- set_busy_cursor(gtk_widget_get_window(g->drawing_area));
-
- for (list=g->elists; list; list=list->next) {
- for (e=list->elements; e->type != ELMT_NONE; e++) {
- switch (e->type) {
- case ELMT_RECT:
- break;
- case ELMT_LINE:
- if (line_detect_collision(e, x, y)) {
- num = e->parent->num;
- }
- break;
- case ELMT_ELLIPSE:
- if (ellipse_detect_collision(e, x, y)) {
- num = e->parent->num;
- }
- break;
- default:
- break;
- }
- }
- }
-
- if (num) {
- cf_goto_frame(&cfile, num);
- }
- unset_busy_cursor(gtk_widget_get_window(g->drawing_area), g->cross.draw);
-}
-
-static int line_detect_collision(struct element *e, int x, int y)
-{
- int xx1, yy1, xx2, yy2;
-
- if (e->p.line.dim.x1 < e->p.line.dim.x2) {
- xx1 = (int )lrint(e->p.line.dim.x1);
- xx2 = (int )lrint(e->p.line.dim.x2);
- } else {
- xx1 = (int )lrint(e->p.line.dim.x2);
- xx2 = (int )lrint(e->p.line.dim.x1);
- }
- if (e->p.line.dim.y1 < e->p.line.dim.y2) {
- yy1 = (int )lrint(e->p.line.dim.y1);
- yy2 = (int )lrint(e->p.line.dim.y2);
- } else {
- yy1 = (int )lrint(e->p.line.dim.y2);
- yy2 = (int )lrint(e->p.line.dim.y1);
- }
- /*
- printf("line: (%d,%d)->(%d,%d), clicked: (%d,%d)\n", xx1, yy1, xx2, yy2, x, y);
- */
- if (((xx1 == x) && (xx2 == x) && (yy1 <= y) && (y <= yy2)) ||
- ((yy1 == y) && (yy2 == y) && (xx1 <= x) && (x <= xx2)))
- return TRUE;
- else
- return FALSE;
-}
-
-static int ellipse_detect_collision(struct element *e, int x, int y)
-{
- int xx1, yy1, xx2, yy2;
-
- xx1 = (int )lrint(e->p.ellipse.dim.x);
- xx2 = (int )lrint(e->p.ellipse.dim.x + e->p.ellipse.dim.width);
- yy1 = (int )lrint(e->p.ellipse.dim.y - e->p.ellipse.dim.height);
- yy2 = (int )lrint(e->p.ellipse.dim.y);
- /*
- printf("ellipse: (%d,%d)->(%d,%d), clicked: (%d,%d)\n", xx1, yy1, xx2, yy2, x, y);
- */
- if ((xx1 <= x) && (x <= xx2) && (yy1 <= y) && (y <= yy2))
- return TRUE;
- else
- return FALSE;
-}
-
-static void cross_draw(struct gtk_graph *g, int x, int y)
-{
- /* Shouldn't draw twice onto the same position if haven't erased in the
- meantime! */
- if (g->cross.erase_needed && (g->cross.x == x) && (g->cross.y == y)) {
- return;
- }
-
- /* Draw the cross */
- if ((x > g->wp.x + 0.5) && (x < g->wp.x+g->wp.width) &&
- (y > g->wp.y) && (y < g->wp.y+g->wp.height)) {
-
- cairo_t *cr = gdk_cairo_create(gtk_widget_get_window(g->drawing_area));
- gdk_cairo_set_source_rgba(cr, &g->s.tseq_tcptrace.seq_color);
- cairo_set_line_width(cr, 1.0);
-
- /* Horizonal line */
- cairo_move_to(cr, g->wp.x, y);
- cairo_line_to(cr, g->wp.x + g->wp.width, y);
-
- /* Vertical line */
- cairo_move_to(cr, x, g->wp.y);
- cairo_line_to(cr, x, g->wp.y + g->wp.height);
- cairo_stroke(cr);
- cairo_destroy(cr);
- }
-
- g->cross.x = x;
- g->cross.y = y;
- g->cross.erase_needed = TRUE;
-}
-
-static void zoomrect_draw(struct gtk_graph *g, int x, int y)
-{
- if ((x > g->wp.x + 0.5) && (x < g->wp.x+g->wp.width) &&
- (y > g->wp.y) && (y < g->wp.y+g->wp.height)) {
-
- cairo_t *cr = gdk_cairo_create(gtk_widget_get_window(g->drawing_area));
- gdk_cairo_set_source_rgba(cr, &g->s.tseq_tcptrace.seq_color);
- cairo_set_line_width(cr, 1.0);
-
- /* Do outline of rect */
- cairo_rectangle(cr, zoomrect.x, zoomrect.y, x-zoomrect.x, y-zoomrect.y);
- cairo_stroke(cr);
- cairo_destroy(cr);
- }
-
- g->zoomrect_erase_needed = TRUE;
-}
-
-static void zoomrect_erase(struct gtk_graph *g)
-{
- /* Just redraw what is in the pixmap buffer */
- graph_pixmap_display(g);
- g->zoomrect_erase_needed = FALSE;
-}
-
-static void cross_erase(struct gtk_graph *g)
-{
- int x = g->cross.x;
- int y = g->cross.y;
-
- g->cross.erase_needed = FALSE;
-
- if ((x > g->wp.x) && (x < g->wp.x+g->wp.width) &&
- (y >= g->wp.y) && (y < g->wp.y+g->wp.height)) {
-
- /* Just redraw what is in the pixmap buffer */
- graph_pixmap_display(g);
- }
-}
-
-static void magnify_move(struct gtk_graph *g, int x, int y)
-{
- struct ipoint pos, offsetpos;
-
- get_mouse_position(g->toplevel, &pos.x, &pos.y, NULL);
- g->magnify.x = pos.x + x - g->magnify.width/2;
- g->magnify.y = pos.y + y - g->magnify.height/2;
- offsetpos.x = g->magnify.x + g->magnify.offset.x;
- offsetpos.x = offsetpos.x >= 0 ? offsetpos.x : 0;
- offsetpos.y = g->magnify.y + g->magnify.offset.y;
- offsetpos.y = offsetpos.y >= 0 ? offsetpos.y : 0;
- magnify_get_geom(g, x, y);
- magnify_draw(g);
-}
-
-static void magnify_create(struct gtk_graph *g, int x, int y)
-{
- struct gtk_graph *mg;
- struct ipoint pos, offsetpos;
- GdkEvent *e = NULL;
- struct element_list *list, *new_list;
-
- mg = g->magnify.g = (struct gtk_graph * )g_malloc(sizeof(struct gtk_graph));
- memcpy((void * )mg, (void * )g, sizeof(struct gtk_graph));
-
- mg->toplevel = dlg_window_new("tcp graph magnify");
- mg->drawing_area = mg->toplevel;
- gtk_window_set_default_size(GTK_WINDOW(mg->toplevel), g->magnify.width, g->magnify.height);
- gtk_widget_set_events(mg->drawing_area, GDK_EXPOSURE_MASK
- /* | GDK_ENTER_NOTIFY_MASK */
- /* | GDK_ALL_EVENTS_MASK */
- );
-
- mg->wp.x = 0;
- mg->wp.y = 0;
- mg->wp.width = g->magnify.width;
- mg->wp.height = g->magnify.height;
- mg->geom.width = (int )lrint(g->geom.width * g->magnify.zoom.x);
- mg->geom.height = (int )lrint(g->geom.height * g->magnify.zoom.y);
- mg->zoom.x = (mg->geom.width - 1) / g->bounds.width;
- mg->zoom.y = (mg->geom.height- 1) / g->bounds.height;
-
- /* in order to keep original element lists intact we need our own */
- graph_element_lists_initialize(mg);
- list = g->elists->next;
- new_list = mg->elists;
- for ( ; list; list=list->next) {
- new_list->next = (struct element_list * )g_malloc(sizeof(struct element_list));
- new_list = new_list->next;
- new_list->next = NULL;
- new_list->elements = NULL;
- }
- graph_element_lists_make(mg);
-
- get_mouse_position(g->toplevel, &pos.x, &pos.y, NULL);
- g->magnify.x = pos.x + x - g->magnify.width/2;
- g->magnify.y = pos.y + y - g->magnify.height/2;
- offsetpos.x = g->magnify.x + g->magnify.offset.x;
- offsetpos.x = offsetpos.x >= 0 ? offsetpos.x : 0;
- offsetpos.y = g->magnify.y + g->magnify.offset.y;
- offsetpos.y = offsetpos.y >= 0 ? offsetpos.y : 0;
- gtk_window_set_position(GTK_WINDOW(mg->drawing_area), GTK_WIN_POS_NONE);
- magnify_get_geom(g, x, y);
-
- gtk_widget_show(mg->drawing_area);
-
- /* we need to wait for the first expose event before we start drawing */
- while (!gdk_events_pending());
- do {
- e = gdk_event_get();
- if (e) {
- if (e->any.type == GDK_EXPOSE) {
- gdk_event_free(e);
- break;
- }
- gdk_event_free(e);
- }
- } while (e);
-
-#if GTK_CHECK_VERSION(2,22,0)
- mg->surface[0] = mg->surface[1] = NULL;
-#else
- mg->pixmap[0] = mg->pixmap[1] = NULL;
-#endif /* GTK_CHECK_VERSION(2,22,0) */
- graph_pixmaps_create(mg);
- magnify_draw(g);
- g->magnify.active = 1;
-}
-
-static void magnify_destroy(struct gtk_graph *g)
-{
- struct element_list *list;
- struct gtk_graph *mg = g->magnify.g;
-
- window_destroy(GTK_WIDGET(mg->drawing_area));
-
-#if GTK_CHECK_VERSION(2,22,0)
- if (mg->surface[0]) {
- cairo_surface_destroy(mg->surface[0]);
- }
- if (mg->surface[1]) {
- cairo_surface_destroy(mg->surface[1]);
- }
-#else
- g_object_unref(mg->pixmap[0]);
- g_object_unref(mg->pixmap[1]);
-#endif /* GTK_CHECK_VERSION(2,22,0) */
- for (list=mg->elists; list; list=list->next)
- g_free(list->elements);
-
- if (mg->elists) {
- while (mg->elists->next) {
- list = mg->elists->next->next;
- g_free(mg->elists->next);
- mg->elists->next = list;
- }
- }
- g_free(g->magnify.g);
- g->magnify.active = 0;
-}
-
-static void magnify_get_geom(struct gtk_graph *g, int x, int y)
-{
- int posx, posy;
-
- get_mouse_position(g->toplevel, &posx, &posy, NULL);
-
- g->magnify.g->geom.x = g->geom.x;
- g->magnify.g->geom.y = g->geom.y;
-
- g->magnify.g->geom.x -= (int )lrint((g->magnify.g->geom.width - g->geom.width) *
- ((x-g->geom.x)/(double )g->geom.width));
- g->magnify.g->geom.y -= (int )lrint((g->magnify.g->geom.height - g->geom.height) *
- ((y-g->geom.y)/(double )g->geom.height));
-
- /* we have coords of origin of graph relative to origin of g->toplevel.
- * now we need them to relate to origin of magnify window */
- g->magnify.g->geom.x -= (g->magnify.x - posx);
- g->magnify.g->geom.y -= (g->magnify.y - posy);
-}
-
-static void magnify_draw(struct gtk_graph *g)
-{
- cairo_t *cr;
- int not_disp = 1 ^ g->magnify.g->displayed;
-
- graph_pixmap_draw(g->magnify.g);
- /* graph pixmap is almost ready, just add border */
-#if GTK_CHECK_VERSION(2,22,0)
- cr = cairo_create(g->magnify.g->surface[not_disp]);
-#else
- cr = gdk_cairo_create(g->magnify.g->pixmap[not_disp]);
-#endif /* GTK_CHECK_VERSION(2,22,0) */
- cairo_set_line_width(cr, 1.0);
- cairo_move_to(cr, 0, 0);
- cairo_line_to(cr, g->magnify.width - 1, 0);
- cairo_stroke(cr);
-
- cairo_move_to(cr, g->magnify.width - 1, 0);
- cairo_line_to(cr, g->magnify.width - 1, g->magnify.height);
- cairo_stroke(cr);
-
- cairo_move_to(cr, 0, 0);
- cairo_line_to(cr, 0, g->magnify.height - 1);
- cairo_stroke(cr);
-
- cairo_move_to(cr, 0, g->magnify.height - 1);
- cairo_line_to(cr, g->magnify.width - 1, g->magnify.height - 1);
- cairo_stroke(cr);
- cairo_destroy(cr);
-
- graph_pixmaps_switch(g->magnify.g);
- graph_pixmap_display(g->magnify.g);
-
-}
-
-static gboolean configure_event(GtkWidget *widget _U_, GdkEventConfigure *event, gpointer user_data)
-{
- struct gtk_graph *g = (struct gtk_graph *)user_data;
- struct {
- double x, y;
- } zoom;
- int cur_g_width, cur_g_height;
- int cur_wp_width, cur_wp_height;
-
- debug(DBS_FENTRY) puts("configure_event()");
-
- cur_wp_width = g->wp.width;
- cur_wp_height = g->wp.height;
- g->wp.width = event->width - g->y_axis->p.width - RMARGIN_WIDTH;
- g->wp.height = event->height - g->x_axis->p.height - g->wp.y;
- g->x_axis->s.width = g->wp.width;
- g->x_axis->p.width = g->wp.width + RMARGIN_WIDTH;
- g->y_axis->p.height = g->wp.height + g->wp.y;
- g->y_axis->s.height = g->wp.height;
- g->x_axis->p.y = g->y_axis->p.height;
- zoom.x = (double )g->wp.width / cur_wp_width;
- zoom.y = (double )g->wp.height / cur_wp_height;
- cur_g_width = g->geom.width;
- cur_g_height = g->geom.height;
- g->geom.width = (int )lrint(g->geom.width * zoom.x);
- g->geom.height = (int )lrint(g->geom.height * zoom.y);
- g->zoom.x = (double )(g->geom.width - 1) / g->bounds.width;
- g->zoom.y = (double )(g->geom.height -1) / g->bounds.height;
- /* g->zoom.initial.x = g->zoom.x; */
- /* g->zoom.initial.y = g->zoom.y; */
-
- g->geom.x = (int) (g->wp.x - (double )g->geom.width/cur_g_width *
- (g->wp.x - g->geom.x));
- g->geom.y = (int) (g->wp.y - (double )g->geom.height/cur_g_height *
- (g->wp.y - g->geom.y));
-#if 0
- printf("configure: graph: (%d,%d), (%d,%d); viewport: (%d,%d), (%d,%d);"
- " zooms: (%f,%f)\n", g->geom.x, g->geom.y, g->geom.width,
- g->geom.height, g->wp.x, g->wp.y, g->wp.width, g->wp.height,
- g->zoom.x, g->zoom.y);
-#endif
-
- update_zoom_spins(g);
- graph_element_lists_make(g);
- graph_pixmaps_create(g);
- graph_title_pixmap_create(g);
- axis_pixmaps_create(g->y_axis);
- axis_pixmaps_create(g->x_axis);
- /* we don't do actual drawing here; we leave it to expose handler */
- graph_pixmap_draw(g);
- graph_pixmaps_switch(g);
- graph_title_pixmap_draw(g);
- h_axis_pixmap_draw(g->x_axis);
- axis_pixmaps_switch(g->x_axis);
- v_axis_pixmap_draw(g->y_axis);
- axis_pixmaps_switch(g->y_axis);
- return TRUE;
-}
-#if GTK_CHECK_VERSION(3,0,0)
-static gboolean
-draw_event(GtkWidget *widget _U_, cairo_t *cr, gpointer user_data)
-{
- struct gtk_graph *g = (struct gtk_graph *)user_data;
-
- debug(DBS_FENTRY) puts("draw_event()");
-
- /* lower left corner */
- cairo_set_source_rgb(cr, 1, 1, 1);
- cairo_rectangle(cr, 0, g->wp.y + g->wp.height, g->y_axis->p.width, g->x_axis->p.height);
- cairo_fill(cr);
-
- /* right margin */
- cairo_rectangle(cr, g->wp.x + g->wp.width, g->wp.y, RMARGIN_WIDTH, g->wp.height);
- cairo_fill(cr);
-
- /* Should these routines be copied here, or be given the cairo_t ?? */
- graph_pixmap_display(g);
- graph_title_pixmap_display(g);
- axis_pixmap_display(g->x_axis);
- axis_pixmap_display(g->y_axis);
-
- return TRUE;
-}
-#else
-static gboolean expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer user_data)
-{
- struct gtk_graph *g = (struct gtk_graph *)user_data;
- cairo_t *cr;
-
- debug(DBS_FENTRY) puts("expose_event()");
-
- if (event->count)
- return TRUE;
-
- /* lower left corner */
- cr = gdk_cairo_create(gtk_widget_get_window(widget));
- cairo_set_source_rgb(cr, 1, 1, 1);
- cairo_rectangle(cr, 0, g->wp.y + g->wp.height, g->y_axis->p.width, g->x_axis->p.height);
- cairo_fill(cr);
- cairo_destroy(cr);
- cr = NULL;
-
- /* right margin */
- cr = gdk_cairo_create(gtk_widget_get_window(widget));
- cairo_set_source_rgb(cr, 1, 1, 1);
- cairo_rectangle(cr, g->wp.x + g->wp.width, g->wp.y, RMARGIN_WIDTH, g->wp.height);
- cairo_fill(cr);
- cairo_destroy(cr);
- cr = NULL;
-
- graph_pixmap_display(g);
- graph_title_pixmap_display(g);
- axis_pixmap_display(g->x_axis);
- axis_pixmap_display(g->y_axis);
-
- return TRUE;
-}
-#endif
-
-#define ZOOM_REDRAW 1
-#define ZOOM_NOREDRAW 0
-static void
-perform_zoom(struct gtk_graph *g, struct zoomfactor *zf,
- int origin_x, int origin_y, int redraw)
-{
- int cur_width = g->geom.width, cur_height = g->geom.height;
-
- /* Multiply by x and y factors */
- g->geom.width = (int )lrint(g->geom.width * zf->x);
- g->geom.height = (int )lrint(g->geom.height * zf->y);
-
- /* If already fully-zoomed out, don't waste time re-drawing */
- if ((g->geom.width <= g->wp.width) &&
- (g->geom.height <= g->wp.height)) {
- return;
- }
-
- if (g->geom.width < g->wp.width) {
- g->geom.width = g->wp.width;
- }
- if (g->geom.height < g->wp.height) {
- g->geom.height = g->wp.height;
- }
-
- /* Divide to work out new zoom */
- g->zoom.x = (g->geom.width - 1) / g->bounds.width;
- g->zoom.y = (g->geom.height- 1) / g->bounds.height;
-
- /* Move origin to keep mouse position at centre of view */
- g->geom.x -= (int)lrint((g->geom.width - cur_width) *
- ((origin_x - g->geom.x)/(double )cur_width));
- g->geom.y -= (int)lrint((g->geom.height - cur_height) *
- ((origin_y - g->geom.y)/(double )cur_height));
-
- if (g->geom.x > g->wp.x)
- g->geom.x = g->wp.x;
- if (g->geom.y > g->wp.y)
- g->geom.y = g->wp.y;
- if (g->wp.x + g->wp.width > g->geom.x + g->geom.width)
- g->geom.x = g->wp.width + g->wp.x - g->geom.width;
- if (g->wp.y + g->wp.height > g->geom.y + g->geom.height)
- g->geom.y = g->wp.height + g->wp.y - g->geom.height;
-
- if (redraw == ZOOM_NOREDRAW)
- return;
-
- graph_element_lists_make(g);
- g->cross.erase_needed = FALSE;
- graph_display(g);
- axis_display(g->y_axis);
- axis_display(g->x_axis);
- update_zoom_spins(g);
-
- if (g->cross.draw) {
- g->cross.erase_needed = FALSE;
- cross_draw(g, origin_x, origin_y);
- }
-}
-
-static void
-get_zoomfactor(struct gtk_graph *g, struct zoomfactor *zf, double step_x,
- double step_y)
-{
- if (g->zoom.flags & ZOOM_OUT) {
- /*
- * If can't zoom out anymore don't waste time redrawing
- * the whole graph!
- */
- if ((g->geom.height <= g->wp.height) &&
- (g->geom.width <= g->wp.width)) {
- zf->x = 1.0;
- zf->y = 1.0;
- return;
- }
- if (g->zoom.flags & ZOOM_HLOCK)
- zf->x = 1.0;
- else
- zf->x = 1 / step_x;
- if (g->zoom.flags & ZOOM_VLOCK)
- zf->y = 1.0;
- else
- zf->y = 1 / step_y;
- } else {
- if (g->zoom.flags & ZOOM_HLOCK)
- zf->x = 1.0;
- else
- zf->x = step_x;
- if (g->zoom.flags & ZOOM_VLOCK)
- zf->y = 1.0;
- else
- zf->y = step_y;
- }
-}
-
-static void
-do_zoom_rectangle(struct gtk_graph *g, struct irect lcl_zoomrect)
-{
- int cur_width = g->wp.width, cur_height = g->wp.height;
- struct irect geom1 = g->geom;
- struct zoomfactor factor;
-
- /* Left hand too much to the right */
- if (lcl_zoomrect.x > g->wp.x + g->wp.width)
- return;
- /* Right hand not far enough */
- if (lcl_zoomrect.x + lcl_zoomrect.width < g->wp.x)
- return;
- /* Left hand too much to the left */
- if (lcl_zoomrect.x < g->wp.x) {
- int dx = g->wp.x - lcl_zoomrect.x;
- lcl_zoomrect.x += dx;
- lcl_zoomrect.width -= dx;
- }
- /* Right hand too much to the right */
- if (lcl_zoomrect.x + lcl_zoomrect.width > g->wp.x + g->wp.width) {
- int dx = lcl_zoomrect.width + lcl_zoomrect.x - g->wp.x - g->wp.width;
- lcl_zoomrect.width -= dx;
- }
-
- /* Top too low */
- if (lcl_zoomrect.y > g->wp.y + g->wp.height)
- return;
- /* Bottom too high */
- if (lcl_zoomrect.y + lcl_zoomrect.height < g->wp.y)
- return;
- /* Top too high */
- if (lcl_zoomrect.y < g->wp.y) {
- int dy = g->wp.y - lcl_zoomrect.y;
- lcl_zoomrect.y += dy;
- lcl_zoomrect.height -= dy;
- }
- /* Bottom too low */
- if (lcl_zoomrect.y + lcl_zoomrect.height > g->wp.y + g->wp.height) {
- int dy = lcl_zoomrect.height + lcl_zoomrect.y - g->wp.y - g->wp.height;
- lcl_zoomrect.height -= dy;
- }
-
-/*
- printf("before:\n"
- "\tgeom: (%d, %d)+(%d x %d)\n"
-*/
-
- get_zoomfactor(g, &factor, (double)cur_width / lcl_zoomrect.width,
- (double)cur_height / lcl_zoomrect.height);
-/*
- printf("Zoomfactor: %f x %f\n", factor.x, factor.y);
-*/
- perform_zoom(g, &factor,
- lcl_zoomrect.x, lcl_zoomrect.y,
- ZOOM_NOREDRAW);
-
-/*
- printf("middle:\n"
- "\tgeom: (%d, %d)+(%d x %d)\n"
- "\twp: (%d, %d)+(%d x %d)\n"
- "\tzoomrect: (%d, %d)+(%d x %d)\n",
- g->geom.x, g->geom.y,
- g->geom.width, g->geom.height,
- g->wp.x, g->wp.y, g->wp.width, g->wp.height,
- lcl_zoomrect.x, lcl_zoomrect.y, lcl_zoomrect.width, lcl_zoomrect.height);
-*/
- g->geom.x = (int)(geom1.x * (1 + factor.x) -
- lcl_zoomrect.x * factor.x - (geom1.x - g->wp.x));
- g->geom.y = (int)(geom1.y * (1 + factor.y) -
- lcl_zoomrect.y * factor.y - (geom1.y - g->wp.y));
-
-/*
- printf("after:\n"
- "\tgeom: (%d, %d)+(%d x %d)\n"
- "\twp: (%d, %d)+(%d x %d)\n"
- "\tzoomrect: (%d, %d)+(%d x %d)\n",
- g->geom.x, g->geom.y,
- g->geom.width, g->geom.height,
- g->wp.x, g->wp.y, g->wp.width, g->wp.height,
- lcl_zoomrect.x, lcl_zoomrect.y, lcl_zoomrect.width, lcl_zoomrect.height);
-*/
-
- graph_element_lists_make(g);
- g->cross.erase_needed = FALSE;
- graph_display(g);
- axis_display(g->y_axis);
- axis_display(g->x_axis);
- update_zoom_spins(g);
-}
-
-
-
-static void do_zoom_mouse(struct gtk_graph *g, GdkEventButton *event)
-{
- struct zoomfactor factor;
-
- get_zoomfactor(g, &factor, g->zoom.step_x, g->zoom.step_y);
- perform_zoom(g, &factor, (int)event->x, (int)event->y, ZOOM_REDRAW);
-}
-
-static void do_zoom_keyboard(struct gtk_graph *g)
-{
- int pointer_x, pointer_y;
- struct zoomfactor factor;
-
- get_mouse_position(g->drawing_area, &pointer_x, &pointer_y, NULL);
- get_zoomfactor(g, &factor, g->zoom.step_x, g->zoom.step_y);
- perform_zoom(g, &factor, pointer_x, pointer_y, ZOOM_REDRAW);
-}
-
-static void do_zoom_in_keyboard(struct gtk_graph *g)
-{
- gtk_toggle_button_set_active(g->zoom.widget.in_toggle, TRUE);
- do_zoom_keyboard(g);
-}
-
-static void do_zoom_out_keyboard(struct gtk_graph *g)
-{
- gtk_toggle_button_set_active(g->zoom.widget.out_toggle, TRUE);
- do_zoom_keyboard(g);
- gtk_toggle_button_set_active(g->zoom.widget.in_toggle, TRUE);
-}
-
-static void do_select_segment(struct gtk_graph *g)
-{
- int pointer_x, pointer_y;
-
- get_mouse_position(g->drawing_area, &pointer_x, &pointer_y, NULL);
- graph_select_segment(g, pointer_x, pointer_y);
-}
-
-static void do_wscale_graph(struct gtk_graph *g)
-{
- gtk_toggle_button_set_active(g->gt.graph_wscale, TRUE);
-}
-
-static void do_rtt_graph(struct gtk_graph *g)
-{
- gtk_toggle_button_set_active(g->gt.graph_rtt, TRUE);
-}
-
-static void do_throughput_graph(struct gtk_graph *g)
-{
- gtk_toggle_button_set_active(g->gt.graph_tput, TRUE);
-}
-
-static void do_ts_graph_stevens(struct gtk_graph *g)
-{
- gtk_toggle_button_set_active(g->gt.graph_tseqstevens, TRUE);
-}
-
-static void do_ts_graph_tcptrace(struct gtk_graph *g)
-{
- gtk_toggle_button_set_active(g->gt.graph_tseqttrace, TRUE);
-}
-
-static void do_magnify_create(struct gtk_graph *g)
-{
- int pointer_x, pointer_y;
-
- get_mouse_position(g->drawing_area, &pointer_x, &pointer_y, NULL);
- magnify_create(g, (int )lrint(pointer_x), (int )lrint(pointer_y));
-}
-
-static void do_key_motion(struct gtk_graph *g)
-{
- if (g->geom.x > g->wp.x)
- g->geom.x = g->wp.x;
- if (g->geom.y > g->wp.y)
- g->geom.y = g->wp.y;
- if (g->wp.x + g->wp.width > g->geom.x + g->geom.width)
- g->geom.x = g->wp.width + g->wp.x - g->geom.width;
- if (g->wp.y + g->wp.height > g->geom.y + g->geom.height)
- g->geom.y = g->wp.height + g->wp.y - g->geom.height;
- g->cross.erase_needed = FALSE;
- graph_display(g);
- axis_display(g->y_axis);
- axis_display(g->x_axis);
- if (g->cross.draw) {
- int pointer_x, pointer_y;
-
- get_mouse_position(g->drawing_area, &pointer_x, &pointer_y, NULL);
- g->cross.erase_needed = FALSE;
- cross_draw(g, pointer_x, pointer_y);
- }
-}
-
-static void do_key_motion_up(struct gtk_graph *g, int step)
-{
- g->geom.y += step;
- do_key_motion(g);
-}
-
-static void do_key_motion_down(struct gtk_graph *g, int step)
-{
- g->geom.y -= step;
- do_key_motion(g);
-}
-
-static void do_key_motion_left(struct gtk_graph *g, int step)
-{
- g->geom.x += step;
- do_key_motion(g);
-}
-
-static void do_key_motion_right(struct gtk_graph *g, int step)
-{
- g->geom.x -= step;
- do_key_motion(g);
-}
-
-static gboolean button_press_event(GtkWidget *widget _U_, GdkEventButton *event, gpointer user_data)
-{
- struct gtk_graph *g = (struct gtk_graph *)user_data;
-
- debug(DBS_FENTRY) puts("button_press_event()");
-
- if (event->button == MOUSE_BUTTON_RIGHT) {
- if (event->state & GDK_CONTROL_MASK) {
- magnify_create(g, (int )lrint(event->x), (int )lrint(event->y));
- } else {
- g->grab.x = (int )lrint(event->x) - g->geom.x;
- g->grab.y = (int )lrint(event->y) - g->geom.y;
- g->grab.grabbed = TRUE;
- }
-#ifdef ORIGINAL_WIN32_BUTTONS
- /* Windows mouse control: */
- /* [<ctrl>-left] - select packet */
- /* [left] - zoom in */
- /* [<shift>-left] - zoom out */
- } else if (event->button == MOUSE_BUTTON_LEFT) {
- if (event->state & GDK_CONTROL_MASK) {
- graph_select_segment(g, (int)event->x, (int)event->y);
- } else {
-#else /* !ORIGINAL_WIN32_BUTTONS */
- } else if (event->button == MOUSE_BUTTON_MIDDLE) {
-#endif
- /* Shift means we should zoom out */
- if (event->state & GDK_SHIFT_MASK) {
- gtk_toggle_button_set_active(g->zoom.widget.out_toggle, TRUE);
- }
- else {
- gtk_toggle_button_set_active(g->zoom.widget.in_toggle, TRUE);
- }
- do_zoom_mouse(g, event);
-#ifndef ORIGINAL_WIN32_BUTTONS
- } else if (event->button == MOUSE_BUTTON_LEFT) {
- /* See if we're on an element that links to a frame */
- graph_select_segment(g, (int )event->x, (int )event->y);
-
- /* Record the origin of the zoom rectangle */
- zoomrect.x = (int)event->x;
- zoomrect.y = (int)event->y;
-#else /* ORIGINAL_WIN32_BUTTONS*/
- }
-#endif
- }
- return TRUE;
-}
-
-static gboolean motion_notify_event(GtkWidget *widget _U_, GdkEventMotion *event, gpointer user_data)
-{
- struct gtk_graph *g = (struct gtk_graph *)user_data;
- int x, y;
- GdkModifierType state;
-
- /* debug(DBS_FENTRY) puts("motion_notify_event()"); */
-
- if (event->is_hint)
- get_mouse_position(g->drawing_area, &x, &y, &state);
- else {
- x = (int) event->x;
- y = (int) event->y;
- state = (GdkModifierType)event->state;
- }
-
- /* Testing just (state & GDK_BUTTON1_MASK) is not enough since when button1
- * is pressed while pointer is in motion, we will receive one more motion
- * notify *before* we get the button press. This last motion notify works
- * with stale grab coordinates */
- if (state & GDK_BUTTON3_MASK) {
- if (g->grab.grabbed) {
- g->geom.x = x-g->grab.x;
- g->geom.y = y-g->grab.y;
-
- if (g->geom.x > g->wp.x)
- g->geom.x = g->wp.x;
- if (g->geom.y > g->wp.y)
- g->geom.y = g->wp.y;
- if (g->wp.x + g->wp.width > g->geom.x + g->geom.width)
- g->geom.x = g->wp.width + g->wp.x - g->geom.width;
- if (g->wp.y + g->wp.height > g->geom.y + g->geom.height)
- g->geom.y = g->wp.height + g->wp.y - g->geom.height;
- g->cross.erase_needed = FALSE;
- graph_display(g);
- axis_display(g->y_axis);
- axis_display(g->x_axis);
- if (g->cross.draw) {
- cross_draw(g, x, y);
- }
- } else if (g->magnify.active)
- magnify_move(g, x, y);
- } else if (state & GDK_BUTTON1_MASK) {
-
- /* TODO: not sure we really want to jump to frames unless we release? */
- graph_select_segment(g, x, y);
-
- /* Update cross if necessary */
- if (g->cross.erase_needed)
- cross_erase(g);
- if (g->cross.draw)
- cross_draw(g, x, y);
-
- /* Draw bounded box for zoomrect being chosen! */
- if (g->zoomrect_erase_needed) {
- zoomrect_erase(g);
- }
- zoomrect_draw(g, x, y);
- } else {
- if (g->cross.erase_needed)
- cross_erase(g);
- if (g->cross.draw) {
- cross_draw(g, x, y);
- }
- }
-
- return TRUE;
-}
-
-static gboolean button_release_event(GtkWidget *widget _U_, GdkEventButton *event, gpointer user_data)
-{
- struct gtk_graph *g = (struct gtk_graph *)user_data;
-
- debug(DBS_FENTRY) puts("button_release_event()");
-
- if (event->button == MOUSE_BUTTON_RIGHT)
- g->grab.grabbed = FALSE;
-
- if (event->button == MOUSE_BUTTON_LEFT) {
- int xx1 = zoomrect.x;
- int xx2 = (int)event->x;
- int yy1 = zoomrect.y;
- int yy2 = (int)event->y;
- zoomrect.x = MIN(xx1, xx2);
- zoomrect.width = abs(xx1 - xx2);
- zoomrect.y = MIN(yy1, yy2);
- zoomrect.height = abs(yy1 - yy2);
-
- /* Finish selecting a region to zoom in on.
- Take care not to choose a too-small area (by accident?) */
- if ((zoomrect.width > 3) && (zoomrect.height > 3)) {
- int oldflags = g->zoom.flags;
-
- debug(DBS_GRAPH_DRAWING) printf("Zoom in from (%d, %d) - (%d, %d)\n",
- zoomrect.x, zoomrect.y,
- zoomrect.width, zoomrect.height);
-
- g->zoom.flags &= ~ZOOM_OUT;
- do_zoom_rectangle(g, zoomrect);
- g->zoom.flags = oldflags;
- }
- }
-
- if (g->magnify.active)
- magnify_destroy(g);
- return TRUE;
-}
-
-static gboolean key_press_event(GtkWidget *widget _U_, GdkEventKey *event, gpointer user_data)
-{
- struct gtk_graph *g = (struct gtk_graph *)user_data;
- int step;
-
- debug(DBS_FENTRY) puts("key_press_event()");
-
- if ((event->state & GDK_CONTROL_MASK) && (event->state & GDK_SHIFT_MASK))
- step = 0;
- else if (event->state & GDK_CONTROL_MASK)
- step = 1;
- else if (event->state & GDK_SHIFT_MASK)
- step = 10;
- else
- step = 100;
-
- switch (event->keyval) {
- case ' ':
- toggle_crosshairs(g);
- break;
- case 't':
- toggle_time_origin(g);
- break;
- case 's':
- toggle_seq_origin(g);
- break;
- case 'r':
- case GDK_Home:
- restore_initial_graph_view(g);
- break;
- case 'i':
- case '+':
- do_zoom_in_keyboard(g);
- break;
- case 'o':
- case '-':
- do_zoom_out_keyboard(g);
- break;
- case 'm':
- do_magnify_create(g);
- break;
- case 'g':
- do_select_segment(g);
- break;
- case '1':
- do_rtt_graph(g);
- break;
- case '2':
- do_throughput_graph(g);
- break;
- case '3':
- do_ts_graph_stevens(g);
- break;
- case '4':
- do_ts_graph_tcptrace(g);
- break;
- case '5':
- do_wscale_graph(g);
- break;
- case GDK_Left:
- do_key_motion_left(g, step);
- break;
- case GDK_Up:
- do_key_motion_up(g, step);
- break;
- case GDK_Right:
- do_key_motion_right(g, step);
- break;
- case GDK_Down:
- do_key_motion_down(g, step);
- break;
- case GDK_F1:
- callback_create_help(NULL, NULL);
- break;
- default:
- break;
- }
-
- return TRUE;
-}
-
-static gboolean key_release_event(GtkWidget *widget _U_, GdkEventKey *event, gpointer user_data)
-{
- struct gtk_graph *g = (struct gtk_graph *)user_data;
-
- debug(DBS_FENTRY) puts("key_release_event()");
-
- if ((event->keyval == GDK_Shift_L) || (event->keyval == GDK_ISO_Prev_Group)) {
- /* g->zoom.flags &= ~ZOOM_OUT; */
- gtk_toggle_button_set_active(g->zoom.widget.in_toggle, TRUE);
- }
- return TRUE;
-}
-
-
-static gboolean leave_notify_event(GtkWidget *widget _U_, GdkEventCrossing *event _U_, gpointer user_data)
-{
- struct gtk_graph *g = (struct gtk_graph *)user_data;
-
- if (g->cross.erase_needed)
- cross_erase(g);
-
- return TRUE;
-}
-
-static gboolean enter_notify_event(GtkWidget *widget, GdkEventCrossing *event _U_, gpointer user_data)
-{
- struct gtk_graph *g = (struct gtk_graph *)user_data;
-
- graph_pixmap_display(g);
- if (g->cross.draw) {
- int x, y;
- get_mouse_position(widget, &x, &y, NULL);
- cross_draw(g, x, y);
- }
- return TRUE;
-}
-
-static void toggle_crosshairs(struct gtk_graph *g)
-{
- g->cross.draw ^= 1;
- if (g->cross.draw) {
- int x, y;
- get_mouse_position(g->drawing_area, &x, &y, NULL);
- cross_draw(g, x, y);
- } else if (g->cross.erase_needed) {
- cross_erase(g);
- }
- /* toggle buttons emit their "toggled" signals so don't bother doing
- * any real work here, it will be done in signal handlers */
- if (g->cross.draw)
- gtk_toggle_button_set_active(g->cross.on_toggle, TRUE);
- else
- gtk_toggle_button_set_active(g->cross.off_toggle, TRUE);
-}
-
-static void toggle_time_origin(struct gtk_graph *g)
-{
- switch (g->tg.type) {
- case GRAPH_TSEQ_STEVENS:
- tseq_stevens_toggle_time_origin(g);
- break;
- case GRAPH_TSEQ_TCPTRACE:
- tseq_tcptrace_toggle_time_origin(g);
- break;
- case GRAPH_THROUGHPUT:
- tput_toggle_time_origin(g);
- break;
- default:
- break;
- }
- axis_display(g->x_axis);
-}
-
-static void toggle_seq_origin(struct gtk_graph *g)
-{
- switch (g->tg.type) {
- case GRAPH_TSEQ_STEVENS:
- tseq_stevens_toggle_seq_origin(g);
- axis_display(g->y_axis);
- break;
- case GRAPH_TSEQ_TCPTRACE:
- tseq_tcptrace_toggle_seq_origin(g);
- axis_display(g->y_axis);
- break;
- case GRAPH_RTT:
- rtt_toggle_seq_origin(g);
- axis_display(g->x_axis);
- break;
- default:
- break;
- }
-}
-
-static void restore_initial_graph_view(struct gtk_graph *g)
-{
- g->geom.width = g->wp.width;
- g->geom.height = g->wp.height;
- g->geom.x = g->wp.x;
- g->geom.y = g->wp.y;
- graph_init_sequence(g);
-
- if (g->cross.draw) {
- g->cross.erase_needed = FALSE;
- }
-}
-
-/*
- * Stevens-style time-sequence grapH
- */
-
-static void tseq_stevens_read_config(struct gtk_graph *g)
-{
- debug(DBS_FENTRY) puts("tseq_stevens_read_config()");
-
- g->s.tseq_stevens.seq_width = 4;
- g->s.tseq_stevens.seq_height = 4;
- g->s.tseq_stevens.flags = 0;
-
- g->title = (const char ** )g_malloc(2 * sizeof(char *));
- g->title[0] = "Time/Sequence Graph (Stevens)";
- g->title[1] = NULL;
- g->y_axis->label = (const char ** )g_malloc(3 * sizeof(char * ));
- g->y_axis->label[0] = "number[B]";
- g->y_axis->label[1] = "Sequence";
- g->y_axis->label[2] = NULL;
- g->x_axis->label = (const char ** )g_malloc(2 * sizeof(char * ));
- g->x_axis->label[0] = "Time[s]";
- g->x_axis->label[1] = NULL;
-}
-
-/* Used by both 'stevens' and 'tcptrace' */
-static void tseq_initialize(struct gtk_graph *g)
-{
- debug(DBS_FENTRY) puts("tseq_initialize()");
- tseq_get_bounds(g);
-
- g->x_axis->min = 0;
- g->y_axis->min = 0;
-
- switch (g->tg.type) {
- case GRAPH_TSEQ_STEVENS:
- tseq_stevens_read_config(g);
- break;
- case GRAPH_TSEQ_TCPTRACE:
- tseq_tcptrace_read_config(g);
- break;
- default:
- break;
- }
-}
-
-
-/* Determine "bounds"
- * Essentially: look for lowest/highest time and seq in the list of segments
- * Note that for tcptrace the "(ack + window) sequence number" would normally be expected
- * to be the upper bound; However, just to be safe, include the data seg sequence numbers
- * in the comparison for tcptrace
- * (e.g. to handle the case of only data segments).
- */
-
-/* ToDo: worry about handling cases such as trying to plot seq of just 1 frame */
-
-static void tseq_get_bounds(struct gtk_graph *g)
-{
- struct segment *tmp;
- double tim;
- gboolean data_frame_seen = FALSE;
- double data_tim_low = 0;
- double data_tim_high = 0;
- guint32 data_seq_cur;
- guint32 data_seq_nxt;
- guint32 data_seq_low = 0;
- guint32 data_seq_high = 0;
- gboolean ack_frame_seen = FALSE;
- double ack_tim_low = 0;
- double ack_tim_high = 0;
- guint32 ack_seq_cur;
- guint32 ack_seq_low = 0;
- guint32 win_seq_cur;
- guint32 win_seq_high = 0;
-
- /* go thru all segments to determine "bounds" */
- for (tmp=g->tg.segments; tmp; tmp=tmp->next) {
- if (compare_headers(&g->tg.src_address, &g->tg.dst_address,
- g->tg.src_port, g->tg.dst_port,
- &tmp->ip_src, &tmp->ip_dst,
- tmp->th_sport, tmp->th_dport,
- COMPARE_CURR_DIR)) {
-
- /* "data" seg */
- tim = tmp->rel_secs + tmp->rel_usecs / 1000000.0;
- data_seq_cur = tmp->th_seq;
- data_seq_nxt = data_seq_cur + tmp->th_seglen;
- if (! data_frame_seen) {
- data_tim_low = data_tim_high = tim;
- data_seq_low = data_seq_cur;
- data_seq_high = data_seq_nxt;
- data_frame_seen = TRUE;
- }
- if (tim < data_tim_low) data_tim_low = tim;
- if (tim > data_tim_high) data_tim_high = tim;
- if (data_seq_cur < data_seq_low) data_seq_low = data_seq_cur;
- if (data_seq_nxt > data_seq_high) data_seq_high = data_seq_nxt;
- }
- else { /* ack seg */
- /* skip ack processing if no ACK (e.g. in RST) */
- if (TCP_ACK(tmp->th_flags)) {
- tim = tmp->rel_secs + tmp->rel_usecs / 1000000.0;
- ack_seq_cur = tmp->th_ack;
- win_seq_cur = ack_seq_cur + tmp->th_win;
- if (! ack_frame_seen) {
- ack_tim_low = ack_tim_high = tim;
- ack_seq_low = ack_seq_cur;
- win_seq_high = win_seq_cur;
- ack_frame_seen = TRUE;
- }
- if (tim < ack_tim_low) ack_tim_low = tim;
- if (tim > ack_tim_high) ack_tim_high = tim;
- if (ack_seq_cur < ack_seq_low) ack_seq_low = ack_seq_cur;
- if (win_seq_cur > win_seq_high) win_seq_high = win_seq_cur;
- }
- }
- }
-
- /* if 'stevens': use only data segments to determine bounds */
- /* if 'tcptrace': use both data and ack segments to determine bounds */
- switch (g->tg.type) {
- case GRAPH_TSEQ_STEVENS:
- g->bounds.x0 = data_tim_low;
- g->bounds.width = data_tim_high - data_tim_low;
- g->bounds.y0 = data_seq_low;
- g->bounds.height = data_seq_high - data_seq_low;
- break;
- case GRAPH_TSEQ_TCPTRACE:
- /* If (ack_frame_seen == false) -> use 'data' segments.
- * Else If (data_frame_seen == false) -> use 'ack' segments.
- * Else -> use both data and ack segments.
- */
- g->bounds.x0 = (((data_tim_low <= ack_tim_low) && data_frame_seen) || (! ack_frame_seen))
- ? data_tim_low : ack_tim_low;
- g->bounds.width = ((((data_tim_high >= ack_tim_high) && data_frame_seen) || (! ack_frame_seen))
- ? data_tim_high : ack_tim_high) - g->bounds.x0;
- g->bounds.y0 = (((data_seq_low <= ack_seq_low) && data_frame_seen) || (! ack_frame_seen))
- ? data_seq_low : ack_seq_low;
- g->bounds.height = ((((data_seq_high >= win_seq_high) && data_frame_seen) || (! ack_frame_seen))
- ? data_seq_high : win_seq_high) - g->bounds.y0;
- break;
- default:
- break;
- }
-
- g->zoom.x = (g->geom.width - 1) / g->bounds.width;
- g->zoom.y = (g->geom.height -1) / g->bounds.height;
-}
-
-
-static void tseq_stevens_make_elmtlist(struct gtk_graph *g)
-{
- struct segment *tmp;
- struct element *elements, *e;
- double xx0 = g->bounds.x0, yy0 = g->bounds.y0;
- guint32 seq_base = (guint32) yy0;
- guint32 seq_cur;
-
- debug(DBS_FENTRY) puts("tseq_stevens_make_elmtlist()");
- if (g->elists->elements == NULL) {
- int n = 1 + get_num_dsegs(&g->tg);
- e = elements = (struct element * )g_malloc(n*sizeof(struct element));
- } else
- e = elements = g->elists->elements;
-
- for (tmp = g->tg.segments; tmp; tmp = tmp->next) {
- double secs, seqno;
-
- if (!compare_headers(&g->tg.src_address, &g->tg.dst_address,
- g->tg.src_port, g->tg.dst_port,
- &tmp->ip_src, &tmp->ip_dst,
- tmp->th_sport, tmp->th_dport,
- COMPARE_CURR_DIR)) {
- continue;
- }
- /* data seg */
- seq_cur = tmp->th_seq - seq_base;
- secs = g->zoom.x * (tmp->rel_secs + tmp->rel_usecs / 1000000.0 - xx0);
- seqno = g->zoom.y * seq_cur;
-
- e->type = ELMT_ELLIPSE;
- e->parent = tmp;
- e->p.ellipse.dim.width = g->s.tseq_stevens.seq_width;
- e->p.ellipse.dim.height = g->s.tseq_stevens.seq_height;
- e->p.ellipse.dim.x = secs - g->s.tseq_stevens.seq_width/2.0;
- e->p.ellipse.dim.y = seqno + g->s.tseq_stevens.seq_height/2.0;
- e++;
- }
- e->type = ELMT_NONE;
- g->elists->elements = elements;
-}
-
-static void tseq_stevens_toggle_seq_origin(struct gtk_graph *g)
-{
- g->s.tseq_stevens.flags ^= SEQ_ORIGIN;
-
- if ((g->s.tseq_stevens.flags & SEQ_ORIGIN) == SEQ_ORIGIN_ZERO)
- g->y_axis->min = g->bounds.y0;
- else /* g->tseq_stevens.flags & SEQ_ORIGIN == SEQ_ORIGIN_ISN */
- g->y_axis->min = 0;
-}
-
-static void tseq_stevens_toggle_time_origin(struct gtk_graph *g)
-{
- g->s.tseq_stevens.flags ^= TIME_ORIGIN;
-
- if ((g->s.tseq_stevens.flags & TIME_ORIGIN) == TIME_ORIGIN_CAP)
- g->x_axis->min = g->bounds.x0;
- else /* g->tseq_stevens.flags & TIME_ORIGIN == TIME_ORIGIN_CONN */
- g->x_axis->min = 0;
-}
-
-/*
- * tcptrace-style time-sequence graph
- */
-
-static void tseq_tcptrace_read_config(struct gtk_graph *g)
-{
- /* Black */
- g->s.tseq_tcptrace.seq_color.red = (double)0 / 65535.0;
- g->s.tseq_tcptrace.seq_color.green = (double)0 / 65535.0;
- g->s.tseq_tcptrace.seq_color.blue = (double)0 / 65535.0;
- g->s.tseq_tcptrace.seq_color.alpha = 1.0;
-
- /* LightSlateGray */
- g->s.tseq_tcptrace.ack_color[0].red = (double)0x7777 / 65535.0;
- g->s.tseq_tcptrace.ack_color[0].green = (double)0x8888 / 65535.0;
- g->s.tseq_tcptrace.ack_color[0].blue = (double)0x9999 / 65535.0;
- g->s.tseq_tcptrace.ack_color[0].alpha = 1.0;
-
- /* LightGray */
- g->s.tseq_tcptrace.ack_color[1].red = (double)0xd3d3 / 65535.0;
- g->s.tseq_tcptrace.ack_color[1].green = (double)0xd3d3 / 65535.0;
- g->s.tseq_tcptrace.ack_color[1].blue = (double)0xd3d3 / 65535.0;
- g->s.tseq_tcptrace.ack_color[1].alpha = 1.0;
-
- /* Light blue */
- g->s.tseq_tcptrace.sack_color[0].red = (double)0x0 / 65535.0;
- g->s.tseq_tcptrace.sack_color[0].green = (double)0x0 / 65535.0;
- g->s.tseq_tcptrace.sack_color[0].blue = (double)0xffff / 65535.0;
- g->s.tseq_tcptrace.sack_color[0].alpha = 1.0;
-
- /* Darker blue */
- g->s.tseq_tcptrace.sack_color[1].red = (double)0x0 / 65535.0;
- g->s.tseq_tcptrace.sack_color[1].green = (double)0x0 / 65535.0;
- g->s.tseq_tcptrace.sack_color[1].blue = (double)0x9888 / 65535.0;
- g->s.tseq_tcptrace.sack_color[1].alpha = 1.0;
-
- g->s.tseq_tcptrace.flags = 0;
-
- /* Allocate first list, but not elements */
- g->elists->next = (struct element_list * )
- g_malloc(sizeof(struct element_list));
- g->elists->next->next = NULL;
- g->elists->next->elements = NULL;
-
- g->title = (const char ** )g_malloc(2 * sizeof(char *));
- g->title[0] = "Time/Sequence Graph (tcptrace)";
- g->title[1] = NULL;
- g->y_axis->label = (const char ** )g_malloc(3 * sizeof(char * ));
- g->y_axis->label[0] = "number[B]";
- g->y_axis->label[1] = "Sequence";
- g->y_axis->label[2] = NULL;
- g->x_axis->label = (const char ** )g_malloc(2 * sizeof(char * ));
- g->x_axis->label[0] = "Time[s]";
- g->x_axis->label[1] = NULL;
-}
-
-static void tseq_tcptrace_make_elmtlist(struct gtk_graph *g)
-{
- struct segment *tmp;
- struct element *elements0, *e0; /* list of elmts with prio 0 */
- struct element *elements1, *e1; /* list of elmts with prio 1 */
- double xx0, yy0;
- double p_t = 0; /* ackno, window and time of previous segment */
- double p_ackno = 0, p_win = 0;
- gboolean ack_seen = FALSE;
- int toggle = 0;
- guint32 seq_base;
- guint32 seq_cur;
- int num_sack_ranges = 0;
-
- debug(DBS_FENTRY) puts("tseq_tcptrace_make_elmtlist()");
-
- if (g->elists->elements == NULL ) {
- /* 3 elements per data segment */
- int n = 1 + 3*get_num_dsegs(&g->tg);
- e0 = elements0 = (struct element * )g_malloc(n * sizeof(struct element));
- } else {
- /* Existing array */
- e0 = elements0 = g->elists->elements;
- }
-
- if (g->elists->next->elements == NULL) {
- /* 4 elements per ACK, but only one for each SACK range */
- int n = 1 + 4*get_num_acks(&g->tg, &num_sack_ranges);
- n += num_sack_ranges;
- e1 = elements1 = (struct element * )g_malloc(n * sizeof(struct element));
- } else {
- /* Existing array */
- e1 = elements1 = g->elists->next->elements;
- }
-
- xx0 = g->bounds.x0;
- yy0 = g->bounds.y0;
- seq_base = (guint32) yy0;
-
- for (tmp = g->tg.segments; tmp; tmp = tmp->next) {
- double secs, data;
- double x;
-
- secs = tmp->rel_secs + tmp->rel_usecs / 1000000.0;
- x = secs - xx0;
- x *= g->zoom.x;
- if (compare_headers(&g->tg.src_address, &g->tg.dst_address,
- g->tg.src_port, g->tg.dst_port,
- &tmp->ip_src, &tmp->ip_dst,
- tmp->th_sport, tmp->th_dport,
- COMPARE_CURR_DIR)) {
- /* forward direction (data) -> we need seqno and amount of data */
- double yy1, yy2;
-
- seq_cur = tmp->th_seq - seq_base;
- if (TCP_SYN(tmp->th_flags) || TCP_FIN(tmp->th_flags))
- data = 1;
- else
- data = tmp->th_seglen;
-
- yy1 = g->zoom.y * (seq_cur);
- yy2 = g->zoom.y * (seq_cur + data);
- e0->type = ELMT_LINE;
- e0->parent = tmp;
- /* Set the drawing color */
- e0->elment_color_p = &g->s.tseq_tcptrace.seq_color;
- e0->p.line.dim.x1 = e0->p.line.dim.x2 = x;
- e0->p.line.dim.y1 = yy1;
- e0->p.line.dim.y2 = yy2;
- e0++;
- e0->type = ELMT_LINE;
- e0->parent = tmp;
- /* Set the drawing color */
- e0->elment_color_p = &g->s.tseq_tcptrace.seq_color;
- e0->p.line.dim.x1 = x - 1;
- e0->p.line.dim.x2 = x + 1;
- e0->p.line.dim.y1 = e0->p.line.dim.y2 = yy1;
- e0++;
- e0->type = ELMT_LINE;
- e0->parent = tmp;
- /* Set the drawing color */
- e0->elment_color_p = &g->s.tseq_tcptrace.seq_color;
- e0->p.line.dim.x1 = x + 1;
- e0->p.line.dim.x2 = x - 1;
- e0->p.line.dim.y1 = e0->p.line.dim.y2 = yy2;
- e0++;
- } else {
- double ackno, win;
- if (! TCP_ACK(tmp->th_flags))
- /* SYN's and RST's do not necessarily have ACK's*/
- continue;
- /* backward direction -> we need ackno and window */
- seq_cur = tmp->th_ack - seq_base;
- ackno = seq_cur * g->zoom.y;
- win = tmp->th_win * g->zoom.y;
-
- /* ack line */
- if (ack_seen == TRUE) { /* don't plot the first ack */
-
- /* Horizonal: time of previous ACK to now (at new ACK) */
- e1->type = ELMT_LINE;
- e1->parent = tmp;
- /* Set the drawing color */
- e1->elment_color_p = &g->s.tseq_tcptrace.ack_color[toggle];
- e1->p.line.dim.x1 = p_t;
- e1->p.line.dim.y1 = p_ackno;
- e1->p.line.dim.x2 = x;
- e1->p.line.dim.y2 = p_ackno;
- e1++;
-
- /* Vertical: from previous ACKNO to current one (at current time) */
- e1->type = ELMT_LINE;
- e1->parent = tmp;
- /* Set the drawing color */
- e1->elment_color_p = &g->s.tseq_tcptrace.ack_color[toggle];
- e1->p.line.dim.x1 = x;
- e1->p.line.dim.y1 = p_ackno;
- e1->p.line.dim.x2 = x;
- /* Dup (or very small) ack */
- e1->p.line.dim.y2 = ((ackno != p_ackno) || (ackno < 4)) ? ackno : ackno - 4;
- e1++;
-
- /* Horizontal: window line */
- e1->type = ELMT_LINE;
- e1->parent = tmp;
- /* Set the drawing color */
- e1->elment_color_p = &g->s.tseq_tcptrace.ack_color[toggle];
- e1->p.line.dim.x1 = p_t;
- e1->p.line.dim.y1 = p_win + p_ackno;
- e1->p.line.dim.x2 = x;
- e1->p.line.dim.y2 = p_win + p_ackno;
- e1++;
-
- /* Vertical: old window to new window */
- e1->type = ELMT_LINE;
- e1->parent = tmp;
- /* Set the drawing color */
- e1->elment_color_p = &g->s.tseq_tcptrace.ack_color[toggle];
- e1->p.line.dim.x1 = x;
- e1->p.line.dim.y1 = p_win + p_ackno;
- e1->p.line.dim.x2 = x;
- e1->p.line.dim.y2 = win + ackno;
- e1++;
-
- /* Toggle color to use for ACKs... */
- toggle = 1^toggle;
- }
- ack_seen = TRUE;
- p_ackno = ackno;
- p_win = win;
- p_t = x;
-
- /* Now any SACK entries */
- if (tmp->num_sack_ranges) {
- int n;
-
- for (n=0; n < tmp->num_sack_ranges; n++) {
- double left_edge = (tmp->sack_left_edge[n] - seq_base) * g->zoom.y;
- double right_edge = (tmp->sack_right_edge[n] - seq_base) * g->zoom.y;
-
- /* Vertical: just show range of SACK.
- Have experimented with sorting ranges and showing in red regions
- between SACKs, but when TCP is limited by option bytes and needs to
- miss out ranges, this can be pretty confusing as we end up apparently
- NACKing what has been received... */
- e1->type = ELMT_LINE;
- e1->parent = tmp;
- /* Set the drawing color. First range is significant, so use
- separate colour */
- e1->elment_color_p = (n==0) ? &g->s.tseq_tcptrace.sack_color[0] :
- &g->s.tseq_tcptrace.sack_color[1];
- e1->p.line.dim.x1 = x;
- e1->p.line.dim.y1 = right_edge;
- e1->p.line.dim.x2 = x;
- e1->p.line.dim.y2 = left_edge;
- e1++;
- }
- }
- }
- }
-
- /* Terminate both lists */
- e0->type = ELMT_NONE;
- e1->type = ELMT_NONE;
-
- g->elists->elements = elements0;
- g->elists->next->elements = elements1;
- g->elists->next->next = NULL;
-}
-
-static void tseq_tcptrace_toggle_seq_origin(struct gtk_graph *g)
-{
- g->s.tseq_tcptrace.flags ^= SEQ_ORIGIN;
-
- if ((g->s.tseq_tcptrace.flags & SEQ_ORIGIN) == SEQ_ORIGIN_ZERO)
- g->y_axis->min = g->bounds.y0;
- else /* g->tseq_stevens.flags & SEQ_ORIGIN == SEQ_ORIGIN_ISN */
- g->y_axis->min = 0;
-}
-
-static void tseq_tcptrace_toggle_time_origin(struct gtk_graph *g)
-{
- g->s.tseq_tcptrace.flags ^= TIME_ORIGIN;
-
- if ((g->s.tseq_tcptrace.flags & TIME_ORIGIN) == TIME_ORIGIN_CAP)
- g->x_axis->min = g->bounds.x0;
- else /* g->tseq_stevens.flags & TIME_ORIGIN == TIME_ORIGIN_CONN */
- g->x_axis->min = 0;
-}
-
-/*
- * throughput graph
- */
-
-static void tput_make_elmtlist(struct gtk_graph *g)
-{
- struct segment *tmp, *oldest;
- struct element *elements, *e;
- int i, sum = 0;
- double dtime, tput;
- int num_sack_ranges;
-
- if (g->elists->elements == NULL) {
- int n = 1 + get_num_dsegs(&g->tg) + get_num_acks(&g->tg, &num_sack_ranges);
- e = elements = (struct element * )g_malloc(n * sizeof(struct element));
- } else
- e = elements = g->elists->elements;
-
- for (oldest=g->tg.segments, tmp=g->tg.segments->next, i=1; tmp; tmp=tmp->next, i++) {
- double time_val = tmp->rel_secs + tmp->rel_usecs/1000000.0;
- if (i>g->s.tput.ma_size) {
- oldest = oldest->next;
- sum -= oldest->th_seglen;
- }
- dtime = time_val - (oldest->rel_secs + oldest->rel_usecs/1000000.0);
- sum += tmp->th_seglen;
- tput = sum / dtime;
- /* debug(DBS_TPUT_ELMTS) printf("tput=%f\n", tput); */
-
- e->type = ELMT_ELLIPSE;
- e->parent = tmp;
- e->p.ellipse.dim.width = g->s.tput.width;
- e->p.ellipse.dim.height = g->s.tput.height;
- e->p.ellipse.dim.x = g->zoom.x*(time_val - g->bounds.x0) - g->s.tput.width/2.0;
- e->p.ellipse.dim.y = g->zoom.y*tput + g->s.tput.height/2.0;
- e++;
- }
- e->type = ELMT_NONE;
- g->elists->elements = elements;
-}
-
-/* Purpose of <graph_type>_initialize functions:
- * - find maximum and minimum for both axes
- * - call setup routine for style struct */
-static void tput_initialize(struct gtk_graph *g)
-{
- struct segment *tmp, *oldest = g->tg.segments/*, *last*/;
- int i, sum = oldest->th_seglen;
- double dtime, tput, tputmax = 0;
- double t, t0, tmax = 0, yy0, ymax;
-
- debug(DBS_FENTRY) puts("tput_initialize()");
-
- tput_read_config(g);
-
- for (tmp=g->tg.segments->next, i=1; tmp; tmp=tmp->next, i++) {
- if (i > g->s.tput.ma_size) {
- oldest = oldest->next;
- sum -= oldest->th_seglen;
- }
- dtime = tmp->rel_secs + tmp->rel_usecs/1000000.0 -
- (oldest->rel_secs + oldest->rel_usecs/1000000.0);
- sum += tmp->th_seglen;
- tput = sum / dtime;
- debug(DBS_TPUT_ELMTS) printf("tput=%f\n", tput);
- if (tput > tputmax)
- tputmax = tput;
- t = tmp->rel_secs + tmp->rel_usecs / 1000000.0;
- if (t > tmax)
- tmax = t;
- }
-
- t0 = g->tg.segments->rel_secs + g->tg.segments->rel_usecs / 1000000.0;
- yy0 = 0;
- ymax = tputmax;
-
- g->bounds.x0 = t0;
- g->bounds.y0 = yy0;
- g->bounds.width = tmax - t0;
- g->bounds.height = ymax - yy0;
- g->zoom.x = (g->geom.width - 1) / g->bounds.width;
- g->zoom.y = (g->geom.height -1) / g->bounds.height;
-}
-
-static void tput_read_config(struct gtk_graph *g)
-{
- debug(DBS_FENTRY) puts("tput_read_config()");
-
- g->s.tput.width = 4;
- g->s.tput.height = 4;
- g->s.tput.ma_size = 20;
-
- g->title = (const char ** )g_malloc(2 * sizeof(char *));
- g->title[0] = "Throughput (20 segment MA)";
- g->title[1] = NULL;
- g->y_axis->label = (const char ** )g_malloc(3 * sizeof(char * ));
- g->y_axis->label[0] = "[B/s]";
- g->y_axis->label[1] = "Throughput";
- g->y_axis->label[2] = NULL;
- g->x_axis->label = (const char ** )g_malloc(2 * sizeof(char * ));
- g->x_axis->label[0] = "Time[s]";
- g->x_axis->label[1] = NULL;
- g->s.tput.flags = 0;
-}
-
-static void tput_toggle_time_origin(struct gtk_graph *g)
-{
- g->s.tput.flags ^= TIME_ORIGIN;
-
- if ((g->s.tput.flags & TIME_ORIGIN) == TIME_ORIGIN_CAP)
- g->x_axis->min = g->bounds.x0;
- else /* g->s.tput.flags & TIME_ORIGIN == TIME_ORIGIN_CONN */
- g->x_axis->min = 0;
-}
-
-/* RTT graph */
-
-static void rtt_read_config(struct gtk_graph *g)
-{
- debug(DBS_FENTRY) puts("rtt_read_config()");
-
- g->s.rtt.width = 4;
- g->s.rtt.height = 4;
- g->s.rtt.flags = 0;
-
- g->title = (const char ** )g_malloc(2 * sizeof(char *));
- g->title[0] = "Round Trip Time Graph";
- g->title[1] = NULL;
- g->y_axis->label = (const char ** )g_malloc(3 * sizeof(char * ));
- g->y_axis->label[0] = "RTT [s]";
- g->y_axis->label[1] = NULL;
- g->x_axis->label = (const char ** )g_malloc(2 * sizeof(char * ));
- g->x_axis->label[0] = "Sequence Number[B]";
- g->x_axis->label[1] = NULL;
-}
-
-static void rtt_initialize(struct gtk_graph *g)
-{
- struct segment *tmp, *first = NULL;
- struct rtt_unack *unack = NULL, *u;
- double rttmax = 0;
- double xx0, yy0, ymax;
- guint32 xmax = 0;
- guint32 seq_base = 0;
-
- debug(DBS_FENTRY) puts("rtt_initialize()");
-
- rtt_read_config(g);
-
- for (tmp=g->tg.segments; tmp; tmp=tmp->next) {
- if (compare_headers(&g->tg.src_address, &g->tg.dst_address,
- g->tg.src_port, g->tg.dst_port,
- &tmp->ip_src, &tmp->ip_dst,
- tmp->th_sport, tmp->th_dport,
- COMPARE_CURR_DIR)) {
- guint32 seqno = tmp->th_seq;
-
- if (!first) {
- first = tmp;
- seq_base = seqno;
- }
- seqno -= seq_base;
- if (tmp->th_seglen && !rtt_is_retrans(unack, seqno)) {
- double time_val = tmp->rel_secs + tmp->rel_usecs / 1000000.0;
- u = rtt_get_new_unack(time_val, seqno, tmp->th_seglen);
- if (!u) return;
- rtt_put_unack_on_list(&unack, u);
- }
-
- if (seqno + tmp->th_seglen > xmax)
- xmax = seqno + tmp->th_seglen;
- } else if (first) {
- guint32 ackno = tmp->th_ack - seq_base;
- double time_val = tmp->rel_secs + tmp->rel_usecs / 1000000.0;
- struct rtt_unack *v = NULL;
-
- for (u=unack; u; u=v) {
- if (tcp_seq_after(ackno, u->seqno)) {
- double rtt = time_val - u->time;
- if (rtt > rttmax)
- rttmax = rtt;
- if (tcp_seq_eq_or_after(ackno, u->end_seqno)) {
- // fully acked segment - can safely be deleted
- v = u->next;
- rtt_delete_unack_from_list(&unack, u);
- } else {
- // partial ACK of GSO segment -
- // just modify segment to reflect ACKed bytes
- u->seqno = ackno;
- }
- } else {
- // nothing was acked in this seg - just move along
- v = u->next;
- }
- }
- }
- }
- // it's possible there's still unacked segs - so be sure to free list!
- rtt_destroy_unack_list(&unack);
-
- xx0 = seq_base;
- yy0 = 0;
- ymax = rttmax;
-
- g->bounds.x0 = xx0;
- g->bounds.y0 = yy0;
- g->bounds.width = xmax;
- g->bounds.height = ymax - yy0;
- g->zoom.x = g->geom.width / g->bounds.width;
- g->zoom.y = g->geom.height / g->bounds.height;
-}
-
-static void rtt_make_elmtlist(struct gtk_graph *g)
-{
- struct segment *tmp;
- struct rtt_unack *unack = NULL, *u;
- struct element *elements, *e;
- guint32 seq_base = (guint32) g->bounds.x0;
-
- debug(DBS_FENTRY) puts("rtt_make_elmtlist()");
-
- if (g->elists->elements == NULL) {
- int n = 1 + get_num_dsegs(&g->tg);
- e = elements = (struct element * )g_malloc(n * sizeof(struct element));
- } else {
- e = elements = g->elists->elements;
- }
-
- for (tmp=g->tg.segments; tmp; tmp=tmp->next) {
- if (compare_headers(&g->tg.src_address, &g->tg.dst_address,
- g->tg.src_port, g->tg.dst_port,
- &tmp->ip_src, &tmp->ip_dst,
- tmp->th_sport, tmp->th_dport,
- COMPARE_CURR_DIR)) {
- guint32 seqno = tmp->th_seq -seq_base;
-
- if (tmp->th_seglen && !rtt_is_retrans(unack, seqno)) {
- double time_val = tmp->rel_secs + tmp->rel_usecs / 1000000.0;
- u = rtt_get_new_unack(time_val, seqno, tmp->th_seglen);
- if (!u) return;
- rtt_put_unack_on_list(&unack, u);
- }
- } else {
- guint32 ackno = tmp->th_ack - seq_base;
- double time_val = tmp->rel_secs + tmp->rel_usecs / 1000000.0;
- struct rtt_unack *v = NULL;
-
- for (u=unack; u; u=v) {
- if (tcp_seq_after(ackno, u->seqno)) {
- double rtt = time_val - u->time;
-
- e->type = ELMT_ELLIPSE;
- e->parent = tmp;
- e->p.ellipse.dim.width = g->s.rtt.width;
- e->p.ellipse.dim.height = g->s.rtt.height;
- e->p.ellipse.dim.x = g->zoom.x * u->seqno - g->s.rtt.width/2.0;
- e->p.ellipse.dim.y = g->zoom.y * rtt + g->s.rtt.height/2.0;
- e++;
-
- if (tcp_seq_eq_or_after(ackno, u->end_seqno)) {
- // fully acked segment - can safely be deleted
- v = u->next;
- rtt_delete_unack_from_list(&unack, u);
- } else {
- // partial ACK of GSO segment -
- // just modify segment to reflect ACKed bytes
- u->seqno = ackno;
- }
- } else {
- // nothing was acked in this seg - just move along
- v = u->next;
- }
- }
- }
- }
- // it's possible there's still unacked segs - so be sure to free list!
- rtt_destroy_unack_list(&unack);
-
- e->type = ELMT_NONE;
- g->elists->elements = elements;
-}
-
-static void rtt_toggle_seq_origin(struct gtk_graph *g)
-{
- g->s.rtt.flags ^= SEQ_ORIGIN;
-
- if ((g->s.rtt.flags & SEQ_ORIGIN) == SEQ_ORIGIN_ZERO)
- g->x_axis->min = g->bounds.x0;
- else
- g->x_axis->min = 0;
-}
-
-/* WSCALE Graph */
-
-static void wscale_read_config(struct gtk_graph *g)
-{
- debug(DBS_FENTRY) puts("wscale_read_config()");
-
- g->s.wscale.win_width = 4;
- g->s.wscale.win_height = 4;
- g->s.wscale.flags = 0;
-
- g->title = (const char ** )g_malloc(2 * sizeof(char *));
- g->title[0] = "Window Scaling Graph";
- g->title[1] = NULL;
- g->y_axis->label = (const char ** )g_malloc(3 * sizeof(char * ));
- g->y_axis->label[0] = "[bytes]";
- g->y_axis->label[1] = "Windowsize";
- g->y_axis->label[2] = NULL;
- g->x_axis->label = (const char ** )g_malloc(2 * sizeof(char * ));
- g->x_axis->label[0] = "Time [s]";
- g->x_axis->label[1] = NULL;
-}
-
-/*
- (1) Find maximum and minimum values for Window-Size(scaled) and seconds
- (2) call function to define window related values
-*/
-static void wscale_initialize(struct gtk_graph *g)
-{
-
- struct segment *segm = NULL;
- guint32 wsize_max = 0;
- guint32 wsize_min = 0;
- gdouble sec_max = 0.0;
- gdouble sec_base = -1.0;
-
- wscale_read_config(g);
-
- debug(DBS_FENTRY) puts("wscale_initialize()");
-
- for (segm=g->tg.segments; segm; segm=segm->next) {
- if (compare_headers(&g->tg.src_address, &g->tg.dst_address,
- g->tg.src_port, g->tg.dst_port,
- &segm->ip_src, &segm->ip_dst,
- segm->th_sport, segm->th_dport,
- COMPARE_CURR_DIR))
- {
- gdouble sec = segm->rel_secs + ( segm->rel_usecs / 1000000.0 );
- guint16 flags = segm->th_flags;
- guint32 wsize = segm->th_win;
-
- /* only data segments */
- if ( (flags & (TH_SYN|TH_RST)) == 0 )
- if ( wsize > wsize_max )
- wsize_max = wsize;
-
- /* remind time of first probe */
- if ((sec_base < 0) && (sec > 0))
- sec_base = sec;
-
- if ( sec_max < sec )
- sec_max = sec;
-
- }
-
- }
-
- g->bounds.x0 = 0;
- g->bounds.y0 = wsize_min;
- g->bounds.width = sec_max - sec_base + 5;
- g->bounds.height = wsize_max + 5;
- g->zoom.x = g->geom.width / g->bounds.width;
- g->zoom.y = g->geom.height / g->bounds.height;
-
-}
-
-/*
- (1) Fill & allocate memory for segments times elements,
-*/
-static void wscale_make_elmtlist(struct gtk_graph *g)
-{
- struct segment *segm = NULL;
- struct element *elements = NULL;
- struct element *e = NULL;
- gdouble sec_base = -1.0;
-
- debug(DBS_FENTRY) puts("wscale_make_elmtlist()");
-
- /* Allocate memory for elements if not already done */
- if (g->elists->elements == NULL)
- {
- int n = 1 + get_num_dsegs(&g->tg);
- e = elements = (struct element*)g_malloc(n*sizeof(struct element));
- }
- else
- e = elements = g->elists->elements;
-
-
- for ( segm=g->tg.segments; segm; segm=segm->next ) {
- if (compare_headers(&g->tg.src_address, &g->tg.dst_address,
- g->tg.src_port, g->tg.dst_port,
- &segm->ip_src, &segm->ip_dst,
- segm->th_sport, segm->th_dport,
- COMPARE_CURR_DIR))
- {
- gdouble sec = segm->rel_secs + (segm->rel_usecs / 1000000.0);
- guint16 flags = segm->th_flags;
- guint32 wsize = segm->th_win;
-
- /* remind time of first probe */
- if ((sec_base < 0) && (sec > 0))
- sec_base = sec;
-
- /* only data or ack segments */
- if ( (flags & (TH_SYN|TH_RST)) == 0 )
- {
- e->type = ELMT_ELLIPSE;
- e->parent = segm;
- e->p.ellipse.dim.width = g->s.wscale.win_width;
- e->p.ellipse.dim.height = g->s.wscale.win_height;
- e->p.ellipse.dim.x = g->zoom.x * (sec - sec_base) - g->s.wscale.win_width / 2.0;
- e->p.ellipse.dim.y = g->zoom.y * wsize - g->s.wscale.win_height / 2.0;
- e++;
- }
- }
- }
- /* finished populating element list */
- e->type = ELMT_NONE;
- g->elists->elements = elements;
-}
-
-#if defined(_WIN32) && !defined(__MINGW32__) && (_MSC_VER < 1800)
-/* Starting VS2103, rint already defined in math.h. No need to redefine */
-/* replacement of Unix rint() for Windows */
-static int rint(double x)
-{
- char *buf;
- int i = 0;
- int dec, sig;
-
- buf = _fcvt(x, 0, &dec, &sig);
- ws_strtoi32(buf, NULL, &i);
- if (sig == 1) {
- i = i * -1;
- }
- return(i);
-}
-#endif
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/text_page_utils.c b/ui/gtk/text_page_utils.c
deleted file mode 100644
index 22c706b585..0000000000
--- a/ui/gtk/text_page_utils.c
+++ /dev/null
@@ -1,162 +0,0 @@
-/* text_page_utils.c
- * Construct a simple text page widget from a file.
- *
- * Ulf Lamping
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 2000 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-#include <string.h>
-#include <errno.h>
-
-#include <gtk/gtk.h>
-
-
-#include "ui/simple_dialog.h"
-#include <wsutil/file_util.h>
-
-#include "ui/gtk/text_page_utils.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/font_utils.h"
-
-
-#define TEXT_KEY "txt_key"
-
-static void text_page_insert(GtkWidget *page, const char *buffer, int nchars);
-static void text_page_set_text(GtkWidget *page, const char *absolute_path);
-
-
-/*
- * Construct a simple text page widget from a file.
- */
-GtkWidget * text_page_new(const char *absolute_path)
-{
- GtkWidget *page_vb, *txt_scrollw, *txt;
-
- page_vb =ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(page_vb), 1);
- txt_scrollw = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(txt_scrollw),
- GTK_SHADOW_IN);
- gtk_box_pack_start(GTK_BOX(page_vb), txt_scrollw, TRUE, TRUE, 0);
-
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(txt_scrollw),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- txt = gtk_text_view_new();
- gtk_text_view_set_editable(GTK_TEXT_VIEW(txt), FALSE);
- gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(txt), GTK_WRAP_WORD);
- gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(txt), FALSE);
- /* XXX: there seems to be no way to add a small border *around* the whole text,
- * so the text will be "bump" against the edges.
- * the following is only working for left and right edges,
- * there is no such thing for top and bottom :-( */
- /* gtk_text_view_set_left_margin(GTK_TEXT_VIEW(txt), 3); */
- /* gtk_text_view_set_right_margin(GTK_TEXT_VIEW(txt), 3); */
-
- g_object_set_data(G_OBJECT(page_vb), TEXT_KEY, txt);
-
- text_page_set_text(page_vb, absolute_path);
- gtk_container_add(GTK_CONTAINER(txt_scrollw), txt);
- gtk_widget_show(txt_scrollw);
- gtk_widget_show(txt);
-
- return page_vb;
-}
-
-
-/*
- * Insert some text to a text page.
- */
-static void text_page_insert(GtkWidget *page, const char *buffer, int nchars)
-{
- GtkWidget *txt = (GtkWidget *)g_object_get_data(G_OBJECT(page), TEXT_KEY);
-
- GtkTextBuffer *buf= gtk_text_view_get_buffer(GTK_TEXT_VIEW(txt));
- GtkTextIter iter;
-
- gtk_text_buffer_get_end_iter(buf, &iter);
-#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_override_font(GTK_WIDGET(txt), user_font_get_regular());
-#else
- gtk_widget_modify_font(GTK_WIDGET(txt), user_font_get_regular());
-#endif
- if (!g_utf8_validate(buffer, -1, NULL))
- printf("Invalid utf8 encoding: %s\n", buffer);
- gtk_text_buffer_insert(buf, &iter, buffer, nchars);
-}
-
-
-/*
- * Put the complete text file into a text page.
- */
-static void text_page_set_text(GtkWidget *page, const char *absolute_path)
-{
- FILE *text_file;
- char line[4096+1]; /* XXX - size? */
-
- text_file = ws_fopen(absolute_path, "r");
- if (text_file != NULL) {
- while (fgets(line, sizeof line, text_file) != NULL) {
- text_page_insert(page, line, (int) strlen(line));
- }
- if(ferror(text_file)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Error reading file \"%s\": %s",
- absolute_path, g_strerror(errno));
- }
- fclose(text_file);
- } else {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Could not open file \"%s\": %s",
- absolute_path, g_strerror(errno));
- }
-}
-
-
-/**
- * Clear the text from the text page.
- */
-static void text_page_clear(GtkWidget *page)
-{
- GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(g_object_get_data(G_OBJECT(page), TEXT_KEY)));
-
- gtk_text_buffer_set_text(buf, "", 0);
-}
-
-
-/**
- * Redraw a single text page, e.g. to use a new font.
- */
-void text_page_redraw(GtkWidget *page, const char *absolute_path)
-{
- text_page_clear(page);
- text_page_set_text(page, absolute_path);
-}
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/text_page_utils.h b/ui/gtk/text_page_utils.h
deleted file mode 100644
index 57b518e9b5..0000000000
--- a/ui/gtk/text_page_utils.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* text_page.h
- * Declarations of routine to construct a simple text page from a file.
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __TEXT_PAGE_H__
-#define __TEXT_PAGE_H__
-
-/** @file
- * Construct a simple text page widget from a file.
- */
-
-/** Construct a simple text page widget from a file (UTF8 encoded).
- *
- * @param absolute_path the path to the text file
- * @return the new widget
- */
-extern GtkWidget * text_page_new(const char *absolute_path);
-
-/** Clear and insert the file content (again).
- *
- * @param page the text_page from text_page_new()
- * @param absolute_path the path to the text file
- */
-extern void text_page_redraw(GtkWidget *page, const char *absolute_path);
-
-#endif /* __TEXT_PAGE_H__ */
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/time_shift_dlg.c b/ui/gtk/time_shift_dlg.c
deleted file mode 100644
index 1e46c04001..0000000000
--- a/ui/gtk/time_shift_dlg.c
+++ /dev/null
@@ -1,484 +0,0 @@
-/* time_shift_dlg.c
- * Routines for "Time Shift" window
- * Submitted by Edwin Groothuis <wireshark@mavetju.org>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-
-#include "globals.h"
-
-#include <gtk/gtk.h>
-
-#include <epan/prefs.h>
-
-#include "ui/time_shift.h"
-#include "ui/simple_dialog.h"
-
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/time_shift_dlg.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/help_dlg.h"
-
-/* Capture callback data keys */
-#define E_TIMESHIFT_SELECT "timeshift_select"
-#define E_TIMESHIFT_OFFSET_KEY "timeshift_offset_te"
-#define E_SETTIME_SELECT "settime_select"
-#define E_SETTIME_TIME_KEY "settime_time_te"
-#define E_SETTIME_PACKETNUMBER_KEY "settime_packetnumber_te"
-#define E_ADJTIME_SELECT "adjtime_select"
-#define E_ADJTIME_TIME1_KEY "adjtime_time1_te"
-#define E_ADJTIME_PACKETNUMBER1_KEY "adjtime_packetnumber1_te"
-#define E_ADJTIME_TIME2_KEY "adjtime_time2_te"
-#define E_ADJTIME_PACKETNUMBER2_KEY "adjtime_packetnumber2_te"
-#define E_UNDO_SELECT "undo_select"
-#define E_UNDO_SHIFT_KEY "undo_shift_cb"
-
-static void time_shift_apply_cb(GtkWidget *ok_bt, GtkWindow *parent_w);
-static void time_shift_close_cb(GtkWidget *close_bt, gpointer parent_w);
-static void time_shift_frame_destroy_cb(GtkWidget *win, gpointer user_data);
-
-static void error_message(const gchar *msg);
-
-/*
- * Keep a static pointer to the current "Time Shift" window, if any, so
- * that if somebody tries to do "Time Shift" while there's already a
- * "Time Shift" window up, we just pop up the existing one, rather than
- * creating a new one.
- */
-static GtkWidget *time_shift_frame_w;
-
-void
-time_shift_cb(GtkWidget *w _U_, gpointer d _U_)
-{
- GtkWidget *main_vb, *label,
- *types_vb, *indent,
-
- *timeshift_offset_hb,
- *timeshift_offset_text_box,
-
- *settime_time_hb,
- *settime_packetnumber_text_box,
- *settime_time_text_box,
-
- *adjtime_offset_hb,
- *adjtime_packetnumber1_text_box,
- *adjtime_packetnumber2_text_box,
- *adjtime_time1_text_box,
- *adjtime_time2_text_box,
-
- *undo_offset_hb,
- *undo_type_hb,
-
- *timeshift_rb, *settime_rb,
- *adjtime_rb, *undo_rb,
-
- *bbox, *apply_bt, *close_bt, *help_bt;
- GString * frame_str = g_string_new("");
- gint rb_size = 0, rb_spacing = 0, indent_width = 0;
-
- if (time_shift_frame_w != NULL) {
- /* There's already a "Time Shift" dialog box; reactivate it. */
- reactivate_window(time_shift_frame_w);
- return;
- }
-
- time_shift_frame_w = dlg_window_new("Wireshark: Time Shift");
- gtk_container_set_border_width (GTK_CONTAINER (time_shift_frame_w), DLG_OUTER_MARGIN);
-
- /* Container for each row of widgets */
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
- gtk_container_add(GTK_CONTAINER(time_shift_frame_w), main_vb);
-
-
- /*
- * Shift All Packets frame
- */
- types_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_LABEL_SPACING, FALSE);
- gtk_box_pack_start(GTK_BOX(main_vb), types_vb, TRUE, TRUE, 0);
-
- /* Radio button row */
- timeshift_offset_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
- gtk_box_pack_start(GTK_BOX(types_vb), timeshift_offset_hb, FALSE, FALSE, 0);
-
- timeshift_rb = gtk_radio_button_new_with_label (NULL, "Shift all packets");
- gtk_box_pack_start(GTK_BOX(timeshift_offset_hb), timeshift_rb, TRUE, TRUE, 0);
- gtk_widget_set_tooltip_text(timeshift_rb, "Shift the time on the frames.");
-
- gtk_widget_style_get(timeshift_rb, "indicator-size", &rb_size,
- "indicator-spacing", &rb_spacing, NULL);
- indent_width += rb_size + rb_spacing;
- /* Time Shift entry row */
- timeshift_offset_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
- gtk_box_pack_start(GTK_BOX(types_vb), timeshift_offset_hb, FALSE, FALSE, 0);
-
- indent = gtk_alignment_new(0,0,0,0);
- gtk_widget_set_size_request(indent, indent_width, -1);
- gtk_box_pack_start(GTK_BOX(timeshift_offset_hb), indent, FALSE, FALSE, 0);
-
- label = gtk_label_new("Time offset in the format [+-][[hh:]mm:]ss[.ddd]");
- gtk_box_pack_start(GTK_BOX(timeshift_offset_hb), label, FALSE, FALSE, 0);
-
- timeshift_offset_text_box = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(timeshift_offset_hb), timeshift_offset_text_box,
- TRUE, TRUE, 0);
- gtk_widget_set_tooltip_text(timeshift_offset_text_box,
- "Enter the time to shift here. The format is "
- "[+-][[hh:]mm:]ss.[.ddddddddd].");
-
- /*
- * Set Packet Number to Time frame
- */
- types_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_LABEL_SPACING, FALSE);
- gtk_box_pack_start(GTK_BOX(main_vb), types_vb, TRUE, TRUE, 0);
- /* time shift type row */
- settime_time_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
- gtk_box_pack_start(GTK_BOX(types_vb), settime_time_hb, FALSE,
- FALSE, 0);
-
- settime_rb = gtk_radio_button_new_with_label(gtk_radio_button_get_group(
- GTK_RADIO_BUTTON(timeshift_rb)), "Set packet to time");
- gtk_box_pack_start(GTK_BOX(settime_time_hb), settime_rb, TRUE, TRUE, 0);
- gtk_widget_set_tooltip_text(settime_rb,
- "Set the time of a certain frame and adjust the rest of the frames "
- "automatically.");
-
- settime_time_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
- gtk_box_pack_start(GTK_BOX(types_vb), settime_time_hb, FALSE,
- FALSE, 0);
-
- indent = gtk_alignment_new(0,0,0,0);
- gtk_widget_set_size_request(indent, indent_width, -1);
- gtk_box_pack_start(GTK_BOX(settime_time_hb), indent, FALSE, FALSE, 0);
-
- label = gtk_label_new("Packet number");
- gtk_box_pack_start(GTK_BOX(settime_time_hb), label, FALSE, FALSE, 0);
-
- if (cfile.current_frame) {
- g_string_printf(frame_str, "%u", cfile.current_frame->num);
- } else {
- g_string_printf(frame_str, "%u", cfile.first_displayed);
- }
- settime_packetnumber_text_box = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(settime_time_hb), settime_packetnumber_text_box,
- TRUE, TRUE, 0);
- gtk_entry_set_text(GTK_ENTRY(settime_packetnumber_text_box), frame_str->str);
- gtk_widget_set_tooltip_text(settime_packetnumber_text_box,
- "The frame which will be set to the time.");
-
- /* time shift row */
- settime_time_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
- gtk_box_pack_start(GTK_BOX(types_vb), settime_time_hb, FALSE, FALSE,
- 0);
-
- indent = gtk_alignment_new(0,0,0,0);
- gtk_widget_set_size_request(indent, indent_width, -1);
- gtk_box_pack_start(GTK_BOX(settime_time_hb), indent, FALSE, FALSE, 0);
-
- label = gtk_label_new("Set packet to time [YYYY-MM-DD] hh:mm:ss[.ddd]");
- gtk_box_pack_start(GTK_BOX(settime_time_hb), label, FALSE, FALSE, 0);
-
- settime_time_text_box = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(settime_time_hb), settime_time_text_box, TRUE,
- TRUE, 0);
- gtk_widget_set_tooltip_text(settime_time_text_box,
- "The time for the frame in the format of [YYYY-MM-DD] "
- "hh:mm:ss[.ddddddddd]");
-
- /*
- * Set two Packet Numbers to Time frame and extrapolate
- */
- types_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_LABEL_SPACING, FALSE);
- gtk_box_pack_start(GTK_BOX(main_vb), types_vb, TRUE, TRUE, 0);
-
- /* packet number row 1 */
- adjtime_offset_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
- gtk_box_pack_start(GTK_BOX(types_vb), adjtime_offset_hb, FALSE, FALSE, 0);
-
- adjtime_rb = gtk_radio_button_new_with_label(gtk_radio_button_get_group(
- GTK_RADIO_BUTTON(timeshift_rb)), "Set packets to time and extrapolate");
- gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), adjtime_rb, TRUE, TRUE, 0);
- gtk_widget_set_tooltip_text(adjtime_rb,
- "Set the time of two frames and adjust the rest of the frames "
- "automatically.");
-
- adjtime_offset_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
- gtk_box_pack_start(GTK_BOX(types_vb), adjtime_offset_hb, FALSE, FALSE, 0);
-
- indent = gtk_alignment_new(0,0,0,0);
- gtk_widget_set_size_request(indent, indent_width, -1);
- gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), indent, FALSE, FALSE, 0);
-
- label = gtk_label_new("Packet number");
- gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), label, FALSE, FALSE, 0);
-
- adjtime_packetnumber1_text_box = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), adjtime_packetnumber1_text_box,
- TRUE, TRUE, 0);
- gtk_entry_set_text(GTK_ENTRY(adjtime_packetnumber1_text_box), frame_str->str);
- gtk_widget_set_tooltip_text(adjtime_packetnumber1_text_box,
- "The frame which will be set to the time.");
-
- /* time shift row */
- adjtime_offset_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
- gtk_box_pack_start(GTK_BOX(types_vb), adjtime_offset_hb, FALSE, FALSE,
- 0);
-
- indent = gtk_alignment_new(0,0,0,0);
- gtk_widget_set_size_request(indent, indent_width, -1);
- gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), indent, FALSE, FALSE, 0);
-
- label = gtk_label_new("Set packet to time [YYYY-MM-DD] hh:mm:ss[.ddd]");
- gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), label, FALSE, FALSE, 0);
-
- adjtime_time1_text_box = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), adjtime_time1_text_box, TRUE,
- TRUE, 0);
- gtk_entry_set_text(GTK_ENTRY(adjtime_time1_text_box), "");
- gtk_widget_set_tooltip_text(adjtime_time1_text_box,
- "The time for the frame in the format of [YYYY-MM-DD] "
- "hh:mm:ss[.ddddddddd]");
-
- /* packet number row 2 */
- adjtime_offset_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
- gtk_box_pack_start(GTK_BOX(types_vb), adjtime_offset_hb, FALSE,
- FALSE, 0);
-
- indent = gtk_alignment_new(0,0,0,0);
- gtk_widget_set_size_request(indent, indent_width, -1);
- gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), indent, FALSE, FALSE, 0);
-
- label = gtk_label_new("Packet number");
- gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), label, FALSE, FALSE, 0);
-
- g_string_printf(frame_str, "%u", cfile.last_displayed);
- adjtime_packetnumber2_text_box = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), adjtime_packetnumber2_text_box,
- TRUE, TRUE, 0);
- gtk_entry_set_text(GTK_ENTRY(adjtime_packetnumber2_text_box), frame_str->str);
- gtk_widget_set_tooltip_text(adjtime_packetnumber2_text_box,
- "The frame which will be set to the time.");
-
- /* time shift row */
- adjtime_offset_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
- gtk_box_pack_start(GTK_BOX(types_vb), adjtime_offset_hb, FALSE, FALSE,
- 0);
-
- indent = gtk_alignment_new(0,0,0,0);
- gtk_widget_set_size_request(indent, indent_width, -1);
- gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), indent, FALSE, FALSE, 0);
-
- label = gtk_label_new("Set packet to time [YYYY-MM-DD] hh:mm:ss[.ddd]");
- gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), label, FALSE, FALSE, 0);
-
- adjtime_time2_text_box = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), adjtime_time2_text_box, TRUE,
- TRUE, 0);
- gtk_entry_set_text(GTK_ENTRY(adjtime_time2_text_box), "");
- gtk_widget_set_tooltip_text(adjtime_time2_text_box,
- "The time for the frame in the format of [YYYY-MM-DD] "
- "hh:mm:ss[.ddddddddd]");
-
- /*
- * Undo all shifts
- */
- types_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_LABEL_SPACING, FALSE);
- gtk_box_pack_start(GTK_BOX(main_vb), types_vb, TRUE, TRUE, 0);
-
- /* time shift type row */
- undo_type_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
- gtk_box_pack_start(GTK_BOX(types_vb), undo_type_hb, TRUE, TRUE, 0);
-
- /* time shift row */
- undo_offset_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
- gtk_box_pack_start(GTK_BOX(types_vb), undo_offset_hb, FALSE,
- FALSE, 0);
-
- undo_rb = gtk_radio_button_new_with_label(gtk_radio_button_get_group(
- GTK_RADIO_BUTTON(timeshift_rb)), "Undo all shifts");
- gtk_box_pack_start(GTK_BOX(undo_offset_hb), undo_rb, TRUE, TRUE, 0);
- gtk_widget_set_tooltip_text(undo_rb,
- "Undo all the Time Shift offsets on the frames.");
-
- /*
- * Button row
- */
- bbox = dlg_button_row_new(GTK_STOCK_APPLY, GTK_STOCK_CLOSE, GTK_STOCK_HELP,
- NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, TRUE, TRUE, 0);
-
- apply_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_APPLY);
- g_signal_connect(apply_bt, "clicked", G_CALLBACK(time_shift_apply_cb),
- time_shift_frame_w);
- gtk_widget_set_tooltip_text(apply_bt,
- "Apply the Time Shift options to the frame data.");
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button(time_shift_frame_w, close_bt, window_cancel_button_cb);
- g_signal_connect(close_bt, "clicked", G_CALLBACK(time_shift_close_cb),
- time_shift_frame_w);
- gtk_widget_set_tooltip_text(close_bt, "Close this dialog box.");
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb),
- (gpointer)HELP_TIME_SHIFT_DIALOG);
- gtk_widget_set_tooltip_text(help_bt,
- "Help on how the Time Shift feature works.");
-
- /* Link everything together */
-
- g_object_set_data(G_OBJECT(time_shift_frame_w), E_TIMESHIFT_SELECT,
- timeshift_rb);
- g_object_set_data(G_OBJECT(time_shift_frame_w), E_TIMESHIFT_OFFSET_KEY,
- timeshift_offset_text_box);
- g_object_set_data(G_OBJECT(time_shift_frame_w), E_SETTIME_SELECT, settime_rb);
- g_object_set_data(G_OBJECT(time_shift_frame_w), E_SETTIME_TIME_KEY,
- settime_time_text_box);
- g_object_set_data(G_OBJECT(time_shift_frame_w), E_SETTIME_PACKETNUMBER_KEY,
- settime_packetnumber_text_box);
- g_object_set_data(G_OBJECT(time_shift_frame_w), E_ADJTIME_SELECT, adjtime_rb);
- g_object_set_data(G_OBJECT(time_shift_frame_w), E_ADJTIME_TIME1_KEY,
- adjtime_time1_text_box);
- g_object_set_data(G_OBJECT(time_shift_frame_w), E_ADJTIME_PACKETNUMBER1_KEY,
- adjtime_packetnumber1_text_box);
- g_object_set_data(G_OBJECT(time_shift_frame_w), E_ADJTIME_TIME2_KEY,
- adjtime_time2_text_box);
- g_object_set_data(G_OBJECT(time_shift_frame_w), E_ADJTIME_PACKETNUMBER2_KEY,
- adjtime_packetnumber2_text_box);
- g_object_set_data(G_OBJECT(time_shift_frame_w), E_UNDO_SELECT, undo_rb);
-
- dlg_set_activate(timeshift_offset_text_box, apply_bt);
-
- /* Give the initial focus to the "offset" entry box. */
- gtk_widget_grab_focus(timeshift_offset_text_box);
-
- g_signal_connect(time_shift_frame_w, "delete_event",
- G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(time_shift_frame_w, "destroy",
- G_CALLBACK(time_shift_frame_destroy_cb), NULL);
-
- g_string_free(frame_str, TRUE);
- gtk_widget_show_all(time_shift_frame_w);
- window_present(time_shift_frame_w);
-}
-
-static void
-error_message(const gchar *msg)
-{
- if (msg)
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", msg);
-}
-
-static void
-time_shift_apply_cb(GtkWidget *ok_bt _U_, GtkWindow *parent_w)
-{
- GtkWidget *flag_rb, *offset_te, *packetnumber_te, *time_te;
- const gchar *offset_text, *time_text, *time2_text;
- guint packet_num, packet2_num;
-
- if (cfile.state == FILE_CLOSED) {
- /* Nothing to do here */
- return;
- }
- if (cfile.state == FILE_READ_IN_PROGRESS) {
- error_message("The Time Shift functions are not available on live captures.");
- return;
- }
-
-
- flag_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
- E_TIMESHIFT_SELECT);
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(flag_rb)) == TRUE) {
- offset_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
- E_TIMESHIFT_OFFSET_KEY);
- offset_text = gtk_entry_get_text(GTK_ENTRY(offset_te));
- error_message(time_shift_all(&cfile, offset_text));
- return;
- }
-
- flag_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
- E_SETTIME_SELECT);
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(flag_rb)) == TRUE) {
- packetnumber_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
- E_SETTIME_PACKETNUMBER_KEY);
- packet_num = (guint)strtol(gtk_entry_get_text(GTK_ENTRY(packetnumber_te)), NULL, 10);
- time_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
- E_SETTIME_TIME_KEY);
- time_text = gtk_entry_get_text(GTK_ENTRY(time_te));
- error_message(time_shift_settime(&cfile, packet_num, time_text));
- return;
- }
-
- flag_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
- E_ADJTIME_SELECT);
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(flag_rb)) == TRUE) {
- packetnumber_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
- E_ADJTIME_PACKETNUMBER1_KEY);
- packet_num = (guint)strtol(gtk_entry_get_text(GTK_ENTRY(packetnumber_te)), NULL, 10);
- time_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
- E_ADJTIME_TIME1_KEY);
- time_text = gtk_entry_get_text(GTK_ENTRY(time_te));
-
- packetnumber_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
- E_ADJTIME_PACKETNUMBER2_KEY);
- packet2_num = (guint)strtol(gtk_entry_get_text(GTK_ENTRY(packetnumber_te)), NULL, 10);
- time_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
- E_ADJTIME_TIME2_KEY);
- time2_text = gtk_entry_get_text(GTK_ENTRY(time_te));
-
- error_message(time_shift_adjtime(&cfile, packet_num, time_text, packet2_num, time2_text));
- return;
- }
-
- flag_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_UNDO_SELECT);
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(flag_rb)) == TRUE) {
- error_message(time_shift_undo(&cfile));
- return;
- }
-}
-
-static void
-time_shift_close_cb(GtkWidget *close_bt _U_, gpointer parent_w _U_)
-{
- gtk_grab_remove(GTK_WIDGET(parent_w));
- window_destroy(GTK_WIDGET(parent_w));
-}
-
-static void
-time_shift_frame_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
-{
- /* Note that we no longer have a "Time Shift" dialog box. */
- time_shift_frame_w = NULL;
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local Variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/time_shift_dlg.h b/ui/gtk/time_shift_dlg.h
deleted file mode 100644
index 944fdcb4d3..0000000000
--- a/ui/gtk/time_shift_dlg.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* time_shift_dlg.h
- * Submitted by Edwin Groothuis <wireshark@mavetju.org>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __TIME_SHIFT_DLG_H__
-#define __TIME_SHIFT_DLG_H__
-
-/** User requested to shift the time of the trace
- *
- * @param widget parent widget
- * @param data unused
- */
-extern void time_shift_cb(GtkWidget *widget, gpointer data);
-
-#endif /* __TIME_SHIFT_DLG_H__ */
diff --git a/ui/gtk/uat_gui.c b/ui/gtk/uat_gui.c
deleted file mode 100644
index cc6c18218f..0000000000
--- a/ui/gtk/uat_gui.c
+++ /dev/null
@@ -1,1164 +0,0 @@
-/*
- * uat_gui.c
- *
- * User Accessible Tables GUI
- * Maintain an array of user accessible data strucures
- *
- * (c) 2007, Luis E. Garcia Ontanon <luis@ontanon.org>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 2001 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/*
- * TO DO:
- * + improvements
- * - field value check (red/green editbox)
- * - tooltips (add field descriptions)
- * - Make cells editable
- * - Allow reordering via drag and drop
- */
-
-#include "config.h"
-#include <string.h>
-#include <stdlib.h>
-#include <math.h>
-
-#include <gtk/gtk.h>
-#if GTK_CHECK_VERSION(3,0,0)
-# include <gdk/gdkkeysyms-compat.h>
-#endif
-
-#include <wsutil/report_message.h>
-
-#include <epan/dfilter/dfilter-macro.h>
-#include <epan/proto.h>
-#include <epan/packet.h>
-#include <epan/uat-int.h>
-#include <epan/value_string.h>
-#include <wsutil/filesystem.h>
-
-#include <epan/stat_groups.h>
-
-#include "ui/help_url.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/stock_icons.h"
-#include "ui/gtk/gui_stat_menu.h"
-#include "ui/gtk/main.h"
-#include "ui/gtk/uat_gui.h"
-#include "ui/gtk/packet_list.h"
-#include "ui/gtk/webbrowser.h"
-#include "ui/gtk/old-gtk-compat.h"
-#include "ui/gtk/packet_win.h"
-
-#include "globals.h"
-
-# define BUTTON_SIZE_X -1
-# define BUTTON_SIZE_Y -1
-
-struct _uat_rep_t {
- GtkWidget *window;
- GtkWidget *vbox;
- GtkWidget *scrolledwindow;
- GtkTreeView *list;
- GtkListStore *list_store;
- GtkWidget *bbox;
- GtkWidget *bt_new;
- GtkWidget *bt_edit;
- GtkWidget *bt_copy;
- GtkWidget *bt_delete;
- GtkWidget *bt_refresh;
- GtkWidget *bt_clear;
- GtkWidget *bt_up;
- GtkWidget *bt_down;
- GtkWidget *bt_apply;
- GtkWidget *bt_cancel;
- GtkWidget *bt_ok;
- GtkWidget *unsaved_window;
-
- gint selected;
-};
-
-struct _str_pair {
- const char *ptr;
- guint len;
-};
-
-struct _uat_dlg_data {
- GtkWidget *win;
- GPtrArray *entries;
- uat_t *uat;
- void *rec;
- gboolean is_new;
- gint row;
- GPtrArray *tobe_freed;
-};
-
-static gboolean unsaved_dialog(GtkWindow *w, GdkEvent *e, gpointer u);
-static gboolean uat_window_delete_event_cb(GtkWindow *w, GdkEvent *e, gpointer u);
-
-static void set_buttons(uat_t *uat, gint row) {
-
- if (!uat->rep) return;
-
- if (row > 0) {
- gtk_widget_set_sensitive (uat->rep->bt_up, TRUE);
- } else {
- gtk_widget_set_sensitive (uat->rep->bt_up, FALSE);
- }
-
- if (row < (gint)(uat->raw_data->len - 1) && row >= 0) {
- gtk_widget_set_sensitive (uat->rep->bt_down, TRUE);
- } else {
- gtk_widget_set_sensitive (uat->rep->bt_down, FALSE);
- }
-
- gtk_widget_set_sensitive (uat->rep->bt_new, TRUE);
- gtk_widget_set_sensitive (uat->rep->bt_clear, TRUE);
-
- if (row < 0) {
- gtk_widget_set_sensitive (uat->rep->bt_edit, FALSE);
- gtk_widget_set_sensitive (uat->rep->bt_copy, FALSE);
- gtk_widget_set_sensitive (uat->rep->bt_delete, FALSE);
- } else {
- gtk_widget_set_sensitive (uat->rep->bt_edit, TRUE);
- gtk_widget_set_sensitive (uat->rep->bt_copy, TRUE);
- gtk_widget_set_sensitive (uat->rep->bt_delete, TRUE);
- }
-
- if (uat->changed) {
- g_signal_handlers_disconnect_by_func(uat->rep->window, uat_window_delete_event_cb, uat);
- g_signal_connect(uat->rep->window, "delete_event", G_CALLBACK(unsaved_dialog), uat);
- g_signal_connect(uat->rep->window, "destroy", G_CALLBACK(unsaved_dialog), uat);
- } else {
- g_signal_handlers_disconnect_by_func(uat->rep->window, unsaved_dialog, uat);
- g_signal_connect(GTK_WINDOW(uat->rep->window), "delete_event", G_CALLBACK(uat_window_delete_event_cb), uat);
- g_signal_connect(GTK_WINDOW(uat->rep->window), "destroy", G_CALLBACK(uat_window_delete_event_cb), uat);
- }
-}
-
-static void limit_buttons(uat_t *uat) {
-
- if (!uat->rep) return;
-
- gtk_widget_set_sensitive (uat->rep->bt_up, FALSE);
- gtk_widget_set_sensitive (uat->rep->bt_down, FALSE);
-
- gtk_widget_set_sensitive (uat->rep->bt_new, FALSE);
- gtk_widget_set_sensitive (uat->rep->bt_edit, FALSE);
- gtk_widget_set_sensitive (uat->rep->bt_copy, FALSE);
- gtk_widget_set_sensitive (uat->rep->bt_delete, FALSE);
-
- gtk_widget_set_sensitive (uat->rep->bt_clear, FALSE);
-}
-
-static void append_row(uat_t *uat, guint idx) {
- void *rec = UAT_INDEX_PTR(uat, idx);
- uat_field_t *f = uat->fields;
- guint colnum;
- GtkTreeIter iter;
- gchar* tmp_str;
-
- if (! uat->rep) return;
-
- gtk_list_store_insert_before(uat->rep->list_store, &iter, NULL);
- for ( colnum = 0; colnum < uat->ncols; colnum++ ) {
- tmp_str = uat_fld_tostr(rec, &(f[colnum]));
- gtk_list_store_set(uat->rep->list_store, &iter, colnum, tmp_str, -1);
- g_free(tmp_str);
- }
-}
-
-static void reset_row(uat_t *uat, guint idx) {
- void *rec = UAT_INDEX_PTR(uat, idx);
- uat_field_t *f = uat->fields;
- guint colnum;
- GtkTreePath *path;
- GtkTreeIter iter;
- gchar* tmp_str;
-
- if (! uat->rep) return;
-
- path = gtk_tree_path_new_from_indices(idx, -1);
- if (!path || !gtk_tree_model_get_iter(GTK_TREE_MODEL(uat->rep->list_store), &iter, path)) {
- return;
- }
-
- for ( colnum = 0; colnum < uat->ncols; colnum++ ) {
- tmp_str = uat_fld_tostr(rec, &(f[colnum]));
- gtk_list_store_set(uat->rep->list_store, &iter, colnum, tmp_str, -1);
- g_free(tmp_str);
- }
-}
-
-static guint8 *unhexbytes(const char *si, guint len, guint *len_p, char** err) {
- guint8 *buf;
- guint8 *p;
- const guint8 *s = (const guint8 *)si;
- guint i;
-
- if (len % 2) {
- *err = g_strdup_printf("Uneven number of chars hex string %u \n'%s'", len, si);
- return NULL;
- }
-
- buf = (guint8 *)g_malloc(len/2+1);
- p = buf;
-
- for (i = 0; i<len ; i += 2) {
- guint8 lo = s[i+1];
- guint8 hi = s[i];
-
- if (hi >= '0' && hi <= '9') {
- hi -= '0';
- } else if (hi >= 'a' && hi <= 'f') {
- hi -= 'a';
- hi += 0xa;
- } else if (hi >= 'A' && hi <= 'F') {
- hi -= 'A';
- hi += 0xa;
- } else {
- goto on_error;
- }
-
- if (lo >= '0' && lo <= '9') {
- lo -= '0';
- } else if (lo >= 'a' && lo <= 'f') {
- lo -= 'a';
- lo += 0xa;
- } else if (lo >= 'A' && lo <= 'F') {
- lo -= 'A';
- lo += 0xa;
- } else {
- goto on_error;
- }
-
- *(p++) = (hi*0x10) + lo;
- }
-
- len /= 2;
-
- if (len_p) *len_p = len;
-
- buf[len] = '\0';
-
- *err = NULL;
- return buf;
-
-on_error:
- *err = g_strdup("Error parsing hex string");
- g_free(buf);
- return NULL;
-}
-
-
-static gboolean uat_dlg_cb(GtkWidget *win _U_, gpointer user_data) {
- struct _uat_dlg_data *dd = (struct _uat_dlg_data *)user_data;
- guint ncols = dd->uat->ncols;
- uat_field_t *f = dd->uat->fields;
- char *err = NULL, *tmp_err = NULL;
- guint colnum;
-
- for ( colnum = 0; colnum < ncols; colnum++ ) {
- void *e = g_ptr_array_index(dd->entries, colnum);
- const char *text = NULL;
- char *text_free = NULL;
- guint len = 0;
-
- switch(f[colnum].mode) {
- case PT_TXTMOD_FILENAME:
- case PT_TXTMOD_DIRECTORYNAME:
- text = text_free = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(e));
- if (text) {
- len = (unsigned) strlen(text);
- } else {
- text = "";
- len = 0;
- }
- break;
-
- case PT_TXTMOD_STRING:
- case PT_TXTMOD_BOOL:
- case PT_TXTMOD_DISPLAY_FILTER:
- case PT_TXTMOD_PROTO_FIELD:
- text = gtk_entry_get_text(GTK_ENTRY(e));
- len = (unsigned) strlen(text);
- break;
- case PT_TXTMOD_HEXBYTES: {
- text = gtk_entry_get_text(GTK_ENTRY(e));
-
- text_free = unhexbytes(text, (guint) strlen(text), &len, &err);
- text = (const char *)text_free;
-
- if (err) {
- tmp_err = err;
- err = g_strdup_printf("error in field '%s': %s", f[colnum].title, tmp_err);
- g_free(tmp_err);
- goto on_failure;
- }
-
- break;
- }
- case PT_TXTMOD_ENUM: {
- gint idx = *(int*)e;
- text = (idx >= 0) ? ((const value_string *)(f[colnum].fld_data))[idx].strptr : "";
- len = (unsigned) strlen(text);
- break;
- }
- case PT_TXTMOD_NONE: break;
- default:
- g_assert_not_reached();
- return FALSE;
- }
-
- if (f[colnum].cb.chk) {
- if (! f[colnum].cb.chk(dd->rec, text, len, f[colnum].cbdata.chk, f[colnum].fld_data, &err)) {
- tmp_err = err;
- err = g_strdup_printf("error in column '%s': %s", f[colnum].title, tmp_err);
- g_free(tmp_err);
- goto on_failure;
- }
- }
-
- f[colnum].cb.set(dd->rec, text, len, f[colnum].cbdata.set, f[colnum].fld_data);
-
- g_free(text_free);
- }
-
- if (dd->uat->update_cb) {
- if (!dd->uat->update_cb(dd->rec, &err)) {
- tmp_err = err;
- err = g_strdup_printf("error updating record: %s", tmp_err);
- g_free(tmp_err);
- goto on_failure;
- }
- }
-
- if (dd->is_new) {
- void *rec_tmp = dd->rec;
- dd->rec = uat_add_record(dd->uat, dd->rec, TRUE);
-
- if (dd->uat->free_cb) {
- dd->uat->free_cb(rec_tmp);
- }
-
- g_free(rec_tmp);
- } else {
- uat_update_record(dd->uat, dd->rec, TRUE);
- }
-
- dd->uat->changed = TRUE;
-
- set_buttons(dd->uat, dd->uat->rep ? dd->uat->rep->selected : -1);
-
- if (dd->is_new) {
- append_row(dd->uat, dd->uat->raw_data->len - 1 );
- } else {
- reset_row(dd->uat, dd->row);
- }
-
- g_ptr_array_free(dd->entries, TRUE);
- window_destroy(GTK_WIDGET(dd->win));
-
- if (dd->uat->rep)
- window_present(GTK_WIDGET(dd->uat->rep->window));
-
- while (dd->tobe_freed->len) g_free( g_ptr_array_remove_index_fast(dd->tobe_freed, dd->tobe_freed->len - 1 ) );
-
- g_free(dd);
-
- return TRUE;
-on_failure:
-
- report_failure("%s", err);
- g_free(err);
- return FALSE;
-}
-
-static gboolean uat_cancel_dlg_cb(GtkWidget *win _U_, gpointer user_data) {
- struct _uat_dlg_data *dd = (struct _uat_dlg_data *)user_data;
-
- if (dd->uat->rep)
- window_present(GTK_WIDGET(dd->uat->rep->window));
-
- /* Reset the buttons */
- set_buttons(dd->uat, dd->uat->rep ? dd->uat->rep->selected : -1);
-
- if (dd->is_new) g_free(dd->rec);
- g_ptr_array_free(dd->entries, TRUE);
- window_destroy(GTK_WIDGET(dd->win));
-
- while (dd->tobe_freed->len) g_free( g_ptr_array_remove_index_fast(dd->tobe_freed, dd->tobe_freed->len - 1 ) );
-
- g_free(dd);
-
- return TRUE;
-}
-
-static void fld_combo_box_changed_cb(GtkComboBox *combo_box, gpointer user_data) {
- int *valptr = (int *)user_data;
-
- *valptr = gtk_combo_box_get_active(combo_box);
-}
-
-static void uat_edit_dialog(uat_t *uat, gint row, gboolean copy) {
- GtkWidget *win, *main_grid, *main_vb, *bbox, *bt_cancel, *bt_ok;
- struct _uat_dlg_data *dd = (struct _uat_dlg_data *)g_malloc(sizeof(struct _uat_dlg_data));
- uat_field_t *f = uat->fields;
- guint colnum;
- gchar *tmp_str;
-
- /* Only allow a single operation at a time, prevents bug 9129 */
- limit_buttons(uat);
-
- dd->entries = g_ptr_array_new();
- tmp_str = g_strdup_printf("%s: %s", uat->name, (row == -1 ? "New" : "Edit"));
- dd->win = dlg_conf_window_new(tmp_str);
- g_free(tmp_str);
- dd->uat = uat;
- if (copy && row >= 0) {
- dd->rec = g_malloc0(uat->record_size);
- if (uat->copy_cb) {
- uat->copy_cb (dd->rec, UAT_INDEX_PTR(uat, row), uat->record_size);
- }
- else {
- /* According to documentation of uat_copy_cb_t memcpy should be used if uat->copy_cb is NULL */
- memcpy(dd->rec, UAT_INDEX_PTR(uat, row), uat->record_size);
- }
- dd->is_new = TRUE;
- } else if (row >= 0) {
- dd->rec = UAT_INDEX_PTR(uat, row);
- dd->is_new = FALSE;
- } else {
- dd->rec = g_malloc0(uat->record_size);
- dd->is_new = TRUE;
- }
- dd->row = row;
- dd->tobe_freed = g_ptr_array_new();
-
- win = dd->win;
-
- gtk_window_set_resizable(GTK_WINDOW(win), FALSE);
- gtk_window_resize(GTK_WINDOW(win), 400, 30*(uat->ncols+2));
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 5, FALSE);
- gtk_container_add(GTK_CONTAINER(win), main_vb);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 6);
-
- main_grid = ws_gtk_grid_new();
- gtk_box_pack_start(GTK_BOX(main_vb), main_grid, FALSE, FALSE, 0);
- ws_gtk_grid_set_row_spacing(GTK_GRID(main_grid), 5);
- ws_gtk_grid_set_column_spacing(GTK_GRID(main_grid), 10);
-
- bbox = dlg_button_row_new(GTK_STOCK_CANCEL, GTK_STOCK_OK, NULL);
- gtk_box_pack_end(GTK_BOX(main_vb), bbox, FALSE, FALSE, 0);
-
- bt_ok = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
- g_signal_connect(bt_ok, "clicked", G_CALLBACK(uat_dlg_cb), dd);
-
- bt_cancel = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- g_signal_connect(bt_cancel, "clicked", G_CALLBACK(uat_cancel_dlg_cb), dd);
- window_set_cancel_button(win, bt_cancel, NULL);
-
- for ( colnum = 0; colnum < uat->ncols; colnum++ ) {
- GtkWidget *entry, *label, *event_box;
- char *text = uat_fld_tostr(dd->rec, &(f[colnum]));
- char *label_text;
- gchar *fc_filename;
-
- event_box = gtk_event_box_new();
-
- label_text = g_strdup_printf("%s:", f[colnum].title);
- label = gtk_label_new(label_text);
- if (f[colnum].desc != NULL)
- gtk_widget_set_tooltip_text(event_box, f[colnum].desc);
-
- g_free(label_text);
- gtk_misc_set_alignment(GTK_MISC(label), 1.0f, 0.5f);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), event_box, 0, colnum, 1, 1);
- gtk_container_add(GTK_CONTAINER(event_box), label);
-
- switch(f[colnum].mode) {
- case PT_TXTMOD_FILENAME:
- case PT_TXTMOD_DIRECTORYNAME:
- entry = gtk_file_chooser_button_new(f[colnum].desc,
- (f[colnum].mode == PT_TXTMOD_FILENAME) ? GTK_FILE_CHOOSER_ACTION_OPEN : GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
- if (! dd->is_new || copy) {
- gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(entry), text);
- }
-
- /*
- * Some versions of GTK+ will crash if fc_filename is NULL.
- * Make sure we have a valid location set.
- */
- fc_filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(entry));
- if (!fc_filename) {
- gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(entry), get_datafile_dir());
- }
- g_free(fc_filename);
-
- g_ptr_array_add(dd->entries, entry);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), entry, 1, colnum, 1, 1);
- break;
-
- case PT_TXTMOD_NONE:
- case PT_TXTMOD_STRING:
- case PT_TXTMOD_HEXBYTES:
- case PT_TXTMOD_DISPLAY_FILTER:
- case PT_TXTMOD_PROTO_FIELD:
- case PT_TXTMOD_BOOL:
- entry = gtk_entry_new();
- if (! dd->is_new || copy) {
- gtk_entry_set_text(GTK_ENTRY(entry), text);
- }
- g_ptr_array_add(dd->entries, entry);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), entry, 1, colnum, 1, 1);
- if (f[colnum].mode != PT_TXTMOD_NONE)
- dlg_set_activate(entry, bt_ok);
- else
- gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
- break;
-
- case PT_TXTMOD_ENUM: {
- GtkWidget *combo_box;
- int idx;
- const value_string *enum_vals = (const value_string *)f[colnum].fld_data;
- int *valptr = (int *)g_malloc(sizeof(int)); /* A place to store the index of the */
- /* "active" fld_data array entry */
- /* -1 means "nothing selected (active)" */
- combo_box = gtk_combo_box_text_new();
- *valptr = -1;
- for (idx = 0; enum_vals[idx].strptr != NULL; idx++) {
- const char *str = enum_vals[idx].strptr;
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combo_box), str);
-
- if ( g_str_equal(str, text) ) {
- *valptr = idx;
- }
- }
-
- g_ptr_array_add(dd->entries, valptr);
- g_ptr_array_add(dd->tobe_freed, valptr);
-
- if (*valptr != -1)
- gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), *valptr);
-
- g_signal_connect(combo_box, "changed", G_CALLBACK(fld_combo_box_changed_cb), valptr);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), combo_box, 1, colnum, 1, 1);
-
- break;
- }
- default:
- g_assert_not_reached();
- return;
- }
- g_free(text);
- }
-
- gtk_widget_grab_default(bt_ok);
- gtk_widget_show_all(win);
-}
-
-struct _uat_del {
- GtkWidget *win;
- uat_t *uat;
- gint idx;
-};
-
-static void uat_del_cb(GtkButton *button _U_, gpointer u) {
- struct _uat_del *ud = (struct _uat_del *)u;
- GtkTreeIter iter;
- GtkTreePath *path;
-
- uat_remove_record_idx(ud->uat, ud->idx);
-
- if (ud->uat->rep) {
- path = gtk_tree_path_new_from_indices(ud->idx, -1);
- if (path && gtk_tree_model_get_iter(GTK_TREE_MODEL(ud->uat->rep->list_store), &iter, path)) {
- gtk_list_store_remove(ud->uat->rep->list_store, &iter);
- }
- }
-
- ud->uat->changed = TRUE;
- set_buttons(ud->uat, -1);
-
- window_destroy(GTK_WIDGET(ud->win));
-
- if (ud->uat->rep)
- window_present(GTK_WIDGET(ud->uat->rep->window));
-
- g_free(ud);
-}
-
-static void uat_cancel_del_cb(GtkButton *button _U_, gpointer u) {
- struct _uat_del *ud = (struct _uat_del *)u;
-
- window_destroy(GTK_WIDGET(ud->win));
-
- /* Reset the buttons */
- set_buttons(ud->uat, ud->uat->rep ? ud->uat->rep->selected : -1);
-
- if (ud->uat->rep)
- window_present(GTK_WIDGET(ud->uat->rep->window));
- g_free(ud);
-}
-
-static void uat_del_dlg(uat_t *uat, int idx) {
- GtkWidget *win, *main_grid, *main_vb, *bbox, *bt_cancel, *bt_ok;
- uat_field_t *f = uat->fields;
- guint colnum;
- void *rec = UAT_INDEX_PTR(uat, idx);
- gchar *tmp_str;
-
- struct _uat_del *ud = (struct _uat_del *)g_malloc(sizeof(struct _uat_del));
-
- /* Only allow a single operation at a time, prevents bug 9129 */
- limit_buttons(uat);
-
- ud->uat = uat;
- ud->idx = idx;
- tmp_str = g_strdup_printf("%s: Confirm Delete", uat->name);
- ud->win = win = dlg_conf_window_new(tmp_str);
- g_free(tmp_str);
-
- gtk_window_set_resizable(GTK_WINDOW(win), FALSE);
- gtk_window_resize(GTK_WINDOW(win), 400, 25*(uat->ncols+2));
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 5, FALSE);
- gtk_container_add(GTK_CONTAINER(win), main_vb);
- gtk_container_set_border_width(GTK_CONTAINER(main_vb), 6);
-
- main_grid = ws_gtk_grid_new();
- gtk_box_pack_start(GTK_BOX(main_vb), main_grid, FALSE, FALSE, 0);
- ws_gtk_grid_set_row_spacing(GTK_GRID(main_grid), 10);
- ws_gtk_grid_set_column_spacing(GTK_GRID(main_grid), 15);
-
- for ( colnum = 0; colnum < uat->ncols; colnum++ ) {
- GtkWidget *label;
- char *text = uat_fld_tostr(rec, &(f[colnum]));
-
- tmp_str = g_strdup_printf("%s:", f[colnum].title);
- label = gtk_label_new(tmp_str);
- gtk_misc_set_alignment(GTK_MISC(label), 1.0f, 0.5f);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), label, 0, colnum, 1, 1);
- g_free(tmp_str);
-
- label = gtk_label_new(text);
- gtk_misc_set_alignment(GTK_MISC(label), 1.0f, 0.5f);
- ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), label, 1, colnum, 1, 1);
- g_free(text);
- }
-
- bbox = dlg_button_row_new(GTK_STOCK_CANCEL, GTK_STOCK_DELETE, NULL);
- gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 0);
-
- bt_ok = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_DELETE);
- g_signal_connect(bt_ok, "clicked", G_CALLBACK(uat_del_cb), ud);
-
- bt_cancel = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
- g_signal_connect(bt_cancel, "clicked", G_CALLBACK(uat_cancel_del_cb), ud);
- window_set_cancel_button( win, bt_cancel, NULL);
-
- gtk_widget_show_all(win);
-}
-
-static void uat_new_cb(GtkButton *button _U_, gpointer u) {
- uat_t *uat = (uat_t *)u;
-
- if (! uat->rep) return;
-
- uat_edit_dialog(uat, -1, FALSE);
-}
-
-static void uat_edit_cb(GtkWidget *button _U_, gpointer u) {
- uat_t *uat = (uat_t *)u;
-
- if (! uat->rep) return;
-
- uat_edit_dialog(uat, uat->rep->selected, FALSE);
-}
-
-static void uat_copy_cb(GtkWidget *button _U_, gpointer u) {
- uat_t *uat = (uat_t *)u;
-
- if (! uat->rep) return;
-
- uat_edit_dialog(uat, uat->rep->selected, TRUE);
-}
-
-static void uat_double_click_cb(GtkWidget *tv, GtkTreePath *path _U_, GtkTreeViewColumn *column _U_, gpointer u) {
- uat_edit_cb(tv, u);
-}
-
-static void uat_delete_cb(GtkButton *button _U_, gpointer u) {
- uat_t *uat = (uat_t *)u;
-
- if (! uat->rep) return;
-
- uat_del_dlg(uat, uat->rep->selected);
-}
-
-static gboolean uat_window_delete_event_cb(GtkWindow *w _U_, GdkEvent *e _U_, gpointer u) {
- uat_t *uat = (uat_t *)u;
-
- if (uat->rep) {
- void *rep = uat->rep;
-
- g_signal_handlers_disconnect_by_func(uat->rep->window, uat_window_delete_event_cb, uat);
- g_signal_handlers_disconnect_by_func(uat->rep->window, unsaved_dialog, uat);
-
- gtk_widget_destroy(uat->rep->window);
-
- uat->rep = NULL;
- g_free(rep);
- }
- return TRUE;
-}
-
-static void uat_up_cb(GtkButton *button _U_, gpointer u) {
- uat_t *uat = (uat_t *)u;
- gint row = uat->rep->selected;
-
- g_assert(row > 0);
-
- uat_swap(uat, row, row-1);
- tree_view_list_store_move_selection(uat->rep->list, TRUE);
-
- uat->changed = TRUE;
-
- row -= 1;
- uat->rep->selected = row;
- set_buttons(uat, row);
-}
-
-static void uat_down_cb(GtkButton *button _U_, gpointer u) {
- uat_t *uat = (uat_t *)u;
- gint row = uat->rep->selected;
-
- g_assert(row >= 0 && (guint) row < uat->raw_data->len - 1);
-
- uat_swap(uat, row, row+1);
- tree_view_list_store_move_selection(uat->rep->list, FALSE);
-
- uat->changed = TRUE;
-
- row += 1;
- uat->rep->selected = row;
- set_buttons(uat, row);
-}
-
-static void uat_apply_changes(uat_t *uat) {
- if (uat->flags & UAT_AFFECTS_FIELDS) {
- /* Recreate list with new fields and redissect packets */
- main_fields_changed ();
- } else {
- if (uat->flags & UAT_AFFECTS_DISSECTION) {
- /* Just redissect packets if we have any */
- if (cfile.state != FILE_CLOSED) {
- redissect_packets ();
- redissect_all_packet_windows ();
- }
- }
- }
-}
-
-static void uat_cancel_cb(GtkWidget *button _U_, gpointer u) {
- uat_t *uat = (uat_t *)u;
- gchar *err = NULL;
-
- if (uat->changed) {
- uat_clear(uat);
- if (!uat_load(uat, &err)) {
- report_failure("Error while loading %s: %s", uat->name, err);
- g_free(err);
- }
-
- uat_apply_changes (uat);
- }
-
- g_signal_handlers_disconnect_by_func(uat->rep->window, uat_window_delete_event_cb, uat);
- g_signal_handlers_disconnect_by_func(uat->rep->window, unsaved_dialog, uat);
- gtk_widget_destroy(uat->rep->window);
- g_free(uat->rep);
- uat->rep = NULL;
-}
-
-static void uat_apply_cb(GtkButton *button _U_, gpointer u) {
- uat_t *uat = (uat_t *)u;
-
- if (uat->changed) {
- if (uat->post_update_cb) uat->post_update_cb();
- uat_apply_changes (uat);
- }
-}
-
-static void uat_ok_cb(GtkButton *button _U_, gpointer u) {
- uat_t *uat = (uat_t *)u;
- gchar *err = NULL;
-
- if (uat->changed) {
- if (!uat_save(uat, &err)) {
- report_failure("Error while saving %s: %s", uat->name, err);
- g_free(err);
- }
-
- if (uat->post_update_cb) uat->post_update_cb();
- uat_apply_changes (uat);
- }
-
- g_signal_handlers_disconnect_by_func(uat->rep->window, uat_window_delete_event_cb, uat);
- g_signal_handlers_disconnect_by_func(uat->rep->window, unsaved_dialog, uat);
- gtk_widget_destroy(uat->rep->window);
- g_free(uat->rep);
- uat->rep = NULL;
-}
-
-static void uat_clear_cb(GtkButton *button _U_, gpointer u) {
- uat_t *uat = (uat_t *)u;
-
- gtk_list_store_clear(uat->rep->list_store);
- uat_clear(uat);
- uat->changed = TRUE;
-}
-
-static void uat_refresh_cb(GtkButton *button _U_, gpointer u) {
- uat_t *uat = (uat_t *)u;
- gchar *err = NULL;
- guint i;
- gboolean success;
-
- uat_clear_cb(button, u);
-
- uat->from_global = TRUE;
- success = uat_load(uat, &err);
- uat->from_global = FALSE;
- uat->changed = TRUE;
-
- if (!success) {
- report_failure("Error while loading %s: %s", uat->name, err);
- g_free(err);
- }
-
- for (i = 0 ; i < uat->raw_data->len; i++) {
- append_row(uat, i);
- }
-}
-
-
-static void remember_selected_row(GtkWidget *w _U_, gpointer u) {
- uat_t *uat = (uat_t *)u;
- gint row;
-
- row = tree_view_list_store_get_selected_row(uat->rep->list);
- uat->rep->selected = row;
-
- gtk_widget_set_sensitive (uat->rep->bt_edit, TRUE);
- gtk_widget_set_sensitive (uat->rep->bt_copy, uat->copy_cb ? TRUE : FALSE);
- gtk_widget_set_sensitive(uat->rep->bt_delete, TRUE);
-
- set_buttons(uat, row);
-}
-
-static void uat_yessave_cb(GtkWindow *w _U_, void *u) {
- uat_t *uat = (uat_t *)u;
- gchar *err = NULL;
-
- window_delete_event_cb(uat->rep->unsaved_window, NULL, NULL);
-
- if (!uat_save(uat, &err)) {
- report_failure("Error while saving %s: %s", uat->name, err);
- g_free(err);
- }
-
- g_signal_handlers_disconnect_by_func(uat->rep->window, uat_window_delete_event_cb, uat);
- g_signal_handlers_disconnect_by_func(uat->rep->window, unsaved_dialog, uat);
- window_destroy(uat->rep->window);
-
- g_free(uat->rep);
- uat->rep = NULL;
-}
-
-
-static void uat_nosave_cb(GtkWindow *w _U_, void *u) {
- uat_t *uat = (uat_t *)u;
-
- window_delete_event_cb(uat->rep->unsaved_window, NULL, NULL);
- g_signal_handlers_disconnect_by_func(uat->rep->window, uat_window_delete_event_cb, uat);
- g_signal_handlers_disconnect_by_func(uat->rep->window, unsaved_dialog, uat);
- window_destroy(uat->rep->window);
-
- g_free(uat->rep);
- uat->rep = NULL;
-}
-
-static gboolean unsaved_dialog(GtkWindow *w _U_, GdkEvent *e _U_, gpointer u) {
- GtkWidget *win, *vbox, *label, *bbox;
- GtkWidget *yes_bt, *no_bt;
- gchar *message;
- uat_t *uat = (uat_t *)u;
-
- if (uat->rep->unsaved_window) {
- window_present(uat->rep->unsaved_window);
- return TRUE;
- }
-
- uat->rep->unsaved_window = win = dlg_conf_window_new("Discard Changes?");
- gtk_window_set_default_size(GTK_WINDOW(win), 360, 140);
-
- gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER_ON_PARENT);
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 12, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 6);
- gtk_container_add(GTK_CONTAINER(win), vbox);
-
- message = g_strdup_printf("Changes to '%s' are not being saved.\n"
- "Do you want to save '%s'?", uat->name, uat->name);
-
- label = gtk_label_new(message);
- g_free(message);
-
- bbox = dlg_button_row_new(GTK_STOCK_YES, GTK_STOCK_NO, NULL);
-
- yes_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_YES);
- no_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_NO);
-
- g_signal_connect(no_bt, "clicked", G_CALLBACK(uat_nosave_cb), uat);
- g_signal_connect(yes_bt, "clicked", G_CALLBACK(uat_yessave_cb), uat);
-
- gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
- gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
-
- gtk_widget_show_all(win);
- window_present(win);
-
- return TRUE;
-}
-
-static void uat_help_cb(GtkWidget *w _U_, gpointer u) {
- gchar *help_page, *url;
-
- help_page = g_strdup_printf("%s.html", ((uat_t*)u)->help);
- url = user_guide_url(help_page);
- if (url) {
- browser_open_url(url);
- }
- g_free(help_page);
- g_free(url);
-}
-
-static GtkWidget *uat_window(void *u) {
- uat_t *uat = (uat_t *)u;
- uat_field_t *f = uat->fields;
- uat_rep_t *rep;
- guint i;
- guint colnum;
- GType *col_types;
- GtkWidget *hbox, *vbox, *move_hbox, *edit_hbox, *refresh_hbox;
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
- GtkTreeSelection *selection;
- gchar *global_fname;
- gboolean global_file_exists;
-
- if (uat->rep) {
- window_present(uat->rep->window);
- return uat->rep->window;
- } else {
- uat->rep = rep = (uat_rep_t *)g_malloc0(sizeof(uat_rep_t));
- }
-
- global_fname = get_datafile_path(uat->filename);
- global_file_exists = file_exists(global_fname);
- g_free (global_fname);
-
- rep->window = dlg_conf_window_new(uat->name);
-
- gtk_window_set_default_size(GTK_WINDOW(rep->window), 720, 512);
- gtk_window_set_position(GTK_WINDOW(rep->window), GTK_WIN_POS_CENTER_ON_PARENT);
-
- gtk_container_set_border_width(GTK_CONTAINER(rep->window), 6);
-
- rep->vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 12, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(rep->vbox), 6);
- gtk_container_add(GTK_CONTAINER(rep->window), rep->vbox);
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(hbox), 6);
- gtk_box_pack_start(GTK_BOX(rep->vbox), hbox, TRUE, TRUE, 0);
-
- vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 12, FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 6);
- gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
-
- rep->scrolledwindow = scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(rep->scrolledwindow), GTK_SHADOW_IN);
-
- col_types = (GType *)g_malloc(sizeof(GType) *uat->ncols);
- for ( colnum = 0; colnum < uat->ncols; colnum++ ) {
- col_types[colnum] = G_TYPE_STRING;
- }
- rep->list_store = gtk_list_store_newv(uat->ncols, col_types);
- g_free(col_types);
-
- rep->list = GTK_TREE_VIEW(tree_view_new(GTK_TREE_MODEL(rep->list_store))); /*uat->ncols */
- gtk_container_add(GTK_CONTAINER(rep->scrolledwindow), GTK_WIDGET(rep->list));
- gtk_box_pack_start(GTK_BOX(hbox), rep->scrolledwindow, TRUE, TRUE, 0);
-
- selection = gtk_tree_view_get_selection(rep->list);
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
- rep->selected = -1;
-
- for ( colnum = 0; colnum < uat->ncols; colnum++ ) {
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes(f[colnum].title,
- renderer, "text", colnum, NULL);
- gtk_tree_view_column_set_resizable (column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_append_column (rep->list, column);
- if (f[colnum].desc != NULL)
- gtk_widget_set_tooltip_text(gtk_tree_view_column_get_button(column), f[colnum].desc);
- }
-
- for ( i = 0 ; i < uat->raw_data->len; i++ ) {
- append_row(uat, i);
- }
-
- if (uat->help) {
- GtkWidget *help_btn;
- rep->bbox = dlg_button_row_new(GTK_STOCK_HELP, GTK_STOCK_OK, GTK_STOCK_APPLY, GTK_STOCK_CANCEL, NULL);
- help_btn = (GtkWidget *)g_object_get_data(G_OBJECT(rep->bbox), GTK_STOCK_HELP);
- g_signal_connect(help_btn, "clicked", G_CALLBACK(uat_help_cb), uat);
- } else {
-
- rep->bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_APPLY, GTK_STOCK_CANCEL, NULL);
- }
-
- move_hbox = gtk_button_box_new(GTK_ORIENTATION_VERTICAL);
- gtk_box_pack_start(GTK_BOX(vbox), move_hbox, TRUE, FALSE, 0);
-
- edit_hbox = gtk_button_box_new(GTK_ORIENTATION_VERTICAL);
- gtk_box_pack_start(GTK_BOX(vbox), edit_hbox, TRUE, FALSE, 0);
-
- refresh_hbox = gtk_button_box_new(GTK_ORIENTATION_VERTICAL);
- gtk_box_pack_end(GTK_BOX(vbox), refresh_hbox, TRUE, FALSE, 0);
-
-
- rep->bt_up = ws_gtk_button_new_from_stock(GTK_STOCK_GO_UP);
- gtk_widget_set_tooltip_text(rep->bt_up, "Move selected entry up");
-
- rep->bt_down = ws_gtk_button_new_from_stock(GTK_STOCK_GO_DOWN);
- gtk_widget_set_tooltip_text(rep->bt_down, "Move selected entry down");
-
- gtk_box_pack_start(GTK_BOX(move_hbox), rep->bt_up, TRUE, FALSE, 5);
- gtk_box_pack_start(GTK_BOX(move_hbox), rep->bt_down, TRUE, FALSE, 5);
-
-
- rep->bt_new = ws_gtk_button_new_from_stock(GTK_STOCK_NEW);
- gtk_widget_set_tooltip_text(rep->bt_new, "Create a new entry");
-
- rep->bt_edit = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_EDIT);
- gtk_widget_set_tooltip_text(rep->bt_edit, "Edit selected entry");
-
- rep->bt_copy = ws_gtk_button_new_from_stock(GTK_STOCK_COPY);
- gtk_widget_set_tooltip_text(rep->bt_copy, "Copy selected entry");
-
- rep->bt_delete = ws_gtk_button_new_from_stock(GTK_STOCK_DELETE);
- gtk_widget_set_tooltip_text(rep->bt_delete, "Delete selected entry");
-
- gtk_box_pack_end(GTK_BOX(edit_hbox), rep->bt_new, TRUE, FALSE, 5);
- gtk_box_pack_end(GTK_BOX(edit_hbox), rep->bt_edit, TRUE, FALSE, 5);
- gtk_box_pack_end(GTK_BOX(edit_hbox), rep->bt_copy, TRUE, FALSE, 5);
- gtk_box_pack_end(GTK_BOX(edit_hbox), rep->bt_delete, TRUE, FALSE, 5);
-
- rep->bt_refresh = ws_gtk_button_new_from_stock(GTK_STOCK_REFRESH);
- gtk_widget_set_tooltip_text(rep->bt_refresh, "Refresh from system defaults");
-
- rep->bt_clear = ws_gtk_button_new_from_stock(GTK_STOCK_CLEAR);
- gtk_widget_set_tooltip_text(rep->bt_clear, "Delete all entries");
-
- gtk_box_pack_end(GTK_BOX(refresh_hbox), rep->bt_refresh, TRUE, FALSE, 5);
- gtk_box_pack_end(GTK_BOX(refresh_hbox), rep->bt_clear, TRUE, FALSE, 5);
-
-
- rep->bt_apply = (GtkWidget *)g_object_get_data(G_OBJECT(rep->bbox), GTK_STOCK_APPLY);
- rep->bt_cancel = (GtkWidget *)g_object_get_data(G_OBJECT(rep->bbox), GTK_STOCK_CANCEL);
- rep->bt_ok = (GtkWidget *)g_object_get_data(G_OBJECT(rep->bbox), GTK_STOCK_OK);
-
- gtk_box_pack_end(GTK_BOX(rep->vbox), rep->bbox, FALSE, FALSE, 0);
-
- gtk_widget_set_sensitive (rep->bt_up, FALSE);
- gtk_widget_set_sensitive (rep->bt_down, FALSE);
- gtk_widget_set_sensitive (rep->bt_edit, FALSE);
- gtk_widget_set_sensitive (rep->bt_copy, FALSE);
- gtk_widget_set_sensitive (rep->bt_delete, FALSE);
- gtk_widget_set_sensitive (rep->bt_refresh, global_file_exists);
-
- g_signal_connect(rep->list, "row-activated", G_CALLBACK(uat_double_click_cb), uat);
- g_signal_connect(selection, "changed", G_CALLBACK(remember_selected_row), uat);
-
-
- g_signal_connect(rep->bt_new, "clicked", G_CALLBACK(uat_new_cb), uat);
- g_signal_connect(rep->bt_edit, "clicked", G_CALLBACK(uat_edit_cb), uat);
- g_signal_connect(rep->bt_copy, "clicked", G_CALLBACK(uat_copy_cb), uat);
- g_signal_connect(rep->bt_delete, "clicked", G_CALLBACK(uat_delete_cb), uat);
-
- g_signal_connect(rep->bt_refresh, "clicked", G_CALLBACK(uat_refresh_cb), uat);
- g_signal_connect(rep->bt_clear, "clicked", G_CALLBACK(uat_clear_cb), uat);
-
- g_signal_connect(rep->bt_up, "clicked", G_CALLBACK(uat_up_cb), uat);
- g_signal_connect(rep->bt_down, "clicked", G_CALLBACK(uat_down_cb), uat);
-
- g_signal_connect(rep->bt_apply, "clicked", G_CALLBACK(uat_apply_cb), uat);
- g_signal_connect(rep->bt_cancel, "clicked", G_CALLBACK(uat_cancel_cb), uat);
- g_signal_connect(rep->bt_ok, "clicked", G_CALLBACK(uat_ok_cb), uat);
-
- window_set_cancel_button(rep->window, rep->bt_cancel, NULL); /*set esc to activate cancel button */
-
- if (uat->changed) {
- g_signal_connect(GTK_WINDOW(rep->window), "delete_event", G_CALLBACK(unsaved_dialog), uat);
- g_signal_connect(GTK_WINDOW(rep->window), "destroy", G_CALLBACK(unsaved_dialog), uat);
- } else {
- g_signal_connect(GTK_WINDOW(rep->window), "delete_event", G_CALLBACK(uat_window_delete_event_cb), uat);
- g_signal_connect(GTK_WINDOW(rep->window), "destroy", G_CALLBACK(uat_window_delete_event_cb), uat);
- }
-
- gtk_widget_grab_focus(GTK_WIDGET(rep->list));
-
- gtk_widget_show_all(rep->window);
- window_present(rep->window);
-
- return rep->window;
-}
-
-void uat_window_cb(GtkWidget *u _U_, void *uat) {
- uat_window(uat);
-}
-
-/*
- * Editor modelines - http://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/gtk/uat_gui.h b/ui/gtk/uat_gui.h
deleted file mode 100644
index a3ac241c8f..0000000000
--- a/ui/gtk/uat_gui.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * uat_gui.h
- *
- * User Accessible Tables GUI
- * Maintain an array of user accessible data strucures
- *
- * (c) 2007, Luis E. Garcia Ontanon <luis@ontanon.org>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 2001 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __UAT_GUI_H__
-#define __UAT_GUI_H__
-
-void uat_window_cb(GtkWidget* unused, void* uat);
-
-#endif /* __UAT_GUI_H__ */
diff --git a/ui/gtk/voip_calls_dlg.c b/ui/gtk/voip_calls_dlg.c
deleted file mode 100644
index d969a2007f..0000000000
--- a/ui/gtk/voip_calls_dlg.c
+++ /dev/null
@@ -1,977 +0,0 @@
-/* voip_calls_dlg.c
- * VoIP calls summary addition for Wireshark
- *
- * Copyright 2004, Ericsson , Spain
- * By Francisco Alcoba <francisco.alcoba@ericsson.com>
- *
- * based on h323_calls_dlg.c
- * Copyright 2004, Iskratel, Ltd, Kranj
- * By Miha Jemec <m.jemec@iskratel.si>
- *
- * H323, RTP and Graph Support
- * By Alejandro Vaquero, alejandro.vaquero@verso.com
- * Copyright 2005, Verso Technologies Inc.
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <epan/packet.h>
-#include <epan/stat_tap_ui.h>
-#include <epan/addr_resolv.h>
-#include <epan/dissectors/packet-h225.h>
-#include <epan/dissectors/packet-h248.h>
-
-#include <wsutil/str_util.h>
-
-#include "../../globals.h"
-
-#include "ui/voip_calls.h"
-
-#include "ui/gtk/graph_analysis.h"
-#include "ui/gtk/voip_calls_dlg.h"
-#include "ui/gtk/gui_stat_menu.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/stock_icons.h"
-
-#ifdef HAVE_LIBPORTAUDIO
-#include "ui/tap-rtp-analysis.h"
-#include "ui/gtk/rtp_player.h"
-#endif /* HAVE_LIBPORTAUDIO */
-
-#include "ui/gtk/old-gtk-compat.h"
-
-void register_tap_listener_voip_calls_dlg(void);
-
-/****************************************************************************/
-/* pointer to the one and only dialog window */
-static GtkWidget *voip_calls_dlg = NULL;
-
-static GtkListStore *list_store = NULL;
-static GtkTreeIter list_iter;
-static GtkWidget *list = NULL;
-
-static GtkWidget *top_label = NULL;
-static GtkWidget *status_label = NULL;
-
-/*static GtkWidet *bt_unselect = NULL;*/
-static GtkWidget *bt_filter = NULL;
-static GtkWidget *bt_graph = NULL;
-#ifdef HAVE_LIBPORTAUDIO
-static GtkWidget *bt_player = NULL;
-#endif /* HAVE_LIBPORTAUDIO */
-
-static guint32 calls_nb = 0; /* number of displayed calls */
-static guint32 calls_ns = 0; /* number of selected calls */
-
-static graph_analysis_data_t *graph_analysis_data = NULL;
-
-enum
-{
- CALL_COL_START_TIME,
- CALL_COL_STOP_TIME,
- CALL_COL_INITIAL_SPEAKER,
- CALL_COL_FROM,
- CALL_COL_TO,
- CALL_COL_PROTOCOL,
- CALL_COL_PACKETS,
- CALL_COL_STATE,
- CALL_COL_COMMENTS,
- CALL_COL_DATA,
- NUM_COLS /* The number of columns */
-};
-
-/* functions for tap_listeners in voip_calls.c */
-static void voip_calls_dlg_reset(void *ptr);
-static gboolean voip_calls_dlg_packet(void *ptr, packet_info *pinfo, epan_dissect_t *edt, const void *data);
-static void voip_calls_dlg_draw(void *ptr);
-
-
-/****************************************************************************/
-/**
- * Retrieves a constant reference to the unique info structure of the voip_calls tap listener.
- * The user should not modify the data pointed to.
- */
-static voip_calls_tapinfo_t*
-voip_calls_get_info(void)
-{
- /* the one and only global voip_calls_tapinfo_t structure */
- static voip_calls_tapinfo_t the_tapinfo_struct =
- {
- voip_calls_dlg_reset, voip_calls_dlg_packet, voip_calls_dlg_draw, NULL,
- 0, NULL, {0}, 0, NULL, 0, 0, 0, NULL, NULL,
- 0, NULL, /* rtp */
- 0, 0, FALSE, /* rtp evt */
- NULL, 0, /* sdp */
- 0, 0, 0, 0, /* mtp3 */
- NULL, /* h245 */
- NULL, NULL, 0, 0, 0, /* q931 */
- 0, 0, H225_OTHER, FALSE, /* h225 */
- 0, /* SIP */
- 0, 0, 0, /* actrace */
- FLOW_ALL, /* flow show option */
- 0 };
- if (!the_tapinfo_struct.session) {
- the_tapinfo_struct.session = cfile.epan;
- }
- if (!the_tapinfo_struct.callsinfos) {
- /* not initialized yet */
- the_tapinfo_struct.callsinfos = g_queue_new();
- }
- return &the_tapinfo_struct;
-}
-
-/****************************************************************************/
-static gboolean have_voip_calls_tap_listeners = FALSE;
-
-static void
-voip_calls_dlg_remove_tap_listeners(voip_calls_tapinfo_t* tap_id_base)
-{
- voip_calls_remove_all_tap_listeners(tap_id_base);
-
- have_voip_calls_tap_listeners = FALSE;
-}
-
-/****************************************************************************/
-/* CALLBACKS */
-/****************************************************************************/
-static void
-voip_calls_on_destroy(GObject *object _U_, gpointer user_data _U_)
-{
- /* remove_tap_listeners */
- voip_calls_dlg_remove_tap_listeners(voip_calls_get_info());
-
- /* Clean up memory used by calls tap */
- voip_calls_dlg_reset(NULL);
-
- /* Note that we no longer have a "VoIP Calls" dialog box. */
- voip_calls_dlg = NULL;
-
- /* Clean up graph analysis memory */
- g_free(graph_analysis_data);
- graph_analysis_data = NULL;
-}
-
-/****************************************************************************/
-static void
-voip_calls_on_unselect(GtkButton *button _U_, gpointer user_data _U_)
-{
- /*gtk_widget_set_sensitive(bt_unselect, FALSE);*/
- gtk_widget_set_sensitive(bt_filter, FALSE);
- gtk_widget_set_sensitive(bt_graph, FALSE);
-#ifdef HAVE_LIBPORTAUDIO
- gtk_widget_set_sensitive(bt_player, FALSE);
-#endif /* HAVE_LIBPORTAUDIO */
-}
-
-/****************************************************************************/
-static void
-voip_calls_on_filter(GtkButton *button _U_, gpointer user_data _U_)
-{
- gchar *filter_string;
- GString *filter_string_fwd;
- const gchar *filter_prepend;
- gboolean is_first = TRUE;
- GList* lista;
- GList* listb;
- voip_calls_info_t *listinfo;
- seq_analysis_item_t *gai;
- size_t filter_length;
- size_t max_filter_length = 2048; /* What's this based on ? */
- int pos;
- char *addr_str, *guid_str;
-
- const sip_calls_info_t *sipinfo;
- const isup_calls_info_t *isupinfo;
- const h323_calls_info_t *h323info;
- const h245_address_t *h245_add = NULL;
- const gcp_ctx_t* ctx;
-
- filter_string = g_strdup(gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget)));
- filter_length = strlen(filter_string);
- pos = (int)filter_length; /* we assume the filter won't be more than 2^31-1 octets long */
- g_strstrip(filter_string);
-
- if (strlen(filter_string) > 0)
- filter_prepend = " or ";
- else
- filter_prepend = "";
- g_free(filter_string);
-
- filter_string_fwd = g_string_new(filter_prepend);
-
- /* look in the Graph and get all the frame_num for this call */
- g_string_append_printf(filter_string_fwd, "(");
-
- /* Build a new filter based on frame numbers */
- lista = g_queue_peek_nth_link(voip_calls_get_info()->callsinfos, 0);
- while (lista) {
- listinfo = (voip_calls_info_t *)lista->data;
- if (listinfo->selected) {
- listb = g_queue_peek_nth_link(voip_calls_get_info()->graph_analysis->items, 0);
- while (listb) {
- gai = (seq_analysis_item_t *)listb->data;
- if (gai->conv_num == listinfo->call_num) {
- g_string_append_printf(filter_string_fwd, "%sframe.number == %u", is_first?"":" or ", gai->frame_number);
- is_first = FALSE;
- }
- listb = g_list_next(listb);
- }
- }
- lista = g_list_next(lista);
- }
-
- g_string_append_printf(filter_string_fwd, ")");
- filter_length += filter_string_fwd->len;
-
- if (filter_length < max_filter_length) {
- gtk_editable_insert_text(GTK_EDITABLE(main_display_filter_widget), filter_string_fwd->str, -1, &pos);
- } else {
- g_string_free(filter_string_fwd, TRUE);
- filter_string_fwd = g_string_new(filter_prepend);
-
- g_string_append_printf(filter_string_fwd, "(");
- is_first = TRUE;
- /* Build a new filter based on protocol fields */
- lista = g_queue_peek_nth_link(voip_calls_get_info()->callsinfos, 0);
- while (lista) {
- listinfo = (voip_calls_info_t *)lista->data;
- if (listinfo->selected) {
- if (!is_first)
- g_string_append_printf(filter_string_fwd, " or ");
- switch (listinfo->protocol) {
- case VOIP_SIP:
- sipinfo = (sip_calls_info_t *)listinfo->prot_info;
- g_string_append_printf(filter_string_fwd,
- "(sip.Call-ID == \"%s\")",
- sipinfo->call_identifier
- );
- break;
- case VOIP_ISUP:
- isupinfo = (isup_calls_info_t *)listinfo->prot_info;
- g_string_append_printf(filter_string_fwd,
- "(isup.cic == %i and frame.number >= %i and frame.number <= %i and mtp3.network_indicator == %i and ((mtp3.dpc == %i) and (mtp3.opc == %i)) or ((mtp3.dpc == %i) and (mtp3.opc == %i)))",
- isupinfo->cic, listinfo->start_fd->num,
- listinfo->stop_fd->num,
- isupinfo->ni, isupinfo->dpc, isupinfo->opc,
- isupinfo->opc, isupinfo->dpc
- );
- break;
- case VOIP_H323:
- h323info = (h323_calls_info_t *)listinfo->prot_info;
- guid_str = guid_to_str(NULL, &h323info->guid[0]);
- g_string_append_printf(filter_string_fwd,
- "((h225.guid == %s || q931.call_ref == %x:%x || q931.call_ref == %x:%x)",
- guid_str,
- (guint8) (h323info->q931_crv & 0x00ff),
- (guint8)((h323info->q931_crv & 0xff00)>>8),
- (guint8) (h323info->q931_crv2 & 0x00ff),
- (guint8)((h323info->q931_crv2 & 0xff00)>>8));
- listb = g_list_first(h323info->h245_list);
- wmem_free(NULL, guid_str);
- while (listb) {
- h245_add = (h245_address_t *)listb->data;
- addr_str = (char*)address_to_str(NULL, &h245_add->h245_address);
- g_string_append_printf(filter_string_fwd,
- " || (ip.addr == %s && tcp.port == %d && h245)",
- addr_str, h245_add->h245_port);
- listb = g_list_next(listb);
- wmem_free(NULL, addr_str);
- }
- g_string_append_printf(filter_string_fwd, ")");
- break;
- case TEL_H248:
- ctx = (gcp_ctx_t *)listinfo->prot_info;
- g_string_append_printf(filter_string_fwd,
- "(h248.ctx == 0x%x)", ctx->id);
- break;
- default:
- /* placeholder to assure valid display filter expression */
- g_string_append_printf(filter_string_fwd,
- "(frame)");
- break;
- }
- is_first = FALSE;
- }
- lista = g_list_next(lista);
- }
-
- g_string_append_printf(filter_string_fwd, ")");
- gtk_editable_insert_text(GTK_EDITABLE(main_display_filter_widget), filter_string_fwd->str, -1, &pos);
- }
-
- g_string_free(filter_string_fwd, TRUE);
-}
-
-/****************************************************************************/
-static void
-voip_calls_on_select_all(GtkButton *button _U_, gpointer user_data _U_)
-{
- GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
- gtk_tree_selection_select_all(selection);
-}
-
-/****************************************************************************/
-static void
-on_graph_bt_clicked(GtkButton *button _U_, gpointer user_data _U_)
-{
- seq_analysis_item_t *gai;
- GList* lista;
- GList* listb;
- voip_calls_info_t *listinfo;
- voip_calls_tapinfo_t *tapinfo = voip_calls_get_info();
-
- if(!tapinfo->graph_analysis){
- return;
- }
- sequence_analysis_list_sort(tapinfo->graph_analysis);
-
- /* reset the "display" parameter in graph analysis */
- listb = g_queue_peek_nth_link(tapinfo->graph_analysis->items, 0);
- while (listb) {
- gai = (seq_analysis_item_t *)listb->data;
- gai->display = FALSE;
- listb = g_list_next(listb);
- }
-
- /* set the display for selected calls */
- lista = g_queue_peek_nth_link(tapinfo->callsinfos, 0);
- while (lista) {
- listinfo = (voip_calls_info_t *)lista->data;
- if (listinfo->selected) {
- listb = g_queue_peek_nth_link(tapinfo->graph_analysis->items, 0);
- while (listb) {
- gai = (seq_analysis_item_t *)listb->data;
- if (gai->conv_num == listinfo->call_num) {
- gai->display = TRUE;
- }
- listb = g_list_next(listb);
- }
- }
- lista = g_list_next(lista);
- }
-
- /* create or refresh the graph windows */
- if (graph_analysis_data->dlg.window == NULL)
- graph_analysis_create(graph_analysis_data); /* create the window */
- else
- graph_analysis_update(graph_analysis_data); /* refresh it */
-}
-
-/****************************************************************************/
-static void
-on_flow_bt_clicked(GtkButton *button, gpointer user_data)
-{
- on_graph_bt_clicked(button,user_data);
-}
-
-/****************************************************************************/
-#ifdef HAVE_LIBPORTAUDIO
-static void
-on_player_bt_clicked(GtkButton *button _U_, gpointer user_data _U_)
-{
- rtp_player_init(voip_calls_get_info());
-}
-#endif /* HAVE_LIBPORTAUDIO */
-
-/****************************************************************************/
-/* when the user selects a row in the calls list */
-static gboolean
-voip_calls_mark_selected(GtkTreeModel *model, GtkTreePath *path _U_, GtkTreeIter *iter, gpointer data)
-{
- GtkTreeSelection *selection = (GtkTreeSelection *)data;
- voip_calls_info_t* strinfo;
-
- gtk_tree_model_get(model, iter, CALL_COL_DATA, &strinfo, -1);
- strinfo->selected = gtk_tree_selection_iter_is_selected(selection, iter);
- /* VOIP_CALLS_DEBUG("selected call %u (%s), frame %u: %d", strinfo->call_num, strinfo->call_id, strinfo->start_fd->num, strinfo->selected); */
-
- return FALSE;
-}
-
-static void
-voip_calls_on_select_row_cb(GtkTreeSelection *selection, gpointer data _U_)
-{
- gchar label_text[80];
-
- gtk_tree_model_foreach(GTK_TREE_MODEL(list_store), voip_calls_mark_selected, selection);
-
- calls_ns = gtk_tree_selection_count_selected_rows(selection);
-
- g_snprintf(label_text, 80,
- "Detected %u VoIP %s. Selected %u %s.",
- calls_nb,
- plurality(calls_nb, "Call", "Calls"),
- calls_ns,
- plurality(calls_ns, "Call", "Calls"));
- gtk_label_set_text(GTK_LABEL(top_label), label_text);
-
- gtk_widget_set_sensitive(bt_filter, calls_ns ? TRUE : FALSE);
- gtk_widget_set_sensitive(bt_graph, calls_ns ? TRUE : FALSE);
-#ifdef HAVE_LIBPORTAUDIO
- gtk_widget_set_sensitive(bt_player, calls_ns ? TRUE : FALSE);
-#endif /* HAVE_LIBPORTAUDIO */
-}
-
-/****************************************************************************/
-/* Tree view constructors */
-/****************************************************************************/
-/* append a line to list */
-static void
-add_to_list_store(voip_calls_info_t* strinfo)
-{
- gchar field[NUM_COLS][50];
- isup_calls_info_t *isupinfo;
- h323_calls_info_t *h323info;
- gboolean flag = FALSE;
- char* addr_str = address_to_display(NULL, &(strinfo->initial_speaker));
-
- g_snprintf(field[CALL_COL_INITIAL_SPEAKER], 30, "%s", addr_str);
- g_snprintf(field[CALL_COL_FROM], 50, "%s", strinfo->from_identity);
- g_snprintf(field[CALL_COL_TO], 50, "%s", strinfo->to_identity);
- g_snprintf(field[CALL_COL_PROTOCOL], 15, "%s",
- ((strinfo->protocol==VOIP_COMMON)&&strinfo->protocol_name)?
- strinfo->protocol_name:voip_protocol_name[strinfo->protocol]);
- g_snprintf(field[CALL_COL_STATE], 15, "%s", voip_call_state_name[strinfo->call_state]);
- wmem_free(NULL, addr_str);
-
- /* Add comments based on the protocol */
- switch (strinfo->protocol) {
- case VOIP_ISUP:
- isupinfo = (isup_calls_info_t *)strinfo->prot_info;
- g_snprintf(field[CALL_COL_COMMENTS],30, "%i-%i -> %i-%i", isupinfo->ni, isupinfo->opc,
- isupinfo->ni, isupinfo->dpc);
- break;
- case VOIP_H323:
- h323info = (h323_calls_info_t *)strinfo->prot_info;
- if (strinfo->call_state == VOIP_CALL_SETUP)
- flag = h323info->is_faststart_Setup;
- else
- if ((h323info->is_faststart_Setup == TRUE) && (h323info->is_faststart_Proc == TRUE))
- flag = TRUE;
- g_snprintf(field[CALL_COL_COMMENTS],35, "Tunneling: %s Fast Start: %s",
- (h323info->is_h245Tunneling==TRUE?"ON":"OFF"),
- (flag==TRUE?"ON":"OFF"));
- break;
- case VOIP_COMMON:
- field[CALL_COL_COMMENTS][0]='\0';
- if (strinfo->call_comment)
- g_snprintf(field[CALL_COL_COMMENTS],30, "%s", strinfo->call_comment);
- break;
- default:
- field[CALL_COL_COMMENTS][0]='\0';
- if (strinfo->call_comment)
- g_snprintf(field[CALL_COL_COMMENTS],30, "%s", strinfo->call_comment);
- }
-
- /* Acquire an iterator */
- gtk_list_store_append(list_store, &list_iter);
-
- /* Fill the new row */
- gtk_list_store_set(list_store, &list_iter,
- CALL_COL_START_TIME, nstime_to_sec(&strinfo->start_rel_ts),
- CALL_COL_STOP_TIME, nstime_to_sec(&strinfo->stop_rel_ts),
- CALL_COL_INITIAL_SPEAKER, &field[CALL_COL_INITIAL_SPEAKER][0],
- CALL_COL_FROM, &field[CALL_COL_FROM][0],
- CALL_COL_TO, &field[CALL_COL_TO][0],
- CALL_COL_PROTOCOL, &field[CALL_COL_PROTOCOL][0],
- CALL_COL_PACKETS, strinfo->npackets,
- CALL_COL_STATE, &field[CALL_COL_STATE][0],
- CALL_COL_COMMENTS, &field[CALL_COL_COMMENTS][0],
- CALL_COL_DATA, strinfo,
- -1);
-
- calls_nb += 1;
-}
-
-/****************************************************************************/
-/* Create list view */
-static void
-create_list_view(void)
-{
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
- GtkTreeSortable *sortable;
- GtkTreeView *list_view;
- GtkTreeSelection *selection;
-
- /* Create the store */
- list_store = gtk_list_store_new(NUM_COLS, /* Total number of columns XXX */
- G_TYPE_DOUBLE, /* Start Time */
- G_TYPE_DOUBLE, /* Stop Time */
- G_TYPE_STRING, /* Initial Speaker */
- G_TYPE_STRING, /* From */
- G_TYPE_STRING, /* To */
- G_TYPE_STRING, /* Protocol */
- G_TYPE_UINT, /* Packets */
- G_TYPE_STRING, /* State */
- G_TYPE_STRING, /* Comments */
- G_TYPE_POINTER /* Data */
- );
-
- /* Create a view */
- list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store));
-
- /* The view now holds a reference. We can get rid of our own reference */
- g_object_unref(G_OBJECT(list_store));
-
- list_view = GTK_TREE_VIEW(list);
- sortable = GTK_TREE_SORTABLE(list_store);
-
- /* Speed up the list display */
- gtk_tree_view_set_fixed_height_mode(list_view, TRUE);
-
- /* Setup the sortable columns */
- gtk_tree_sortable_set_sort_column_id(sortable, CALL_COL_START_TIME, GTK_SORT_ASCENDING);
- gtk_tree_view_set_headers_clickable(list_view, FALSE);
-
- /* Start Time */
- renderer = gtk_cell_renderer_text_new();
- g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL); /* right align */
- g_object_set(G_OBJECT(renderer), "xpad", 10, NULL);
- column = gtk_tree_view_column_new_with_attributes("Start Time", renderer,
- "text", CALL_COL_START_TIME,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, CALL_COL_START_TIME);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 60);
- gtk_tree_view_column_set_fixed_width(column, 100);
- /* Add the column to the view. */
- gtk_tree_view_append_column(list_view, column);
-
- /* Stop Time */
- renderer = gtk_cell_renderer_text_new();
- g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL); /* right align */
- g_object_set(G_OBJECT(renderer), "xpad", 10, NULL);
- column = gtk_tree_view_column_new_with_attributes("Stop Time", renderer,
- "text", CALL_COL_STOP_TIME,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, CALL_COL_STOP_TIME);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 60);
- gtk_tree_view_column_set_fixed_width(column, 100);
- gtk_tree_view_append_column(list_view, column);
-
- /* Initial Speaker */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Initial Speaker", renderer,
- "text", CALL_COL_INITIAL_SPEAKER,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, CALL_COL_INITIAL_SPEAKER);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 80);
- gtk_tree_view_column_set_fixed_width(column, 120);
- gtk_tree_view_append_column(list_view, column);
-
- /* From */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("From", renderer,
- "text", CALL_COL_FROM,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, CALL_COL_FROM);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 130);
- gtk_tree_view_column_set_fixed_width(column, 140);
- gtk_tree_view_append_column(list_view, column);
-
- /* To */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("To", renderer,
- "text", CALL_COL_TO,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, CALL_COL_TO);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 130);
- gtk_tree_view_column_set_fixed_width(column, 140);
- gtk_tree_view_append_column(list_view, column);
-
- /* Protocol */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Protocol", renderer,
- "text", CALL_COL_PROTOCOL,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, CALL_COL_PROTOCOL);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 50);
- gtk_tree_view_column_set_fixed_width(column, 80);
- gtk_tree_view_append_column(list_view, column);
-
- /* Packets */
- renderer = gtk_cell_renderer_text_new();
- g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL); /* right align numbers */
- g_object_set(G_OBJECT(renderer), "xpad", 10, NULL);
- column = gtk_tree_view_column_new_with_attributes("Packets", renderer,
- "text", CALL_COL_PACKETS,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, CALL_COL_PACKETS);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 70);
- gtk_tree_view_column_set_fixed_width(column, 80);
- gtk_tree_view_append_column(list_view, column);
-
- /* State */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("State", renderer,
- "text", CALL_COL_STATE,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, CALL_COL_STATE);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 60);
- gtk_tree_view_column_set_fixed_width(column, 80);
- gtk_tree_view_append_column(list_view, column);
-
- /* Comments */
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes("Comments", renderer,
- "text", CALL_COL_COMMENTS,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, CALL_COL_COMMENTS);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_min_width(column, 100);
- gtk_tree_view_column_set_fixed_width(column, 140);
- gtk_tree_view_append_column(list_view, column);
-
- /* Now enable the sorting of each column */
- gtk_tree_view_set_rules_hint(list_view, TRUE);
- gtk_tree_view_set_headers_clickable(list_view, TRUE);
-
- /* Setup the selection handler */
- selection = gtk_tree_view_get_selection(list_view);
- gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
-
- g_signal_connect(G_OBJECT(selection), "changed", /* select_row */
- G_CALLBACK(voip_calls_on_select_row_cb),
- NULL);
-
-}
-
-/****************************************************************************/
-/* INTERFACE */
-/****************************************************************************/
-static void
-voip_calls_dlg_create(void)
-{
- GtkWidget *voip_calls_dlg_w;
- GtkWidget *main_vb;
- GtkWidget *scrolledwindow;
- GtkWidget *hbuttonbox;
- GtkWidget *bt_close;
- GtkWidget *bt_select_all;
- gchar *title_name_ptr;
- gchar *win_name;
-
- title_name_ptr = cf_get_display_name(&cfile);
- win_name = g_strdup_printf("%s - VoIP Calls", title_name_ptr);
- g_free(title_name_ptr);
- voip_calls_dlg_w = dlg_window_new(win_name); /* transient_for top_level */
- gtk_window_set_destroy_with_parent(GTK_WINDOW(voip_calls_dlg_w), TRUE);
-
- gtk_window_set_default_size(GTK_WINDOW(voip_calls_dlg_w), 1000, 350);
-
- main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(voip_calls_dlg_w), main_vb);
- gtk_container_set_border_width(GTK_CONTAINER (main_vb), 12);
-
- top_label = gtk_label_new("Detected 0 VoIP Calls. Selected 0 Calls.");
- gtk_box_pack_start(GTK_BOX (main_vb), top_label, FALSE, FALSE, 8);
-
- scrolledwindow = scrolled_window_new(NULL, NULL);
- gtk_box_pack_start(GTK_BOX (main_vb), scrolledwindow, TRUE, TRUE, 0);
-
- create_list_view();
- gtk_container_add(GTK_CONTAINER(scrolledwindow), list);
- gtk_widget_show(voip_calls_dlg_w);
-
- status_label = gtk_label_new("Total: Calls: 0 Start packets: 0 Completed calls: 0 Rejected calls: 0");
- gtk_box_pack_start(GTK_BOX(main_vb), status_label, FALSE, FALSE, 8);
-
- /* button row */
- hbuttonbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_start(GTK_BOX(main_vb), hbuttonbox, FALSE, FALSE, 0);
- gtk_button_box_set_layout(GTK_BUTTON_BOX (hbuttonbox), GTK_BUTTONBOX_SPREAD);
- gtk_box_set_spacing(GTK_BOX(hbuttonbox), 30);
-
- /*bt_unselect = gtk_button_new_with_label ("Unselect");
- gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_unselect);
- gtk_widget_set_tooltip_text (bt_unselect, "Unselect this conversation");*/
-
- bt_filter = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_PREPARE_FILTER);
- gtk_container_add(GTK_CONTAINER(hbuttonbox), bt_filter);
- gtk_widget_set_tooltip_text(bt_filter, "Prepare a display filter of the selected conversation");
-
- bt_graph = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_VOIP_FLOW);
- gtk_container_add(GTK_CONTAINER(hbuttonbox), bt_graph);
- gtk_widget_show(bt_graph);
- g_signal_connect(bt_graph, "clicked", G_CALLBACK(on_flow_bt_clicked), NULL);
- gtk_widget_set_tooltip_text(bt_graph, "Show a flow graph of the selected calls.");
-
-#ifdef HAVE_LIBPORTAUDIO
- bt_player = ws_gtk_button_new_from_stock(WIRESHARK_STOCK_AUDIO_PLAYER);
- gtk_container_add(GTK_CONTAINER(hbuttonbox), bt_player);
- gtk_widget_show(bt_player);
- g_signal_connect(bt_player, "clicked", G_CALLBACK(on_player_bt_clicked), NULL);
- gtk_widget_set_tooltip_text(bt_player, "Launch the RTP player to listen the selected calls.");
-#endif /* HAVE_LIBPORTAUDIO */
-
- bt_select_all = ws_gtk_button_new_from_stock(GTK_STOCK_SELECT_ALL);
- gtk_container_add(GTK_CONTAINER(hbuttonbox), bt_select_all);
- gtk_widget_set_can_default(bt_select_all, TRUE);
- gtk_widget_set_tooltip_text(bt_select_all, "Select all the calls");
-
- bt_close = ws_gtk_button_new_from_stock(GTK_STOCK_CLOSE);
- gtk_container_add(GTK_CONTAINER (hbuttonbox), bt_close);
- gtk_widget_set_can_default(bt_close, TRUE);
- gtk_widget_set_tooltip_text(bt_close, "Close this dialog");
-
- /*g_signal_connect(bt_unselect, "clicked", G_CALLBACK(voip_calls_on_unselect), NULL);*/
- g_signal_connect(bt_filter, "clicked", G_CALLBACK(voip_calls_on_filter), NULL);
-
- window_set_cancel_button(voip_calls_dlg_w, bt_close, window_cancel_button_cb);
-
- g_signal_connect(voip_calls_dlg_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect(voip_calls_dlg_w, "destroy", G_CALLBACK(voip_calls_on_destroy), NULL);
- g_signal_connect(bt_select_all, "clicked", G_CALLBACK(voip_calls_on_select_all), NULL);
-
- gtk_widget_show_all(voip_calls_dlg_w);
- window_present(voip_calls_dlg_w);
-
- voip_calls_on_unselect(NULL, NULL);
-
- voip_calls_dlg = voip_calls_dlg_w;
-
- g_free(win_name);
-}
-
-
-/****************************************************************************/
-/* PUBLIC */
-/****************************************************************************/
-
-/****************************************************************************/
-/* update the contents of the list view */
-/* list: pointer to list of voip_calls_info_t* */
-void
-voip_calls_dlg_update(GList *listx)
-{
- /* GtkTreeView *list_view; */
- GtkTreeSortable *sortable;
- gchar label_text[256];
-
- /* list_view = GTK_TREE_VIEW(list); */
- sortable = GTK_TREE_SORTABLE(list_store);
- if (voip_calls_dlg != NULL) {
- calls_nb = 0;
- calls_ns = 0;
- gtk_list_store_clear(list_store);
-
- g_snprintf(label_text, sizeof(label_text),
- "Total: Calls: %u Start packets: %u Completed calls: %u Rejected calls: %u",
- g_queue_get_length(voip_calls_get_info()->callsinfos),
- voip_calls_get_info()->start_packets,
- voip_calls_get_info()->completed_calls,
- voip_calls_get_info()->rejected_calls);
- gtk_label_set_text(GTK_LABEL(status_label), label_text);
-
- /* Disable the re-ordering */
- gtk_tree_sortable_set_sort_column_id(sortable, GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, GTK_SORT_ASCENDING);
-
-
- listx = g_list_first(listx);
- while (listx) {
- add_to_list_store((voip_calls_info_t*)(listx->data));
- listx = g_list_next(listx);
- }
- /* Enable the re-ordering */
- gtk_tree_sortable_set_sort_column_id(sortable, CALL_COL_START_TIME, GTK_SORT_ASCENDING);
-
-
- g_snprintf(label_text, sizeof(label_text),
- "Detected %u VoIP %s. Selected %u %s.",
- calls_nb,
- plurality(calls_nb, "Call", "Calls"),
- calls_ns,
- plurality(calls_ns, "Call", "Calls"));
- gtk_label_set_text(GTK_LABEL(top_label), label_text);
- }
-}
-
-/****************************************************************************/
-/* per-packet function for tap listeners */
-#ifdef HAVE_LIBPORTAUDIO
-gboolean
-voip_calls_dlg_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const void *data) {
- /* add this RTP for future listening using the RTP Player*/
- const struct _rtp_info *rtp_info = (const struct _rtp_info *)data;
- add_rtp_packet(rtp_info, pinfo);
- return TRUE;
-}
-#else
-gboolean
-voip_calls_dlg_packet(void *ptr _U_, packet_info *pinfo _U_, epan_dissect_t *edt _U_, const void *data _U_) {
- /* add this RTP for future listening using the RTP Player*/
- return FALSE;
-}
-#endif
-
-/****************************************************************************/
-/* draw function for tap listeners to keep the window up to date */
-void
-voip_calls_dlg_draw(void *ptr _U_)
-{
- if (voip_calls_get_info()->redraw) {
- voip_calls_dlg_update(g_queue_peek_nth_link(voip_calls_get_info()->callsinfos, 0));
- }
-}
-
-/****************************************************************************/
-/* reset function for tap listeners to clear window, if necessary */
-void
-voip_calls_dlg_reset(void *ptr _U_)
-{
- /* Clear gtk list store */
- if (graph_analysis_data) {
- gtk_list_store_clear(list_store);
- }
-
-#ifdef HAVE_LIBPORTAUDIO
- /* reset the RTP player */
- reset_rtp_player();
-#endif
-
- /* Clean up memory used by calls tap */
- voip_calls_reset_all_taps(voip_calls_get_info());
- sequence_analysis_list_free(voip_calls_get_info()->graph_analysis);
-
- /* close the graph window if open */
- if (graph_analysis_data && graph_analysis_data->dlg.window != NULL) {
- window_cancel_button_cb(NULL, graph_analysis_data->dlg.window);
- graph_analysis_data->dlg.window = NULL;
- }
-}
-
-/****************************************************************************/
-/* init function for tap */
-static void
-voip_calls_dlg_init_taps(const char *dummy _U_, void* userdata _U_)
-{
- voip_calls_tapinfo_t* tap_id_base = voip_calls_get_info();
- if(NULL == tap_id_base->graph_analysis) {
- tap_id_base->graph_analysis = sequence_analysis_info_new();
- }
- tap_id_base->session = cfile.epan;
-
-#ifdef HAVE_LIBPORTAUDIO
- /* reset the RTP player */
- reset_rtp_player();
-#endif
-
- /* Clean up memory used by calls tap */
- voip_calls_reset_all_taps(tap_id_base);
- sequence_analysis_list_free(tap_id_base->graph_analysis);
-
- if (graph_analysis_data == NULL) {
- /* init the Graph Analysys */
- graph_analysis_data = graph_analysis_init(voip_calls_get_info()->graph_analysis);
- }
-
- /* Register the tap listeners */
- if (!have_voip_calls_tap_listeners) {
- voip_calls_init_all_taps(tap_id_base);
- have_voip_calls_tap_listeners = TRUE;
- }
-
- /* create dialog box if necessary */
- if (voip_calls_dlg == NULL) {
- voip_calls_dlg_create();
- } else {
- /* There's already a dialog box; reactivate it. */
- reactivate_window(voip_calls_dlg);
- }
-
- voip_calls_get_info()->redraw = 1;
- voip_calls_dlg_draw(NULL);
- voip_calls_get_info()->redraw = 0;
-
- /* Scan for VoIP calls calls (redissect all packets) */
- cf_retap_packets(&cfile);
- gdk_window_raise(gtk_widget_get_window(voip_calls_dlg));
- /* Tap listener will be removed and cleaned up in voip_calls_on_destroy */
-}
-
-
-/****************************************************************************/
-/* entry point when called via the GTK menu */
-void
-voip_calls_launch(GtkAction *action _U_, gpointer user_data _U_)
-{
- voip_calls_get_info()->fs_option = FLOW_ONLY_INVITES;
- voip_calls_dlg_init_taps("", NULL);
-}
-
-/****************************************************************************/
-/* entry point when called via the GTK menu */
-void
-voip_flows_launch(GtkAction *action _U_, gpointer user_data _U_)
-{
- voip_calls_get_info()->fs_option = FLOW_ALL;
- voip_calls_dlg_init_taps("", NULL);
-}
-
-/****************************************************************************/
-static stat_tap_ui voip_calls_ui = {
- REGISTER_STAT_GROUP_GENERIC,
- NULL,
- "voip,calls",
- voip_calls_dlg_init_taps,
- 0,
- NULL
-};
-
-void
-register_tap_listener_voip_calls_dlg(void)
-{
- register_stat_tap_ui(&voip_calls_ui, NULL);
-}
-
-/*
- * 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/gtk/voip_calls_dlg.h b/ui/gtk/voip_calls_dlg.h
deleted file mode 100644
index 6331cef6c0..0000000000
--- a/ui/gtk/voip_calls_dlg.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/* voip_calls_dlg.h
- * VoIP conversations addition for Wireshark
- *
- * Copyright 2004, Ericsson , Spain
- * By Francisco Alcoba <francisco.alcoba@ericsson.com>
- *
- * based on h323_conversations_dlg.h
- * Copyright 2004, Iskratel, Ltd, Kranj
- * By Miha Jemec <m.jemec@iskratel.si>
- *
- * H323, RTP and Graph Support
- * By Alejandro Vaquero, alejandro.vaquero@verso.com
- * Copyright 2005, Verso Technologies Inc.
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __VOIP_CALLS_DLG_H__
-#define __VOIP_CALLS_DLG_H__
-
-#include <gtk/gtk.h>
-
-/**
- * Update the contents of the dialog box clist with that of list.
- *
- * @param list pointer to list of rtp_stream_info_t*
- */
-void voip_calls_dlg_update(GList *list);
-
-#endif /* __VOIP_CALLS_DLG_H__ */
diff --git a/ui/gtk/webbrowser.c b/ui/gtk/webbrowser.c
deleted file mode 100644
index 7401c10876..0000000000
--- a/ui/gtk/webbrowser.c
+++ /dev/null
@@ -1,487 +0,0 @@
-/* The GIMP -- an image manipulation program
- * Copyright (C) 1995 Spencer Kimball and Peter Mattis
- *
- * Web Browser Plug-in
- * Copyright (C) 2003 Henrik Brix Andersen <brix@gimp.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/* Wireshark - this file is copied from "The GIMP" V2.0.2
- * You will find the original file in the gimp distribution zip under:
- * \plug-ins\common\webbrowser.c
- *
- * It was modified to suit the Wireshark environment (#if 0)!
- *
- * For the UNIX+X11 launcher, see this blog post:
- *
- * http://blogs.gnome.org/timj/2006/11/24/24112006-how-to-start-a-web-browser/
- *
- * for a discussion of how Beast launches a browser, a link that shows
- * the rather complicated code it uses, and some information on why it
- * goes through all that pain. See also Kevin Krammer's comment, which
- * notes that the problem might be that the GNOME, KDE, and XFCE
- * launcher programs always cause the window to be opened in the background,
- * regardless of whether an instance of the app is running or not (the
- * app gets launched - in the background - if it's not already running,
- * and is told to open a new window/tab if it's already running), while
- * launchers such as sensible-browser, which xdg-open falls back to,
- * launch the app in the foreground if it's not already running, leading
- * to the "first window is in the foreground, subsequent windows are in
- * the background" behavior in non-GNOME/KDE/XFCE environments.
- *
- * What Qt's "generic UNIX" openURL does is:
- *
- * if it's a mailto: URL, use the "document lanuncher" if
- * known, otherwise, use the results of detectWebBrowser
- * as the "document launcher", and use that;
- *
- * otherwise, use the "Web browser" if known, otherwise, use
- * the results of detectWebBrowser as the "document launcher",
- * and use that.
- *
- * detectWebBrowser:
- *
- * looks for xdg-open and, if it finds it, uses that;
- *
- * otherwise, if the DEFAULT_BROWSER or BROWSER environment
- * variable is set, use the first of those that's set (in
- * that order) and, if that's an executable, uses that;
- *
- * otherwise, if the desktop environment is detected to be
- * KDE, uses kfmclient;
- *
- * otherwise, if the desktop environment is detected to
- * be GNOME, uses gnome-open;
- *
- * otherwise, tries, in order, google-chrome, firefox,
- * mozilla, and opera.
- *
- * (Its Windows openURL uses ShellExecute() on non-mailto URLs (it
- * does more exotic stuff for mailto: URLs).
- *
- * Its macOS stuff uses the openURL method of an NSWorkspace (which
- * probably ends up in Launch Services....).)
- *
- * GTK+ has gtk_show_uri(), but that ultimately uses gvfs on UN*X,
- * so it's not appropriate for non-GNOME UN*Xes (including, but not
- * limited to, macOS), and ultimately appears to be a stubbed-out
- * routine in GLib 2.36.0, so it's not very useful for a cross-
- * platform applicatio n.
- *
- * Perhaps the right strategy is to:
- *
- * Check whether we're in a GNOME/KDE/XFCE session and, if
- * we are, try xdg-open, as it works around, among other things,
- * some kfmclient bugs, and run it synchronously (that will fail
- * if we detect a GNOME/KDE/XFCE session but the launcher is
- * missing, but so it goes). If we don't have xdg-open, try
- * the appropriate launcher for the environment, but ignore
- * the return code from kfmclient, as it might be bogus (that's
- * the bug xdg-open works around).
- *
- * Otherwise, try the "broken/unpredictable browser launchers",
- * but run them in the background and leave them running, and
- * ignore the exit code, and then try x-www-browser, and then
- * try directly launching a user-specified browser. (Beast tries
- * a bunch of browsers, with the user not being allowed to
- * specify which one they want.)
- *
- * On the other hand, see bug 2699, in which xdg-open is itself buggy.
- */
-
-#include "config.h"
-#include <string.h> /* strlen, strstr */
-
-#include <gtk/gtk.h>
-
-#include <epan/prefs.h>
-
-#include "ui/simple_dialog.h"
-#include "ui/help_url.h"
-
-#include "ui/gtk/webbrowser.h"
-
-#include <wsutil/filesystem.h>
-
-#if defined(G_OS_WIN32)
-/* Win32 - use Windows shell services to start a browser */
-#include <windows.h>
-/* We're using Unicode */
-#include <tchar.h>
-#include <wsutil/unicode-utils.h>
-/* if WIN32_LEAN_AND_MEAN is defined, shellapi.h is needed too */
-#include <shellapi.h>
-#elif defined (HAVE_MACOS_FRAMEWORKS)
-/* macOS - use Launch Services to start a browser */
-#include <CoreFoundation/CoreFoundation.h>
-#include <ApplicationServices/ApplicationServices.h>
-#else
-/* Everything else */
-#define TRY_XDG_OPEN_THEN_BROWSER_FALLBACK
-#endif
-
-#ifdef TRY_XDG_OPEN_THEN_BROWSER_FALLBACK
-static gchar* strreplace (const gchar *string,
- const gchar *delimiter,
- const gchar *replacement);
-
-static gboolean xdg_open(const gchar *url);
-#endif
-
-gboolean
-browser_needs_pref(void)
-{
-#ifdef TRY_XDG_OPEN_THEN_BROWSER_FALLBACK
- return TRUE;
-#else
- return FALSE;
-#endif
-}
-
-
-gboolean
-browser_open_url (const gchar *url)
-{
-#if defined(G_OS_WIN32)
-
- return ((intptr_t) ShellExecute (HWND_DESKTOP, _T("open"), utf_8to16(url), NULL, NULL, SW_SHOWNORMAL) > 32);
-
-#elif defined(HAVE_MACOS_FRAMEWORKS)
-
- CFStringRef url_CFString;
- CFURLRef url_CFURL;
- OSStatus status;
-
- /*
- * XXX - if URLs passed to "browser_open_url()" contain non-ASCII
- * characters, we'd have to choose an appropriate value from the
- * CFStringEncodings enum.
- */
- url_CFString = CFStringCreateWithCString(NULL, url, kCFStringEncodingASCII);
- if (url_CFString == NULL)
- return (FALSE);
- url_CFURL = CFURLCreateWithString(NULL, url_CFString, NULL);
- CFRelease(url_CFString);
- if (url_CFURL == NULL) {
- /*
- * XXX - this could mean that the url_CFString wasn't a valid URL,
- * or that memory allocation failed. We can't determine which,
- * except perhaps by providing our own allocator and somehow
- * flagging allocation failures.
- */
- return (FALSE);
- }
- /*
- * XXX - this is a Launch Services result code, and we should probably
- * display a dialog box if it's not 0, describing what the error was.
- * Then again, we should probably do the same for the ShellExecute call,
- * unless that call itself happens to pop up a dialog box for all errors.
- */
- status = LSOpenCFURLRef(url_CFURL, NULL);
- CFRelease(url_CFURL);
- return (status == 0);
-
-#else
-
- GError *error = NULL;
- gchar *browser, *argument, *cmd;
- gchar **argv;
- gboolean retval;
-
- g_return_val_if_fail (url != NULL, FALSE);
-
- if (xdg_open(url)) {
- return TRUE;
- }
-
- /* browser = gimp_gimprc_query ("web-browser");*/
- browser = g_strdup(prefs.gui_webbrowser);
-
- if (browser == NULL || ! strlen (browser))
- {
- simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK,
- "Web browser not specified.\n"
- "Please correct the web browser setting in the Preferences dialog.\n"
- "URL: %s", url);
- g_free (browser);
- return FALSE;
- }
-
- /* quote the url since it might contains special chars */
- argument = g_shell_quote (url);
-
- /* replace %s with URL */
- if (strstr (browser, "%s"))
- cmd = strreplace (browser, "%s", argument);
- else
- cmd = g_strconcat (browser, " ", argument, NULL);
-
- g_free (argument);
-
- /* parse the cmd line */
- if (! g_shell_parse_argv (cmd, NULL, &argv, &error))
- {
- simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK,
- "%sCould not parse web browser command: \"%s\"%s\n\n\"%s\"\n\n%s",
- simple_dialog_primary_start(), browser, simple_dialog_primary_end(),
- error->message,
- "Please correct the web browser setting in the Preferences dialog.");
- g_error_free (error);
- return FALSE;
- }
-
- /*
- * XXX - use g_spawn_on_screen() so the browser window shows up on
- * the same screen?
- */
- retval = g_spawn_async (NULL, argv, NULL,
- G_SPAWN_SEARCH_PATH,
- NULL, NULL,
- NULL, &error);
-
- if (! retval)
- {
- simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK,
- "%sCould not execute web browser: \"%s\"%s\n\n\"%s\"\n\n%s",
- simple_dialog_primary_start(), browser, simple_dialog_primary_end(),
- error->message,
- "Please correct the web browser setting in the Preferences dialog.");
- g_error_free (error);
- }
-
- g_free (browser);
- g_free (cmd);
- g_strfreev (argv);
-
- return retval;
-#endif
-}
-
-/* XXX: Much of this is very similar to browser_open_url - abstract a common
- * function out of the two of them? */
-gboolean
-filemanager_open_directory (const gchar *path)
-{
-#if defined(G_OS_WIN32)
- /* ShellExecute(...,"explore",...) needs path to be explicitly a directory;
- Otherwise 'explore' will fail if a file exists with a basename matching
- the provided directory path.
- (eg: wireshak-gtk2.exe exists in the same directory as a wireshark-gtk2
- directory entry).
- */
- intptr_t ret;
- gchar *xpath;
- xpath = g_strconcat(path,
- g_str_has_suffix(path, "\\") ? "" : "\\",
- NULL);
- ret = (intptr_t) ShellExecute (HWND_DESKTOP, _T("explore"), utf_8to16(xpath), NULL, NULL, SW_SHOWNORMAL);
- g_free(xpath);
- return (ret > 32);
-
-#elif defined(HAVE_MACOS_FRAMEWORKS)
-
- CFStringRef path_CFString;
- CFURLRef path_CFURL;
- OSStatus status;
-
- path_CFString = CFStringCreateWithCString(NULL, path, kCFStringEncodingUTF8);
- if (path_CFString == NULL)
- return (FALSE);
- path_CFURL = CFURLCreateWithFileSystemPath(NULL, path_CFString,
- kCFURLPOSIXPathStyle, true);
- CFRelease(path_CFString);
- if (path_CFURL == NULL) {
- /*
- * XXX - does this always mean that that memory allocation failed?
- */
- return (FALSE);
- }
- /*
- * XXX - this is a Launch Services result code, and we should probably
- * display a dialog box if it's not 0, describing what the error was.
- * Then again, we should probably do the same for the ShellExecute call,
- * unless that call itself happens to pop up a dialog box for all errors.
- */
- status = LSOpenCFURLRef(path_CFURL, NULL);
- CFRelease(path_CFURL);
- return (status == 0);
-
-#else
-
- GError *error = NULL;
- gchar *browser, *argument, *cmd;
- gchar **argv;
- gboolean retval;
-
- g_return_val_if_fail (path != NULL, FALSE);
-
- if (xdg_open(path)) {
- return TRUE;
- }
-
- /* browser = gimp_gimprc_query ("web-browser");*/
- browser = g_strdup(prefs.gui_webbrowser);
-
- if (browser == NULL || ! strlen (browser))
- {
- simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK,
- "Web browser not specified.\n"
- "Please correct the web browser setting in the Preferences dialog.\n"
- "URL: %s", path);
- g_free (browser);
- return FALSE;
- }
-
- /* conver the path to a URI */
- argument = g_filename_to_uri(path, NULL, &error);
- if (argument == NULL)
- {
- simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK,
- "%sCould not convert \"%s\" to a URI: \"%s\"%s\"",
- simple_dialog_primary_start(), path, simple_dialog_primary_end(),
- error->message);
- g_error_free (error);
- return FALSE;
- }
-
- /* replace %s with URL */
- if (strstr (browser, "%s"))
- cmd = strreplace (browser, "%s", argument);
- else
- cmd = g_strconcat (browser, " ", argument, NULL);
-
- g_free (argument);
-
- /* parse the cmd line */
- if (! g_shell_parse_argv (cmd, NULL, &argv, &error))
- {
- simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK,
- "%sCould not parse web browser command: \"%s\"%s\n\n\"%s\"\n\n%s",
- simple_dialog_primary_start(), browser, simple_dialog_primary_end(),
- error->message,
- "Please correct the web browser setting in the Preferences dialog.");
- g_error_free (error);
- return FALSE;
- }
-
- /*
- * XXX - use g_spawn_on_screen() so the browser window shows up on
- * the same screen?
- */
- retval = g_spawn_async (NULL, argv, NULL,
- G_SPAWN_SEARCH_PATH,
- NULL, NULL,
- NULL, &error);
-
- if (! retval)
- {
- simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK,
- "%sCould not execute web browser: \"%s\"%s\n\n\"%s\"\n\n%s",
- simple_dialog_primary_start(), browser, simple_dialog_primary_end(),
- error->message,
- "Please correct the web browser setting in the Preferences dialog.");
- g_error_free (error);
- }
-
- g_free (browser);
- g_free (cmd);
- g_strfreev (argv);
-
- return retval;
-#endif
-}
-
-#ifdef TRY_XDG_OPEN_THEN_BROWSER_FALLBACK
-
-static gchar*
-strreplace (const gchar *string,
- const gchar *delimiter,
- const gchar *replacement)
-{
- gchar *ret;
- gchar **tmp;
-
- g_return_val_if_fail (string != NULL, NULL);
- g_return_val_if_fail (delimiter != NULL, NULL);
- g_return_val_if_fail (replacement != NULL, NULL);
-
- tmp = g_strsplit (string, delimiter, 0);
- ret = g_strjoinv (replacement, tmp);
- g_strfreev (tmp);
-
- return ret;
-}
-
-gboolean xdg_open(const gchar *url) {
- GError *error = NULL;
- gchar *argv[3];
- gboolean retval;
-
- argv[0] = "xdg-open";
-DIAG_OFF(cast-qual)
- argv[1] = (gchar *)url;
-DIAG_ON(cast-qual)
- argv[2] = NULL;
-
- /*
- * XXX - use g_spawn_on_screen() so the browser window shows up on
- * the same screen?
- *
- * Also, g_spawn_async() shouldn't modify argv but takes it as non-const!
- */
- retval = g_spawn_async (NULL, argv, NULL,
- G_SPAWN_SEARCH_PATH,
- NULL, NULL,
- NULL, &error);
- if (retval)
- return TRUE;
-
- g_debug("Could not execute xdg-open: %s", error->message);
- g_error_free(error);
- return FALSE;
-}
-
-#endif /* TRY_XDG_OPEN_THEN_BROWSER_FALLBACK */
-
-
-/* browse a file relative to the data dir */
-void
-browser_open_data_file(const gchar *filename)
-{
- gchar *uri;
-
- /* XXX - check, if the file is really existing, otherwise display a simple_dialog about the problem */
-
- uri = data_file_url(filename);
-
- /* show the uri */
- browser_open_url (uri);
-
- g_free(uri);
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local Variables:
- * c-basic-offset: 2
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=2 tabstop=8 expandtab:
- * :indentSize=2:tabSize=8:noTabs=true:
- */
diff --git a/ui/gtk/webbrowser.h b/ui/gtk/webbrowser.h
deleted file mode 100644
index 1f7b8e22ac..0000000000
--- a/ui/gtk/webbrowser.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* webbrowser.h
- * Web browser activation functions
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __WEBBROWSER_H__
-#define __WEBBROWSER_H__
-
-extern gboolean browser_needs_pref(void);
-
-extern gboolean browser_open_url (const gchar *url);
-
-extern gboolean filemanager_open_directory (const gchar *path);
-
-/* browse a file relative to the data dir */
-extern void browser_open_data_file (const gchar *filename);
-
-#endif /* __WEBBROWSER_H__ */
diff --git a/ui/gtk/wlan_stat_dlg.c b/ui/gtk/wlan_stat_dlg.c
deleted file mode 100644
index 56e5d56306..0000000000
--- a/ui/gtk/wlan_stat_dlg.c
+++ /dev/null
@@ -1,2017 +0,0 @@
-/* wlan_stat_dlg.c
- * Copyright 2008 Stig Bjorlykke <stig@bjorlykke.org>
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-
-#include "config.h"
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <epan/packet.h>
-#include <epan/addr_resolv.h>
-#include <epan/tap.h>
-#include <epan/dissectors/packet-ieee80211.h>
-#include <epan/conversation_table.h>
-#include <epan/strutil.h>
-
-#include "ui/recent.h"
-#include "ui/simple_dialog.h"
-#include <wsutil/utf8_entities.h>
-
-#include <epan/stat_groups.h>
-
-#include "ui/gtk/gtkglobals.h"
-#include "ui/gtk/dlg_utils.h"
-#include "ui/gtk/filter_utils.h"
-#include "ui/gtk/gui_stat_menu.h"
-#include "ui/gtk/gui_utils.h"
-#include "ui/gtk/help_dlg.h"
-#include "ui/gtk/main.h"
-
-#include "ui/gtk/old-gtk-compat.h"
-
-#include "globals.h"
-
-void register_tap_listener_wlanstat(void);
-
-enum {
- BSSID_COLUMN,
- CHANNEL_COLUMN,
- SSID_COLUMN,
- PERCENT_COLUMN,
- BEACONS_COLUMN,
- DATA_COLUMN,
- PROBE_REQ_COLUMN,
- PROBE_RESP_COLUMN,
- AUTH_COLUMN,
- DEAUTH_COLUMN,
- OTHER_COLUMN,
- PROTECTION_COLUMN,
- PERCENT_VALUE_COLUMN,
- TABLE_COLUMN,
- NUM_COLUMNS
-};
-
-static const gchar *titles[] = { "BSSID", "Ch.", "SSID", "% Packets", "Beacons", "Data Packets",
- "Probe Req", "Probe Resp", "Auth", "Deauth", "Other", "Protection" };
-
-enum {
- ADDRESS_COLUMN,
- PERCENT_2_COLUMN,
- DATA_SENT_COLUMN,
- DATA_REC_COLUMN,
- PROBE_REQ_2_COLUMN,
- PROBE_RESP_2_COLUMN,
- AUTH_2_COLUMN,
- DEAUTH_2_COLUMN,
- OTHER_2_COLUMN,
- COMMENT_COLUMN,
- PERCENT_VALUE_2_COLUMN,
- DETAILS_COLUMN,
- NUM_DETAIL_COLUMNS
-};
-
-static const gchar *detail_titles[] = { "Address", "% Packets", "Data Sent", "Data Received",
- "Probe Req", "Probe Resp", "Auth", "Deauth", "Other", "Comment" };
-
-typedef struct wlan_details_ep {
- struct wlan_details_ep *next;
- address addr;
- guint32 probe_req;
- guint32 probe_rsp;
- guint32 auth;
- guint32 deauth;
- guint32 data_sent;
- guint32 data_received;
- guint32 other;
- guint32 number_of_packets;
- GtkTreeIter iter;
- gboolean iter_valid;
-} wlan_details_ep_t;
-
-typedef struct wlan_ep {
- struct wlan_ep *next;
- address bssid;
- struct _wlan_stats stats;
- guint32 type[256];
- guint32 number_of_packets;
- GtkTreeIter iter;
- gboolean iter_valid;
- gboolean probe_req_searched;
- gboolean is_broadcast;
- struct wlan_details_ep *details;
-} wlan_ep_t;
-
-static GtkWidget *wlanstat_dlg_w = NULL;
-static GtkWidget *wlanstat_pane = NULL;
-static GtkWidget *wlanstat_name_lb = NULL;
-
-/* used to keep track of the statistics for an entire program interface */
-typedef struct _wlan_stat_t {
- GtkTreeView *table;
- GtkTreeView *details;
- GtkWidget *menu;
- GtkWidget *details_menu;
- guint32 number_of_packets;
- guint32 num_entries;
- guint32 num_details;
- gboolean resolve_names;
- gboolean use_dfilter;
- gboolean show_only_existing;
- wlan_ep_t *ep_list;
-} wlanstat_t;
-
-static void
-dealloc_wlan_details_ep (wlan_details_ep_t *details)
-{
- wlan_details_ep_t *tmp;
-
- while (details) {
- tmp = details;
- details = details->next;
- free_address(&tmp->addr);
- g_free (tmp);
- }
-}
-
-static void
-wlanstat_reset (void *phs)
-{
- wlanstat_t *wlan_stat = (wlanstat_t *)phs;
- wlan_ep_t *list = wlan_stat->ep_list;
- char *display_name;
- char title[256];
- GString *error_string;
- GtkListStore *store;
- const char *filter = NULL;
-
- if (wlanstat_dlg_w != NULL) {
- display_name = cf_get_display_name(&cfile);
- g_snprintf (title, sizeof(title), "Wireshark: WLAN Traffic Statistics: %s",
- display_name);
- g_free(display_name);
- gtk_window_set_title(GTK_WINDOW(wlanstat_dlg_w), title);
- }
-
- if (wlan_stat->use_dfilter) {
- filter = gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget));
- }
-
- error_string = set_tap_dfilter (wlan_stat, filter);
- if (error_string) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
- g_string_free(error_string, TRUE);
- return;
- }
-
- if (wlan_stat->use_dfilter) {
- if (filter && strlen(filter)) {
- g_snprintf(title, sizeof(title), "Network Overview - Filter: %s", filter);
- } else {
- g_snprintf(title, sizeof(title), "Network Overview - No Filter");
- }
- } else {
- g_snprintf(title, sizeof(title), "Network Overview");
- }
- gtk_frame_set_label(GTK_FRAME(wlanstat_name_lb), title);
-
- /* remove all entries from the list */
- store = GTK_LIST_STORE(gtk_tree_view_get_model(wlan_stat->table));
- gtk_list_store_clear(store);
- store = GTK_LIST_STORE(gtk_tree_view_get_model(wlan_stat->details));
- gtk_list_store_clear(store);
-
- if (!list)
- return;
-
- while (list) {
- wlan_ep_t *tmp;
- tmp = list;
- dealloc_wlan_details_ep(tmp->details);
- list = tmp->next;
- free_address(&tmp->bssid);
- g_free(tmp);
- }
-
- wlan_stat->ep_list = NULL;
- wlan_stat->number_of_packets = 0;
-}
-
-static void
-invalidate_detail_iters (wlanstat_t *hs)
-{
- wlan_ep_t *ep = hs->ep_list;
- wlan_details_ep_t *d_ep;
-
- while (ep) {
- d_ep = ep->details;
- while (d_ep) {
- d_ep->iter_valid = FALSE;
- d_ep = d_ep->next;
- }
- ep = ep->next;
- }
-}
-
-static wlan_ep_t*
-alloc_wlan_ep (const struct _wlan_hdr *si, const packet_info *pinfo _U_)
-{
- wlan_ep_t *ep;
-
- if (!si)
- return NULL;
-
- ep = (wlan_ep_t *)g_malloc (sizeof(wlan_ep_t));
-
- copy_address (&ep->bssid, &si->bssid);
- ep->stats.channel = si->stats.channel;
- memcpy (ep->stats.ssid, si->stats.ssid, MAX_SSID_LEN);
- ep->stats.ssid_len = si->stats.ssid_len;
- g_strlcpy (ep->stats.protection, si->stats.protection, MAX_PROTECT_LEN);
- memset(&ep->type, 0, sizeof (int) * 256);
- ep->number_of_packets = 0;
- ep->details = NULL;
- ep->iter_valid = FALSE;
- ep->probe_req_searched = FALSE;
- ep->is_broadcast = FALSE;
- ep->next = NULL;
-
- return ep;
-}
-
-static wlan_details_ep_t *
-alloc_wlan_details_ep (const address *addr)
-{
- wlan_details_ep_t *d_ep;
-
- if (!addr)
- return NULL;
-
- if (!(d_ep = (wlan_details_ep_t *)g_malloc (sizeof(wlan_details_ep_t))))
- return NULL;
-
- copy_address (&d_ep->addr, addr);
- d_ep->probe_req = 0;
- d_ep->probe_rsp = 0;
- d_ep->auth = 0;
- d_ep->deauth = 0;
- d_ep->data_sent = 0;
- d_ep->data_received = 0;
- d_ep->other = 0;
- d_ep->number_of_packets = 0;
- d_ep->iter_valid = FALSE;
- d_ep->next = NULL;
-
- return d_ep;
-}
-
-static wlan_details_ep_t *
-get_details_ep (wlan_ep_t *te, const address *addr)
-{
- wlan_details_ep_t *tmp, *d_te = NULL;
-
- if (!te->details) {
- te->details = alloc_wlan_details_ep (addr);
- d_te = te->details;
- } else {
- for (tmp = te->details; tmp; tmp = tmp->next) {
- if (!cmp_address (&tmp->addr, addr)) {
- d_te = tmp;
- break;
- }
- }
-
- if (!d_te) {
- if ((d_te = alloc_wlan_details_ep (addr)) != NULL) {
- d_te->next = te->details;
- te->details = d_te;
- }
- }
- }
-
- g_assert(d_te != NULL);
-
- return d_te;
-}
-
-static void
-wlanstat_packet_details (wlan_ep_t *te, guint32 type, const address *addr, gboolean src)
-{
- wlan_details_ep_t *d_te = get_details_ep (te, addr);
-
- switch (type) {
- case MGT_PROBE_REQ:
- d_te->probe_req++;
- break;
- case MGT_PROBE_RESP:
- d_te->probe_rsp++;
- break;
- case MGT_BEACON:
- /* No counting for beacons */
- break;
- case MGT_AUTHENTICATION:
- d_te->auth++;
- break;
- case MGT_DEAUTHENTICATION:
- d_te->deauth++;
- break;
- case DATA:
- case DATA_CF_ACK:
- case DATA_CF_POLL:
- case DATA_CF_ACK_POLL:
- case DATA_QOS_DATA:
- case DATA_QOS_DATA_CF_ACK:
- case DATA_QOS_DATA_CF_POLL:
- case DATA_QOS_DATA_CF_ACK_POLL:
- if (src) {
- d_te->data_sent++;
- } else {
- d_te->data_received++;
- }
- break;
- default:
- d_te->other++;
- break;
- }
-
- if (type != MGT_BEACON) {
- /* Do not count beacons in details */
- d_te->number_of_packets++;
- }
-}
-
-#if 0
-static gboolean
-is_broadcast(const address *addr)
-{
- gboolean cmp_addr;
- char* addr_str = address_to_display(NULL, addr);
-
- cmp_addr = (strcmp(addr_str, "Broadcast") == 0);
- wmem_free(NULL, addr_str);
-
- /* doesn't work if MAC resolution is disable */
- return cmp_addr;
- return addresses_equal(&broadcast, addr);
-}
-#endif
-
-static gboolean
-ssid_equal(const struct _wlan_stats *st1, const struct _wlan_stats *st2 )
-{
- return ((st1->ssid_len <= sizeof(st1->ssid)) && st1->ssid_len == st2->ssid_len) && (memcmp(st1->ssid, st2->ssid, st1->ssid_len) == 0);
-}
-
-static gboolean
-wlanstat_packet (void *phs, packet_info *pinfo, epan_dissect_t *edt _U_, const void *phi)
-{
- wlanstat_t *hs = (wlanstat_t *)phs;
- wlan_ep_t *tmp, *te = NULL;
- const struct _wlan_hdr *si = (const struct _wlan_hdr *) phi;
- guint16 frame_type = si->type & 0xff0;
-
- if (!hs)
- return FALSE;
-
- if (!((frame_type == 0x0) || (frame_type == 0x20) || (frame_type == 0x30))
- || ((frame_type == 0x20) && DATA_FRAME_IS_NULL(si->type))) {
- /* Not a management or non null data or extension frame; let's skip it */
- return FALSE;
- }
-
- hs->number_of_packets++;
- if (!hs->ep_list) {
- hs->ep_list = alloc_wlan_ep (si, pinfo);
- te = hs->ep_list;
- te->is_broadcast = is_broadcast_bssid(&si->bssid);
- } else {
- for (tmp = hs->ep_list; tmp; tmp = tmp->next) {
- if ((((si->type == MGT_PROBE_REQ) && (
- ((tmp->stats.ssid_len == 0) && (si->stats.ssid_len == 0) && tmp->is_broadcast)
- || ((si->stats.ssid_len != 0) && (ssid_equal(&tmp->stats, &si->stats)))
- )))
- ||
- ((si->type != MGT_PROBE_REQ) && !cmp_address(&tmp->bssid, &si->bssid))) {
- te = tmp;
- break;
- }
- }
-
- if (!te) {
- te = alloc_wlan_ep (si, pinfo);
- te->is_broadcast = is_broadcast_bssid(&si->bssid);
- te->next = hs->ep_list;
- hs->ep_list = te;
- }
-
- if (!te->probe_req_searched && (si->type != MGT_PROBE_REQ) && (te->type[MGT_PROBE_REQ] == 0) &&
- (si->stats.ssid_len > 1 || si->stats.ssid[0] != 0)) {
- /*
- * We have found a matching entry without Probe Requests.
- * Search the rest of the entries for a corresponding entry
- * matching the SSID and BSSID == Broadcast.
- *
- * This is because we can have a hidden SSID or Probe Request
- * before we have a Beacon, Association Request, etc.
- */
- wlan_ep_t *prev = NULL;
- GtkListStore *store = GTK_LIST_STORE(gtk_tree_view_get_model(hs->table));
- te->probe_req_searched = TRUE;
- for (tmp = hs->ep_list; tmp; tmp = tmp->next) {
- if (tmp != te && tmp->is_broadcast && ssid_equal (&si->stats, &tmp->stats)) {
- /*
- * Found a matching entry. Merge with the previous
- * found entry and remove from list.
- */
- te->type[MGT_PROBE_REQ] += tmp->type[MGT_PROBE_REQ];
- te->number_of_packets += tmp->number_of_packets;
-
- if (tmp->details && tmp->details->next) {
- /* Adjust received probe requests */
- wlan_details_ep_t *d_te;
- d_te = get_details_ep (te, &tmp->details->addr);
- d_te->probe_req += tmp->type[MGT_PROBE_REQ];
- d_te->number_of_packets += tmp->type[MGT_PROBE_REQ];
- d_te = get_details_ep (te, &tmp->details->next->addr);
- d_te->probe_req += tmp->type[MGT_PROBE_REQ];
- d_te->number_of_packets += tmp->type[MGT_PROBE_REQ];
- }
- if (prev) {
- prev->next = tmp->next;
- } else {
- hs->ep_list = tmp->next;
- }
- dealloc_wlan_details_ep (tmp->details);
- if (tmp->iter_valid) {
- gtk_list_store_remove(store, &tmp->iter);
- }
- free_address(&tmp->bssid);
- g_free(tmp);
- break;
- }
- prev = tmp;
- }
- }
- }
-
- if (te->stats.channel == 0 && si->stats.channel != 0) {
- te->stats.channel = si->stats.channel;
- }
- if (te->stats.ssid[0] == 0 && si->stats.ssid_len != 0) {
- memcpy (te->stats.ssid, si->stats.ssid, MAX_SSID_LEN);
- te->stats.ssid_len = si->stats.ssid_len;
- }
- if (te->stats.protection[0] == 0 && si->stats.protection[0] != 0) {
- g_strlcpy (te->stats.protection, si->stats.protection, MAX_PROTECT_LEN);
- }
- te->type[si->type]++;
- te->number_of_packets++;
-
- wlanstat_packet_details (te, si->type, &si->src, TRUE); /* Register source */
- wlanstat_packet_details (te, si->type, &si->dst, FALSE); /* Register destination */
-
- return TRUE;
-}
-
-static void
-wlanstat_draw_details(wlanstat_t *hs, wlan_ep_t *wlan_ep, gboolean clear)
-{
- wlan_details_ep_t *tmp;
- char *addr_str, comment[256], percent[256];
- gboolean broadcast_flag, basestation_flag;
- float f;
- GtkListStore *store;
-
- store = GTK_LIST_STORE(gtk_tree_view_get_model(hs->details));
- if (clear) {
- gtk_list_store_clear(store);
- invalidate_detail_iters(hs);
- }
- hs->num_details = 0;
-
- for (tmp = wlan_ep->details; tmp; tmp=tmp->next) {
- broadcast_flag = is_broadcast_bssid(&tmp->addr);
- basestation_flag = !broadcast_flag && addresses_data_equal(&tmp->addr, &wlan_ep->bssid);
-
- if ((wlan_ep->number_of_packets - wlan_ep->type[MGT_BEACON]) > 0) {
- f = (float)(((float)tmp->number_of_packets * 100.0) / (wlan_ep->number_of_packets - wlan_ep->type[MGT_BEACON]));
- } else {
- f = 0.0f;
- }
-
- addr_str = get_conversation_address(NULL, &tmp->addr, hs->resolve_names);
-
- if (basestation_flag) {
- g_strlcpy (comment, "Base station", sizeof(comment));
- } else {
- g_strlcpy (comment, " ", sizeof(comment));
- }
- g_snprintf (percent, sizeof(percent), "%.2f %%", f);
-
- if (!tmp->iter_valid) {
- gtk_list_store_append(store, &tmp->iter);
- tmp->iter_valid = TRUE;
- }
- gtk_list_store_set(store, &tmp->iter,
- ADDRESS_COLUMN, addr_str,
- PERCENT_2_COLUMN, percent,
- DATA_SENT_COLUMN, tmp->data_sent,
- DATA_REC_COLUMN, tmp->data_received,
- PROBE_REQ_2_COLUMN, tmp->probe_req,
- PROBE_RESP_2_COLUMN, tmp->probe_rsp,
- AUTH_2_COLUMN, tmp->auth,
- DEAUTH_2_COLUMN, tmp->deauth,
- OTHER_2_COLUMN, tmp->other,
- COMMENT_COLUMN, comment,
- PERCENT_VALUE_2_COLUMN, f,
- DETAILS_COLUMN, tmp,
- -1);
-
- hs->num_details++;
- wmem_free(NULL, addr_str);
- }
-}
-
-static void
-wlanstat_draw(void *phs)
-{
- wlanstat_t *hs = (wlanstat_t *)phs;
- wlan_ep_t *list = hs->ep_list, *tmp;
- guint32 data = 0, other = 0;
- char *bssid, channel[256], ssid[256], percent[256];
- float f;
- GtkListStore *store;
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- GtkTreeIter iter;
- gchar *ssid_temp;
-
- store = GTK_LIST_STORE(gtk_tree_view_get_model(hs->table));
- hs->num_entries = 0;
-
- for (tmp = list; tmp; tmp=tmp->next) {
-
- if (hs->show_only_existing && tmp->is_broadcast) {
- if (tmp->iter_valid) {
- gtk_list_store_remove(store, &tmp->iter);
- tmp->iter_valid = FALSE;
- }
- continue;
- }
-
- data = tmp->type[DATA] + tmp->type[DATA_CF_ACK] + tmp->type[DATA_CF_POLL] + tmp->type[DATA_CF_ACK_POLL] +
- tmp->type[DATA_QOS_DATA] + tmp->type[DATA_QOS_DATA_CF_ACK] + tmp->type[DATA_QOS_DATA_CF_POLL] + tmp->type[DATA_QOS_DATA_CF_ACK_POLL];
- other = tmp->number_of_packets - data - tmp->type[MGT_BEACON] - tmp->type[MGT_PROBE_REQ] -
- tmp->type[MGT_PROBE_RESP] - tmp->type[MGT_AUTHENTICATION] - tmp->type[MGT_DEAUTHENTICATION];
- f = (float)(((float)tmp->number_of_packets * 100.0) / hs->number_of_packets);
-
- bssid = get_conversation_address(NULL, &tmp->bssid, hs->resolve_names);
- if (tmp->stats.channel) {
- g_snprintf (channel, sizeof(channel), "%u", tmp->stats.channel);
- } else {
- channel[0] = '\0';
- }
- if (tmp->stats.ssid_len == 0) {
- g_strlcpy (ssid, "<Broadcast>", sizeof(ssid));
- } else if (tmp->stats.ssid_len == 1 && tmp->stats.ssid[0] == 0) {
- g_strlcpy (ssid, "<Hidden>", sizeof(ssid));
- } else {
- ssid_temp = format_text(NULL, tmp->stats.ssid, tmp->stats.ssid_len);
- g_strlcpy (ssid, ssid_temp, sizeof(ssid));
- wmem_free(NULL, ssid_temp);
- }
- g_snprintf (percent, sizeof(percent), "%.2f %%", f);
-
- if (!tmp->iter_valid) {
- gtk_list_store_append(store, &tmp->iter);
- tmp->iter_valid = TRUE;
- }
- gtk_list_store_set (store, &tmp->iter,
- BSSID_COLUMN, bssid,
- CHANNEL_COLUMN, channel,
- SSID_COLUMN, ssid,
- PERCENT_COLUMN, percent,
- BEACONS_COLUMN, tmp->type[MGT_BEACON],
- DATA_COLUMN, data,
- PROBE_REQ_COLUMN, tmp->type[MGT_PROBE_REQ],
- PROBE_RESP_COLUMN, tmp->type[MGT_PROBE_RESP],
- AUTH_COLUMN, tmp->type[MGT_AUTHENTICATION],
- DEAUTH_COLUMN, tmp->type[MGT_DEAUTHENTICATION],
- OTHER_COLUMN, other,
- PROTECTION_COLUMN, tmp->stats.protection,
- PERCENT_VALUE_COLUMN, f,
- TABLE_COLUMN, tmp,
- -1);
-
- hs->num_entries++;
- wmem_free(NULL, bssid);
- }
-
- sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(hs->table));
- if (gtk_tree_selection_get_selected (sel, &model, &iter)) {
- wlan_ep_t *ep;
-
- gtk_tree_model_get (model, &iter, TABLE_COLUMN, &ep, -1);
- wlanstat_draw_details (hs, ep, FALSE);
- }
-}
-
-/* What to do when a list item is selected/unselected */
-static void
-wlan_select_cb(GtkTreeSelection *sel, gpointer data)
-{
- wlanstat_t *hs = (wlanstat_t *)data;
- wlan_ep_t *ep;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- if (gtk_tree_selection_get_selected (sel, &model, &iter)) {
- gtk_tree_model_get (model, &iter, TABLE_COLUMN, &ep, -1);
- wlanstat_draw_details (hs, ep, TRUE);
- }
-}
-
-
-static void
-wlan_resolve_toggle_dest(GtkWidget *widget, gpointer data)
-{
- wlanstat_t *hs = (wlanstat_t *)data;
-
- hs->resolve_names = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget));
-
- wlanstat_draw(hs);
-}
-
-static void
-wlan_filter_toggle_dest(GtkWidget *widget, gpointer data)
-{
- wlanstat_t *hs = (wlanstat_t *)data;
- const char *filter = NULL;
-
- hs->use_dfilter = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget));
- if (hs->use_dfilter) {
- filter = gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget));
- }
-
- set_tap_dfilter(hs, filter);
-
- cf_retap_packets(&cfile);
- gdk_window_raise(gtk_widget_get_window(wlanstat_dlg_w));
-}
-
-static void
-wlan_existing_toggle_dest(GtkWidget *widget, gpointer data)
-{
- wlanstat_t *hs = (wlanstat_t *)data;
-
- hs->show_only_existing = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget));
-
- wlanstat_draw(hs);
-}
-
-static gboolean
-csv_handle(GtkTreeModel *model, GtkTreePath *path _U_, GtkTreeIter *iter,
- gpointer data)
-{
- GString *CSV_str = (GString *)data;
- gchar *table_text;
- gint table_value;
- int i;
-
- for (i=0; i<=PROTECTION_COLUMN; i++) {
- if (i == BSSID_COLUMN || i == CHANNEL_COLUMN || i == SSID_COLUMN ||
- i == PERCENT_COLUMN || i == PROTECTION_COLUMN) {
- gtk_tree_model_get(model, iter, i, &table_text, -1);
- g_string_append_printf(CSV_str, "\"%s\"", table_text);
- g_free(table_text);
- } else {
- gtk_tree_model_get(model, iter, i, &table_value, -1);
- g_string_append_printf(CSV_str, "\"%u\"", table_value);
- }
- if (i != PROTECTION_COLUMN)
- g_string_append(CSV_str,",");
- }
- g_string_append(CSV_str,"\n");
-
- return FALSE;
-}
-
-static void
-wlan_copy_as_csv(GtkWindow *win _U_, gpointer data)
-{
- int i;
- GString *CSV_str = g_string_new("");
- GtkClipboard *cb;
- GtkTreeView *tree_view = GTK_TREE_VIEW(data);
- GtkListStore *store;
-
- /* Add the column headers to the CSV data */
- for (i=0; i<=PROTECTION_COLUMN; i++) {
- g_string_append_printf(CSV_str, "\"%s\"", titles[i]);
- if (i != PROTECTION_COLUMN)
- g_string_append(CSV_str, ",");
- }
- g_string_append(CSV_str,"\n");
-
- /* Add the column values to the CSV data */
- store = GTK_LIST_STORE(gtk_tree_view_get_model(tree_view));
- gtk_tree_model_foreach(GTK_TREE_MODEL(store), csv_handle, CSV_str);
-
- /* Now that we have the CSV data, copy it into the default clipboard */
- cb = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
- gtk_clipboard_set_text(cb, CSV_str->str, -1);
- g_string_free(CSV_str, TRUE);
-}
-
-static void
-win_destroy_cb (GtkWindow *win _U_, gpointer data)
-{
- wlanstat_t *hs = (wlanstat_t *)data;
-
- remove_tap_listener (hs);
-
- if (wlanstat_dlg_w != NULL) {
- window_destroy(wlanstat_dlg_w);
- wlanstat_dlg_w = NULL;
- }
- wlanstat_reset(hs);
- g_free(hs);
-
- recent.gui_geometry_wlan_stats_pane =
- gtk_paned_get_position(GTK_PANED(wlanstat_pane));
-}
-
-/* Filter value */
-#define VALUE_BSSID_ONLY 0
-#define VALUE_SSID_ONLY 1
-#define VALUE_BSSID_AND_SSID 2
-#define VALUE_BSSID_OR_SSID 3
-
-static void
-wlan_select_filter_cb(GtkWidget *widget _U_, gpointer callback_data, guint callback_action)
-{
- int value;
- wlanstat_t *hs = (wlanstat_t *)callback_data;
- char *str = NULL;
- wlan_ep_t *ep;
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- GtkTreeIter iter;
- char *addr_str;
- gchar *ssid_temp;
-
- sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(hs->table));
- if (!gtk_tree_selection_get_selected(sel, &model, &iter))
- return;
- gtk_tree_model_get (model, &iter, TABLE_COLUMN, &ep, -1);
-
- value = FILTER_EXTRA(callback_action);
-
- addr_str = (char*)address_to_str(NULL, &ep->bssid);
- switch (value) {
- case VALUE_BSSID_ONLY:
- str = g_strdup_printf("wlan.bssid==%s", addr_str);
- break;
- case VALUE_SSID_ONLY:
- ssid_temp = format_text(NULL, ep->stats.ssid, ep->stats.ssid_len);
- str = g_strdup_printf("wlan.ssid==\"%s\"", ssid_temp);
- wmem_free(NULL, ssid_temp);
- break;
- case VALUE_BSSID_AND_SSID:
- ssid_temp = format_text(NULL, ep->stats.ssid, ep->stats.ssid_len);
- str = g_strdup_printf("wlan.bssid==%s && wlan.ssid==\"%s\"",
- addr_str, ssid_temp);
- wmem_free(NULL, ssid_temp);
- break;
- case VALUE_BSSID_OR_SSID:
- ssid_temp = format_text(NULL, ep->stats.ssid, ep->stats.ssid_len);
- str = g_strdup_printf("wlan.bssid==%s || wlan.ssid==\"%s\"",
- addr_str, ssid_temp);
- wmem_free(NULL, ssid_temp);
- break;
- default:
- g_assert_not_reached();
- }
- wmem_free(NULL, addr_str);
-
- apply_selected_filter (callback_action, str);
-
- g_free (str);
-}
-
-static void
-wlan_details_select_filter_cb(GtkWidget *widget _U_, gpointer callback_data, guint callback_action)
-{
- wlanstat_t *hs = (wlanstat_t *)callback_data;
- char *str;
- wlan_details_ep_t *ep;
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- GtkTreeIter iter;
- char *addr_str;
-
- sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(hs->details));
- if (!gtk_tree_selection_get_selected(sel, &model, &iter))
- return;
- gtk_tree_model_get (model, &iter, DETAILS_COLUMN, &ep, -1);
-
- addr_str = (char*)address_to_str(NULL, &ep->addr);
- str = g_strdup_printf("wlan.addr==%s", addr_str);
-
- apply_selected_filter (callback_action, str);
-
- g_free (str);
- wmem_free(NULL, addr_str);
-}
-
-static gboolean
-wlan_show_popup_menu_cb(void *widg _U_, GdkEvent *event, wlanstat_t *et)
-{
- GdkEventButton *bevent = (GdkEventButton *)event;
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- /* To qoute the "Gdk Event Structures" doc:
- * "Normally button 1 is the left mouse button, 2 is the middle button, and 3 is the right button" */
- if ((event->type == GDK_BUTTON_PRESS) && (bevent->button == 3)) {
- /* If this is a right click on one of our columns, popup the context menu */
- sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(et->table));
- if (gtk_tree_selection_get_selected (sel, &model, &iter)) {
- gtk_menu_popup(GTK_MENU(et->menu), NULL, NULL, NULL, NULL,
- bevent->button, bevent->time);
- }
- }
-
- return FALSE;
-}
-
-/* Apply as Filter/Selected */
-static void
-wlan_select_filter_as_selected_BSSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_SELECTED, VALUE_BSSID_ONLY));
-}
-
-static void
-wlan_select_filter_as_selected_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_SELECTED, VALUE_SSID_ONLY));
-}
-
-static void
-wlan_select_filter_as_selected_BSSID_and_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_SELECTED, VALUE_BSSID_AND_SSID));
-}
-
-static void
-wlan_select_filter_as_selected_BSSID_or_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_SELECTED, VALUE_BSSID_OR_SSID));
-}
-
-/* Apply as Filter/Not Selected */
-static void
-wlan_select_filter_as_not_selected_BSSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_NOT_SELECTED, VALUE_BSSID_ONLY));
-}
-
-static void
-wlan_select_filter_as_not_selected_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_NOT_SELECTED, VALUE_SSID_ONLY));
-}
-
-static void
-wlan_select_filter_as_not_selected_BSSID_and_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_NOT_SELECTED, VALUE_BSSID_AND_SSID));
-}
-
-static void
-wlan_select_filter_as_not_selected_BSSID_or_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_NOT_SELECTED, VALUE_BSSID_OR_SSID));
-}
-
-/* /Apply as Filter/... and Selected */
-static void
-wlan_select_filter_and_selected_BSSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_AND_SELECTED, VALUE_BSSID_ONLY));
-}
-
-static void
-wlan_select_filter_and_selected_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_AND_SELECTED, VALUE_SSID_ONLY));
-}
-
-static void
-wlan_select_filter_and_selected_BSSID_and_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_AND_SELECTED, VALUE_BSSID_AND_SSID));
-}
-
-static void
-wlan_select_filter_and_selected_BSSID_or_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_AND_SELECTED, VALUE_BSSID_OR_SSID));
-}
-
-/* /Apply as Filter/... or Selected */
-static void
-wlan_select_filter_or_selected_BSSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_OR_SELECTED, VALUE_BSSID_ONLY));
-}
-
-static void
-wlan_select_filter_or_selected_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_OR_SELECTED, VALUE_SSID_ONLY));
-}
-
-static void
-wlan_select_filter_or_selected_BSSID_and_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_OR_SELECTED, VALUE_BSSID_AND_SSID));
-}
-
-static void
-wlan_select_filter_or_selected_BSSID_or_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_OR_SELECTED, VALUE_BSSID_OR_SSID));
-}
-
-/* /Apply as Filter/... and not Selected */
-static void
-wlan_select_filter_and_not_selected_BSSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_AND_NOT_SELECTED, VALUE_BSSID_ONLY));
-}
-
-static void
-wlan_select_filter_and_not_selected_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_AND_NOT_SELECTED, VALUE_SSID_ONLY));
-}
-
-static void
-wlan_select_filter_and_not_selected_BSSID_and_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_AND_NOT_SELECTED, VALUE_BSSID_AND_SSID));
-}
-
-static void
-wlan_select_filter_and_not_selected_BSSID_or_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_AND_NOT_SELECTED, VALUE_BSSID_OR_SSID));
-}
-
-/* /Apply as Filter/... or not Selected */
-static void
-wlan_select_filter_or_not_selected_BSSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_OR_NOT_SELECTED, VALUE_BSSID_ONLY));
-}
-
-static void
-wlan_select_filter_or_not_selected_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_OR_NOT_SELECTED, VALUE_SSID_ONLY));
-}
-
-static void
-wlan_select_filter_or_not_selected_BSSID_and_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_OR_NOT_SELECTED, VALUE_BSSID_AND_SSID));
-}
-
-static void
-wlan_select_filter_or_not_selected_BSSID_or_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_OR_NOT_SELECTED, VALUE_BSSID_OR_SSID));
-}
-
-/* Prepare */
-/* Prepare a Filter/Selected */
-static void
-wlan_prepare_filter_as_selected_BSSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_SELECTED, VALUE_BSSID_ONLY));
-}
-
-static void
-wlan_prepare_filter_as_selected_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_SELECTED, VALUE_SSID_ONLY));
-}
-
-static void
-wlan_prepare_filter_as_selected_BSSID_and_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_SELECTED, VALUE_BSSID_AND_SSID));
-}
-
-static void
-wlan_prepare_filter_as_selected_BSSID_or_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_SELECTED, VALUE_BSSID_OR_SSID));
-}
-
-/* Prepare a Filter/Not Selected */
-static void
-wlan_prepare_filter_as_not_selected_BSSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_NOT_SELECTED, VALUE_BSSID_ONLY));
-}
-
-static void
-wlan_prepare_filter_as_not_selected_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_NOT_SELECTED, VALUE_SSID_ONLY));
-}
-
-static void
-wlan_prepare_filter_as_not_selected_BSSID_and_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_NOT_SELECTED, VALUE_BSSID_AND_SSID));
-}
-
-static void
-wlan_prepare_filter_as_not_selected_BSSID_or_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_NOT_SELECTED, VALUE_BSSID_OR_SSID));
-}
-
-/* /Prepare a Filter/... and Selected */
-static void
-wlan_prepare_filter_and_selected_BSSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_AND_SELECTED, VALUE_BSSID_ONLY));
-}
-
-static void
-wlan_prepare_filter_and_selected_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_AND_SELECTED, VALUE_SSID_ONLY));
-}
-
-static void
-wlan_prepare_filter_and_selected_BSSID_and_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_AND_SELECTED, VALUE_BSSID_AND_SSID));
-}
-
-static void
-wlan_prepare_filter_and_selected_BSSID_or_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_AND_SELECTED, VALUE_BSSID_OR_SSID));
-}
-
-/* /Prepare a Filter/... or Selected */
-static void
-wlan_prepare_filter_or_selected_BSSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_OR_SELECTED, VALUE_BSSID_ONLY));
-}
-
-static void
-wlan_prepare_filter_or_selected_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_OR_SELECTED, VALUE_SSID_ONLY));
-}
-
-static void
-wlan_prepare_filter_or_selected_BSSID_and_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_OR_SELECTED, VALUE_BSSID_AND_SSID));
-}
-
-static void
-wlan_prepare_filter_or_selected_BSSID_or_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_OR_SELECTED, VALUE_BSSID_OR_SSID));
-}
-
-/* /Prepare a Filter/... and not Selected */
-static void
-wlan_prepare_filter_and_not_selected_BSSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_AND_NOT_SELECTED, VALUE_BSSID_ONLY));
-}
-
-static void
-wlan_prepare_filter_and_not_selected_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_AND_NOT_SELECTED, VALUE_SSID_ONLY));
-}
-
-static void
-wlan_prepare_filter_and_not_selected_BSSID_and_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_AND_NOT_SELECTED, VALUE_BSSID_AND_SSID));
-}
-
-static void
-wlan_prepare_filter_and_not_selected_BSSID_or_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_AND_NOT_SELECTED, VALUE_BSSID_OR_SSID));
-}
-
-/* /Prepare a Filter/... or not Selected */
-static void
-wlan_prepare_filter_or_not_selected_BSSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_OR_NOT_SELECTED, VALUE_BSSID_ONLY));
-}
-
-static void
-wlan_prepare_filter_or_not_selected_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_OR_NOT_SELECTED, VALUE_SSID_ONLY));
-}
-
-static void
-wlan_prepare_filter_or_not_selected_BSSID_and_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_OR_NOT_SELECTED, VALUE_BSSID_AND_SSID));
-}
-static void
-wlan_prepare_filter_or_not_selected_BSSID_or_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_OR_NOT_SELECTED, VALUE_BSSID_OR_SSID));
-}
-
-/* /Find frame/Find Frame/ */
-static void
-wlan_find_frame_BSSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_FIND_FRAME(ACTYPE_SELECTED, VALUE_BSSID_ONLY));
-}
-static void
-wlan_find_frame_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_FIND_FRAME(ACTYPE_SELECTED, VALUE_SSID_ONLY));
-}
-static void
-wlan_find_frame_BSSID_and_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_FIND_FRAME(ACTYPE_SELECTED, VALUE_BSSID_AND_SSID));
-}
-static void
-wlan_find_frame_BSSID_or_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_FIND_FRAME(ACTYPE_SELECTED, VALUE_BSSID_OR_SSID));
-}
-
-/* /Find frame/Find Next/ */
-static void
-wlan_find_frame_next_BSSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_FIND_NEXT(ACTYPE_SELECTED, VALUE_BSSID_ONLY));
-}
-static void
-wlan_find_frame_next_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_FIND_NEXT(ACTYPE_SELECTED, VALUE_SSID_ONLY));
-}
-static void
-wlan_find_frame_next_BSSID_and_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_FIND_NEXT(ACTYPE_SELECTED, VALUE_BSSID_AND_SSID));
-}
-static void
-wlan_find_frame_next_BSSID_or_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_FIND_NEXT(ACTYPE_SELECTED, VALUE_BSSID_OR_SSID));
-}
-/* /Find frame/Find Previous/ */
-static void
-wlan_find_frame_previous_BSSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_FIND_PREVIOUS(ACTYPE_SELECTED, VALUE_BSSID_ONLY));
-}
-static void
-wlan_find_frame_previous_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_FIND_PREVIOUS(ACTYPE_SELECTED, VALUE_SSID_ONLY));
-}
-static void
-wlan_find_frame_previous_BSSID_and_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_FIND_PREVIOUS(ACTYPE_SELECTED, VALUE_BSSID_AND_SSID));
-}
-static void
-wlan_find_frame_previous_BSSID_or_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_FIND_PREVIOUS(ACTYPE_SELECTED, VALUE_BSSID_OR_SSID));
-}
-
-/* /Colorize/ */
-static void
-wlan_colorize_BSSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_COLORIZE(ACTYPE_SELECTED, VALUE_BSSID_ONLY));
-}
-static void
-wlan_colorize_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_COLORIZE(ACTYPE_SELECTED, VALUE_SSID_ONLY));
-}
-static void
-wlan_colorize_BSSID_and_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_COLORIZE(ACTYPE_SELECTED, VALUE_BSSID_AND_SSID));
-}
-static void
-wlan_colorize_BSSID_or_SSID_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_select_filter_cb( widget , user_data, CALLBACK_COLORIZE(ACTYPE_SELECTED, VALUE_BSSID_OR_SSID));
-}
-
-
-static const char *ui_desc_wlan_stat_filter_popup =
-"<ui>\n"
-" <popup name='WlanStatFilterPopup' action='PopupAction'>\n"
-" <menu name= 'ApplyAsFilter' action='/Apply as Filter'>\n"
-" <menu name= 'ApplyAsFilterSelected' action='/Apply as Filter/Selected'>\n"
-" <menuitem action='/Apply as Filter/Selected/BSSID'/>\n"
-" <menuitem action='/Apply as Filter/Selected/SSID'/>\n"
-" <menuitem action='/Apply as Filter/Selected/BSSID and SSID'/>\n"
-" <menuitem action='/Apply as Filter/Selected/BSSID or SSID'/>\n"
-" </menu>\n"
-" <menu name= 'ApplyAsFilterNotSelected' action='/Apply as Filter/Not Selected'>\n"
-" <menuitem action='/Apply as Filter/Not Selected/BSSID'/>\n"
-" <menuitem action='/Apply as Filter/Not Selected/SSID'/>\n"
-" <menuitem action='/Apply as Filter/Not Selected/BSSID and SSID'/>\n"
-" <menuitem action='/Apply as Filter/Not Selected/BSSID or SSID'/>\n"
-" </menu>\n"
-" <menu name= 'ApplyAsFilterAndSelected' action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected'>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/BSSID'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/SSID'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/BSSID and SSID'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/BSSID or SSID'/>\n"
-" </menu>\n"
-" <menu name= 'ApplyAsFilterOrSelected' action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected'>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/BSSID'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/SSID'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/BSSID and SSID'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/BSSID or SSID'/>\n"
-" </menu>\n"
-" <menu name= 'ApplyAsFilterAndNotSelected' action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected'>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/BSSID'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/SSID'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/BSSID and SSID'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/BSSID or SSID'/>\n"
-" </menu>\n"
-" <menu name= 'ApplyAsFilterOrNotSelected' action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected'>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/BSSID'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/SSID'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/BSSID and SSID'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/BSSID or SSID'/>\n"
-" </menu>\n"
-" </menu>\n"
-" <menu name= 'PrepareAFilter' action='/Prepare a Filter'>\n"
-" <menu name= 'PrepareAFilterSelected' action='/Prepare a Filter/Selected'>\n"
-" <menuitem action='/Prepare a Filter/Selected/BSSID'/>\n"
-" <menuitem action='/Prepare a Filter/Selected/SSID'/>\n"
-" <menuitem action='/Prepare a Filter/Selected/BSSID and SSID'/>\n"
-" <menuitem action='/Prepare a Filter/Selected/BSSID or SSID'/>\n"
-" </menu>\n"
-" <menu name= 'PrepareAFilterNotSelected' action='/Prepare a Filter/Not Selected'>\n"
-" <menuitem action='/Prepare a Filter/Not Selected/BSSID'/>\n"
-" <menuitem action='/Prepare a Filter/Not Selected/SSID'/>\n"
-" <menuitem action='/Prepare a Filter/Not Selected/BSSID and SSID'/>\n"
-" <menuitem action='/Prepare a Filter/Not Selected/BSSID or SSID'/>\n"
-" </menu>\n"
-" <menu name= 'PrepareAFilterAndSelected' action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected'>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/BSSID'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/SSID'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/BSSID and SSID'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/BSSID or SSID'/>\n"
-" </menu>\n"
-" <menu name= 'PrepareAFilterOrSelected' action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected'>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/BSSID'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/SSID'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/BSSID and SSID'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/BSSID or SSID'/>\n"
-" </menu>\n"
-" <menu name= 'PrepareAFilterAndNotSelected' action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected'>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/BSSID'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/SSID'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/BSSID and SSID'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/BSSID or SSID'/>\n"
-" </menu>\n"
-" <menu name= 'PrepareAFilterOrNotSelected' action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected'>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/BSSID'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/SSID'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/BSSID and SSID'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/BSSID or SSID'/>\n"
-" </menu>\n"
-" </menu>\n"
-" <menu name= 'FindFrame' action='/Find Frame'>\n"
-" <menu name= 'FindFrameFindFrame' action='/Find Frame/Find Frame'>\n"
-" <menuitem action='/Find Frame/Find Frame/BSSID'/>\n"
-" <menuitem action='/Find Frame/Find Frame/SSID'/>\n"
-" <menuitem action='/Find Frame/Find Frame/BSSID and SSID'/>\n"
-" <menuitem action='/Find Frame/Find Frame/BSSID or SSID'/>\n"
-" </menu>\n"
-" <menu name= 'FindFrameNext' action='/Find Frame/Find Next'>\n"
-" <menuitem action='/Find Frame/Find Next/BSSID'/>\n"
-" <menuitem action='/Find Frame/Find Next/SSID'/>\n"
-" <menuitem action='/Find Frame/Find Next/BSSID and SSID'/>\n"
-" <menuitem action='/Find Frame/Find Next/BSSID or SSID'/>\n"
-" </menu>\n"
-" <menu name= 'FindFramePrevious' action='/Find Frame/Find Previous'>\n"
-" <menuitem action='/Find Frame/Find Previous/BSSID'/>\n"
-" <menuitem action='/Find Frame/Find Previous/SSID'/>\n"
-" <menuitem action='/Find Frame/Find Previous/BSSID and SSID'/>\n"
-" <menuitem action='/Find Frame/Find Previous/BSSID or SSID'/>\n"
-" </menu>\n"
-" </menu>\n"
-" <menu name= 'Colorize' action='/Colorize'>\n"
-" <menuitem action='/Colorize/BSSID'/>\n"
-" <menuitem action='/Colorize/SSID'/>\n"
-" <menuitem action='/Colorize/BSSID and SSID'/>\n"
-" <menuitem action='/Colorize/BSSID or SSID'/>\n"
-" </menu>\n"
-" </popup>\n"
-"</ui>\n";
-
-/*
- * GtkActionEntry
- * typedef struct {
- * const gchar *name;
- * const gchar *stock_id;
- * const gchar *label;
- * const gchar *accelerator;
- * const gchar *tooltip;
- * GCallback callback;
- * } GtkActionEntry;
- * const gchar *name; The name of the action.
- * const gchar *stock_id; The stock id for the action, or the name of an icon from the icon theme.
- * const gchar *label; The label for the action. This field should typically be marked for translation,
- * see gtk_action_group_set_translation_domain().
- * If label is NULL, the label of the stock item with id stock_id is used.
- * const gchar *accelerator; The accelerator for the action, in the format understood by gtk_accelerator_parse().
- * const gchar *tooltip; The tooltip for the action. This field should typically be marked for translation,
- * see gtk_action_group_set_translation_domain().
- * GCallback callback; The function to call when the action is activated.
- *
- */
-static const GtkActionEntry wlans_stat_popup_entries[] = {
- /* Top level */
- { "/Apply as Filter", NULL, "Apply as Filter", NULL, NULL, NULL },
- { "/Prepare a Filter", NULL, "Prepare a Filter", NULL, NULL, NULL },
- { "/Find Frame", NULL, "Find Frame", NULL, NULL, NULL },
- { "/Colorize", NULL, "Colorize", NULL, NULL, NULL },
-
- /* Apply as */
- { "/Apply as Filter/Selected", NULL, "Selected" , NULL, NULL, NULL },
- { "/Apply as Filter/Not Selected", NULL, "Not Selected", NULL, NULL, NULL },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, NULL, NULL },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, NULL, NULL },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, NULL, NULL },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, NULL, NULL },
-
- /* Apply as Selected */
- { "/Apply as Filter/Selected/BSSID", NULL, "BSSID", NULL, "BSSID", G_CALLBACK(wlan_select_filter_as_selected_BSSID_cb)},
- { "/Apply as Filter/Selected/SSID", NULL, "SSID", NULL, "SSID", G_CALLBACK(wlan_select_filter_as_selected_SSID_cb)},
- { "/Apply as Filter/Selected/BSSID and SSID", NULL, "BSSID and SSID", NULL, "BSSID and SSID", G_CALLBACK(wlan_select_filter_as_selected_BSSID_and_SSID_cb)},
- { "/Apply as Filter/Selected/BSSID or SSID", NULL, "BSSID or SSID", NULL, "BSSID or SSID", G_CALLBACK(wlan_select_filter_as_selected_BSSID_or_SSID_cb)},
-
- /* Apply as Not Selected */
- { "/Apply as Filter/Not Selected/BSSID", NULL, "BSSID", NULL, "BSSID", G_CALLBACK(wlan_select_filter_as_not_selected_BSSID_cb)},
- { "/Apply as Filter/Not Selected/SSID", NULL, "SSID", NULL, "SSID", G_CALLBACK(wlan_select_filter_as_not_selected_SSID_cb)},
- { "/Apply as Filter/Not Selected/BSSID and SSID", NULL, "BSSID and SSID", NULL, "BSSID and SSID", G_CALLBACK(wlan_select_filter_as_not_selected_BSSID_and_SSID_cb)},
- { "/Apply as Filter/Not Selected/BSSID or SSID", NULL, "BSSID or SSID", NULL, "BSSID or SSID", G_CALLBACK(wlan_select_filter_as_not_selected_BSSID_or_SSID_cb)},
-
- /* Apply as and Selected */
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/BSSID", NULL, "BSSID", NULL, "BSSID", G_CALLBACK(wlan_select_filter_and_selected_BSSID_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/SSID", NULL, "SSID", NULL, "SSID", G_CALLBACK(wlan_select_filter_and_selected_SSID_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/BSSID and SSID", NULL, "BSSID and SSID", NULL, "BSSID and SSID", G_CALLBACK(wlan_select_filter_and_selected_BSSID_and_SSID_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/BSSID or SSID", NULL, "BSSID or SSID", NULL, "BSSID or SSID", G_CALLBACK(wlan_select_filter_and_selected_BSSID_or_SSID_cb)},
-
- /* Apply as or Selected */
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/BSSID", NULL, "BSSID", NULL, "BSSID", G_CALLBACK(wlan_select_filter_or_selected_BSSID_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/SSID", NULL, "SSID", NULL, "SSID", G_CALLBACK(wlan_select_filter_or_selected_SSID_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/BSSID and SSID", NULL, "BSSID and SSID", NULL, "BSSID and SSID", G_CALLBACK(wlan_select_filter_or_selected_BSSID_and_SSID_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/BSSID or SSID", NULL, "BSSID or SSID", NULL, "BSSID or SSID", G_CALLBACK(wlan_select_filter_or_selected_BSSID_or_SSID_cb)},
-
- /* /Apply as Filter/... and not Selected */
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/BSSID", NULL, "BSSID", NULL, "BSSID", G_CALLBACK(wlan_select_filter_and_not_selected_BSSID_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/SSID", NULL, "SSID", NULL, "SSID", G_CALLBACK(wlan_select_filter_and_not_selected_SSID_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/BSSID and SSID", NULL, "BSSID and SSID", NULL, "BSSID and SSID", G_CALLBACK(wlan_select_filter_and_not_selected_BSSID_and_SSID_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/BSSID or SSID", NULL, "BSSID or SSID", NULL, "BSSID or SSID", G_CALLBACK(wlan_select_filter_and_not_selected_BSSID_or_SSID_cb)},
-
- /* /Apply as Filter/... or not Selected */
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/BSSID", NULL, "BSSID", NULL, "BSSID", G_CALLBACK(wlan_select_filter_or_not_selected_BSSID_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/SSID", NULL, "SSID", NULL, "SSID", G_CALLBACK(wlan_select_filter_or_not_selected_SSID_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/BSSID and SSID", NULL, "BSSID and SSID", NULL, "BSSID and SSID", G_CALLBACK(wlan_select_filter_or_not_selected_BSSID_and_SSID_cb)},
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/BSSID or SSID", NULL, "BSSID or SSID", NULL, "BSSID or SSID", G_CALLBACK(wlan_select_filter_or_not_selected_BSSID_or_SSID_cb)},
-
- /* Prepare a */
- { "/Prepare a Filter/Selected", NULL, "Selected" , NULL, NULL, NULL },
- { "/Prepare a Filter/Not Selected", NULL, "Not Selected", NULL, NULL, NULL },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, NULL, NULL },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, NULL, NULL },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, NULL, NULL },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, NULL, NULL },
-
- /* Prepare a Selected */
- { "/Prepare a Filter/Selected/BSSID", NULL, "BSSID", NULL, "BSSID", G_CALLBACK(wlan_prepare_filter_as_selected_BSSID_cb)},
- { "/Prepare a Filter/Selected/SSID", NULL, "SSID", NULL, "SSID", G_CALLBACK(wlan_prepare_filter_as_selected_SSID_cb)},
- { "/Prepare a Filter/Selected/BSSID and SSID",NULL, "BSSID and SSID", NULL, "BSSID and SSID", G_CALLBACK(wlan_prepare_filter_as_selected_BSSID_and_SSID_cb)},
- { "/Prepare a Filter/Selected/BSSID or SSID", NULL, "BSSID or SSID", NULL, "BSSID or SSID", G_CALLBACK(wlan_prepare_filter_as_selected_BSSID_or_SSID_cb)},
-
- /* Prepare a Not Selected */
- { "/Prepare a Filter/Not Selected/BSSID", NULL, "BSSID", NULL, "BSSID", G_CALLBACK(wlan_prepare_filter_as_not_selected_BSSID_cb)},
- { "/Prepare a Filter/Not Selected/SSID", NULL, "SSID", NULL, "SSID", G_CALLBACK(wlan_prepare_filter_as_not_selected_SSID_cb)},
- { "/Prepare a Filter/Not Selected/BSSID and SSID",NULL, "BSSID and SSID", NULL, "BSSID and SSID", G_CALLBACK(wlan_prepare_filter_as_not_selected_BSSID_and_SSID_cb)},
- { "/Prepare a Filter/Not Selected/BSSID or SSID", NULL, "BSSID or SSID", NULL, "BSSID or SSID", G_CALLBACK(wlan_prepare_filter_as_not_selected_BSSID_or_SSID_cb)},
-
- /* Prepare a and Selected */
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/BSSID", NULL, "BSSID", NULL, "BSSID", G_CALLBACK(wlan_prepare_filter_and_selected_BSSID_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/SSID", NULL, "SSID", NULL, "SSID", G_CALLBACK(wlan_prepare_filter_and_selected_SSID_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/BSSID and SSID", NULL, "BSSID and SSID", NULL, "BSSID and SSID", G_CALLBACK(wlan_prepare_filter_and_selected_BSSID_and_SSID_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected/BSSID or SSID", NULL, "BSSID or SSID", NULL, "BSSID or SSID", G_CALLBACK(wlan_prepare_filter_and_selected_BSSID_or_SSID_cb)},
-
- /* Prepare a or Selected */
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/BSSID", NULL, "BSSID", NULL, "BSSID", G_CALLBACK(wlan_prepare_filter_or_selected_BSSID_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/SSID", NULL, "SSID", NULL, "SSID", G_CALLBACK(wlan_prepare_filter_or_selected_SSID_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/BSSID and SSID", NULL, "BSSID and SSID", NULL, "BSSID and SSID", G_CALLBACK(wlan_prepare_filter_or_selected_BSSID_and_SSID_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected/BSSID or SSID", NULL, "BSSID or SSID", NULL, "BSSID or SSID", G_CALLBACK(wlan_prepare_filter_or_selected_BSSID_or_SSID_cb)},
-
- /* /Prepare a Filter/... and not Selected */
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/BSSID", NULL, "BSSID", NULL, "BSSID", G_CALLBACK(wlan_prepare_filter_and_not_selected_BSSID_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/SSID", NULL, "SSID", NULL, "SSID", G_CALLBACK(wlan_prepare_filter_and_not_selected_SSID_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/BSSID and SSID", NULL, "BSSID and SSID", NULL, "BSSID and SSID", G_CALLBACK(wlan_prepare_filter_and_not_selected_BSSID_and_SSID_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected/BSSID or SSID", NULL, "BSSID or SSID", NULL, "BSSID or SSID", G_CALLBACK(wlan_prepare_filter_and_not_selected_BSSID_or_SSID_cb)},
-
- /* /Prepare a Filter/... or not Selected */
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/BSSID", NULL, "BSSID", NULL, "BSSID", G_CALLBACK(wlan_prepare_filter_or_not_selected_BSSID_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/SSID", NULL, "SSID", NULL, "SSID", G_CALLBACK(wlan_prepare_filter_or_not_selected_SSID_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/BSSID and SSID", NULL, "BSSID and SSID", NULL, "BSSID and SSID", G_CALLBACK(wlan_prepare_filter_or_not_selected_BSSID_and_SSID_cb)},
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected/BSSID or SSID", NULL, "BSSID or SSID", NULL, "BSSID or SSID", G_CALLBACK(wlan_prepare_filter_or_not_selected_BSSID_or_SSID_cb)},
-
- /* Find Frame*/
- { "/Find Frame/Find Frame", NULL, "Find Frame", NULL, NULL, NULL },
- { "/Find Frame/Find Next", NULL, "Find Next", NULL, NULL, NULL },
- { "/Find Frame/Find Previous", NULL, "Find Previous", NULL, NULL, NULL },
-
- /* Find Frame/Find Frame*/
- { "/Find Frame/Find Frame/BSSID", NULL, "BSSID", NULL, "BSSID", G_CALLBACK(wlan_find_frame_BSSID_cb)},
- { "/Find Frame/Find Frame/SSID", NULL, "SSID", NULL, "SSID", G_CALLBACK(wlan_find_frame_SSID_cb)},
- { "/Find Frame/Find Frame/BSSID and SSID", NULL, "SSID and SSID", NULL, "SSID and SSID", G_CALLBACK(wlan_find_frame_BSSID_and_SSID_cb)},
- { "/Find Frame/Find Frame/BSSID or SSID", NULL, "BSSID", NULL, "BSSID", G_CALLBACK(wlan_find_frame_BSSID_or_SSID_cb)},
-
- /* Find Frame/Find Next*/
- { "/Find Frame/Find Next/BSSID", NULL, "BSSID", NULL, "BSSID", G_CALLBACK(wlan_find_frame_next_BSSID_cb)},
- { "/Find Frame/Find Next/SSID", NULL, "SSID", NULL, "SSID", G_CALLBACK(wlan_find_frame_next_SSID_cb)},
- { "/Find Frame/Find Next/BSSID and SSID", NULL, "SSID and SSID", NULL, "SSID and SSID", G_CALLBACK(wlan_find_frame_next_BSSID_and_SSID_cb)},
- { "/Find Frame/Find Next/BSSID or SSID", NULL, "BSSID", NULL, "BSSID", G_CALLBACK(wlan_find_frame_next_BSSID_or_SSID_cb)},
-
- /* Find Frame/Find Previous*/
- { "/Find Frame/Find Previous/BSSID", NULL, "BSSID", NULL, "BSSID", G_CALLBACK(wlan_find_frame_previous_BSSID_cb)},
- { "/Find Frame/Find Previous/SSID", NULL, "SSID", NULL, "SSID", G_CALLBACK(wlan_find_frame_previous_SSID_cb)},
- { "/Find Frame/Find Previous/BSSID and SSID", NULL, "SSID and SSID", NULL, "SSID and SSID", G_CALLBACK(wlan_find_frame_previous_BSSID_and_SSID_cb)},
- { "/Find Frame/Find Previous/BSSID or SSID", NULL, "BSSID", NULL, "BSSID", G_CALLBACK(wlan_find_frame_previous_BSSID_or_SSID_cb)},
-
- /* Colorize */
- { "/Colorize/BSSID", NULL, "BSSID", NULL, "BSSID", G_CALLBACK(wlan_colorize_BSSID_cb)},
- { "/Colorize/SSID", NULL, "SSID", NULL, "SSID", G_CALLBACK(wlan_colorize_SSID_cb)},
- { "/Colorize/BSSID and SSID", NULL, "BSSID and SSID", NULL, "BSSID and SSID", G_CALLBACK(wlan_colorize_BSSID_and_SSID_cb)},
- { "/Colorize/BSSID or SSID", NULL, "BSSID or SSID", NULL, "BSSID or SSID", G_CALLBACK(wlan_colorize_BSSID_or_SSID_cb)},
-
-};
-
-static void
-wlan_create_popup_menu(wlanstat_t *hs)
-{
- GtkUIManager *ui_manager;
- GtkActionGroup *action_group;
- GError *error = NULL;
-
- action_group = gtk_action_group_new ("WlanFilterPopupActionGroup");
- gtk_action_group_add_actions (action_group, /* the action group */
- (GtkActionEntry *)wlans_stat_popup_entries, /* an array of action descriptions */
- G_N_ELEMENTS(wlans_stat_popup_entries), /* the number of entries */
- hs); /* data to pass to the action callbacks */
-
- ui_manager = gtk_ui_manager_new ();
- gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);
- gtk_ui_manager_add_ui_from_string (ui_manager,ui_desc_wlan_stat_filter_popup, -1, &error);
- if (error != NULL)
- {
- fprintf (stderr, "Warning: building Wlan Stat Filter popup failed: %s\n",
- error->message);
- g_error_free (error);
- error = NULL;
- }
- hs->menu = gtk_ui_manager_get_widget(ui_manager, "/WlanStatFilterPopup");
- g_signal_connect(hs->table, "button_press_event", G_CALLBACK(wlan_show_popup_menu_cb), hs);
-
-}
-
-static gboolean
-wlan_details_show_popup_menu_cb(void *widg _U_, GdkEvent *event, wlanstat_t *et)
-{
- GdkEventButton *bevent = (GdkEventButton *)event;
- GtkTreeSelection *sel;
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- /* To qoute the "Gdk Event Structures" doc:
- * "Normally button 1 is the left mouse button, 2 is the middle button, and 3 is the right button" */
- if ((event->type == GDK_BUTTON_PRESS) && (bevent->button == 3)) {
- /* if this is a right click on one of our columns, popup the context menu */
- sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(et->details));
- if (gtk_tree_selection_get_selected (sel, &model, &iter)) {
- gtk_menu_popup(GTK_MENU(et->details_menu), NULL, NULL, NULL, NULL,
- bevent->button, bevent->time);
- }
- }
-
- return FALSE;
-}
-
-/* Apply as Filter/ */
-
-static void
-wlan_details_apply_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_details_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_SELECTED, 0));
-}
-
-static void
-wlan_details_apply_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_details_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_NOT_SELECTED, 0));
-}
-
-static void
-wlan_details_apply_and_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_details_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_AND_SELECTED, 0));
-}
-
-static void
-wlan_details_apply_or_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_details_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_OR_SELECTED, 0));
-}
-
-static void
-wlan_details_apply_and_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_details_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_AND_NOT_SELECTED, 0));
-}
-
-static void
-wlan_details_apply_or_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_details_select_filter_cb( widget , user_data, CALLBACK_MATCH(ACTYPE_OR_NOT_SELECTED, 0));
-}
-/* Prepare a filter */
-static void
-wlan_details_prepare_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_details_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_SELECTED, 0));
-}
-
-static void
-wlan_details_prepare_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_details_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_NOT_SELECTED, 0));
-}
-
-static void
-wlan_details_prepare_and_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_details_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_AND_SELECTED, 0));
-}
-
-static void
-wlan_details_prepare_or_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_details_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_OR_SELECTED, 0));
-}
-
-static void
-wlan_details_prepare_and_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_details_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_AND_NOT_SELECTED, 0));
-}
-
-static void
-wlan_details_prepare_or_not_selected_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_details_select_filter_cb( widget , user_data, CALLBACK_PREPARE(ACTYPE_OR_NOT_SELECTED, 0));
-}
-
-static void
-wlan_details_find_frame_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_details_select_filter_cb( widget , user_data, CALLBACK_FIND_FRAME(ACTYPE_SELECTED, 0));
-}
-static void
-wlan_details_find_next_frame_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_details_select_filter_cb( widget , user_data, CALLBACK_FIND_FRAME(ACTYPE_OR_NOT_SELECTED, 0));
-}
-static void
-wlan_details_find_previous_frame_cb(GtkWidget *widget, gpointer user_data)
-{
- wlan_details_select_filter_cb( widget , user_data, CALLBACK_FIND_FRAME(ACTYPE_OR_NOT_SELECTED, 0));
-}
-
-
-static const char *ui_desc_wlan_details_filter_popup =
-"<ui>\n"
-" <popup name='WlanStatFilterPopup' action='PopupAction'>\n"
-" <menu name= 'ApplyAsFilter' action='/Apply as Filter'>\n"
-" <menuitem action='/Apply as Filter/Selected'/>\n"
-" <menuitem action='/Apply as Filter/Not Selected'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected'/>\n"
-" <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected'/>\n"
-" </menu>\n"
-" <menu name= 'PrepareAFilter' action='/Prepare a Filter'>\n"
-" <menuitem action='/Prepare a Filter/Selected'/>\n"
-" <menuitem action='/Prepare a Filter/Not Selected'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected'/>\n"
-" <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected'/>\n"
-" </menu>\n"
-" <menu name= 'FindFrame' action='/Find Frame'>\n"
-" <menuitem action='/Find Frame/Find Frame'/>\n"
-" <menuitem action='/Find Frame/Find Next'/>\n"
-" <menuitem action='/Find Frame/Find Previous'/>\n"
-" </menu>\n"
-" </popup>\n"
-"</ui>\n";
-
-/*
- * GtkActionEntry
- * typedef struct {
- * const gchar *name;
- * const gchar *stock_id;
- * const gchar *label;
- * const gchar *accelerator;
- * const gchar *tooltip;
- * GCallback callback;
- * } GtkActionEntry;
- * const gchar *name; The name of the action.
- * const gchar *stock_id; The stock id for the action, or the name of an icon from the icon theme.
- * const gchar *label; The label for the action. This field should typically be marked for translation,
- * see gtk_action_group_set_translation_domain().
- * If label is NULL, the label of the stock item with id stock_id is used.
- * const gchar *accelerator; The accelerator for the action, in the format understood by gtk_accelerator_parse().
- * const gchar *tooltip; The tooltip for the action. This field should typically be marked for translation,
- * see gtk_action_group_set_translation_domain().
- * GCallback callback; The function to call when the action is activated.
- *
- */
-static const GtkActionEntry wlan_details_list_popup_entries[] = {
- /* Top level */
- { "/Apply as Filter", NULL, "Apply as Filter", NULL, NULL, NULL },
- { "/Prepare a Filter", NULL, "Prepare a Filter", NULL, NULL, NULL },
- { "/Find Frame", NULL, "Find Frame", NULL, NULL, NULL },
-
- /* Apply as */
- { "/Apply as Filter/Selected", NULL, "Selected" , NULL, NULL, G_CALLBACK(wlan_details_apply_selected_cb) },
- { "/Apply as Filter/Not Selected", NULL, "Not Selected", NULL, NULL, G_CALLBACK(wlan_details_apply_not_selected_cb) },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, NULL, G_CALLBACK(wlan_details_apply_and_selected_cb) },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, NULL, G_CALLBACK(wlan_details_apply_or_selected_cb) },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, NULL, G_CALLBACK(wlan_details_apply_and_not_selected_cb) },
- { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, NULL, G_CALLBACK(wlan_details_apply_or_not_selected_cb) },
-
- { "/Prepare a Filter/Selected", NULL, "Selected" , NULL, NULL, G_CALLBACK(wlan_details_prepare_selected_cb) },
- { "/Prepare a Filter/Not Selected", NULL, "Not Selected", NULL, NULL, G_CALLBACK(wlan_details_prepare_not_selected_cb) },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and Selected", NULL, NULL, G_CALLBACK(wlan_details_prepare_and_selected_cb) },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or Selected", NULL, NULL, G_CALLBACK(wlan_details_prepare_or_selected_cb) },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " and not Selected", NULL, NULL, G_CALLBACK(wlan_details_prepare_and_not_selected_cb) },
- { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, UTF8_HORIZONTAL_ELLIPSIS " or not Selected", NULL, NULL, G_CALLBACK(wlan_details_prepare_or_not_selected_cb) },
-
- /* Find Frame*/
- { "/Find Frame/Find Frame", NULL, "Find Frame", NULL, NULL, G_CALLBACK(wlan_details_find_frame_cb) },
- { "/Find Frame/Find Next", NULL, "Find Next", NULL, NULL, G_CALLBACK(wlan_details_find_next_frame_cb) },
- { "/Find Frame/Find Previous", NULL, "Find Previous", NULL, NULL, G_CALLBACK(wlan_details_find_previous_frame_cb) },
-
-};
-
-static void
-wlan_details_create_popup_menu(wlanstat_t *hs)
-{
- GtkUIManager *ui_manager;
- GtkActionGroup *action_group;
- GError *error = NULL;
-
- action_group = gtk_action_group_new ("WlanDetailsPopupActionGroup");
- gtk_action_group_add_actions (action_group, /* the action group */
- (GtkActionEntry *)wlan_details_list_popup_entries, /* an array of action descriptions */
- G_N_ELEMENTS(wlan_details_list_popup_entries), /* the number of entries */
- hs); /* data to pass to the action callbacks */
-
- ui_manager = gtk_ui_manager_new ();
- gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);
- gtk_ui_manager_add_ui_from_string (ui_manager,ui_desc_wlan_details_filter_popup, -1, &error);
- if (error != NULL)
- {
- fprintf (stderr, "Warning: building Wlan details list popup failed: %s\n",
- error->message);
- g_error_free (error);
- error = NULL;
- }
- hs->details_menu = gtk_ui_manager_get_widget(ui_manager, "/WlanStatFilterPopup");
- g_signal_connect(hs->details, "button_press_event", G_CALLBACK(wlan_details_show_popup_menu_cb), hs);
-
-}
-
-static void
-wlanstat_dlg_create (void)
-{
- wlanstat_t *hs;
- GString *error_string;
- GtkWidget *scrolled_window;
- GtkWidget *bbox;
- GtkWidget *vbox;
- GtkWidget *hbox;
- GtkWidget *frame;
- GtkWidget *selected_vb;
- GtkWidget *resolv_cb;
- GtkWidget *filter_cb;
- GtkWidget *existing_cb;
- GtkWidget *close_bt;
- GtkWidget *help_bt;
- GtkWidget *copy_bt;
- GtkListStore *store;
- GtkTreeView *tree_view;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
- GtkTreeSelection *sel;
- char *display_name;
- char title[256];
- gint i;
-
- hs = (wlanstat_t *)g_malloc (sizeof(wlanstat_t));
- hs->num_entries = 0;
- hs->ep_list = NULL;
- hs->number_of_packets = 0;
- hs->resolve_names = TRUE;
- hs->use_dfilter = FALSE;
- hs->show_only_existing = FALSE;
-
- display_name = cf_get_display_name(&cfile);
- g_snprintf (title, sizeof(title), "Wireshark: WLAN Traffic Statistics: %s",
- display_name);
- g_free(display_name);
- wlanstat_dlg_w = window_new_with_geom (GTK_WINDOW_TOPLEVEL, title, "WLAN Statistics", GTK_WIN_POS_CENTER_ON_PARENT);
- gtk_window_set_default_size (GTK_WINDOW(wlanstat_dlg_w), 750, 400);
-
- vbox=ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
- gtk_container_add(GTK_CONTAINER(wlanstat_dlg_w), vbox);
- gtk_container_set_border_width (GTK_CONTAINER(vbox), 6);
-
- wlanstat_pane = gtk_paned_new(GTK_ORIENTATION_VERTICAL);
- gtk_box_pack_start (GTK_BOX (vbox), wlanstat_pane, TRUE, TRUE, 0);
- gtk_paned_set_position(GTK_PANED(wlanstat_pane), recent.gui_geometry_wlan_stats_pane);
- gtk_widget_show(wlanstat_pane);
-
- /* init a scrolled window for overview */
- wlanstat_name_lb = gtk_frame_new("Network Overview");
- gtk_paned_pack1(GTK_PANED(wlanstat_pane), wlanstat_name_lb, FALSE, TRUE);
- selected_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(wlanstat_name_lb), selected_vb);
- gtk_container_set_border_width(GTK_CONTAINER(selected_vb), 5);
-
- scrolled_window = scrolled_window_new (NULL, NULL);
- gtk_box_pack_start(GTK_BOX(selected_vb), scrolled_window, TRUE, TRUE, 0);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window),
- GTK_SHADOW_IN);
-
- store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
- G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT,
- G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT,
- G_TYPE_STRING, G_TYPE_FLOAT, G_TYPE_POINTER);
- hs->table = GTK_TREE_VIEW(tree_view_new(GTK_TREE_MODEL(store)));
- gtk_container_add(GTK_CONTAINER (scrolled_window), GTK_WIDGET(hs->table));
- g_object_unref(G_OBJECT(store));
-
- tree_view = hs->table;
- gtk_tree_view_set_headers_visible(tree_view, TRUE);
- gtk_tree_view_set_headers_clickable(tree_view, TRUE);
-
- for (i = 0; i <= PROTECTION_COLUMN; i++) {
- if (i == PERCENT_COLUMN) {
- /* XXX: "progess" rendering doesn't seem to work for Gtk3 ?? */
- renderer = gtk_cell_renderer_progress_new();
- column = gtk_tree_view_column_new_with_attributes(titles[i], renderer,
- "text", i,
- "value", PERCENT_VALUE_COLUMN,
- NULL);
- gtk_tree_view_column_set_expand(column, TRUE);
- gtk_tree_view_column_set_sort_column_id(column, PERCENT_VALUE_COLUMN);
- } else {
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes(titles[i], renderer,
- "text", i,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, i);
- }
-
- if (i != BSSID_COLUMN && i != SSID_COLUMN && i != PROTECTION_COLUMN) {
- /* Align all number columns */
- g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
- }
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_append_column(tree_view, column);
-
- if (i == SSID_COLUMN) {
- /* Sort the SSID column */
- gtk_tree_view_column_clicked(column);
- }
- }
-
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(hs->table));
- gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
- g_signal_connect(sel, "changed", G_CALLBACK(wlan_select_cb), hs);
-
- /* init a scrolled window for details */
- frame = gtk_frame_new("Selected Network");
- gtk_paned_pack2(GTK_PANED(wlanstat_pane), frame, FALSE, TRUE);
- selected_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
- gtk_container_add(GTK_CONTAINER(frame), selected_vb);
- gtk_container_set_border_width(GTK_CONTAINER(selected_vb), 5);
-
- scrolled_window = scrolled_window_new (NULL, NULL);
- gtk_box_pack_start(GTK_BOX(selected_vb), scrolled_window, TRUE, TRUE, 0);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window),
- GTK_SHADOW_IN);
-
- store = gtk_list_store_new(NUM_DETAIL_COLUMNS, G_TYPE_STRING, G_TYPE_STRING,
- G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT,
- G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING,
- G_TYPE_FLOAT, G_TYPE_POINTER);
- hs->details = GTK_TREE_VIEW(tree_view_new(GTK_TREE_MODEL(store)));
- gtk_container_add(GTK_CONTAINER (scrolled_window), GTK_WIDGET(hs->details));
- g_object_unref(G_OBJECT(store));
-
- tree_view = hs->details;
- gtk_tree_view_set_headers_visible(tree_view, TRUE);
- gtk_tree_view_set_headers_clickable(tree_view, TRUE);
-
- for (i = 0; i <= COMMENT_COLUMN; i++) {
- if (i == PERCENT_2_COLUMN) {
- /* XXX: "progess" rendering doesn't seem to work for Gtk3 ?? */
- renderer = gtk_cell_renderer_progress_new();
- column = gtk_tree_view_column_new_with_attributes(detail_titles[i], renderer,
- "text", i,
- "value", PERCENT_VALUE_2_COLUMN,
- NULL);
- gtk_tree_view_column_set_expand(column, TRUE);
- gtk_tree_view_column_set_sort_column_id(column, PERCENT_VALUE_2_COLUMN);
- } else {
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes(detail_titles[i], renderer,
- "text", i,
- NULL);
- gtk_tree_view_column_set_sort_column_id(column, i);
- }
-
- if (i != ADDRESS_COLUMN && i != COMMENT_COLUMN) {
- /* Align all number columns */
- g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
- }
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_append_column(tree_view, column);
-
- if (i == ADDRESS_COLUMN) {
- /* Sort the Address column */
- gtk_tree_view_column_clicked(column);
- }
- }
-
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(hs->table));
- gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
-
- /* create popup menu for this table */
- wlan_create_popup_menu(hs);
- wlan_details_create_popup_menu(hs);
-
- error_string=register_tap_listener ("wlan", hs, NULL, 0,
- wlanstat_reset, wlanstat_packet,
- wlanstat_draw);
- if (error_string) {
- simple_dialog (ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
- g_string_free (error_string, TRUE);
- g_free (hs);
- return;
- }
-
- hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-
- resolv_cb = gtk_check_button_new_with_mnemonic("Name resolution");
- gtk_box_pack_start(GTK_BOX(hbox), resolv_cb, FALSE, FALSE, 0);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(resolv_cb), TRUE);
- gtk_widget_set_tooltip_text(resolv_cb, "Show results of name resolutions rather than the \"raw\" values. "
- "Please note: The corresponding name resolution must be enabled.");
-
- g_signal_connect(resolv_cb, "toggled", G_CALLBACK(wlan_resolve_toggle_dest), hs);
-
- filter_cb = gtk_check_button_new_with_mnemonic("Limit to display filter");
- gtk_box_pack_start(GTK_BOX(hbox), filter_cb, FALSE, FALSE, 0);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(filter_cb), FALSE);
- gtk_widget_set_tooltip_text(filter_cb, "Limit the list to entries matching the current display filter.");
- g_signal_connect(filter_cb, "toggled", G_CALLBACK(wlan_filter_toggle_dest), hs);
-
- existing_cb = gtk_check_button_new_with_mnemonic("Only show existing networks");
- gtk_box_pack_start(GTK_BOX(hbox), existing_cb, FALSE, FALSE, 0);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(existing_cb), FALSE);
- gtk_widget_set_tooltip_text(existing_cb, "This option disables probe requests for "
- "unknown networks.");
- g_signal_connect(existing_cb, "toggled", G_CALLBACK(wlan_existing_toggle_dest), hs);
-
- /* Button row. */
- bbox = dlg_button_row_new (GTK_STOCK_CLOSE, GTK_STOCK_COPY, GTK_STOCK_HELP, NULL);
-
- gtk_box_pack_end (GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
-
- close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
- window_set_cancel_button (wlanstat_dlg_w, close_bt, window_cancel_button_cb);
-
- copy_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_COPY);
-/* gtk_button_set_label(GTK_BUTTON(copy_bt), "Copy Overview"); */
- gtk_widget_set_tooltip_text(copy_bt,
- "Copy all statistical values of this page to the clipboard in CSV (Comma Separated Values) format.");
- g_signal_connect(copy_bt, "clicked", G_CALLBACK(wlan_copy_as_csv), hs->table);
-
- help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
- g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_STATS_WLAN_TRAFFIC_DIALOG);
-
- g_signal_connect (wlanstat_dlg_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
- g_signal_connect (wlanstat_dlg_w, "destroy", G_CALLBACK(win_destroy_cb), hs);
-
- gtk_widget_show_all (wlanstat_dlg_w);
- window_present (wlanstat_dlg_w);
-
- cf_retap_packets (&cfile);
- gdk_window_raise(gtk_widget_get_window(wlanstat_dlg_w));
-}
-
-void
-wlanstat_launch (GtkAction *action _U_, gpointer user_data _U_)
-{
- if (wlanstat_dlg_w) {
- reactivate_window(wlanstat_dlg_w);
- } else {
- wlanstat_dlg_create ();
- }
-}
-
-void
-register_tap_listener_wlanstat (void)
-{
-}
-
-/*
- * Editor modelines - http://www.wireshark.org/tools/modelines.html
- *
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * vi: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */